@morpho-dev/router 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -16
- package/dist/index.browser.d.cts +20 -1
- package/dist/index.browser.d.ts +20 -1
- package/dist/index.browser.js +32 -2
- package/dist/index.browser.js.map +1 -1
- package/dist/index.browser.mjs +32 -2
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.d.cts +20 -1
- package/dist/index.node.d.ts +20 -1
- package/dist/index.node.js +32 -2
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +32 -2
- package/dist/index.node.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Chain.ts","../src/core/router/Client.ts","../src/RouterOffer.ts","../src/utils/index.ts","../src/utils/batch.ts","../src/utils/cursor.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/retry.ts","../src/core/apiSchema/requests.ts","../src/core/apiSchema/openapi.ts","../src/core/apiSchema/utils.ts","../src/OfferStore/index.ts","../src/OfferStore/MemoryOfferStore.ts","../src/RouterEvent.ts","../src/Validation.ts","../src/ValidationRule.ts"],"names":["viemEthereum","viemBase","Offer","z","maxUint256","Format","Errors","Base64","poll","Maturity","LLTV","parseUnits","createDocument","formatUnits","parameters","chains","Time","from","batch","run","offers","morpho","loanToken","parseAbi"],"mappings":"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","file":"index.browser.js","sourcesContent":["import type { Compute } from \"@morpho-dev/mempool\";\nimport type { Address } from \"viem\";\nimport { type Chain as ViemChain, base as viemBase, mainnet as viemEthereum } from \"viem/chains\";\n\nexport const chainNames = [\"ethereum\", \"base\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n};\nexport type ChainId = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: ChainId;\n name: ChainName;\n whitelistedAssets: Set<Address>;\n morpho: Address;\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: ChainId): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n whitelistedAssets: new Set(\n [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n },\n};\n","import { type Compute, Errors, Format, type LLTV, type Maturity } from \"@morpho-dev/mempool\";\nimport { formatUnits } from \"viem\";\nimport * as ApiSchema from \"#core/apiSchema/index.ts\";\nimport { from, type OfferStatus } from \"#RouterOffer.ts\";\n\nexport type GetParameters = {\n /** Filter by multiple creator addresses (comma-separated) */\n creators?: string[];\n /** Filter by offer type: buy offers or sell offers */\n side?: \"buy\" | \"sell\";\n /** Filter by multiple blockchain networks (comma-separated chain IDs) */\n chains?: number[];\n /** Filter by multiple loan assets (comma-separated) */\n loanTokens?: string[];\n /** Filter by multiple statuses (comma-separated) */\n status?: OfferStatus[];\n /** Filter by multiple callback addresses (comma-separated) */\n callbackAddresses?: string[];\n /** Minimum amount of assets in the offer */\n minAmount?: bigint;\n /** Maximum amount of assets in the offer */\n maxAmount?: bigint;\n /** Minimum rate per asset (in wei) */\n minRate?: bigint;\n /** Maximum rate per asset (in wei) */\n maxRate?: bigint;\n /** Minimum maturity timestamp (Unix timestamp in seconds) */\n minMaturity?: Maturity.Maturity;\n /** Maximum maturity timestamp (Unix timestamp in seconds) */\n maxMaturity?: Maturity.Maturity;\n /** Minimum expiry timestamp (Unix timestamp in seconds) */\n minExpiry?: number;\n /** Maximum expiry timestamp (Unix timestamp in seconds) */\n maxExpiry?: number;\n /** Filter by multiple collateral assets (comma-separated) */\n collateralAssets?: string[];\n /** Filter by multiple rate oracles (comma-separated) */\n collateralOracles?: string[];\n /** Filter by collateral combinations */\n collateralTuple?: Array<{\n asset: string;\n oracle?: string;\n lltv?: LLTV.LLTV;\n }>;\n /** Minimum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal) */\n minLltv?: LLTV.LLTV;\n /** Maximum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal) */\n maxLltv?: LLTV.LLTV;\n /** Field to sort results by */\n sortBy?: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n /** Sort direction: asc (ascending) or desc (descending, default) */\n sortOrder?: \"asc\" | \"desc\";\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. Defaults to 20. Maximum is 100. */\n limit?: number;\n};\n\nexport type MatchParameters = {\n /** The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell */\n side: \"buy\" | \"sell\";\n /** The blockchain network chain ID */\n chainId: number;\n /** Rate per asset (in wei) for matching offers */\n rate?: bigint;\n /** Collateral requirements */\n collaterals?: Array<{\n asset: string;\n oracle: string;\n lltv: LLTV.LLTV;\n }>;\n /** Exact maturity timestamp (Unix timestamp in seconds) */\n maturity?: Maturity.Maturity;\n /** Minimum maturity timestamp (Unix timestamp in seconds, inclusive) */\n minMaturity?: Maturity.Maturity;\n /** Maximum maturity timestamp (Unix timestamp in seconds, inclusive) */\n maxMaturity?: Maturity.Maturity;\n /** The loan asset address to match against */\n loanToken?: string;\n /** Filter by a specific offer creator address */\n creator?: string;\n /** Filter by multiple statuses (comma-separated) */\n status?: OfferStatus[];\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. Defaults to 20. Maximum is 100. */\n limit?: number;\n};\n\nexport type RouterClientConfig = {\n readonly url: URL;\n readonly headers: Headers;\n};\n\nexport type Client = Compute<\n RouterClientConfig & {\n get: (\n parameters: GetParameters,\n ) => Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }>;\n match: (\n parameters: MatchParameters,\n ) => Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }>;\n }\n>;\n\nexport function connect(opts?: { url?: string; apiKey?: string }): Client {\n const u = new URL(opts?.url || \"https://router.morpho.dev\");\n\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n throw new InvalidUrlError(u.toString());\n }\n\n const headers = new Headers();\n headers.set(\"Content-Type\", \"application/json\");\n opts?.apiKey !== undefined ? headers.set(\"X-API-Key\", opts.apiKey) : null;\n\n const config: RouterClientConfig = {\n url: u,\n headers,\n };\n\n return {\n ...config,\n get: (parameters) => get(config, parameters),\n match: (parameters) => match(config, parameters),\n };\n}\n\nexport declare namespace connect {\n export type ErrorType = InvalidUrlError;\n}\n\n/**\n * Get offers from the router.\n * @returns The offers with pagination cursor.\n */\nexport async function get(\n config: RouterClientConfig,\n parameters: GetParameters,\n): Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }> {\n const url = new URL(`${config.url.toString()}v1/offers`);\n\n if (parameters.creators?.length) {\n url.searchParams.set(\"creators\", parameters.creators.join(\",\"));\n }\n if (parameters.side) {\n url.searchParams.set(\"side\", parameters.side);\n }\n if (parameters.chains?.length) {\n url.searchParams.set(\"chains\", parameters.chains.join(\",\"));\n }\n if (parameters.loanTokens?.length) {\n url.searchParams.set(\"loan_tokens\", parameters.loanTokens.join(\",\"));\n }\n if (parameters.status?.length) {\n url.searchParams.set(\"status\", parameters.status.join(\",\"));\n }\n if (parameters.callbackAddresses?.length) {\n url.searchParams.set(\"callback_addresses\", parameters.callbackAddresses.join(\",\"));\n }\n if (parameters.minAmount !== undefined) {\n url.searchParams.set(\"min_amount\", parameters.minAmount.toString());\n }\n if (parameters.maxAmount !== undefined) {\n url.searchParams.set(\"max_amount\", parameters.maxAmount.toString());\n }\n if (parameters.minRate !== undefined) {\n url.searchParams.set(\"min_rate\", parameters.minRate.toString());\n }\n if (parameters.maxRate !== undefined) {\n url.searchParams.set(\"max_rate\", parameters.maxRate.toString());\n }\n if (parameters.minMaturity !== undefined) {\n url.searchParams.set(\"min_maturity\", parameters.minMaturity.toString());\n }\n if (parameters.maxMaturity !== undefined) {\n url.searchParams.set(\"max_maturity\", parameters.maxMaturity.toString());\n }\n if (parameters.minExpiry !== undefined) {\n url.searchParams.set(\"min_expiry\", parameters.minExpiry.toString());\n }\n if (parameters.maxExpiry !== undefined) {\n url.searchParams.set(\"max_expiry\", parameters.maxExpiry.toString());\n }\n if (parameters.collateralAssets?.length) {\n url.searchParams.set(\"collateral_assets\", parameters.collateralAssets.join(\",\"));\n }\n if (parameters.collateralOracles?.length) {\n url.searchParams.set(\"collateral_oracles\", parameters.collateralOracles.join(\",\"));\n }\n if (parameters.collateralTuple?.length) {\n const tupleStr = parameters.collateralTuple\n .map(({ asset, oracle, lltv }) => {\n let result = asset;\n if (oracle) {\n result += `:${oracle}`;\n } else if (lltv !== undefined) {\n result += `:`; // Add empty oracle when lltv is present but oracle is undefined\n }\n if (lltv !== undefined) result += `:${formatUnits(lltv, 16)}`;\n return result;\n })\n .join(\"#\");\n url.searchParams.set(\"collateral_tuple\", tupleStr);\n }\n if (parameters.minLltv !== undefined) {\n url.searchParams.set(\"min_lltv\", formatUnits(parameters.minLltv, 16));\n }\n if (parameters.maxLltv !== undefined) {\n url.searchParams.set(\"max_lltv\", formatUnits(parameters.maxLltv, 16));\n }\n if (parameters.sortBy) {\n url.searchParams.set(\"sort_by\", parameters.sortBy);\n }\n if (parameters.sortOrder) {\n url.searchParams.set(\"sort_order\", parameters.sortOrder);\n }\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: Format.Snake<ApiSchema.OfferResponse>[];\n }>(config, url);\n\n const routerOffers = offers.map(Format.fromSnakeCase).map(ApiSchema.fromResponse);\n return {\n cursor: returnedCursor,\n offers: routerOffers.map(from).map(ApiSchema.toResponse),\n };\n}\n\nexport declare namespace get {\n export type ErrorType = GetApiErrorType;\n}\n\n/**\n * Match offers from the router.\n * @returns The matched offers with pagination cursor.\n */\nexport async function match(\n config: RouterClientConfig,\n parameters: MatchParameters,\n): Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }> {\n const url = new URL(`${config.url.toString()}v1/offers/match`);\n\n url.searchParams.set(\"side\", parameters.side);\n url.searchParams.set(\"chain_id\", parameters.chainId.toString());\n\n if (parameters.rate !== undefined) {\n url.searchParams.set(\"rate\", parameters.rate.toString());\n }\n if (parameters.collaterals?.length) {\n const collateralsStr = parameters.collaterals\n .map(({ asset, oracle, lltv }) => `${asset}:${oracle}:${formatUnits(lltv, 16)}`)\n .join(\"#\");\n url.searchParams.set(\"collaterals\", collateralsStr);\n }\n if (parameters.maturity !== undefined) {\n url.searchParams.set(\"maturity\", parameters.maturity.toString());\n }\n if (parameters.minMaturity !== undefined) {\n url.searchParams.set(\"min_maturity\", parameters.minMaturity.toString());\n }\n if (parameters.maxMaturity !== undefined) {\n url.searchParams.set(\"max_maturity\", parameters.maxMaturity.toString());\n }\n if (parameters.loanToken) {\n url.searchParams.set(\"loan_token\", parameters.loanToken);\n }\n if (parameters.creator) {\n url.searchParams.set(\"creator\", parameters.creator);\n }\n if (parameters.status?.length) {\n url.searchParams.set(\"status\", parameters.status.join(\",\"));\n }\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: Format.Snake<ApiSchema.OfferResponse>[];\n }>(config, url);\n\n const routerOffers = offers.map(Format.fromSnakeCase).map(ApiSchema.fromResponse);\n return {\n cursor: returnedCursor,\n offers: routerOffers.map(from).map(ApiSchema.toResponse),\n };\n}\n\nexport declare namespace match {\n export type ErrorType = GetApiErrorType;\n}\n\ntype GetApiErrorType =\n | HttpGetOffersFailedError\n | HttpUnauthorizedError\n | HttpForbiddenError\n | HttpRateLimitError;\n\nasync function getApi<T>(config: RouterClientConfig, url: URL): Promise<T> {\n const pathname = url.pathname;\n let action: \"get_offers\" | \"match_offers\";\n\n switch (true) {\n case pathname.includes(\"/v1/offers/match\"):\n action = \"match_offers\";\n break;\n case pathname.includes(\"/v1/offers\"):\n action = \"get_offers\";\n break;\n default:\n throw new HttpGetOffersFailedError(\"Unknown endpoint\", {\n details: `Unsupported path: ${pathname}`,\n });\n }\n\n const schemaParseResult = ApiSchema.safeParse(action, Object.fromEntries(url.searchParams));\n if (!schemaParseResult.success) {\n throw new HttpGetOffersFailedError(`Invalid URL parameters`, {\n details: schemaParseResult.error.issues[0]?.message,\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: config.headers,\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new HttpUnauthorizedError();\n case 403:\n throw new HttpForbiddenError();\n case 429:\n throw new HttpRateLimitError();\n }\n throw new HttpGetOffersFailedError(`GET request returned ${response.status}`, {\n details: await response.text(),\n });\n }\n\n return response.json() as Promise<T>;\n}\n\nexport class InvalidUrlError extends Errors.BaseError {\n override name = \"Router.InvalidUrlError\";\n constructor(url: string) {\n super(`URL \"${url}\" is not http/https.`);\n }\n}\n\nexport class HttpUnauthorizedError extends Errors.BaseError {\n override name = \"Router.HttpUnauthorizedError\";\n constructor() {\n super(\"Unauthorized.\", {\n metaMessages: [\"Ensure that an API key is provided.\"],\n });\n }\n}\n\nexport class HttpForbiddenError extends Errors.BaseError {\n override name = \"Router.HttpForbiddenError\";\n constructor() {\n super(\"Forbidden.\", {\n metaMessages: [\"Ensure that the API key is valid.\"],\n });\n }\n}\n\nexport class HttpRateLimitError extends Errors.BaseError {\n override name = \"Router.HttpRateLimitError\";\n constructor() {\n super(\"Rate limit exceeded.\", {\n metaMessages: [\n \"The number of allowed requests has been exceeded. You must wait for the rate limit to reset.\",\n ],\n });\n }\n}\n\nexport class HttpGetOffersFailedError extends Errors.BaseError {\n override name = \"Router.HttpGetOffersFailedError\";\n constructor(message: string, { details }: { details?: string } = {}) {\n super(message, {\n metaMessages: [details],\n });\n }\n}\n","import { Errors, Format, Offer } from \"@morpho-dev/mempool\";\nimport { maxUint256 } from \"viem\";\nimport { type ZodError, z } from \"zod/v4\";\n\nexport const OfferStatusValues = [\n \"valid\",\n \"callback_not_supported\",\n \"callback_error\",\n \"unverified\",\n] as const;\nexport type OfferStatus = (typeof OfferStatusValues)[number];\n\nexport type OfferMetadata = {\n issue: string;\n};\n\nexport type RouterOffer = Offer.Offer & {\n consumed: bigint;\n status: OfferStatus;\n metadata?: OfferMetadata;\n};\n\nexport const RouterOfferSchema = (parameters?: { omitHash?: boolean }) =>\n Offer.OfferSchema(parameters).extend({\n consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n status: z.enum(OfferStatusValues),\n metadata: z\n .object({\n issue: z.string(),\n })\n .optional(),\n });\n\n/**\n * Creates a router offer from a plain object.\n * @throws {InvalidRouterOfferError} If the router offer is invalid.\n * @param input - The router offer to create.\n * @returns The created router offer with its hash.\n */\nexport function from(input: Omit<RouterOffer, \"hash\">): RouterOffer {\n try {\n const parsedOffer = RouterOfferSchema({ omitHash: true }).parse(input);\n const parsedHash = Offer.OfferHashSchema.parse(Offer.hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidRouterOfferError(error as ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidRouterOfferError;\n}\n\n/**\n * Creates a router offer from a snake case object.\n * @throws {InvalidRouterOfferError} If the router offer is invalid.\n * @param input - The router offer to create.\n * @returns The created router offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<RouterOffer, \"hash\">>): RouterOffer {\n return from(Format.fromSnakeCase(input));\n}\n\nexport declare namespace fromSnakeCase {\n export type ErrorType = InvalidRouterOfferError;\n}\n\n/**\n * Converts a router offer to a snake case object.\n * @param offer - The router offer to convert.\n * @returns The converted router offer.\n */\nexport function toSnakeCase(offer: RouterOffer): Format.Snake<RouterOffer> {\n return Format.toSnakeCase(offer);\n}\n\nexport function random(): RouterOffer {\n const baseOffer = Offer.random();\n\n return from({\n ...baseOffer,\n status: \"valid\",\n metadata: undefined,\n consumed: 0n,\n });\n}\n\nexport class InvalidRouterOfferError extends Errors.BaseError<ZodError | Error> {\n override readonly name = \"RouterOffer.InvalidRouterOfferError\";\n constructor(error: ZodError | Error) {\n super(\"Invalid router offer.\", { cause: error });\n }\n}\n","export * from \"./batch.ts\";\nexport * from \"./cursor.ts\";\nexport * from \"./poll.ts\";\nexport * from \"./retry.ts\";\nexport * from \"./wait.ts\";\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","import { Base64 } from \"js-base64\";\n// ---------- Cursor‑pagination helpers ----------\nexport type Cursor = {\n sort: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n dir: \"asc\" | \"desc\";\n rate?: string; // bigint rendered to string\n maturity?: number;\n expiry?: number;\n assets?: string; // bigint rendered to string\n hash: string;\n};\n\nexport function validateCursor(cursor: unknown): cursor is Cursor {\n if (!cursor || typeof cursor !== \"object\") {\n throw new Error(\"Cursor must be an object\");\n }\n\n const c = cursor as any;\n\n // Validate sort field\n if (![\"rate\", \"maturity\", \"expiry\", \"amount\"].includes(c.sort)) {\n throw new Error(\n `Invalid sort field: ${c.sort}. Must be one of: rate, maturity, expiry, amount`,\n );\n }\n\n // Validate direction\n if (![\"asc\", \"desc\"].includes(c.dir)) {\n throw new Error(`Invalid direction: ${c.dir}. Must be one of: asc, desc`);\n }\n\n // Validate hash format (basic hex validation)\n if (!/^0x[a-fA-F0-9]{64}$/.test(c.hash)) {\n throw new Error(\n `Invalid hash format: ${c.hash}. Must be a 64-character hex string starting with 0x`,\n );\n }\n\n // Validate sort-specific fields\n const validations: Record<\n string,\n {\n field: string;\n type: \"string\" | \"number\";\n pattern?: RegExp;\n validator?: (val: any) => boolean;\n error: string;\n }\n > = {\n rate: {\n field: \"rate\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n amount: {\n field: \"assets\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n maturity: {\n field: \"maturity\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n expiry: {\n field: \"expiry\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n };\n\n const validation = validations[c.sort];\n if (!validation) {\n throw new Error(`Invalid sort field: ${c.sort}`);\n }\n\n const fieldValue = c[validation.field];\n\n if (!fieldValue) {\n throw new Error(`${c.sort} sort requires '${validation.field}' field to be present`);\n }\n\n if (typeof fieldValue !== validation.type) {\n throw new Error(\n `${c.sort} sort requires '${validation.field}' field of type ${validation.type}`,\n );\n }\n\n if (validation.pattern && !validation.pattern.test(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} format: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (validation.validator && !validation.validator(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} value: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n return true;\n}\n\nexport function encodeCursor(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decodeCursor(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validateCursor(decoded);\n return decoded;\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import { LLTV, Maturity } from \"@morpho-dev/mempool\";\nimport { parseUnits } from \"viem\";\nimport { z } from \"zod/v4\";\nimport { type OfferStatus, OfferStatusValues } from \"#RouterOffer.ts\";\nimport { decodeCursor } from \"#utils/index.ts\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst MAX_LLTV = 100;\nconst MIN_LLTV = 0;\n\nexport const GetOffersQueryParams = z\n .object({\n // Core filtering parameters\n creators: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Creators must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple creator addresses (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n side: z.enum([\"buy\", \"sell\"]).optional().meta({\n description: \"Filter by offer type: buy offers or sell offers\",\n example: \"buy\",\n }),\n chains: z\n .string()\n .regex(/^\\d+(,\\d+)*$/, {\n message: \"Chains must be comma-separated chain IDs\",\n })\n .transform((val) => val.split(\",\").map(Number))\n .optional()\n .meta({\n description: \"Filter by multiple blockchain networks (comma-separated chain IDs)\",\n example: \"1,137,10\",\n }),\n loan_tokens: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Loan assets must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple loan assets (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n status: z\n .string()\n .regex(/^[a-zA-Z_]+(,[a-zA-Z_]+)*$/, {\n message: \"Status must be comma-separated status values\",\n })\n .transform((val) => val.split(\",\") as OfferStatus[])\n .refine((statuses) => statuses.every((status) => OfferStatusValues.includes(status)), {\n message: `Invalid status value. Must be one of: ${OfferStatusValues.join(\", \")}`,\n })\n .optional()\n .meta({\n description: `Filter by multiple statuses (comma-separated). Valid values: ${OfferStatusValues.join(\", \")}. By default, only offers with 'valid' status are returned.`,\n example: \"valid,callback_error\",\n }),\n callback_addresses: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Callback addresses must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple callback addresses (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n\n // Asset range\n min_amount: z\n .bigint({ coerce: true })\n .positive({\n message: \"Min amount must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Minimum amount of assets in the offer\",\n example: \"1000\",\n }),\n max_amount: z\n .bigint({ coerce: true })\n .positive({\n message: \"Max amount must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Maximum amount of assets in the offer\",\n example: \"10000\",\n }),\n\n // Rate range\n min_rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Min rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Minimum rate per asset (in wei)\",\n example: \"500000000000000000\",\n }),\n max_rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Max rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Maximum rate per asset (in wei)\",\n example: \"1500000000000000000\",\n }),\n\n // Time range\n min_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n max_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n min_expiry: z.coerce.number().int().optional().meta({\n description: \"Minimum expiry timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_expiry: z.coerce.number().int().optional().meta({\n description: \"Maximum expiry timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\n\n // Collateral filtering\n collateral_assets: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Collateral assets must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple collateral assets (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n collateral_oracles: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Collateral oracles must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple rate oracles (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n collateral_tuple: z\n .string()\n .regex(\n /^(0x[a-fA-F0-9]{40}(:0x[a-fA-F0-9]{40})?(:[0-9]+(\\.[0-9]+)?)?)(#0x[a-fA-F0-9]{40}(:0x[a-fA-F0-9]{40})?(:[0-9]+(\\.[0-9]+)?)?)*$/,\n {\n message:\n \"Collateral tuple must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. Oracle and lltv are optional. Asset must be 0x + 40 hex chars, oracle must be 0x + 40 hex chars, lltv must be a number (e.g., 80.5).\",\n },\n )\n .transform((val, ctx) => {\n return val.split(\"#\").map((tuple) => {\n const parts = tuple.split(\":\");\n\n if (parts.length === 0 || !parts[0]) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Asset address is required for each collateral tuple\",\n path: [\"asset\"],\n input: val,\n });\n return z.NEVER;\n }\n\n const asset = parts[0]?.toLowerCase();\n const oracle = parts[1]?.toLowerCase();\n const lltv = parts[2] ? parseFloat(parts[2]) : undefined;\n\n if (lltv !== undefined && (lltv < MIN_LLTV || lltv > MAX_LLTV)) {\n ctx.addIssue({\n code: \"custom\",\n message: `LLTV must be between ${MIN_LLTV} and ${MAX_LLTV} (0-100%)`,\n path: [\"lltv\"],\n input: val,\n });\n return z.NEVER;\n }\n\n let lltvValue: LLTV.LLTV | undefined;\n if (lltv !== undefined) {\n try {\n lltvValue = LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.issues.push({\n code: \"custom\",\n message:\n e instanceof LLTV.InvalidLLTVError || e instanceof LLTV.InvalidOptionError\n ? e.message\n : \"Invalid LLTV.\",\n input: lltv,\n path: [\"lltv\"],\n });\n return z.NEVER;\n }\n }\n\n return {\n asset,\n oracle,\n lltv: lltvValue,\n };\n });\n })\n .optional()\n .meta({\n description:\n \"Filter by collateral combinations in format: asset:oracle:lltv#asset2:oracle2:lltv2. Oracle and lltv are optional. Use # to separate multiple combinations.\",\n example:\n \"0x1234567890123456789012345678901234567890:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd:86#0x9876543210987654321098765432109876543210:94.5\",\n }),\n min_lltv: z.coerce\n .number()\n .min(0, { message: \"LLTV must be above 0\" })\n .max(100, { message: \"LLTV must be below 100\" })\n .transform((lltv, ctx) => {\n try {\n return LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as LLTV.from.ErrorType).message,\n input: lltv,\n });\n return z.NEVER;\n }\n })\n .optional()\n .meta({\n description:\n \"Minimum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal, e.g., 80.5 = 80.5%)\",\n example: \"80.5\",\n }),\n max_lltv: z.coerce\n .number()\n .min(0, { message: \"LLTV must be above 0\" })\n .max(100, { message: \"LLTV must be below 100\" })\n .transform((lltv, ctx) => {\n try {\n return LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as LLTV.from.ErrorType).message,\n input: lltv,\n });\n return z.NEVER;\n }\n })\n .optional()\n .meta({\n description:\n \"Maximum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal, e.g., 95.5 = 95.5%)\",\n example: \"95.5\",\n }),\n\n // Sorting parameters\n sort_by: z.enum([\"rate\", \"maturity\", \"expiry\", \"amount\"]).optional().meta({\n description: \"Field to sort results by\",\n example: \"rate\",\n }),\n sort_order: z.enum([\"asc\", \"desc\"]).optional().default(\"desc\").meta({\n description: \"Sort direction: asc (ascending) or desc (descending, default)\",\n example: \"desc\",\n }),\n\n // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = decodeCursor(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n })\n .refine(\n (data) =>\n data.min_maturity === undefined ||\n data.max_maturity === undefined ||\n data.max_maturity >= data.min_maturity,\n {\n message: \"max_maturity must be greater than or equal to min_maturity\",\n path: [\"max_maturity\"],\n },\n )\n .refine(\n (data) =>\n data.min_expiry === undefined ||\n data.max_expiry === undefined ||\n data.max_expiry >= data.min_expiry,\n {\n message: \"max_expiry must be greater than or equal to min_expiry\",\n path: [\"max_expiry\"],\n },\n )\n .refine(\n (data) =>\n data.min_amount === undefined ||\n data.max_amount === undefined ||\n data.max_amount >= data.min_amount,\n {\n message: \"max_amount must be greater than or equal to min_amount\",\n path: [\"max_amount\"],\n },\n )\n .refine(\n (data) =>\n data.min_rate === undefined || data.max_rate === undefined || data.max_rate >= data.min_rate,\n {\n message: \"max_rate must be greater than or equal to min_rate\",\n path: [\"max_rate\"],\n },\n )\n .refine(\n (data) =>\n data.min_lltv === undefined || data.max_lltv === undefined || data.max_lltv >= data.min_lltv,\n {\n message: \"max_lltv must be greater than or equal to min_lltv\",\n path: [\"max_lltv\"],\n },\n );\n\nexport const MatchOffersQueryParams = z\n .object({\n // Required parameters\n side: z.enum([\"buy\", \"sell\"]).meta({\n description:\n \"The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell. If your intent is to sell, buy offers will be returned, and vice versa.\",\n example: \"buy\",\n }),\n chain_id: z\n .string()\n .regex(/^\\d+$/, {\n message: \"Chain ID must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(z.number().positive())\n .meta({\n description: \"The blockchain network chain ID\",\n example: \"1\",\n }),\n\n // Optional parameters\n rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Rate per asset (in wei) for matching offers\",\n example: \"1000000000000000000\",\n }),\n\n // Collateral filtering\n collaterals: z\n .string()\n .regex(\n /^(0x[a-fA-F0-9]{40}:0x[a-fA-F0-9]{40}:[0-9]+(\\.[0-9]+)?)(#0x[a-fA-F0-9]{40}:0x[a-fA-F0-9]{40}:[0-9]+(\\.[0-9]+)?)*$/,\n {\n message:\n \"Collaterals must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. All fields are required for each collateral.\",\n },\n )\n .transform((val, ctx) => {\n return val.split(\"#\").map((collateral) => {\n const parts = collateral.split(\":\");\n\n if (parts.length !== 3) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each collateral must have exactly 3 parts: asset:oracle:lltv\",\n path: [\"collaterals\"],\n input: val,\n });\n return z.NEVER;\n }\n\n const [asset, oracle, lltvStr] = parts;\n\n if (!asset || !oracle || !lltvStr) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Asset, oracle, and lltv are all required for each collateral\",\n path: [\"collaterals\"],\n input: val,\n });\n }\n\n let lltvValue: LLTV.LLTV | undefined;\n if (lltvStr !== undefined) {\n try {\n lltvValue = LLTV.from(parseUnits(lltvStr, 16));\n } catch (e: unknown) {\n ctx.issues.push({\n code: \"custom\",\n message:\n e instanceof LLTV.InvalidLLTVError || e instanceof LLTV.InvalidOptionError\n ? e.message\n : \"Invalid LLTV.\",\n input: lltvStr,\n path: [\"lltv\"],\n });\n return z.NEVER;\n }\n }\n\n return {\n asset: asset!.toLowerCase(),\n oracle: oracle!.toLowerCase(),\n lltv: lltvValue!,\n };\n });\n })\n .optional()\n .meta({\n description:\n \"Collateral requirements in format: asset:oracle:lltv#asset2:oracle2:lltv2. Use # to separate multiple collaterals.\",\n example:\n \"0x1234567890123456789012345678901234567890:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd:86#0x9876543210987654321098765432109876543210:0xfedcbafedcbafedcbafedcbafedcbafedcbafedc:94.5\",\n }),\n\n // Maturity filtering\n maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n min_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n max_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n\n // Asset and creator filtering\n loan_token: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, {\n message: \"Loan asset must be a valid Ethereum address\",\n })\n .transform((val) => val.toLowerCase())\n .optional()\n .meta({\n description: \"The loan asset address to match against\",\n example: \"0x1234567890123456789012345678901234567890\",\n }),\n creator: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, {\n message: \"Creator must be a valid Ethereum address\",\n })\n .transform((val) => val.toLowerCase())\n .optional()\n .meta({\n description: \"Filter by a specific offer creator address\",\n example: \"0x1234567890123456789012345678901234567890\",\n }),\n\n // Status filtering\n status: z\n .string()\n .regex(/^[a-zA-Z_]+(,[a-zA-Z_]+)*$/, {\n message: \"Status must be comma-separated status values\",\n })\n .transform((val) => val.split(\",\") as OfferStatus[])\n .refine((statuses) => statuses.every((status) => OfferStatusValues.includes(status)), {\n message: `Invalid status value. Must be one of: ${OfferStatusValues.join(\", \")}`,\n })\n .optional()\n .meta({\n description: `Filter by multiple statuses (comma-separated). Valid values: ${OfferStatusValues.join(\", \")}. By default, only offers with 'valid' status are returned.`,\n example: \"valid,callback_error\",\n }),\n\n // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = decodeCursor(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n })\n .refine(\n (data) =>\n data.min_maturity === undefined ||\n data.max_maturity === undefined ||\n data.max_maturity >= data.min_maturity,\n {\n message: \"max_maturity must be greater than or equal to min_maturity\",\n path: [\"max_maturity\"],\n },\n );\nconst schemas = {\n get_offers: GetOffersQueryParams,\n match_offers: MatchOffersQueryParams,\n} as const;\n\ntype Action = keyof typeof schemas;\n\nexport function parse<A extends Action>(action: A, query: unknown): z.infer<(typeof schemas)[A]> {\n return schemas[action].parse(query) as z.infer<(typeof schemas)[A]>;\n}\n\nexport function safeParse<A extends Action>(\n action: A,\n query: unknown,\n error?: z.core.$ZodErrorMap<z.core.$ZodIssue>,\n): z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>> {\n return schemas[action].safeParse(query, {\n error,\n }) as z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>>;\n}\n","import { z } from \"zod/v4\";\nimport { createDocument, type ZodOpenApiPathsObject } from \"zod-openapi\";\nimport { GetOffersQueryParams, MatchOffersQueryParams } from \"./requests.ts\";\n\nconst successResponseSchema = z.object({\n status: z.literal(\"success\"),\n cursor: z.string().nullable(),\n data: z.array(z.any()),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst errorResponseSchema = z.object({\n status: z.literal(\"error\"),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.any().optional(),\n }),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst paths: ZodOpenApiPathsObject = {\n \"/v1/offers\": {\n get: {\n summary: \"Get offers\",\n description: \"Get all offers with optional filtering and pagination\",\n tags: [\"Offers\"],\n requestParams: {\n query: GetOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/offers/match\": {\n get: {\n summary: \"Match offers\",\n description: \"Find offers that match specific criteria\",\n tags: [\"Offers\"],\n requestParams: {\n query: MatchOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n};\n\nexport const OpenApi = createDocument({\n openapi: \"3.1.0\",\n info: {\n title: \"Router API\",\n version: \"1.0.0\",\n description: \"API for the Morpho Router\",\n },\n tags: [\n {\n name: \"Offers\",\n },\n ],\n servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:8081\",\n description: \"Local development server\",\n },\n ],\n paths,\n});\n","import type { Offer } from \"@morpho-dev/mempool\";\nimport type { OfferMetadata, OfferStatus, RouterOffer } from \"#RouterOffer.ts\";\n\nexport type OfferResponse = {\n offer: Offer.Offer;\n consumed: bigint;\n status: OfferStatus;\n metadata?: OfferMetadata;\n};\n\n/**\n * Transforms a RouterOffer to OfferResponse format.\n * @param routerOffer - The router offer to transform.\n * @returns The router offer response with offer as a nested property.\n */\nexport function toResponse(routerOffer: RouterOffer): OfferResponse {\n const { consumed, status, metadata, ...offer } = routerOffer;\n return {\n offer,\n consumed,\n status,\n metadata,\n };\n}\n\n/**\n * Transforms a OfferResponse to RouterOffer format.\n * @param offerResponse - The router offer response to transform.\n * @returns The router offer with all properties at the top level.\n */\nexport function fromResponse(offerResponse: OfferResponse): RouterOffer {\n const { offer, consumed, status, metadata } = offerResponse;\n return {\n ...offer,\n consumed,\n status,\n metadata,\n };\n}\n","export * from \"./MemoryOfferStore.ts\";\nexport * from \"./types.ts\";\n","import { LLTV, Maturity, type Offer, Time } from \"@morpho-dev/mempool\";\nimport type { Address, Hex } from \"viem\";\nimport type * as Chain from \"#Chain.ts\";\nimport type * as RouterOffer from \"#RouterOffer.ts\";\nimport { type Cursor, decodeCursor, encodeCursor } from \"#utils/cursor.ts\";\nimport type {\n FindMatchingOffersParams,\n GetAllParams,\n GetOffersFilters,\n OfferStore,\n} from \"./types.ts\";\n\nexport function memory(parameters: {\n offers: Map<\n Hex,\n Offer.Offer & { status: RouterOffer.OfferStatus; metadata?: RouterOffer.OfferMetadata }\n >;\n filled: Map<Chain.ChainId, Map<Address, Map<bigint, bigint>>>;\n}): OfferStore {\n const map: Map<\n Hex,\n Offer.Offer & { status: RouterOffer.OfferStatus; metadata?: RouterOffer.OfferMetadata }\n > = parameters.offers;\n // chainId -> address -> nonce -> consumed amount\n const filled: Map<Chain.ChainId, Map<Address, Map<bigint, bigint>>> = parameters.filled;\n\n const create = async (parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<string> => {\n if (map.has(parameters.offer.hash.toLowerCase() as `0x${string}`)) return parameters.offer.hash;\n map.set(parameters.offer.hash.toLowerCase() as `0x${string}`, {\n ...parameters.offer,\n status: parameters.status,\n metadata: parameters.metadata,\n });\n const chainId = parameters.offer.chainId;\n const address = parameters.offer.offering.toLowerCase() as `0x${string}`;\n const nonce = parameters.offer.nonce;\n\n const filledForChain = filled.get(chainId) || new Map();\n const filledForOffering = filledForChain.get(address) || new Map();\n if (!filledForOffering.has(nonce)) filledForOffering.set(nonce, 0n);\n filledForChain.set(address, filledForOffering);\n filled.set(chainId, filledForChain);\n\n return Promise.resolve(parameters.offer.hash);\n };\n\n const sort = (\n sortBy: GetOffersFilters[\"sortBy\"],\n sortOrder: GetOffersFilters[\"sortOrder\"],\n a: RouterOffer.RouterOffer,\n b: RouterOffer.RouterOffer,\n ) => {\n sortBy = sortBy || \"expiry\";\n sortOrder = sortOrder || \"desc\";\n\n const sortKey = sortBy === \"amount\" ? \"assets\" : sortBy;\n\n if (a[sortKey] === b[sortKey]) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : b.hash > a.hash ? 1 : -1;\n }\n\n switch (sortBy) {\n case \"rate\":\n if (a.rate === b.rate) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.rate > b.rate ? 1 : -1) : b.rate > a.rate ? 1 : -1;\n case \"maturity\":\n if (a.maturity === b.maturity) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\"\n ? a.maturity > b.maturity\n ? 1\n : -1\n : b.maturity > a.maturity\n ? 1\n : -1;\n case \"expiry\":\n if (a.expiry === b.expiry) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.expiry > b.expiry ? 1 : -1) : b.expiry > a.expiry ? 1 : -1;\n case \"amount\":\n if (a.assets === b.assets) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.assets > b.assets ? 1 : -1) : b.assets > a.assets ? 1 : -1;\n default:\n if (a.expiry === b.expiry) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.expiry > b.expiry ? 1 : -1) : b.expiry > a.expiry ? 1 : -1;\n }\n };\n\n return {\n create,\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[],\n ): Promise<string[]> => {\n return Promise.all(\n parameters.map((p) => create({ offer: p.offer, status: p.status, metadata: p.metadata })),\n );\n },\n\n getAll: async (\n params?: GetAllParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const { query } = params || {};\n let {\n creators,\n side,\n chains,\n loanTokens,\n status = [\"valid\"],\n callbackAddresses,\n minAmount,\n maxAmount,\n minRate,\n maxRate,\n minMaturity,\n maxMaturity,\n minExpiry,\n maxExpiry,\n collateralAssets,\n collateralOracles,\n collateralTuple,\n minLltv,\n maxLltv,\n sortBy = \"expiry\",\n sortOrder = \"desc\",\n cursor: queryCursor,\n limit = 20,\n } = query || {};\n\n const now = Time.now();\n const buy = side === \"buy\";\n\n let offers: RouterOffer.RouterOffer[] = Array.from(map.values())\n .map((o) => ({\n ...o,\n consumed:\n filled\n .get(o.chainId)\n ?.get(o.offering.toLowerCase() as `0x${string}`)\n ?.get(o.nonce) || 0n,\n }))\n .filter((o) => o.consumed < o.assets);\n\n const cursor = decodeCursor(queryCursor);\n if (cursor) {\n // ignore/throw if cursor mismatches current sort options\n if (cursor.sort !== sortBy || cursor.dir !== sortOrder) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n\n switch (cursor.sort) {\n case \"rate\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.rate >= BigInt(cursor.rate!)\n : o.rate <= BigInt(cursor.rate!)) &&\n (o.rate !== BigInt(cursor.rate!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"maturity\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.maturity >= BigInt(cursor.maturity!)\n : o.maturity <= BigInt(cursor.maturity!)) &&\n (o.maturity !== Maturity.from(cursor.maturity!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"expiry\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\" ? o.expiry >= cursor.expiry! : o.expiry <= cursor.expiry!) &&\n (o.expiry !== cursor.expiry! ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"amount\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.assets >= BigInt(cursor.assets!)\n : o.assets <= BigInt(cursor.assets!)) &&\n (o.assets !== BigInt(cursor.assets!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n default:\n throw new Error(\"Invalid sort parameter\");\n }\n\n offers = offers.filter((o) => o.hash !== cursor.hash);\n }\n\n creators && (creators = creators.map((c) => c.toLowerCase()));\n loanTokens && (loanTokens = loanTokens.map((lt) => lt.toLowerCase()));\n callbackAddresses && (callbackAddresses = callbackAddresses.map((ca) => ca.toLowerCase()));\n collateralAssets && (collateralAssets = collateralAssets.map((ca) => ca.toLowerCase()));\n collateralOracles && (collateralOracles = collateralOracles.map((co) => co.toLowerCase()));\n collateralTuple &&\n (collateralTuple = collateralTuple.map((ct) => ({\n asset: ct.asset.toLowerCase(),\n oracle: ct.oracle?.toLowerCase(),\n })));\n\n offers = offers.filter((o) => o.expiry >= now);\n creators && (offers = offers.filter((o) => creators.includes(o.offering.toLowerCase())));\n side && (offers = offers.filter((o) => o.buy === buy));\n chains && (offers = offers.filter((o) => chains.includes(Number(o.chainId))));\n loanTokens && (offers = offers.filter((o) => loanTokens.includes(o.loanToken.toLowerCase())));\n status && (offers = offers.filter((o) => status.includes(o.status)));\n callbackAddresses &&\n (offers = offers.filter((o) =>\n callbackAddresses.includes(o.callback.address.toLowerCase()),\n ));\n minAmount && (offers = offers.filter((o) => o.assets >= minAmount));\n maxAmount && (offers = offers.filter((o) => o.assets <= maxAmount));\n minRate && (offers = offers.filter((o) => o.rate >= minRate));\n maxRate && (offers = offers.filter((o) => o.rate <= maxRate));\n minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));\n maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));\n minExpiry && (offers = offers.filter((o) => o.expiry >= minExpiry));\n maxExpiry && (offers = offers.filter((o) => o.expiry <= maxExpiry));\n collateralAssets &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) => collateralAssets.includes(c.asset.toLowerCase())),\n ));\n collateralOracles &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) => collateralOracles.includes(c.oracle.toLowerCase())),\n ));\n collateralTuple &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) =>\n collateralTuple.some(\n (ct) =>\n c.asset.toLowerCase() === ct.asset.toLowerCase() &&\n (ct.oracle ? c.oracle.toLowerCase() === ct.oracle.toLowerCase() : true) &&\n (ct.lltv ? c.lltv === LLTV.from(BigInt(ct.lltv)) : true),\n ),\n ),\n ));\n minLltv && (offers = offers.filter((o) => o.collaterals.every((c) => c.lltv >= minLltv)));\n maxLltv && (offers = offers.filter((o) => o.collaterals.every((c) => c.lltv <= maxLltv)));\n\n offers = offers.sort((a, b) => sort(sortBy, sortOrder, a, b));\n\n let nextCursor: string | null = null;\n if (offers.length > limit) {\n const last = offers[limit - 1]!;\n const base: Cursor = {\n sort: sortBy,\n dir: sortOrder,\n hash: last.hash,\n };\n\n switch (sortBy) {\n case \"rate\":\n base.rate = last.rate.toString();\n break;\n case \"amount\":\n base.assets = last.assets.toString();\n break;\n case \"maturity\":\n base.maturity = last.maturity;\n break;\n default:\n base.expiry = last.expiry;\n }\n nextCursor = encodeCursor(base);\n }\n\n offers = offers.slice(0, limit);\n\n return {\n offers,\n nextCursor,\n };\n },\n\n findMatchingOffers: async (\n params: FindMatchingOffersParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const {\n side,\n chainId,\n rate,\n collaterals = [],\n maturity,\n minMaturity,\n maxMaturity,\n loanToken,\n creator,\n status,\n cursor: queryCursor,\n limit = 20,\n } = params;\n\n const now = Time.now();\n const isBuying = side === \"buy\";\n const sortOrder: \"asc\" | \"desc\" = isBuying ? \"desc\" : \"asc\";\n\n let offers: RouterOffer.RouterOffer[] = Array.from(map.values())\n .map((o) => ({\n ...o,\n consumed:\n filled\n .get(o.chainId)\n ?.get(o.offering.toLowerCase() as `0x${string}`)\n ?.get(o.nonce) || 0n,\n }))\n .filter((o) => o.consumed < o.assets);\n\n const cursor = decodeCursor(queryCursor);\n if (cursor) {\n // ignore/throw if cursor mismatches current sort options\n if (cursor.sort !== \"rate\" || cursor.dir !== sortOrder) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n offers = offers.filter((o) =>\n sortOrder === \"asc\" ? o.rate >= BigInt(cursor.rate!) : o.rate <= BigInt(cursor.rate!),\n );\n }\n\n // We need to sort after selecting best offers per (offering, nonce, buy) group\n\n offers = offers.filter((o) => o.buy === !isBuying);\n offers = offers.filter((o) => o.chainId === BigInt(chainId));\n offers = offers.filter((o) => o.expiry >= now);\n rate && (offers = offers.filter((o) => (isBuying ? o.rate >= rate : o.rate <= rate)));\n collaterals.length > 0 &&\n (offers = offers.filter((o) =>\n isBuying\n ? // when wanting to buy, sell offer collaterals ⊆ user buy collaterals\n o.collaterals.every((oc) => {\n return collaterals.some(\n (c) =>\n oc.asset.toLowerCase() === c.asset.toLowerCase() &&\n oc.oracle.toLowerCase() === c.oracle.toLowerCase() &&\n oc.lltv === c.lltv,\n );\n })\n : // when wanting to sell, user sell collaterals ⊆ buy offer collaterals\n collaterals.every((c) => {\n return o.collaterals.some(\n (oc) =>\n oc.asset.toLowerCase() === c.asset.toLowerCase() &&\n oc.oracle.toLowerCase() === c.oracle.toLowerCase() &&\n oc.lltv === c.lltv,\n );\n }),\n ));\n maturity && (offers = offers.filter((o) => o.maturity === maturity));\n minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));\n maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));\n loanToken &&\n (offers = offers.filter((o) => o.loanToken.toLowerCase() === loanToken.toLowerCase()));\n creator &&\n (offers = offers.filter((o) => o.offering.toLowerCase() === creator.toLowerCase()));\n status && (offers = offers.filter((o) => status.includes(o.status)));\n\n // Select best offer per (offering, nonce, buy, chainId) group\n // Priority:\n // 1) price: for lend (buy=true) lower rate is better; for borrow (buy=false) higher rate is better\n // 2) remaining size: (assets - consumed) desc\n // 3) term: maturity desc\n // 4) deterministic tiebreak: hash lex asc\n const byGroup = new Map<string, RouterOffer.RouterOffer>();\n for (const offer of offers) {\n const groupKey = `${offer.chainId}-${offer.offering.toLowerCase()}-${offer.nonce}-${offer.buy}`;\n const current = byGroup.get(groupKey);\n if (!current) {\n byGroup.set(groupKey, offer);\n continue;\n }\n\n const remainingCandidate = offer.assets - offer.consumed;\n const remainingCurrent = current.assets - current.consumed;\n\n let candidateIsBetter = false;\n if (offer.buy) {\n // lend book: lower rate better\n if (offer.rate !== current.rate) candidateIsBetter = offer.rate < current.rate;\n else if (remainingCandidate !== remainingCurrent)\n candidateIsBetter = remainingCandidate > remainingCurrent;\n else if (offer.maturity !== current.maturity)\n candidateIsBetter = offer.maturity > current.maturity;\n else candidateIsBetter = offer.hash < current.hash;\n } else {\n // borrow book: higher rate better\n if (offer.rate !== current.rate) candidateIsBetter = offer.rate > current.rate;\n else if (remainingCandidate !== remainingCurrent)\n candidateIsBetter = remainingCandidate > remainingCurrent;\n else if (offer.maturity !== current.maturity)\n candidateIsBetter = offer.maturity > current.maturity;\n else candidateIsBetter = offer.hash < current.hash;\n }\n\n if (candidateIsBetter) byGroup.set(groupKey, offer);\n }\n\n offers = Array.from(byGroup.values());\n\n // Final ordering for response/pagination\n offers = offers.sort((a, b) => sort(\"rate\", sortOrder, a, b));\n\n // remove cursor offer from result\n // we kept it this far to remove offers in same group\n cursor && (offers = offers.filter((o) => o.hash !== cursor.hash));\n\n let nextCursor: string | null = null;\n if (offers.length > limit) {\n const last = offers[limit - 1]!;\n nextCursor = encodeCursor({\n sort: \"rate\",\n dir: sortOrder,\n hash: last.hash,\n rate: last.rate.toString(),\n });\n }\n\n offers = offers.slice(0, limit);\n\n return {\n offers,\n nextCursor,\n };\n },\n\n delete: async (hash: Offer.Offer[\"hash\"]): Promise<boolean> => {\n if (!map.has(hash.toLowerCase() as `0x${string}`)) return false;\n map.delete(hash.toLowerCase() as `0x${string}`);\n return true;\n },\n\n deleteMany: async (hashes: Offer.Offer[\"hash\"][]): Promise<number> => {\n let deleted = 0;\n for (const hash of hashes) {\n if (map.has(hash.toLowerCase() as `0x${string}`)) {\n map.delete(hash.toLowerCase() as `0x${string}`);\n deleted++;\n }\n }\n return deleted;\n },\n\n updateStatus: async (parameters: {\n offerHash: Offer.Offer[\"hash\"];\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<void> => {\n const key = parameters.offerHash.toLowerCase() as `0x${string}`;\n const existing = map.get(key);\n if (!existing) return;\n if (existing.status === parameters.status) return;\n map.set(key, {\n ...existing,\n status: parameters.status,\n metadata: parameters.metadata,\n });\n },\n\n updateConsumedAmount: async (parameters: {\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n }): Promise<void> => {\n const chainId = parameters.chainId;\n const address = parameters.offering.toLowerCase() as `0x${string}`;\n const nonce = parameters.nonce;\n\n const filledForChain = filled.get(chainId) || new Map();\n const filledForOffering = filledForChain.get(address) || new Map();\n filledForOffering.set(nonce, parameters.consumed);\n filledForChain.set(address, filledForOffering);\n filled.set(chainId, filledForChain);\n },\n };\n}\n","import type { Compute, Offer } from \"@morpho-dev/mempool\";\n\nexport const types = [\"offer_created\", \"offer_matched\", \"offer_validation\"] as const;\nexport type Type = (typeof types)[number];\n\ntype BaseEvent<type extends Type = Type> = {\n readonly id: string;\n readonly type: type;\n};\n\nexport type RouterEvent<type extends Type = Type> = type extends\n | \"offer_created\"\n | \"offer_matched\"\n | \"offer_validation\"\n ? Compute<BaseEvent<type> & { readonly offer: Offer.Offer }>\n : never;\n\n/**\n * Creates a RouterEvent with a deterministic id.\n */\nexport function from<T extends Type = Type>(\n base: Omit<RouterEvent<T>, \"id\" | \"type\"> & { type: T },\n): Compute<RouterEvent<T>> {\n const id = `${base.type}:${base.offer.hash.toLowerCase()}` as const;\n return { id, ...base } as RouterEvent<T>;\n}\n","import type * as ValidationRule from \"./ValidationRule.ts\";\n\n/**\n * A validation issue.\n */\nexport type Issue<T, RuleName extends string = string> = {\n /** The name of the rule that caused the issue. */\n ruleName: RuleName;\n /** The message of the issue. */\n message: string;\n /** The item that was not valid. */\n item: T;\n};\n\n/**\n * The result of a validation.\n */\nexport type Result<T, RuleName extends string = string> = {\n /** The items that were valid. */\n valid: T[];\n /** The reports of the failed validations. */\n issues: Issue<T, RuleName>[];\n};\n\nexport function run<\n T,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, void>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport async function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx?: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>> {\n const { items, rules, ctx = {} as Ctx, chunkSize } = parameters;\n\n const issues: Issue<T, ValidationRule.RuleNames<Rules>>[] = [];\n let validItems: T[] = items.slice();\n\n for (const rule of rules) {\n if (validItems.length === 0) return { valid: [], issues };\n\n const indicesToRemove: Set<number> = new Set();\n if (rule.kind === \"single\") {\n for (let i = 0; i < validItems.length; i++) {\n const item = validItems[i]!;\n const issue = await rule.run(item, ctx);\n if (issue) {\n issues.push({ ...issue, ruleName: rule.name, item });\n indicesToRemove.add(i);\n }\n }\n } else if (rule.kind === \"batch\") {\n const exec = async (slice: T[], offset: number) => {\n const map = await rule.run(slice, ctx);\n for (let i = 0; i < slice.length; i++) {\n const issue = map.get(i);\n if (issue !== undefined) {\n issues.push({ ...issue, ruleName: rule.name, item: slice[i]! });\n indicesToRemove.add(offset + i);\n }\n }\n };\n\n if (!chunkSize) await exec(validItems, 0);\n else {\n for (let i = 0; i < validItems.length; i += chunkSize) {\n await exec(validItems.slice(i, i + chunkSize), i);\n }\n }\n }\n\n validItems = validItems.filter((_, i) => !indicesToRemove.has(i));\n }\n\n return {\n valid: validItems,\n issues,\n };\n}\n","import type { Offer } from \"@morpho-dev/mempool\";\nimport { type Address, type PublicClient, parseAbi } from \"viem\";\nimport * as Chain from \"./Chain.ts\";\nimport type * as Validation from \"./Validation.ts\";\n\n/**\n * A validation rule.\n */\nexport type Rule<T, Name extends string = string, Ctx = void> =\n | { kind: \"single\"; name: Name; run: Single<T, Name, Ctx> }\n | { kind: \"batch\"; name: Name; run: Batch<T, Name, Ctx> };\n\nexport type RuleNames<Rules extends readonly { name: string }[]> = Rules[number][\"name\"];\n\n/**\n * A single item validation rule.\n * @param item - The item to validate.\n * @param ctx - The context of the validation.\n * @returns The issue that was found. If the item is valid, this will be undefined.\n */\nexport type Single<T, RuleName extends string, Ctx = void> = (\n item: T,\n ctx: Ctx,\n) =>\n | Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\">\n | undefined\n | Promise<Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>;\n\n/**\n * A batch item validation rule.\n * @param items - The items to validate.\n * @param ctx - The context of the validation.\n * @returns A map of the items to the issue that was found.\n */\nexport type Batch<T, RuleName extends string, Ctx = void> = (\n items: T[],\n ctx: Ctx,\n) =>\n | Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>\n | Promise<Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>>;\n\n/**\n * Create a validation rule iterating over a single item at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function single<Name extends string, T, Ctx = void>(\n name: Name,\n run: Single<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"single\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\n/**\n * Create a validation rule iterating over a batch of items at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function batch<Name extends string, T, Ctx = void>(\n name: Name,\n run: Batch<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"batch\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\nexport type MorphoContext = {\n publicClients: Partial<Record<Chain.ChainName, PublicClient>>;\n};\n\nexport function morpho(parameters: { whitelistedChains: Chain.Chain[] }) {\n const { whitelistedChains } = parameters;\n\n const whitelistedChainIds = new Set(whitelistedChains.map((chain) => chain.id));\n const whitelistedLoanTokensPerChain = new Map(\n whitelistedChains.map((chain) => [\n chain.id,\n new Set(Array.from(chain.whitelistedAssets).map((a) => a.toLowerCase() as Address)),\n ]),\n );\n const morphoPerChain = new Map(\n whitelistedChains.map((chain) => [chain.id, chain.morpho.toLowerCase() as Address]),\n );\n\n const chainId = single(\"chain_id\", (offer: Offer.Offer, _: MorphoContext) => {\n if (!whitelistedChainIds.has(offer.chainId)) {\n return { message: `Chain ID ${offer.chainId} is not whitelisted` };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, _: MorphoContext) => {\n if (\n !whitelistedLoanTokensPerChain\n .get(offer.chainId)\n ?.has(offer.loanToken.toLowerCase() as Address)\n ) {\n return {\n message: `Loan token ${offer.loanToken} is not whitelisted on chain ${offer.chainId}`,\n };\n }\n });\n\n const expiry = single(\"expiry\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.expiry < Math.floor(Date.now() / 1000)) {\n return { message: \"Expiry mismatch\" };\n }\n });\n\n // TODO: add offer maturity whitelisting rule\n // TODO: add callback address whitelisting rule\n // TODO: add callback oracle whitelisting rule\n // TODO: add callback token whitelisting rule\n // TODO: add signature rule\n\n const emptyCallback = single(\"empty_callback\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.callback.data !== \"0x\") {\n return { message: \"Callback data is not empty. Not supported yet.\" };\n }\n });\n\n const sellOffersEmptyCallback = single(\n \"sell_offers_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data === \"0x\") {\n return { message: \"Sell offers with empty callback are not supported yet.\" };\n }\n },\n );\n\n const buyOffersEmptyCallback = batch(\n \"buy_offers_empty_callback\",\n async (offers: Offer.Offer[], { publicClients }: MorphoContext) => {\n const issues = new Map<\n number,\n | Omit<Validation.Issue<Offer.Offer, \"buy_offers_empty_callback\">, \"ruleName\" | \"item\">\n | undefined\n >();\n\n const hashToIndex = new Map<string, number>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n hashToIndex.set(offer.hash, i);\n }\n\n const { buyOffers, sellOffers: _sellOffers } = offers.reduce<{\n buyOffers: Offer.Offer[];\n sellOffers: Offer.Offer[];\n }>(\n (acc, offer) => {\n offer.buy\n ? acc.buyOffers.push(offer)\n : issues.set(hashToIndex.get(offer.hash)!, {\n message: \"Onchain callback for sell offers is not supported yet.\",\n });\n return acc;\n },\n { buyOffers: [], sellOffers: [] },\n );\n\n const buyOffersPerLoanAsset = new Map<Chain.ChainName, Map<Address, Offer.Offer[]>>();\n for (const offer of buyOffers) {\n // ok to force unwrap here since we check that the chain is whitelisted in the chain_id rule\n const chainName = Chain.getChain(offer.chainId)?.name!;\n\n const loanTokens = buyOffersPerLoanAsset.get(chainName) ?? new Map();\n const offers = loanTokens.get(offer.loanToken.toLowerCase() as Address) ?? [];\n offers.push(offer);\n loanTokens.set(offer.loanToken.toLowerCase() as Address, offers);\n buyOffersPerLoanAsset.set(chainName, loanTokens);\n }\n\n await Promise.all(\n Array.from(buyOffersPerLoanAsset.entries()).map(async ([name, loanTokens]) => {\n const chainName = name as Chain.ChainName;\n\n const publicClient = publicClients[chainName];\n // ok to force unwrap here since we check that the chain is whitelisted and morpho is mandatory in the chain definition\n const morpho = morphoPerChain.get(Chain.chains[chainName].id)!;\n\n if (!publicClient) {\n const offers: Offer.Offer[] = Array.from(loanTokens.values()).flat();\n for (const offer of offers) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Public client for chain \"${chainName}\" is not available`,\n });\n }\n return;\n }\n\n // user -> loanToken -> balance\n const balances: Map<string, Map<string, bigint>> = new Map();\n const allowances: Map<string, Map<string, bigint>> = new Map();\n for (const [loanToken, offers] of loanTokens as Map<Address, Offer.Offer[]>) {\n const data = await Promise.all(\n offers.flatMap((offer) => [\n publicClient.readContract({\n address: loanToken,\n abi: parseAbi([\n \"function balanceOf(address owner) view returns (uint256 balance)\",\n ]),\n functionName: \"balanceOf\",\n args: [offer.offering],\n }),\n publicClient.readContract({\n address: loanToken,\n abi: parseAbi([\n \"function allowance(address owner, address spender) public view returns (uint256 remaining)\",\n ]),\n functionName: \"allowance\",\n args: [offer.offering, morpho],\n }),\n ]),\n );\n\n for (let i = 0; i < offers.length; i++) {\n const user = offers[i]!.offering.toLowerCase();\n const balance = data[i * 2] || 0n;\n const allowance = data[i * 2 + 1] || 0n;\n\n const userBalances = balances.get(user) ?? new Map();\n userBalances.set(loanToken.toLowerCase(), balance);\n\n const userAllowances = allowances.get(user) ?? new Map();\n userAllowances.set(loanToken.toLowerCase(), allowance);\n\n balances.set(user, userBalances);\n allowances.set(user, userAllowances);\n }\n }\n\n for (const offer of Array.from(loanTokens.values()).flat()) {\n const user = offer.offering.toLowerCase();\n const userBalances = balances.get(user);\n const balance: bigint = userBalances?.get(offer.loanToken.toLowerCase())!;\n if (balance < offer.assets) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Insufficient balance for ${offer.loanToken} on chain ${offer.chainId} (${balance.toString()} < ${offer.assets.toString()})`,\n });\n continue;\n }\n\n const userAllowances = allowances.get(user);\n const allowance: bigint = userAllowances?.get(offer.loanToken.toLowerCase())!;\n if (allowance < offer.assets) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Insufficient allowance for ${offer.loanToken} on chain ${offer.chainId} (${allowance.toString()} < ${offer.assets.toString()})`,\n });\n }\n }\n }),\n );\n\n return issues;\n },\n );\n\n return [\n chainId,\n loanToken,\n expiry,\n // note: callback onchain check should be done last since it does not mean that the offer is forever invalid\n // integrators should be able to keep the offers that have an invalid callback onchain and be sure that is the only check that is not valid\n emptyCallback,\n sellOffersEmptyCallback,\n buyOffersEmptyCallback,\n ];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Chain.ts","../src/core/router/Client.ts","../src/RouterOffer.ts","../src/utils/index.ts","../src/utils/batch.ts","../src/utils/cursor.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/retry.ts","../src/core/apiSchema/requests.ts","../src/core/apiSchema/openapi.ts","../src/core/apiSchema/utils.ts","../src/OfferStore/index.ts","../src/OfferStore/MemoryOfferStore.ts","../src/RouterEvent.ts","../src/Validation.ts","../src/ValidationRule.ts"],"names":["viemEthereum","viemBase","Offer","z","maxUint256","Format","Errors","Base64","poll","Maturity","LLTV","parseUnits","createDocument","formatUnits","parameters","chains","Time","from","batch","run","offers","morpho","loanToken","parseAbi"],"mappings":"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","file":"index.browser.js","sourcesContent":["import type { Compute } from \"@morpho-dev/mempool\";\nimport type { Address } from \"viem\";\nimport { type Chain as ViemChain, base as viemBase, mainnet as viemEthereum } from \"viem/chains\";\n\nexport const chainNames = [\"ethereum\", \"base\", \"ethereum-virtual-testnet\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n \"ETHEREUM-VIRTUAL-TESTNET\": 121212n,\n};\nexport type ChainId = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: ChainId;\n name: ChainName;\n whitelistedAssets: Set<Address>;\n morpho: Address;\n mempool?: {\n address: Address;\n deploymentBlock: number;\n reindexBuffer: number;\n };\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: ChainId): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n whitelistedAssets: new Set(\n [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n },\n \"ethereum-virtual-testnet\": {\n ...viemEthereum,\n id: 121212n,\n name: \"ethereum-virtual-testnet\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n mempool: {\n address: \"0x7be3164eeee8b35092f6128ec32c2e6ff8f6c890\",\n deploymentBlock: 23225668,\n reindexBuffer: 10,\n },\n },\n};\n","import { type Compute, Errors, Format, type LLTV, type Maturity } from \"@morpho-dev/mempool\";\nimport { formatUnits } from \"viem\";\nimport * as ApiSchema from \"#core/apiSchema/index.ts\";\nimport { from, type OfferStatus } from \"#RouterOffer.ts\";\n\nexport type GetParameters = {\n /** Filter by multiple creator addresses (comma-separated) */\n creators?: string[];\n /** Filter by offer type: buy offers or sell offers */\n side?: \"buy\" | \"sell\";\n /** Filter by multiple blockchain networks (comma-separated chain IDs) */\n chains?: number[];\n /** Filter by multiple loan assets (comma-separated) */\n loanTokens?: string[];\n /** Filter by multiple statuses (comma-separated) */\n status?: OfferStatus[];\n /** Filter by multiple callback addresses (comma-separated) */\n callbackAddresses?: string[];\n /** Minimum amount of assets in the offer */\n minAmount?: bigint;\n /** Maximum amount of assets in the offer */\n maxAmount?: bigint;\n /** Minimum rate per asset (in wei) */\n minRate?: bigint;\n /** Maximum rate per asset (in wei) */\n maxRate?: bigint;\n /** Minimum maturity timestamp (Unix timestamp in seconds) */\n minMaturity?: Maturity.Maturity;\n /** Maximum maturity timestamp (Unix timestamp in seconds) */\n maxMaturity?: Maturity.Maturity;\n /** Minimum expiry timestamp (Unix timestamp in seconds) */\n minExpiry?: number;\n /** Maximum expiry timestamp (Unix timestamp in seconds) */\n maxExpiry?: number;\n /** Filter by multiple collateral assets (comma-separated) */\n collateralAssets?: string[];\n /** Filter by multiple rate oracles (comma-separated) */\n collateralOracles?: string[];\n /** Filter by collateral combinations */\n collateralTuple?: Array<{\n asset: string;\n oracle?: string;\n lltv?: LLTV.LLTV;\n }>;\n /** Minimum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal) */\n minLltv?: LLTV.LLTV;\n /** Maximum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal) */\n maxLltv?: LLTV.LLTV;\n /** Field to sort results by */\n sortBy?: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n /** Sort direction: asc (ascending) or desc (descending, default) */\n sortOrder?: \"asc\" | \"desc\";\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. Defaults to 20. Maximum is 100. */\n limit?: number;\n};\n\nexport type MatchParameters = {\n /** The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell */\n side: \"buy\" | \"sell\";\n /** The blockchain network chain ID */\n chainId: number;\n /** Rate per asset (in wei) for matching offers */\n rate?: bigint;\n /** Collateral requirements */\n collaterals?: Array<{\n asset: string;\n oracle: string;\n lltv: LLTV.LLTV;\n }>;\n /** Exact maturity timestamp (Unix timestamp in seconds) */\n maturity?: Maturity.Maturity;\n /** Minimum maturity timestamp (Unix timestamp in seconds, inclusive) */\n minMaturity?: Maturity.Maturity;\n /** Maximum maturity timestamp (Unix timestamp in seconds, inclusive) */\n maxMaturity?: Maturity.Maturity;\n /** The loan asset address to match against */\n loanToken?: string;\n /** Filter by a specific offer creator address */\n creator?: string;\n /** Filter by multiple statuses (comma-separated) */\n status?: OfferStatus[];\n /** Pagination cursor in base64url-encoded format */\n cursor?: string;\n /** Maximum number of offers to return. Defaults to 20. Maximum is 100. */\n limit?: number;\n};\n\nexport type RouterClientConfig = {\n readonly url: URL;\n readonly headers: Headers;\n};\n\nexport type Client = Compute<\n RouterClientConfig & {\n get: (\n parameters: GetParameters,\n ) => Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }>;\n match: (\n parameters: MatchParameters,\n ) => Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }>;\n }\n>;\n\nexport function connect(opts?: { url?: string; apiKey?: string }): Client {\n const u = new URL(opts?.url || \"https://router.morpho.dev\");\n\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n throw new InvalidUrlError(u.toString());\n }\n\n const headers = new Headers();\n headers.set(\"Content-Type\", \"application/json\");\n opts?.apiKey !== undefined ? headers.set(\"X-API-Key\", opts.apiKey) : null;\n\n const config: RouterClientConfig = {\n url: u,\n headers,\n };\n\n return {\n ...config,\n get: (parameters) => get(config, parameters),\n match: (parameters) => match(config, parameters),\n };\n}\n\nexport declare namespace connect {\n export type ErrorType = InvalidUrlError;\n}\n\n/**\n * Get offers from the router.\n * @returns The offers with pagination cursor.\n */\nexport async function get(\n config: RouterClientConfig,\n parameters: GetParameters,\n): Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }> {\n const url = new URL(`${config.url.toString()}v1/offers`);\n\n if (parameters.creators?.length) {\n url.searchParams.set(\"creators\", parameters.creators.join(\",\"));\n }\n if (parameters.side) {\n url.searchParams.set(\"side\", parameters.side);\n }\n if (parameters.chains?.length) {\n url.searchParams.set(\"chains\", parameters.chains.join(\",\"));\n }\n if (parameters.loanTokens?.length) {\n url.searchParams.set(\"loan_tokens\", parameters.loanTokens.join(\",\"));\n }\n if (parameters.status?.length) {\n url.searchParams.set(\"status\", parameters.status.join(\",\"));\n }\n if (parameters.callbackAddresses?.length) {\n url.searchParams.set(\"callback_addresses\", parameters.callbackAddresses.join(\",\"));\n }\n if (parameters.minAmount !== undefined) {\n url.searchParams.set(\"min_amount\", parameters.minAmount.toString());\n }\n if (parameters.maxAmount !== undefined) {\n url.searchParams.set(\"max_amount\", parameters.maxAmount.toString());\n }\n if (parameters.minRate !== undefined) {\n url.searchParams.set(\"min_rate\", parameters.minRate.toString());\n }\n if (parameters.maxRate !== undefined) {\n url.searchParams.set(\"max_rate\", parameters.maxRate.toString());\n }\n if (parameters.minMaturity !== undefined) {\n url.searchParams.set(\"min_maturity\", parameters.minMaturity.toString());\n }\n if (parameters.maxMaturity !== undefined) {\n url.searchParams.set(\"max_maturity\", parameters.maxMaturity.toString());\n }\n if (parameters.minExpiry !== undefined) {\n url.searchParams.set(\"min_expiry\", parameters.minExpiry.toString());\n }\n if (parameters.maxExpiry !== undefined) {\n url.searchParams.set(\"max_expiry\", parameters.maxExpiry.toString());\n }\n if (parameters.collateralAssets?.length) {\n url.searchParams.set(\"collateral_assets\", parameters.collateralAssets.join(\",\"));\n }\n if (parameters.collateralOracles?.length) {\n url.searchParams.set(\"collateral_oracles\", parameters.collateralOracles.join(\",\"));\n }\n if (parameters.collateralTuple?.length) {\n const tupleStr = parameters.collateralTuple\n .map(({ asset, oracle, lltv }) => {\n let result = asset;\n if (oracle) {\n result += `:${oracle}`;\n } else if (lltv !== undefined) {\n result += `:`; // Add empty oracle when lltv is present but oracle is undefined\n }\n if (lltv !== undefined) result += `:${formatUnits(lltv, 16)}`;\n return result;\n })\n .join(\"#\");\n url.searchParams.set(\"collateral_tuple\", tupleStr);\n }\n if (parameters.minLltv !== undefined) {\n url.searchParams.set(\"min_lltv\", formatUnits(parameters.minLltv, 16));\n }\n if (parameters.maxLltv !== undefined) {\n url.searchParams.set(\"max_lltv\", formatUnits(parameters.maxLltv, 16));\n }\n if (parameters.sortBy) {\n url.searchParams.set(\"sort_by\", parameters.sortBy);\n }\n if (parameters.sortOrder) {\n url.searchParams.set(\"sort_order\", parameters.sortOrder);\n }\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: Format.Snake<ApiSchema.OfferResponse>[];\n }>(config, url);\n\n const routerOffers = offers.map(Format.fromSnakeCase).map(ApiSchema.fromResponse);\n return {\n cursor: returnedCursor,\n offers: routerOffers.map(from).map(ApiSchema.toResponse),\n };\n}\n\nexport declare namespace get {\n export type ErrorType = GetApiErrorType;\n}\n\n/**\n * Match offers from the router.\n * @returns The matched offers with pagination cursor.\n */\nexport async function match(\n config: RouterClientConfig,\n parameters: MatchParameters,\n): Promise<{ cursor: string | null; offers: ApiSchema.OfferResponse[] }> {\n const url = new URL(`${config.url.toString()}v1/offers/match`);\n\n url.searchParams.set(\"side\", parameters.side);\n url.searchParams.set(\"chain_id\", parameters.chainId.toString());\n\n if (parameters.rate !== undefined) {\n url.searchParams.set(\"rate\", parameters.rate.toString());\n }\n if (parameters.collaterals?.length) {\n const collateralsStr = parameters.collaterals\n .map(({ asset, oracle, lltv }) => `${asset}:${oracle}:${formatUnits(lltv, 16)}`)\n .join(\"#\");\n url.searchParams.set(\"collaterals\", collateralsStr);\n }\n if (parameters.maturity !== undefined) {\n url.searchParams.set(\"maturity\", parameters.maturity.toString());\n }\n if (parameters.minMaturity !== undefined) {\n url.searchParams.set(\"min_maturity\", parameters.minMaturity.toString());\n }\n if (parameters.maxMaturity !== undefined) {\n url.searchParams.set(\"max_maturity\", parameters.maxMaturity.toString());\n }\n if (parameters.loanToken) {\n url.searchParams.set(\"loan_token\", parameters.loanToken);\n }\n if (parameters.creator) {\n url.searchParams.set(\"creator\", parameters.creator);\n }\n if (parameters.status?.length) {\n url.searchParams.set(\"status\", parameters.status.join(\",\"));\n }\n if (parameters.cursor) {\n url.searchParams.set(\"cursor\", parameters.cursor);\n }\n if (parameters.limit !== undefined) {\n url.searchParams.set(\"limit\", parameters.limit.toString());\n }\n\n const { cursor: returnedCursor, data: offers } = await getApi<{\n cursor: string | null;\n data: Format.Snake<ApiSchema.OfferResponse>[];\n }>(config, url);\n\n const routerOffers = offers.map(Format.fromSnakeCase).map(ApiSchema.fromResponse);\n return {\n cursor: returnedCursor,\n offers: routerOffers.map(from).map(ApiSchema.toResponse),\n };\n}\n\nexport declare namespace match {\n export type ErrorType = GetApiErrorType;\n}\n\ntype GetApiErrorType =\n | HttpGetOffersFailedError\n | HttpUnauthorizedError\n | HttpForbiddenError\n | HttpRateLimitError;\n\nasync function getApi<T>(config: RouterClientConfig, url: URL): Promise<T> {\n const pathname = url.pathname;\n let action: \"get_offers\" | \"match_offers\";\n\n switch (true) {\n case pathname.includes(\"/v1/offers/match\"):\n action = \"match_offers\";\n break;\n case pathname.includes(\"/v1/offers\"):\n action = \"get_offers\";\n break;\n default:\n throw new HttpGetOffersFailedError(\"Unknown endpoint\", {\n details: `Unsupported path: ${pathname}`,\n });\n }\n\n const schemaParseResult = ApiSchema.safeParse(action, Object.fromEntries(url.searchParams));\n if (!schemaParseResult.success) {\n throw new HttpGetOffersFailedError(`Invalid URL parameters`, {\n details: schemaParseResult.error.issues[0]?.message,\n });\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: config.headers,\n });\n\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new HttpUnauthorizedError();\n case 403:\n throw new HttpForbiddenError();\n case 429:\n throw new HttpRateLimitError();\n }\n throw new HttpGetOffersFailedError(`GET request returned ${response.status}`, {\n details: await response.text(),\n });\n }\n\n return response.json() as Promise<T>;\n}\n\nexport class InvalidUrlError extends Errors.BaseError {\n override name = \"Router.InvalidUrlError\";\n constructor(url: string) {\n super(`URL \"${url}\" is not http/https.`);\n }\n}\n\nexport class HttpUnauthorizedError extends Errors.BaseError {\n override name = \"Router.HttpUnauthorizedError\";\n constructor() {\n super(\"Unauthorized.\", {\n metaMessages: [\"Ensure that an API key is provided.\"],\n });\n }\n}\n\nexport class HttpForbiddenError extends Errors.BaseError {\n override name = \"Router.HttpForbiddenError\";\n constructor() {\n super(\"Forbidden.\", {\n metaMessages: [\"Ensure that the API key is valid.\"],\n });\n }\n}\n\nexport class HttpRateLimitError extends Errors.BaseError {\n override name = \"Router.HttpRateLimitError\";\n constructor() {\n super(\"Rate limit exceeded.\", {\n metaMessages: [\n \"The number of allowed requests has been exceeded. You must wait for the rate limit to reset.\",\n ],\n });\n }\n}\n\nexport class HttpGetOffersFailedError extends Errors.BaseError {\n override name = \"Router.HttpGetOffersFailedError\";\n constructor(message: string, { details }: { details?: string } = {}) {\n super(message, {\n metaMessages: [details],\n });\n }\n}\n","import { Errors, Format, Offer } from \"@morpho-dev/mempool\";\nimport { maxUint256 } from \"viem\";\nimport { type ZodError, z } from \"zod/v4\";\n\nexport const OfferStatusValues = [\n \"valid\",\n \"callback_not_supported\",\n \"callback_error\",\n \"unverified\",\n] as const;\nexport type OfferStatus = (typeof OfferStatusValues)[number];\n\nexport type OfferMetadata = {\n issue: string;\n};\n\nexport type RouterOffer = Offer.Offer & {\n consumed: bigint;\n status: OfferStatus;\n metadata?: OfferMetadata;\n};\n\nexport const RouterOfferSchema = (parameters?: { omitHash?: boolean }) =>\n Offer.OfferSchema(parameters).extend({\n consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n status: z.enum(OfferStatusValues),\n metadata: z\n .object({\n issue: z.string(),\n })\n .optional(),\n });\n\n/**\n * Creates a router offer from a plain object.\n * @throws {InvalidRouterOfferError} If the router offer is invalid.\n * @param input - The router offer to create.\n * @returns The created router offer with its hash.\n */\nexport function from(input: Omit<RouterOffer, \"hash\">): RouterOffer {\n try {\n const parsedOffer = RouterOfferSchema({ omitHash: true }).parse(input);\n const parsedHash = Offer.OfferHashSchema.parse(Offer.hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidRouterOfferError(error as ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidRouterOfferError;\n}\n\n/**\n * Creates a router offer from a snake case object.\n * @throws {InvalidRouterOfferError} If the router offer is invalid.\n * @param input - The router offer to create.\n * @returns The created router offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<RouterOffer, \"hash\">>): RouterOffer {\n return from(Format.fromSnakeCase(input));\n}\n\nexport declare namespace fromSnakeCase {\n export type ErrorType = InvalidRouterOfferError;\n}\n\n/**\n * Converts a router offer to a snake case object.\n * @param offer - The router offer to convert.\n * @returns The converted router offer.\n */\nexport function toSnakeCase(offer: RouterOffer): Format.Snake<RouterOffer> {\n return Format.toSnakeCase(offer);\n}\n\nexport function random(): RouterOffer {\n const baseOffer = Offer.random();\n\n return from({\n ...baseOffer,\n status: \"valid\",\n metadata: undefined,\n consumed: 0n,\n });\n}\n\nexport class InvalidRouterOfferError extends Errors.BaseError<ZodError | Error> {\n override readonly name = \"RouterOffer.InvalidRouterOfferError\";\n constructor(error: ZodError | Error) {\n super(\"Invalid router offer.\", { cause: error });\n }\n}\n","export * from \"./batch.ts\";\nexport * from \"./cursor.ts\";\nexport * from \"./poll.ts\";\nexport * from \"./retry.ts\";\nexport * from \"./wait.ts\";\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","import { Base64 } from \"js-base64\";\n// ---------- Cursor‑pagination helpers ----------\nexport type Cursor = {\n sort: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n dir: \"asc\" | \"desc\";\n rate?: string; // bigint rendered to string\n maturity?: number;\n expiry?: number;\n assets?: string; // bigint rendered to string\n hash: string;\n};\n\nexport function validateCursor(cursor: unknown): cursor is Cursor {\n if (!cursor || typeof cursor !== \"object\") {\n throw new Error(\"Cursor must be an object\");\n }\n\n const c = cursor as any;\n\n // Validate sort field\n if (![\"rate\", \"maturity\", \"expiry\", \"amount\"].includes(c.sort)) {\n throw new Error(\n `Invalid sort field: ${c.sort}. Must be one of: rate, maturity, expiry, amount`,\n );\n }\n\n // Validate direction\n if (![\"asc\", \"desc\"].includes(c.dir)) {\n throw new Error(`Invalid direction: ${c.dir}. Must be one of: asc, desc`);\n }\n\n // Validate hash format (basic hex validation)\n if (!/^0x[a-fA-F0-9]{64}$/.test(c.hash)) {\n throw new Error(\n `Invalid hash format: ${c.hash}. Must be a 64-character hex string starting with 0x`,\n );\n }\n\n // Validate sort-specific fields\n const validations: Record<\n string,\n {\n field: string;\n type: \"string\" | \"number\";\n pattern?: RegExp;\n validator?: (val: any) => boolean;\n error: string;\n }\n > = {\n rate: {\n field: \"rate\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n amount: {\n field: \"assets\",\n type: \"string\",\n pattern: /^\\d+$/,\n error: \"numeric string\",\n },\n maturity: {\n field: \"maturity\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n expiry: {\n field: \"expiry\",\n type: \"number\",\n validator: (val: number) => val > 0,\n error: \"positive number\",\n },\n };\n\n const validation = validations[c.sort];\n if (!validation) {\n throw new Error(`Invalid sort field: ${c.sort}`);\n }\n\n const fieldValue = c[validation.field];\n\n if (!fieldValue) {\n throw new Error(`${c.sort} sort requires '${validation.field}' field to be present`);\n }\n\n if (typeof fieldValue !== validation.type) {\n throw new Error(\n `${c.sort} sort requires '${validation.field}' field of type ${validation.type}`,\n );\n }\n\n if (validation.pattern && !validation.pattern.test(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} format: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n if (validation.validator && !validation.validator(fieldValue)) {\n throw new Error(\n `Invalid ${validation.field} value: ${fieldValue}. Must be a ${validation.error}`,\n );\n }\n\n return true;\n}\n\nexport function encodeCursor(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decodeCursor(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validateCursor(decoded);\n return decoded;\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import { LLTV, Maturity } from \"@morpho-dev/mempool\";\nimport { parseUnits } from \"viem\";\nimport { z } from \"zod/v4\";\nimport { type OfferStatus, OfferStatusValues } from \"#RouterOffer.ts\";\nimport { decodeCursor } from \"#utils/index.ts\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst MAX_LLTV = 100;\nconst MIN_LLTV = 0;\n\nexport const GetOffersQueryParams = z\n .object({\n // Core filtering parameters\n creators: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Creators must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple creator addresses (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n side: z.enum([\"buy\", \"sell\"]).optional().meta({\n description: \"Filter by offer type: buy offers or sell offers\",\n example: \"buy\",\n }),\n chains: z\n .string()\n .regex(/^\\d+(,\\d+)*$/, {\n message: \"Chains must be comma-separated chain IDs\",\n })\n .transform((val) => val.split(\",\").map(Number))\n .optional()\n .meta({\n description: \"Filter by multiple blockchain networks (comma-separated chain IDs)\",\n example: \"1,137,10\",\n }),\n loan_tokens: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Loan assets must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple loan assets (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n status: z\n .string()\n .regex(/^[a-zA-Z_]+(,[a-zA-Z_]+)*$/, {\n message: \"Status must be comma-separated status values\",\n })\n .transform((val) => val.split(\",\") as OfferStatus[])\n .refine((statuses) => statuses.every((status) => OfferStatusValues.includes(status)), {\n message: `Invalid status value. Must be one of: ${OfferStatusValues.join(\", \")}`,\n })\n .optional()\n .meta({\n description: `Filter by multiple statuses (comma-separated). Valid values: ${OfferStatusValues.join(\", \")}. By default, only offers with 'valid' status are returned.`,\n example: \"valid,callback_error\",\n }),\n callback_addresses: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Callback addresses must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple callback addresses (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n\n // Asset range\n min_amount: z\n .bigint({ coerce: true })\n .positive({\n message: \"Min amount must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Minimum amount of assets in the offer\",\n example: \"1000\",\n }),\n max_amount: z\n .bigint({ coerce: true })\n .positive({\n message: \"Max amount must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Maximum amount of assets in the offer\",\n example: \"10000\",\n }),\n\n // Rate range\n min_rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Min rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Minimum rate per asset (in wei)\",\n example: \"500000000000000000\",\n }),\n max_rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Max rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Maximum rate per asset (in wei)\",\n example: \"1500000000000000000\",\n }),\n\n // Time range\n min_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n max_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n min_expiry: z.coerce.number().int().optional().meta({\n description: \"Minimum expiry timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_expiry: z.coerce.number().int().optional().meta({\n description: \"Maximum expiry timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\n\n // Collateral filtering\n collateral_assets: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Collateral assets must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple collateral assets (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n collateral_oracles: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}(,0x[a-fA-F0-9]{40})*$/, {\n message: \"Collateral oracles must be comma-separated Ethereum addresses\",\n })\n .transform((val) => val.split(\",\").map((addr) => addr.toLowerCase()))\n .optional()\n .meta({\n description: \"Filter by multiple rate oracles (comma-separated)\",\n example:\n \"0x1234567890123456789012345678901234567890,0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\",\n }),\n collateral_tuple: z\n .string()\n .regex(\n /^(0x[a-fA-F0-9]{40}(:0x[a-fA-F0-9]{40})?(:[0-9]+(\\.[0-9]+)?)?)(#0x[a-fA-F0-9]{40}(:0x[a-fA-F0-9]{40})?(:[0-9]+(\\.[0-9]+)?)?)*$/,\n {\n message:\n \"Collateral tuple must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. Oracle and lltv are optional. Asset must be 0x + 40 hex chars, oracle must be 0x + 40 hex chars, lltv must be a number (e.g., 80.5).\",\n },\n )\n .transform((val, ctx) => {\n return val.split(\"#\").map((tuple) => {\n const parts = tuple.split(\":\");\n\n if (parts.length === 0 || !parts[0]) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Asset address is required for each collateral tuple\",\n path: [\"asset\"],\n input: val,\n });\n return z.NEVER;\n }\n\n const asset = parts[0]?.toLowerCase();\n const oracle = parts[1]?.toLowerCase();\n const lltv = parts[2] ? parseFloat(parts[2]) : undefined;\n\n if (lltv !== undefined && (lltv < MIN_LLTV || lltv > MAX_LLTV)) {\n ctx.addIssue({\n code: \"custom\",\n message: `LLTV must be between ${MIN_LLTV} and ${MAX_LLTV} (0-100%)`,\n path: [\"lltv\"],\n input: val,\n });\n return z.NEVER;\n }\n\n let lltvValue: LLTV.LLTV | undefined;\n if (lltv !== undefined) {\n try {\n lltvValue = LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.issues.push({\n code: \"custom\",\n message:\n e instanceof LLTV.InvalidLLTVError || e instanceof LLTV.InvalidOptionError\n ? e.message\n : \"Invalid LLTV.\",\n input: lltv,\n path: [\"lltv\"],\n });\n return z.NEVER;\n }\n }\n\n return {\n asset,\n oracle,\n lltv: lltvValue,\n };\n });\n })\n .optional()\n .meta({\n description:\n \"Filter by collateral combinations in format: asset:oracle:lltv#asset2:oracle2:lltv2. Oracle and lltv are optional. Use # to separate multiple combinations.\",\n example:\n \"0x1234567890123456789012345678901234567890:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd:86#0x9876543210987654321098765432109876543210:94.5\",\n }),\n min_lltv: z.coerce\n .number()\n .min(0, { message: \"LLTV must be above 0\" })\n .max(100, { message: \"LLTV must be below 100\" })\n .transform((lltv, ctx) => {\n try {\n return LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as LLTV.from.ErrorType).message,\n input: lltv,\n });\n return z.NEVER;\n }\n })\n .optional()\n .meta({\n description:\n \"Minimum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal, e.g., 80.5 = 80.5%)\",\n example: \"80.5\",\n }),\n max_lltv: z.coerce\n .number()\n .min(0, { message: \"LLTV must be above 0\" })\n .max(100, { message: \"LLTV must be below 100\" })\n .transform((lltv, ctx) => {\n try {\n return LLTV.from(parseUnits(lltv.toString(), 16));\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as LLTV.from.ErrorType).message,\n input: lltv,\n });\n return z.NEVER;\n }\n })\n .optional()\n .meta({\n description:\n \"Maximum Loan-to-Value ratio (LLTV) for collateral (percentage as decimal, e.g., 95.5 = 95.5%)\",\n example: \"95.5\",\n }),\n\n // Sorting parameters\n sort_by: z.enum([\"rate\", \"maturity\", \"expiry\", \"amount\"]).optional().meta({\n description: \"Field to sort results by\",\n example: \"rate\",\n }),\n sort_order: z.enum([\"asc\", \"desc\"]).optional().default(\"desc\").meta({\n description: \"Sort direction: asc (ascending) or desc (descending, default)\",\n example: \"desc\",\n }),\n\n // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = decodeCursor(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n })\n .refine(\n (data) =>\n data.min_maturity === undefined ||\n data.max_maturity === undefined ||\n data.max_maturity >= data.min_maturity,\n {\n message: \"max_maturity must be greater than or equal to min_maturity\",\n path: [\"max_maturity\"],\n },\n )\n .refine(\n (data) =>\n data.min_expiry === undefined ||\n data.max_expiry === undefined ||\n data.max_expiry >= data.min_expiry,\n {\n message: \"max_expiry must be greater than or equal to min_expiry\",\n path: [\"max_expiry\"],\n },\n )\n .refine(\n (data) =>\n data.min_amount === undefined ||\n data.max_amount === undefined ||\n data.max_amount >= data.min_amount,\n {\n message: \"max_amount must be greater than or equal to min_amount\",\n path: [\"max_amount\"],\n },\n )\n .refine(\n (data) =>\n data.min_rate === undefined || data.max_rate === undefined || data.max_rate >= data.min_rate,\n {\n message: \"max_rate must be greater than or equal to min_rate\",\n path: [\"max_rate\"],\n },\n )\n .refine(\n (data) =>\n data.min_lltv === undefined || data.max_lltv === undefined || data.max_lltv >= data.min_lltv,\n {\n message: \"max_lltv must be greater than or equal to min_lltv\",\n path: [\"max_lltv\"],\n },\n );\n\nexport const MatchOffersQueryParams = z\n .object({\n // Required parameters\n side: z.enum([\"buy\", \"sell\"]).meta({\n description:\n \"The desired side of the match: 'buy' if you want to buy, 'sell' if you want to sell. If your intent is to sell, buy offers will be returned, and vice versa.\",\n example: \"buy\",\n }),\n chain_id: z\n .string()\n .regex(/^\\d+$/, {\n message: \"Chain ID must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(z.number().positive())\n .meta({\n description: \"The blockchain network chain ID\",\n example: \"1\",\n }),\n\n // Optional parameters\n rate: z\n .bigint({ coerce: true })\n .positive({\n message: \"Rate must be a positive number\",\n })\n .optional()\n .meta({\n description: \"Rate per asset (in wei) for matching offers\",\n example: \"1000000000000000000\",\n }),\n\n // Collateral filtering\n collaterals: z\n .string()\n .regex(\n /^(0x[a-fA-F0-9]{40}:0x[a-fA-F0-9]{40}:[0-9]+(\\.[0-9]+)?)(#0x[a-fA-F0-9]{40}:0x[a-fA-F0-9]{40}:[0-9]+(\\.[0-9]+)?)*$/,\n {\n message:\n \"Collaterals must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. All fields are required for each collateral.\",\n },\n )\n .transform((val, ctx) => {\n return val.split(\"#\").map((collateral) => {\n const parts = collateral.split(\":\");\n\n if (parts.length !== 3) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each collateral must have exactly 3 parts: asset:oracle:lltv\",\n path: [\"collaterals\"],\n input: val,\n });\n return z.NEVER;\n }\n\n const [asset, oracle, lltvStr] = parts;\n\n if (!asset || !oracle || !lltvStr) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Asset, oracle, and lltv are all required for each collateral\",\n path: [\"collaterals\"],\n input: val,\n });\n }\n\n let lltvValue: LLTV.LLTV | undefined;\n if (lltvStr !== undefined) {\n try {\n lltvValue = LLTV.from(parseUnits(lltvStr, 16));\n } catch (e: unknown) {\n ctx.issues.push({\n code: \"custom\",\n message:\n e instanceof LLTV.InvalidLLTVError || e instanceof LLTV.InvalidOptionError\n ? e.message\n : \"Invalid LLTV.\",\n input: lltvStr,\n path: [\"lltv\"],\n });\n return z.NEVER;\n }\n }\n\n return {\n asset: asset!.toLowerCase(),\n oracle: oracle!.toLowerCase(),\n lltv: lltvValue!,\n };\n });\n })\n .optional()\n .meta({\n description:\n \"Collateral requirements in format: asset:oracle:lltv#asset2:oracle2:lltv2. Use # to separate multiple collaterals.\",\n example:\n \"0x1234567890123456789012345678901234567890:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd:86#0x9876543210987654321098765432109876543210:0xfedcbafedcbafedcbafedcbafedcbafedcbafedc:94.5\",\n }),\n\n // Maturity filtering\n maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n min_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n max_maturity: z.coerce\n .number()\n .int()\n .positive()\n .transform((maturity, ctx) => {\n try {\n return Maturity.from(maturity);\n } catch (e: unknown) {\n ctx.addIssue({\n code: \"custom\",\n message: (e as Maturity.from.ErrorType).message,\n });\n return z.NEVER;\n }\n })\n .optional(),\n\n // Asset and creator filtering\n loan_token: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, {\n message: \"Loan asset must be a valid Ethereum address\",\n })\n .transform((val) => val.toLowerCase())\n .optional()\n .meta({\n description: \"The loan asset address to match against\",\n example: \"0x1234567890123456789012345678901234567890\",\n }),\n creator: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, {\n message: \"Creator must be a valid Ethereum address\",\n })\n .transform((val) => val.toLowerCase())\n .optional()\n .meta({\n description: \"Filter by a specific offer creator address\",\n example: \"0x1234567890123456789012345678901234567890\",\n }),\n\n // Status filtering\n status: z\n .string()\n .regex(/^[a-zA-Z_]+(,[a-zA-Z_]+)*$/, {\n message: \"Status must be comma-separated status values\",\n })\n .transform((val) => val.split(\",\") as OfferStatus[])\n .refine((statuses) => statuses.every((status) => OfferStatusValues.includes(status)), {\n message: `Invalid status value. Must be one of: ${OfferStatusValues.join(\", \")}`,\n })\n .optional()\n .meta({\n description: `Filter by multiple statuses (comma-separated). Valid values: ${OfferStatusValues.join(\", \")}. By default, only offers with 'valid' status are returned.`,\n example: \"valid,callback_error\",\n }),\n\n // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = decodeCursor(val);\n return decoded !== null;\n } catch (_error) {\n return false; // Invalid cursor\n }\n },\n {\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n )\n .meta({\n description: \"Pagination cursor in base64url-encoded format\",\n example:\n \"eyJzb3J0IjoicHJpY2UiLCJkaXIiOiJkZXNjIiwicHJpY2UiOiIxMDAwMDAwMDAwMDAwMDAwMDAwIiwiaGFzaCI6IjB4ZGRmZDY4NTllM2UwODJkMTkzODlhMWFlYzFiZGFkN2U4ZDkyZDk2YjFhYTc5NDBkYTkxYTMxMjVkMzFlM2JlNWIifQ\",\n }),\n limit: z\n .string()\n .regex(/^[1-9]\\d*$/, {\n message: \"Limit must be a positive integer\",\n })\n .transform((val) => Number.parseInt(val, 10))\n .pipe(\n z.number().max(MAX_LIMIT, {\n message: `Limit cannot exceed ${MAX_LIMIT}`,\n }),\n )\n .optional()\n .default(DEFAULT_LIMIT)\n .meta({\n description: `Limit maximum: ${MAX_LIMIT}. Default: ${DEFAULT_LIMIT}`,\n example: 10,\n }),\n })\n .refine(\n (data) =>\n data.min_maturity === undefined ||\n data.max_maturity === undefined ||\n data.max_maturity >= data.min_maturity,\n {\n message: \"max_maturity must be greater than or equal to min_maturity\",\n path: [\"max_maturity\"],\n },\n );\nconst schemas = {\n get_offers: GetOffersQueryParams,\n match_offers: MatchOffersQueryParams,\n} as const;\n\ntype Action = keyof typeof schemas;\n\nexport function parse<A extends Action>(action: A, query: unknown): z.infer<(typeof schemas)[A]> {\n return schemas[action].parse(query) as z.infer<(typeof schemas)[A]>;\n}\n\nexport function safeParse<A extends Action>(\n action: A,\n query: unknown,\n error?: z.core.$ZodErrorMap<z.core.$ZodIssue>,\n): z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>> {\n return schemas[action].safeParse(query, {\n error,\n }) as z.ZodSafeParseResult<z.infer<(typeof schemas)[A]>>;\n}\n","import { z } from \"zod/v4\";\nimport { createDocument, type ZodOpenApiPathsObject } from \"zod-openapi\";\nimport { GetOffersQueryParams, MatchOffersQueryParams } from \"./requests.ts\";\n\nconst successResponseSchema = z.object({\n status: z.literal(\"success\"),\n cursor: z.string().nullable(),\n data: z.array(z.any()),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst errorResponseSchema = z.object({\n status: z.literal(\"error\"),\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.any().optional(),\n }),\n meta: z.object({\n timestamp: z.string(),\n }),\n});\n\nconst paths: ZodOpenApiPathsObject = {\n \"/v1/offers\": {\n get: {\n summary: \"Get offers\",\n description: \"Get all offers with optional filtering and pagination\",\n tags: [\"Offers\"],\n requestParams: {\n query: GetOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/offers/match\": {\n get: {\n summary: \"Match offers\",\n description: \"Find offers that match specific criteria\",\n tags: [\"Offers\"],\n requestParams: {\n query: MatchOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: successResponseSchema,\n },\n },\n },\n 400: {\n description: \"Bad Request\",\n content: {\n \"application/json\": {\n schema: errorResponseSchema,\n },\n },\n },\n },\n },\n },\n};\n\nexport const OpenApi = createDocument({\n openapi: \"3.1.0\",\n info: {\n title: \"Router API\",\n version: \"1.0.0\",\n description: \"API for the Morpho Router\",\n },\n tags: [\n {\n name: \"Offers\",\n },\n ],\n servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:8081\",\n description: \"Local development server\",\n },\n ],\n paths,\n});\n","import type { Offer } from \"@morpho-dev/mempool\";\nimport type { OfferMetadata, OfferStatus, RouterOffer } from \"#RouterOffer.ts\";\n\nexport type OfferResponse = {\n offer: Offer.Offer;\n consumed: bigint;\n status: OfferStatus;\n metadata?: OfferMetadata;\n};\n\n/**\n * Transforms a RouterOffer to OfferResponse format.\n * @param routerOffer - The router offer to transform.\n * @returns The router offer response with offer as a nested property.\n */\nexport function toResponse(routerOffer: RouterOffer): OfferResponse {\n const { consumed, status, metadata, ...offer } = routerOffer;\n return {\n offer,\n consumed,\n status,\n metadata,\n };\n}\n\n/**\n * Transforms a OfferResponse to RouterOffer format.\n * @param offerResponse - The router offer response to transform.\n * @returns The router offer with all properties at the top level.\n */\nexport function fromResponse(offerResponse: OfferResponse): RouterOffer {\n const { offer, consumed, status, metadata } = offerResponse;\n return {\n ...offer,\n consumed,\n status,\n metadata,\n };\n}\n","export * from \"./MemoryOfferStore.ts\";\nexport * from \"./types.ts\";\n","import { LLTV, Maturity, type Offer, Time } from \"@morpho-dev/mempool\";\nimport type { Address, Hex } from \"viem\";\nimport type * as Chain from \"#Chain.ts\";\nimport type * as RouterOffer from \"#RouterOffer.ts\";\nimport { type Cursor, decodeCursor, encodeCursor } from \"#utils/cursor.ts\";\nimport type {\n FindMatchingOffersParams,\n GetAllParams,\n GetOffersFilters,\n OfferStore,\n} from \"./types.ts\";\n\nexport function memory(parameters: {\n offers: Map<\n Hex,\n Offer.Offer & { status: RouterOffer.OfferStatus; metadata?: RouterOffer.OfferMetadata }\n >;\n filled: Map<Chain.ChainId, Map<Address, Map<bigint, bigint>>>;\n}): OfferStore {\n const map: Map<\n Hex,\n Offer.Offer & { status: RouterOffer.OfferStatus; metadata?: RouterOffer.OfferMetadata }\n > = parameters.offers;\n // chainId -> address -> nonce -> consumed amount\n const filled: Map<Chain.ChainId, Map<Address, Map<bigint, bigint>>> = parameters.filled;\n const indexingProgress = new Map<string, number>();\n\n const create = async (parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<string> => {\n if (map.has(parameters.offer.hash.toLowerCase() as `0x${string}`)) return parameters.offer.hash;\n map.set(parameters.offer.hash.toLowerCase() as `0x${string}`, {\n ...parameters.offer,\n status: parameters.status,\n metadata: parameters.metadata,\n });\n const chainId = parameters.offer.chainId;\n const address = parameters.offer.offering.toLowerCase() as `0x${string}`;\n const nonce = parameters.offer.nonce;\n\n const filledForChain = filled.get(chainId) || new Map();\n const filledForOffering = filledForChain.get(address) || new Map();\n if (!filledForOffering.has(nonce)) filledForOffering.set(nonce, 0n);\n filledForChain.set(address, filledForOffering);\n filled.set(chainId, filledForChain);\n\n return Promise.resolve(parameters.offer.hash);\n };\n\n const sort = (\n sortBy: GetOffersFilters[\"sortBy\"],\n sortOrder: GetOffersFilters[\"sortOrder\"],\n a: RouterOffer.RouterOffer,\n b: RouterOffer.RouterOffer,\n ) => {\n sortBy = sortBy || \"expiry\";\n sortOrder = sortOrder || \"desc\";\n\n const sortKey = sortBy === \"amount\" ? \"assets\" : sortBy;\n\n if (a[sortKey] === b[sortKey]) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : b.hash > a.hash ? 1 : -1;\n }\n\n switch (sortBy) {\n case \"rate\":\n if (a.rate === b.rate) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.rate > b.rate ? 1 : -1) : b.rate > a.rate ? 1 : -1;\n case \"maturity\":\n if (a.maturity === b.maturity) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\"\n ? a.maturity > b.maturity\n ? 1\n : -1\n : b.maturity > a.maturity\n ? 1\n : -1;\n case \"expiry\":\n if (a.expiry === b.expiry) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.expiry > b.expiry ? 1 : -1) : b.expiry > a.expiry ? 1 : -1;\n case \"amount\":\n if (a.assets === b.assets) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.assets > b.assets ? 1 : -1) : b.assets > a.assets ? 1 : -1;\n default:\n if (a.expiry === b.expiry) {\n if (a.hash === b.hash) return 0;\n return sortOrder === \"asc\" ? (a.hash > b.hash ? 1 : -1) : a.hash > b.hash ? -1 : 1;\n }\n return sortOrder === \"asc\" ? (a.expiry > b.expiry ? 1 : -1) : b.expiry > a.expiry ? 1 : -1;\n }\n };\n\n return {\n create,\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[],\n ): Promise<string[]> => {\n return Promise.all(\n parameters.map((p) => create({ offer: p.offer, status: p.status, metadata: p.metadata })),\n );\n },\n\n getAll: async (\n params?: GetAllParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const { query } = params || {};\n let {\n creators,\n side,\n chains,\n loanTokens,\n status = [\"valid\"],\n callbackAddresses,\n minAmount,\n maxAmount,\n minRate,\n maxRate,\n minMaturity,\n maxMaturity,\n minExpiry,\n maxExpiry,\n collateralAssets,\n collateralOracles,\n collateralTuple,\n minLltv,\n maxLltv,\n sortBy = \"expiry\",\n sortOrder = \"desc\",\n cursor: queryCursor,\n limit = 20,\n } = query || {};\n\n const now = Time.now();\n const buy = side === \"buy\";\n\n let offers: RouterOffer.RouterOffer[] = Array.from(map.values())\n .map((o) => ({\n ...o,\n consumed:\n filled\n .get(o.chainId)\n ?.get(o.offering.toLowerCase() as `0x${string}`)\n ?.get(o.nonce) || 0n,\n }))\n .filter((o) => o.consumed < o.assets);\n\n const cursor = decodeCursor(queryCursor);\n if (cursor) {\n // ignore/throw if cursor mismatches current sort options\n if (cursor.sort !== sortBy || cursor.dir !== sortOrder) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n\n switch (cursor.sort) {\n case \"rate\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.rate >= BigInt(cursor.rate!)\n : o.rate <= BigInt(cursor.rate!)) &&\n (o.rate !== BigInt(cursor.rate!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"maturity\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.maturity >= BigInt(cursor.maturity!)\n : o.maturity <= BigInt(cursor.maturity!)) &&\n (o.maturity !== Maturity.from(cursor.maturity!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"expiry\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\" ? o.expiry >= cursor.expiry! : o.expiry <= cursor.expiry!) &&\n (o.expiry !== cursor.expiry! ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n case \"amount\":\n offers = offers.filter(\n (o) =>\n (sortOrder === \"asc\"\n ? o.assets >= BigInt(cursor.assets!)\n : o.assets <= BigInt(cursor.assets!)) &&\n (o.assets !== BigInt(cursor.assets!) ||\n (sortOrder === \"asc\" ? o.hash > cursor.hash : o.hash < cursor.hash)),\n );\n break;\n default:\n throw new Error(\"Invalid sort parameter\");\n }\n\n offers = offers.filter((o) => o.hash !== cursor.hash);\n }\n\n creators && (creators = creators.map((c) => c.toLowerCase()));\n loanTokens && (loanTokens = loanTokens.map((lt) => lt.toLowerCase()));\n callbackAddresses && (callbackAddresses = callbackAddresses.map((ca) => ca.toLowerCase()));\n collateralAssets && (collateralAssets = collateralAssets.map((ca) => ca.toLowerCase()));\n collateralOracles && (collateralOracles = collateralOracles.map((co) => co.toLowerCase()));\n collateralTuple &&\n (collateralTuple = collateralTuple.map((ct) => ({\n asset: ct.asset.toLowerCase(),\n oracle: ct.oracle?.toLowerCase(),\n })));\n\n offers = offers.filter((o) => o.expiry >= now);\n creators && (offers = offers.filter((o) => creators.includes(o.offering.toLowerCase())));\n side && (offers = offers.filter((o) => o.buy === buy));\n chains && (offers = offers.filter((o) => chains.includes(Number(o.chainId))));\n loanTokens && (offers = offers.filter((o) => loanTokens.includes(o.loanToken.toLowerCase())));\n status && (offers = offers.filter((o) => status.includes(o.status)));\n callbackAddresses &&\n (offers = offers.filter((o) =>\n callbackAddresses.includes(o.callback.address.toLowerCase()),\n ));\n minAmount && (offers = offers.filter((o) => o.assets >= minAmount));\n maxAmount && (offers = offers.filter((o) => o.assets <= maxAmount));\n minRate && (offers = offers.filter((o) => o.rate >= minRate));\n maxRate && (offers = offers.filter((o) => o.rate <= maxRate));\n minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));\n maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));\n minExpiry && (offers = offers.filter((o) => o.expiry >= minExpiry));\n maxExpiry && (offers = offers.filter((o) => o.expiry <= maxExpiry));\n collateralAssets &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) => collateralAssets.includes(c.asset.toLowerCase())),\n ));\n collateralOracles &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) => collateralOracles.includes(c.oracle.toLowerCase())),\n ));\n collateralTuple &&\n (offers = offers.filter((o) =>\n o.collaterals.some((c) =>\n collateralTuple.some(\n (ct) =>\n c.asset.toLowerCase() === ct.asset.toLowerCase() &&\n (ct.oracle ? c.oracle.toLowerCase() === ct.oracle.toLowerCase() : true) &&\n (ct.lltv ? c.lltv === LLTV.from(BigInt(ct.lltv)) : true),\n ),\n ),\n ));\n minLltv && (offers = offers.filter((o) => o.collaterals.every((c) => c.lltv >= minLltv)));\n maxLltv && (offers = offers.filter((o) => o.collaterals.every((c) => c.lltv <= maxLltv)));\n\n offers = offers.sort((a, b) => sort(sortBy, sortOrder, a, b));\n\n let nextCursor: string | null = null;\n if (offers.length > limit) {\n const last = offers[limit - 1]!;\n const base: Cursor = {\n sort: sortBy,\n dir: sortOrder,\n hash: last.hash,\n };\n\n switch (sortBy) {\n case \"rate\":\n base.rate = last.rate.toString();\n break;\n case \"amount\":\n base.assets = last.assets.toString();\n break;\n case \"maturity\":\n base.maturity = last.maturity;\n break;\n default:\n base.expiry = last.expiry;\n }\n nextCursor = encodeCursor(base);\n }\n\n offers = offers.slice(0, limit);\n\n return {\n offers,\n nextCursor,\n };\n },\n\n findMatchingOffers: async (\n params: FindMatchingOffersParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const {\n side,\n chainId,\n rate,\n collaterals = [],\n maturity,\n minMaturity,\n maxMaturity,\n loanToken,\n creator,\n status,\n cursor: queryCursor,\n limit = 20,\n } = params;\n\n const now = Time.now();\n const isBuying = side === \"buy\";\n const sortOrder: \"asc\" | \"desc\" = isBuying ? \"desc\" : \"asc\";\n\n let offers: RouterOffer.RouterOffer[] = Array.from(map.values())\n .map((o) => ({\n ...o,\n consumed:\n filled\n .get(o.chainId)\n ?.get(o.offering.toLowerCase() as `0x${string}`)\n ?.get(o.nonce) || 0n,\n }))\n .filter((o) => o.consumed < o.assets);\n\n const cursor = decodeCursor(queryCursor);\n if (cursor) {\n // ignore/throw if cursor mismatches current sort options\n if (cursor.sort !== \"rate\" || cursor.dir !== sortOrder) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n offers = offers.filter((o) =>\n sortOrder === \"asc\" ? o.rate >= BigInt(cursor.rate!) : o.rate <= BigInt(cursor.rate!),\n );\n }\n\n // We need to sort after selecting best offers per (offering, nonce, buy) group\n\n offers = offers.filter((o) => o.buy === !isBuying);\n offers = offers.filter((o) => o.chainId === BigInt(chainId));\n offers = offers.filter((o) => o.expiry >= now);\n rate && (offers = offers.filter((o) => (isBuying ? o.rate >= rate : o.rate <= rate)));\n collaterals.length > 0 &&\n (offers = offers.filter((o) =>\n isBuying\n ? // when wanting to buy, sell offer collaterals ⊆ user buy collaterals\n o.collaterals.every((oc) => {\n return collaterals.some(\n (c) =>\n oc.asset.toLowerCase() === c.asset.toLowerCase() &&\n oc.oracle.toLowerCase() === c.oracle.toLowerCase() &&\n oc.lltv === c.lltv,\n );\n })\n : // when wanting to sell, user sell collaterals ⊆ buy offer collaterals\n collaterals.every((c) => {\n return o.collaterals.some(\n (oc) =>\n oc.asset.toLowerCase() === c.asset.toLowerCase() &&\n oc.oracle.toLowerCase() === c.oracle.toLowerCase() &&\n oc.lltv === c.lltv,\n );\n }),\n ));\n maturity && (offers = offers.filter((o) => o.maturity === maturity));\n minMaturity && (offers = offers.filter((o) => o.maturity >= minMaturity));\n maxMaturity && (offers = offers.filter((o) => o.maturity <= maxMaturity));\n loanToken &&\n (offers = offers.filter((o) => o.loanToken.toLowerCase() === loanToken.toLowerCase()));\n creator &&\n (offers = offers.filter((o) => o.offering.toLowerCase() === creator.toLowerCase()));\n status && (offers = offers.filter((o) => status.includes(o.status)));\n\n // Select best offer per (offering, nonce, buy, chainId) group\n // Priority:\n // 1) price: for lend (buy=true) lower rate is better; for borrow (buy=false) higher rate is better\n // 2) remaining size: (assets - consumed) desc\n // 3) term: maturity desc\n // 4) deterministic tiebreak: hash lex asc\n const byGroup = new Map<string, RouterOffer.RouterOffer>();\n for (const offer of offers) {\n const groupKey = `${offer.chainId}-${offer.offering.toLowerCase()}-${offer.nonce}-${offer.buy}`;\n const current = byGroup.get(groupKey);\n if (!current) {\n byGroup.set(groupKey, offer);\n continue;\n }\n\n const remainingCandidate = offer.assets - offer.consumed;\n const remainingCurrent = current.assets - current.consumed;\n\n let candidateIsBetter = false;\n if (offer.buy) {\n // lend book: lower rate better\n if (offer.rate !== current.rate) candidateIsBetter = offer.rate < current.rate;\n else if (remainingCandidate !== remainingCurrent)\n candidateIsBetter = remainingCandidate > remainingCurrent;\n else if (offer.maturity !== current.maturity)\n candidateIsBetter = offer.maturity > current.maturity;\n else candidateIsBetter = offer.hash < current.hash;\n } else {\n // borrow book: higher rate better\n if (offer.rate !== current.rate) candidateIsBetter = offer.rate > current.rate;\n else if (remainingCandidate !== remainingCurrent)\n candidateIsBetter = remainingCandidate > remainingCurrent;\n else if (offer.maturity !== current.maturity)\n candidateIsBetter = offer.maturity > current.maturity;\n else candidateIsBetter = offer.hash < current.hash;\n }\n\n if (candidateIsBetter) byGroup.set(groupKey, offer);\n }\n\n offers = Array.from(byGroup.values());\n\n // Final ordering for response/pagination\n offers = offers.sort((a, b) => sort(\"rate\", sortOrder, a, b));\n\n // remove cursor offer from result\n // we kept it this far to remove offers in same group\n cursor && (offers = offers.filter((o) => o.hash !== cursor.hash));\n\n let nextCursor: string | null = null;\n if (offers.length > limit) {\n const last = offers[limit - 1]!;\n nextCursor = encodeCursor({\n sort: \"rate\",\n dir: sortOrder,\n hash: last.hash,\n rate: last.rate.toString(),\n });\n }\n\n offers = offers.slice(0, limit);\n\n return {\n offers,\n nextCursor,\n };\n },\n\n delete: async (hash: Offer.Offer[\"hash\"]): Promise<boolean> => {\n if (!map.has(hash.toLowerCase() as `0x${string}`)) return false;\n map.delete(hash.toLowerCase() as `0x${string}`);\n return true;\n },\n\n deleteMany: async (hashes: Offer.Offer[\"hash\"][]): Promise<number> => {\n let deleted = 0;\n for (const hash of hashes) {\n if (map.has(hash.toLowerCase() as `0x${string}`)) {\n map.delete(hash.toLowerCase() as `0x${string}`);\n deleted++;\n }\n }\n return deleted;\n },\n\n updateStatus: async (parameters: {\n offerHash: Offer.Offer[\"hash\"];\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<void> => {\n const key = parameters.offerHash.toLowerCase() as `0x${string}`;\n const existing = map.get(key);\n if (!existing) return;\n if (existing.status === parameters.status) return;\n map.set(key, {\n ...existing,\n status: parameters.status,\n metadata: parameters.metadata,\n });\n },\n\n updateConsumedAmount: async (parameters: {\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n }): Promise<void> => {\n const chainId = parameters.chainId;\n const address = parameters.offering.toLowerCase() as `0x${string}`;\n const nonce = parameters.nonce;\n\n const filledForChain = filled.get(chainId) || new Map();\n const filledForOffering = filledForChain.get(address) || new Map();\n filledForOffering.set(nonce, parameters.consumed);\n filledForChain.set(address, filledForOffering);\n filled.set(chainId, filledForChain);\n },\n\n saveLatestBlockNumberProcessed: async (parameters: {\n chainId: Offer.Offer[\"chainId\"];\n eventType: \"offer_created\" | \"offer_matched\";\n latestBlockNumber: number;\n }): Promise<void> => {\n const key = `${parameters.chainId.toString()}:${parameters.eventType}`;\n indexingProgress.set(key, parameters.latestBlockNumber);\n },\n\n getLatestBlockNumberProcessed: async (parameters: {\n chainId: Offer.Offer[\"chainId\"];\n eventType: \"offer_created\" | \"offer_matched\";\n }): Promise<{ latestBlockNumber: number } | null> => {\n const key = `${parameters.chainId.toString()}:${parameters.eventType}`;\n const value = indexingProgress.get(key);\n return value === undefined ? null : { latestBlockNumber: value };\n },\n };\n}\n","import type { Compute, Offer } from \"@morpho-dev/mempool\";\n\nexport const types = [\"offer_created\", \"offer_matched\", \"offer_validation\"] as const;\nexport type Type = (typeof types)[number];\n\ntype BaseEvent<type extends Type = Type> = {\n readonly id: string;\n readonly type: type;\n};\n\nexport type RouterEvent<type extends Type = Type> = type extends\n | \"offer_created\"\n | \"offer_matched\"\n | \"offer_validation\"\n ? Compute<BaseEvent<type> & { readonly offer: Offer.Offer }>\n : never;\n\n/**\n * Creates a RouterEvent with a deterministic id.\n */\nexport function from<T extends Type = Type>(\n base: Omit<RouterEvent<T>, \"id\" | \"type\"> & { type: T },\n): Compute<RouterEvent<T>> {\n const id = `${base.type}:${base.offer.hash.toLowerCase()}` as const;\n return { id, ...base } as RouterEvent<T>;\n}\n","import type * as ValidationRule from \"./ValidationRule.ts\";\n\n/**\n * A validation issue.\n */\nexport type Issue<T, RuleName extends string = string> = {\n /** The name of the rule that caused the issue. */\n ruleName: RuleName;\n /** The message of the issue. */\n message: string;\n /** The item that was not valid. */\n item: T;\n};\n\n/**\n * The result of a validation.\n */\nexport type Result<T, RuleName extends string = string> = {\n /** The items that were valid. */\n valid: T[];\n /** The reports of the failed validations. */\n issues: Issue<T, RuleName>[];\n};\n\nexport function run<\n T,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, void>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>>;\n\nexport async function run<\n T,\n Ctx,\n Name extends string,\n Rules extends readonly ValidationRule.Rule<T, Name, Ctx>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n ctx?: Ctx;\n chunkSize?: number;\n}): Promise<Result<T, ValidationRule.RuleNames<Rules>>> {\n const { items, rules, ctx = {} as Ctx, chunkSize } = parameters;\n\n const issues: Issue<T, ValidationRule.RuleNames<Rules>>[] = [];\n let validItems: T[] = items.slice();\n\n for (const rule of rules) {\n if (validItems.length === 0) return { valid: [], issues };\n\n const indicesToRemove: Set<number> = new Set();\n if (rule.kind === \"single\") {\n for (let i = 0; i < validItems.length; i++) {\n const item = validItems[i]!;\n const issue = await rule.run(item, ctx);\n if (issue) {\n issues.push({ ...issue, ruleName: rule.name, item });\n indicesToRemove.add(i);\n }\n }\n } else if (rule.kind === \"batch\") {\n const exec = async (slice: T[], offset: number) => {\n const map = await rule.run(slice, ctx);\n for (let i = 0; i < slice.length; i++) {\n const issue = map.get(i);\n if (issue !== undefined) {\n issues.push({ ...issue, ruleName: rule.name, item: slice[i]! });\n indicesToRemove.add(offset + i);\n }\n }\n };\n\n if (!chunkSize) await exec(validItems, 0);\n else {\n for (let i = 0; i < validItems.length; i += chunkSize) {\n await exec(validItems.slice(i, i + chunkSize), i);\n }\n }\n }\n\n validItems = validItems.filter((_, i) => !indicesToRemove.has(i));\n }\n\n return {\n valid: validItems,\n issues,\n };\n}\n","import type { Offer } from \"@morpho-dev/mempool\";\nimport { type Address, type PublicClient, parseAbi } from \"viem\";\nimport * as Chain from \"./Chain.ts\";\nimport type * as Validation from \"./Validation.ts\";\n\n/**\n * A validation rule.\n */\nexport type Rule<T, Name extends string = string, Ctx = void> =\n | { kind: \"single\"; name: Name; run: Single<T, Name, Ctx> }\n | { kind: \"batch\"; name: Name; run: Batch<T, Name, Ctx> };\n\nexport type RuleNames<Rules extends readonly { name: string }[]> = Rules[number][\"name\"];\n\n/**\n * A single item validation rule.\n * @param item - The item to validate.\n * @param ctx - The context of the validation.\n * @returns The issue that was found. If the item is valid, this will be undefined.\n */\nexport type Single<T, RuleName extends string, Ctx = void> = (\n item: T,\n ctx: Ctx,\n) =>\n | Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\">\n | undefined\n | Promise<Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>;\n\n/**\n * A batch item validation rule.\n * @param items - The items to validate.\n * @param ctx - The context of the validation.\n * @returns A map of the items to the issue that was found.\n */\nexport type Batch<T, RuleName extends string, Ctx = void> = (\n items: T[],\n ctx: Ctx,\n) =>\n | Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>\n | Promise<Map<number, Omit<Validation.Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>>;\n\n/**\n * Create a validation rule iterating over a single item at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function single<Name extends string, T, Ctx = void>(\n name: Name,\n run: Single<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"single\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\n/**\n * Create a validation rule iterating over a batch of items at a time.\n * @param name - The name of the rule.\n * @param run - The function that validates the rule.\n * @returns The created rule.\n */\nexport function batch<Name extends string, T, Ctx = void>(\n name: Name,\n run: Batch<T, Name, Ctx>,\n): Rule<T, Name, Ctx> {\n return { kind: \"batch\", name, run } as const satisfies Rule<T, Name, Ctx>;\n}\n\nexport type MorphoContext = {\n publicClients: Partial<Record<Chain.ChainName, PublicClient>>;\n};\n\nexport function morpho(parameters: { whitelistedChains: Chain.Chain[] }) {\n const { whitelistedChains } = parameters;\n\n const whitelistedChainIds = new Set(whitelistedChains.map((chain) => chain.id));\n const whitelistedLoanTokensPerChain = new Map(\n whitelistedChains.map((chain) => [\n chain.id,\n new Set(Array.from(chain.whitelistedAssets).map((a) => a.toLowerCase() as Address)),\n ]),\n );\n const morphoPerChain = new Map(\n whitelistedChains.map((chain) => [chain.id, chain.morpho.toLowerCase() as Address]),\n );\n\n const chainId = single(\"chain_id\", (offer: Offer.Offer, _: MorphoContext) => {\n if (!whitelistedChainIds.has(offer.chainId)) {\n return { message: `Chain ID ${offer.chainId} is not whitelisted` };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, _: MorphoContext) => {\n if (\n !whitelistedLoanTokensPerChain\n .get(offer.chainId)\n ?.has(offer.loanToken.toLowerCase() as Address)\n ) {\n return {\n message: `Loan token ${offer.loanToken} is not whitelisted on chain ${offer.chainId}`,\n };\n }\n });\n\n const expiry = single(\"expiry\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.expiry < Math.floor(Date.now() / 1000)) {\n return { message: \"Expiry mismatch\" };\n }\n });\n\n // TODO: add offer maturity whitelisting rule\n // TODO: add callback address whitelisting rule\n // TODO: add callback oracle whitelisting rule\n // TODO: add callback token whitelisting rule\n // TODO: add signature rule\n\n const emptyCallback = single(\"empty_callback\", (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.callback.data !== \"0x\") {\n return { message: \"Callback data is not empty. Not supported yet.\" };\n }\n });\n\n const sellOffersEmptyCallback = single(\n \"sell_offers_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data === \"0x\") {\n return { message: \"Sell offers with empty callback are not supported yet.\" };\n }\n },\n );\n\n const buyOffersEmptyCallback = batch(\n \"buy_offers_empty_callback\",\n async (offers: Offer.Offer[], { publicClients }: MorphoContext) => {\n const issues = new Map<\n number,\n | Omit<Validation.Issue<Offer.Offer, \"buy_offers_empty_callback\">, \"ruleName\" | \"item\">\n | undefined\n >();\n\n const hashToIndex = new Map<string, number>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n hashToIndex.set(offer.hash, i);\n }\n\n const { buyOffers, sellOffers: _sellOffers } = offers.reduce<{\n buyOffers: Offer.Offer[];\n sellOffers: Offer.Offer[];\n }>(\n (acc, offer) => {\n offer.buy\n ? acc.buyOffers.push(offer)\n : issues.set(hashToIndex.get(offer.hash)!, {\n message: \"Onchain callback for sell offers is not supported yet.\",\n });\n return acc;\n },\n { buyOffers: [], sellOffers: [] },\n );\n\n const buyOffersPerLoanAsset = new Map<Chain.ChainName, Map<Address, Offer.Offer[]>>();\n for (const offer of buyOffers) {\n // ok to force unwrap here since we check that the chain is whitelisted in the chain_id rule\n const chainName = Chain.getChain(offer.chainId)?.name!;\n\n const loanTokens = buyOffersPerLoanAsset.get(chainName) ?? new Map();\n const offers = loanTokens.get(offer.loanToken.toLowerCase() as Address) ?? [];\n offers.push(offer);\n loanTokens.set(offer.loanToken.toLowerCase() as Address, offers);\n buyOffersPerLoanAsset.set(chainName, loanTokens);\n }\n\n await Promise.all(\n Array.from(buyOffersPerLoanAsset.entries()).map(async ([name, loanTokens]) => {\n const chainName = name as Chain.ChainName;\n\n const publicClient = publicClients[chainName];\n // ok to force unwrap here since we check that the chain is whitelisted and morpho is mandatory in the chain definition\n const morpho = morphoPerChain.get(Chain.chains[chainName].id)!;\n\n if (!publicClient) {\n const offers: Offer.Offer[] = Array.from(loanTokens.values()).flat();\n for (const offer of offers) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Public client for chain \"${chainName}\" is not available`,\n });\n }\n return;\n }\n\n // user -> loanToken -> balance\n const balances: Map<string, Map<string, bigint>> = new Map();\n const allowances: Map<string, Map<string, bigint>> = new Map();\n for (const [loanToken, offers] of loanTokens as Map<Address, Offer.Offer[]>) {\n const data = await Promise.all(\n offers.flatMap((offer) => [\n publicClient.readContract({\n address: loanToken,\n abi: parseAbi([\n \"function balanceOf(address owner) view returns (uint256 balance)\",\n ]),\n functionName: \"balanceOf\",\n args: [offer.offering],\n }),\n publicClient.readContract({\n address: loanToken,\n abi: parseAbi([\n \"function allowance(address owner, address spender) public view returns (uint256 remaining)\",\n ]),\n functionName: \"allowance\",\n args: [offer.offering, morpho],\n }),\n ]),\n );\n\n for (let i = 0; i < offers.length; i++) {\n const user = offers[i]!.offering.toLowerCase();\n const balance = data[i * 2] || 0n;\n const allowance = data[i * 2 + 1] || 0n;\n\n const userBalances = balances.get(user) ?? new Map();\n userBalances.set(loanToken.toLowerCase(), balance);\n\n const userAllowances = allowances.get(user) ?? new Map();\n userAllowances.set(loanToken.toLowerCase(), allowance);\n\n balances.set(user, userBalances);\n allowances.set(user, userAllowances);\n }\n }\n\n for (const offer of Array.from(loanTokens.values()).flat()) {\n const user = offer.offering.toLowerCase();\n const userBalances = balances.get(user);\n const balance: bigint = userBalances?.get(offer.loanToken.toLowerCase())!;\n if (balance < offer.assets) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Insufficient balance for ${offer.loanToken} on chain ${offer.chainId} (${balance.toString()} < ${offer.assets.toString()})`,\n });\n continue;\n }\n\n const userAllowances = allowances.get(user);\n const allowance: bigint = userAllowances?.get(offer.loanToken.toLowerCase())!;\n if (allowance < offer.assets) {\n issues.set(hashToIndex.get(offer.hash)!, {\n message: `Insufficient allowance for ${offer.loanToken} on chain ${offer.chainId} (${allowance.toString()} < ${offer.assets.toString()})`,\n });\n }\n }\n }),\n );\n\n return issues;\n },\n );\n\n return [\n chainId,\n loanToken,\n expiry,\n // note: callback onchain check should be done last since it does not mean that the offer is forever invalid\n // integrators should be able to keep the offers that have an invalid callback onchain and be sure that is the only check that is not valid\n emptyCallback,\n sellOffersEmptyCallback,\n buyOffersEmptyCallback,\n ];\n}\n"]}
|