@morpho-dev/router 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.browser.d.cts +116 -3
- package/dist/index.browser.d.ts +116 -3
- package/dist/index.browser.js +128 -13
- package/dist/index.browser.js.map +1 -1
- package/dist/index.browser.mjs +128 -13
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.d.cts +116 -3
- package/dist/index.node.d.ts +116 -3
- package/dist/index.node.js +125 -8
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +126 -9
- package/dist/index.node.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/apiSchema/index.ts","../src/core/Cursor.ts","../src/core/RouterOffer.ts","../src/core/apiSchema/requests.ts","../src/core/apiSchema/openapi.ts","../src/core/apiSchema/utils.ts","../src/core/Callback.ts","../src/core/Collector/index.ts","../src/core/Liquidity.ts","../src/core/Logger.ts","../src/core/Collector/BuyWithEmptyCallbackLiquidityCollector.ts","../src/core/Collector/ChainReorgsCollector.ts","../src/core/Collector/Collector.ts","../src/core/Collector/ConsumedEventsCollector.ts","../src/core/Validation.ts","../src/core/ValidationRule.ts","../src/core/Collector/MempoolCollector.ts","../src/core/CollectorBlockStore.ts","../src/core/OfferStore/drizzle/schema.ts","../src/core/LiquidityStore.ts","../src/core/OfferStore/index.ts","../src/core/OfferStore/OfferStorePg.ts","../src/core/OfferStore/PG.ts","../src/core/router/index.ts","../src/core/router/Client.ts","../src/core/router/Server.ts","../src/core/Services.ts"],"names":["Base64","Offer","z","maxUint256","error","Format","Errors","LLTV","parseUnits","createDocument","consumed","CallbackType","index","fetch","Utils","erc20Abi","stringify","AsyncLocalStorage","offers","publicActions","getBlockNumber","missingBlockNumbers","start","Chain","parseEventLogs","run","mempool","pgSchema","varchar","numeric","bigint","integer","boolean","text","timestamp","serial","jsonb","desc","uniqueIndex","primaryKey","and","eq","create","memory","Time","inArray","gte","lte","sql","asc","Maturity","pool","Pool","client","drizzle","PGlite","drizzleLite","path","migratePostgres","migratePGLite","connect","formatUnits","Hono","serveHono","from","createWalletClient","http","Mempool"],"mappings":"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","file":"index.node.js","sourcesContent":["export * from \"./openapi.ts\";\nexport { parse, safeParse } from \"./requests.ts\";\nexport * from \"./utils.ts\";\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 validate(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 encode(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decode(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validate(decoded);\n return decoded;\n}\n","import { Errors, Format, Offer } from \"@morpho-dev/mempool\";\nimport { type Address, type Hex, 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 type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\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 * ABI for the Consumed event emitted by the terms contract.\n */\nexport const consumedEvent = {\n type: \"event\",\n name: \"Consumed\",\n inputs: [\n { name: \"user\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"nonce\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", indexed: false, internalType: \"uint256\" },\n ],\n anonymous: false,\n} as const;\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 function fromConsumedLog(parameters: {\n blockNumber: bigint;\n logIndex: number;\n chainId: number;\n transactionHash: Hex;\n user: Address;\n nonce: bigint;\n amount: bigint;\n}): OfferConsumed {\n const { blockNumber, logIndex, chainId, transactionHash, user, nonce, amount } = parameters;\n return {\n id: `${blockNumber.toString()}-${logIndex.toString()}-${chainId}-${transactionHash}`,\n chainId: BigInt(chainId),\n offering: user,\n nonce,\n amount,\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","import { LLTV } from \"@morpho-dev/mempool\";\nimport { parseUnits } from \"viem\";\nimport { z } from \"zod/v4\";\nimport * as Cursor from \"#core/Cursor.ts\";\nimport { type OfferStatus, OfferStatusValues } from \"#core/RouterOffer.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.number().int().min(0).optional().meta({\n description: \"Minimum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Maximum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\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 .transform((val, ctx) => {\n const pattern =\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 if (!pattern.test(val)) {\n ctx.addIssue({\n code: \"custom\",\n message: \"collateral_tuple has an invalid format\",\n input: val,\n });\n }\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 .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 .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 = Cursor.decode(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 .transform((val, ctx) => {\n const numericLike = /^-?\\d+$/.test(val);\n if (!numericLike) {\n ctx.addIssue({\n code: \"custom\",\n message: \"chain_id has an invalid format\",\n input: val,\n });\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid input: expected number, received NaN\",\n input: val,\n });\n return z.NEVER;\n }\n return Number.parseInt(val, 10);\n })\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 .transform((val, ctx) => {\n const pattern =\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 if (!pattern.test(val)) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Collaterals must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. All fields are required for each collateral.\",\n input: val,\n });\n }\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.number().int().min(0).optional().meta({\n description: \"Maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n min_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Minimum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Maximum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\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 // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = Cursor.decode(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 \"#core/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","import type { Offer } from \"@morpho-dev/mempool\";\nimport type * as Liquidity from \"#core/Liquidity.ts\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n}\n\nexport function buildLiquidity(parameters: {\n type: CallbackType;\n user: string;\n contract: string; // token or callback contract address, depending on type\n chainId: bigint;\n amount: string | bigint;\n index?: number;\n updatedAt?: Date;\n}): Liquidity.Liquidity {\n const { type, user, contract, chainId, amount, index = 0, updatedAt = new Date() } = parameters;\n if (type !== CallbackType.BuyWithEmptyCallback)\n throw new Error(`CallbackType not implemented: ${type}`);\n const amountStr = amount.toString();\n const id = `${user}-${chainId.toString()}-${type}-${contract}`.toLowerCase();\n return {\n userPosition: {\n id,\n availableLiquidityQueueId: id,\n user: user.toLowerCase(),\n chainId,\n amount: amountStr,\n updatedAt,\n },\n queues: [\n {\n queue: {\n queueId: id,\n availableLiquidityPoolId: id,\n index,\n updatedAt,\n },\n pool: {\n id,\n amount: amountStr,\n updatedAt,\n },\n },\n ],\n };\n}\n\nexport function getCallbackIdForOffer(offer: Offer.Offer): string | null {\n if (offer.buy && offer.callback.data === \"0x\") {\n const type = CallbackType.BuyWithEmptyCallback;\n const user = offer.offering;\n const loanToken = offer.loanToken;\n return `${user}-${offer.chainId.toString()}-${type}-${loanToken}`.toLowerCase();\n }\n return null;\n}\n","export * from \"./BuyWithEmptyCallbackLiquidityCollector.ts\";\nexport * from \"./ChainReorgsCollector.ts\";\nexport * from \"./Collector.ts\";\nexport * from \"./ConsumedEventsCollector.ts\";\nexport * from \"./MempoolCollector.ts\";\n","import { Utils } from \"@morpho-dev/mempool\";\nimport { type Address, erc20Abi, type PublicActions } from \"viem\";\nimport * as Callback from \"#core/Callback.ts\";\n\nexport async function fetchBalancesAndAllowances(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n spender: Address;\n pairs: Array<{ user: Address; token: Address }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<\n Map<\n Address,\n Map<\n Address,\n {\n balance: bigint;\n allowance: bigint;\n }\n >\n >\n> {\n const { client, spender, pairs, options } = parameters;\n if (pairs.length === 0) return new Map();\n\n const batchSize = Math.max(1, options?.batchSize ?? 5000);\n const retryAttempts = Math.max(1, options?.retryAttempts ?? 3);\n const retryDelayMs = Math.max(0, options?.retryDelayMs ?? 50);\n const blockNumber = options?.blockNumber ? BigInt(options.blockNumber) : undefined;\n\n // user address -> token address -> { balance, allowance }\n const out: Map<Address, Map<Address, { balance: bigint; allowance: bigint }>> = new Map();\n\n for (const pairsBatch of Utils.batch(pairs, batchSize)) {\n const balanceContracts: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"balanceOf\";\n args: [Address];\n }> = [];\n const allowanceContracts: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"allowance\";\n args: [Address, Address];\n }> = [];\n\n for (const { user, token } of pairsBatch) {\n balanceContracts.push({\n address: token,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n });\n allowanceContracts.push({\n address: token,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n });\n }\n\n const [balances, allowances] = await Promise.all([\n Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: balanceContracts,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n ),\n Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: allowanceContracts,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n ),\n ]);\n\n for (let i = 0; i < pairsBatch.length; i++) {\n const { user, token } = pairsBatch[i]!;\n const balance = balances[i]! as unknown as bigint;\n const allowance = allowances[i]! as unknown as bigint;\n let perUser = out.get(user);\n if (!perUser) {\n perUser = new Map();\n out.set(user, perUser);\n }\n perUser.set(token, { balance, allowance });\n }\n }\n\n return out;\n}\n\nexport type LiquidityUserPosition = {\n id: string;\n availableLiquidityQueueId: string;\n user: string;\n chainId: bigint;\n amount: string;\n updatedAt: Date;\n};\n\nexport type LiquidityQueue = {\n queueId: string;\n availableLiquidityPoolId: string;\n index: number;\n updatedAt: Date;\n};\n\nexport type LiquidityPool = {\n id: string;\n amount: string;\n updatedAt: Date;\n};\n\nexport type LiquidityQueueWithPool = { queue: LiquidityQueue; pool: LiquidityPool };\n\nexport type Liquidity = { userPosition: LiquidityUserPosition; queues: LiquidityQueueWithPool[] };\n\nexport async function fetch(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\n spender: Address;\n type: Callback.CallbackType;\n pairs: Array<{ user: Address; contract: Address }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<Liquidity[]> {\n const { client, chainId, spender, type, pairs, options } = parameters;\n if (type !== Callback.CallbackType.BuyWithEmptyCallback)\n throw new Error(`CallbackType not implemented: ${type}`);\n\n const map = await fetchBalancesAndAllowances({\n client,\n spender,\n pairs: pairs.map(({ user, contract }) => ({ user, token: contract })),\n options,\n });\n\n const out: Liquidity[] = [];\n for (const [user, perContract] of map) {\n for (const [contract, { balance, allowance }] of perContract) {\n const amount = balance < allowance ? balance : allowance;\n out.push(\n Callback.buildLiquidity({\n type,\n user,\n contract,\n chainId,\n amount: amount.toString(),\n index: 0,\n }),\n );\n }\n }\n return out;\n}\n\nexport function serialize(liquidity: Liquidity): string {\n const normalized = {\n userPosition: {\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: String(liquidity.userPosition.chainId),\n amount: String(liquidity.userPosition.amount),\n },\n queues: liquidity.queues\n .map((queueWithPool) => ({\n queue: {\n queueId: queueWithPool.queue.queueId,\n availableLiquidityPoolId: queueWithPool.queue.availableLiquidityPoolId,\n index: queueWithPool.queue.index,\n },\n pool: {\n id: queueWithPool.pool.id,\n amount: String(queueWithPool.pool.amount),\n },\n }))\n .sort(\n (\n left: { queue: { queueId: string | null; index: number }; pool: { id: string } },\n right: { queue: { queueId: string | null; index: number }; pool: { id: string } },\n ) => {\n const leftQueueId = left.queue.queueId || \"\";\n const rightQueueId = right.queue.queueId || \"\";\n if (leftQueueId < rightQueueId) return -1;\n if (leftQueueId > rightQueueId) return 1;\n\n const leftPoolId = left.pool.id;\n const rightPoolId = right.pool.id;\n if (leftPoolId < rightPoolId) return -1;\n if (leftPoolId > rightPoolId) return 1;\n\n const leftIndex = left.queue.index;\n const rightIndex = right.queue.index;\n if (leftIndex < rightIndex) return -1;\n if (leftIndex > rightIndex) return 1;\n return 0;\n },\n ),\n };\n return JSON.stringify(normalized);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Compute } from \"@morpho-dev/mempool\";\nimport { stringify } from \"viem\";\n\nexport const LogLevelValues = [\n \"silent\",\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n] as const;\nexport type LogLevel = (typeof LogLevelValues)[number];\ntype ActiveLogLevel = Exclude<LogLevel, \"silent\">;\n\nexport type LogEntry = Compute<{ msg: string } & Record<string, unknown>>;\nexport type LogFn = (entry: LogEntry) => void;\n\nexport type Logger = {\n trace: LogFn;\n debug: LogFn;\n info: LogFn;\n warn: LogFn;\n error: LogFn;\n fatal: LogFn;\n};\n\nexport function defaultLogger(minLevel?: LogLevel): Logger {\n const threshold: LogLevel = minLevel ?? \"info\";\n\n const levelIndexByName: Record<LogLevel, number> = LogLevelValues.reduce(\n (acc, lvl, idx) => {\n acc[lvl] = idx;\n return acc;\n },\n {} as Record<LogLevel, number>,\n );\n\n const isEnabled = (methodLevel: LogLevel): boolean =>\n levelIndexByName[methodLevel] >= levelIndexByName[threshold];\n\n const wrap = <L extends ActiveLogLevel>(\n consoleMethod: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\",\n methodLevel: L,\n ): LogFn =>\n isEnabled(methodLevel)\n ? (entry: LogEntry) => {\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](stringify({ level: methodLevel, ...entry }));\n }\n : () => {};\n\n return {\n trace: wrap(\"trace\", \"trace\"),\n debug: wrap(\"debug\", \"debug\"),\n info: wrap(\"info\", \"info\"),\n warn: wrap(\"warn\", \"warn\"),\n error: wrap(\"error\", \"error\"),\n fatal: wrap(\"error\", \"fatal\"),\n };\n}\n\nexport function silentLogger(): Logger {\n const noop = (() => {}) as LogFn;\n return { trace: noop, debug: noop, info: noop, warn: noop, error: noop, fatal: noop };\n}\n\nconst loggerContext = new AsyncLocalStorage<Logger>();\n\nexport function runWithLogger<T>(logger: Logger, fn: () => Promise<T>): Promise<T> {\n return loggerContext.run(logger, fn);\n}\n\nexport function getLogger(): Logger {\n return loggerContext.getStore() ?? defaultLogger();\n}\n","import { type Chain, Utils } from \"@morpho-dev/mempool\";\nimport { type Address, publicActions, type WalletClient as ViemClient } from \"viem\";\nimport { getBlockNumber } from \"viem/actions\";\nimport * as Callback from \"#core/Callback.ts\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Liquidity from \"#core/Liquidity.ts\";\nimport type * as LiquidityStore from \"#core/LiquidityStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createBuyWithEmptyCallbackLiquidityCollector(params: {\n client: ViemClient;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"buy_with_empty_callback_liquidity\"> {\n const {\n client,\n collectorBlockStore,\n liquidityStore,\n offerStore,\n chain,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n } = params;\n\n const collector = \"buy_with_empty_callback_liquidity\";\n\n async function getUniqueUserTokenPairs(): Promise<Array<{ user: Address; token: Address }>> {\n const unique = new Set<string>();\n const pairs: Array<{ user: Address; token: Address }> = [];\n\n let cursor: string | undefined;\n do {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n cursor,\n limit: 1000,\n },\n });\n cursor = nextCursor ?? undefined;\n\n for (const offer of offers) {\n const creator = offer.offering;\n const loanToken = offer.loanToken;\n const key = `${offer.offering}-${offer.loanToken}`.toLowerCase();\n if (unique.has(key)) continue;\n unique.add(key);\n pairs.push({ user: creator as Address, token: loanToken as Address });\n }\n } while (cursor);\n\n return pairs;\n }\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n return Utils.poll(\n async () => {\n const publicClient = client.extend(publicActions);\n const pairs = await getUniqueUserTokenPairs();\n\n const latestBlockNumber = Number(await getBlockNumber(publicClient));\n\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"snapshot started\",\n blockNumber: latestBlockNumber,\n });\n\n const liquidityEntries = await Liquidity.fetch({\n client: publicClient,\n chainId: chain.id,\n spender: chain!.morpho,\n type: Callback.CallbackType.BuyWithEmptyCallback,\n pairs: pairs.map(({ user, token }) => ({ user, contract: token })),\n options: {\n blockNumber: latestBlockNumber,\n batchSize: maxBatchSize,\n },\n });\n\n logger.debug({\n collector,\n chainId: chain.id,\n msg: `found ${liquidityEntries.length} liquidity entries`,\n blockNumber: latestBlockNumber,\n });\n\n const existingLiquidityEntries = await liquidityStore.getAll();\n const existingById = new Map<string, string>();\n\n for (const liquidityEntry of existingLiquidityEntries) {\n const liquidityId = liquidityEntry.userPosition.id;\n const serializedEntry = Liquidity.serialize(liquidityEntry);\n existingById.set(liquidityId, serializedEntry);\n }\n\n for (const liquidity of liquidityEntries) {\n const serialized = Liquidity.serialize(liquidity);\n const prevSerialized = existingById.get(liquidity.userPosition.id);\n if (prevSerialized === serialized) continue; // No change across any relevant field\n await liquidityStore.save({ liquidity });\n }\n\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumber,\n });\n\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"snapshot done\",\n blockNumber: latestBlockNumber,\n });\n\n emit(latestBlockNumber);\n },\n { interval },\n );\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId: chain.id }),\n collect,\n onReorg,\n };\n}\n","import { type Chain, Utils } from \"@morpho-dev/mempool\";\nimport type { Block, Hex, PublicClient } from \"viem\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createChainReorgsCollector(parameters: {\n client: PublicClient;\n subscribers: Collector.Collector[];\n collectorStore: CollectorBlockStore.CollectorBlockStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"chain_reorgs\"> {\n const collectorName = \"chain_reorgs\";\n const {\n client,\n subscribers,\n collectorStore,\n chain,\n options: { maxBatchSize = 25, interval } = {},\n } = parameters;\n\n type LightBlock = {\n hash: Hex;\n number: bigint;\n parentHash: Hex;\n };\n\n let finalizedBlock: LightBlock | null = null;\n let unfinalizedBlocks: LightBlock[] = [];\n\n const commonAncestor = (block: Block) => {\n const parent = unfinalizedBlocks.find((b) => b.hash === block.parentHash);\n if (parent) return parent;\n\n if (finalizedBlock == null) throw new Error(\"Failed to get common ancestor\");\n return finalizedBlock;\n };\n\n // greatly inspired by Ponder `ReconcileBlock`\n // https://github.com/ponder-sh/ponder/blob/d0bdadee06ebd93f05903b5a692ad46fe95371b9/packages/core/src/sync-realtime/index.ts#L792\n const reconcile = async (block: Block) => {\n if (block.hash === null || block.number === null || block.parentHash === null)\n throw new Error(\"Failed to get block\");\n const latestBlock = unfinalizedBlocks[unfinalizedBlocks.length - 1];\n if (latestBlock === undefined) {\n unfinalizedBlocks.push({\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n });\n return;\n }\n\n if (latestBlock.hash === block.hash) return;\n\n if (latestBlock.number >= block.number) {\n const ancestor = commonAncestor(block);\n // biome-ignore lint: debug message\n console.log(\n `reorg detected, latestBlock.number: ${latestBlock.number} > block.number: ${block.number} on chain ${chain.id}. Ancestor: ${ancestor.number}`,\n );\n subscribers.forEach((subscriber) => subscriber.onReorg(Number(ancestor.number)));\n unfinalizedBlocks = [];\n return;\n }\n\n if (latestBlock.number + 1n < block.number) {\n // biome-ignore lint: debug message\n console.log(\n `missing blocks between block ${latestBlock.number} and block ${block.number} on chain ${chain.id}`,\n );\n\n const missingBlockNumbers = (() => {\n const missingBlockNumbers = [];\n let start = latestBlock.number + 1n;\n const threshold =\n latestBlock.number + BigInt(maxBatchSize) > block.number\n ? block.number\n : latestBlock.number + BigInt(maxBatchSize);\n while (start < threshold) {\n missingBlockNumbers.push(start);\n start = start + 1n;\n }\n return missingBlockNumbers;\n })();\n\n const missingBlocks = await Promise.all(\n missingBlockNumbers.map((blockNumber) =>\n client.getBlock({ blockNumber, includeTransactions: false }),\n ),\n );\n\n for (const missingBlock of missingBlocks) await reconcile(missingBlock);\n await reconcile(block);\n return;\n }\n\n if (block.parentHash !== latestBlock.hash) {\n const ancestor = commonAncestor(block);\n // biome-ignore lint: debug message\n console.log(\n `reorg detected, block.parentHash: ${block.parentHash} !== latestBlock.hash: ${latestBlock.hash} on chain ${chain.id}. Ancestor: ${ancestor.number}`,\n );\n subscribers.forEach((subscriber) => subscriber.onReorg(Number(ancestor.number)));\n unfinalizedBlocks = [];\n return;\n }\n\n unfinalizedBlocks.push({\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n });\n };\n\n const collect = Utils.lazy<number>((emit) => {\n let tick = 0;\n const fetchFinalizedBlock = async () => {\n if (tick % 20 === 0 || finalizedBlock === null) {\n finalizedBlock = await client.getBlock({\n blockTag: \"finalized\",\n includeTransactions: false,\n });\n if (finalizedBlock === null) throw new Error(\"Failed to get finalized block\");\n }\n tick++;\n };\n\n return Utils.poll(\n async () => {\n await fetchFinalizedBlock();\n\n const latestBlock = await client.getBlock({\n blockTag: \"latest\",\n includeTransactions: false,\n });\n\n await reconcile(latestBlock);\n\n const lastBlockNumber = Number(latestBlock.number);\n await collectorStore.saveBlockNumber({\n collectorName: \"chain_reorgs\",\n chainId: chain.id,\n blockNumber: lastBlockNumber,\n });\n\n emit(lastBlockNumber);\n },\n { interval: interval ?? 30_000 },\n );\n });\n\n return {\n name: collectorName,\n lastSyncedBlock: async () =>\n await collectorStore.getBlockNumber({ collectorName, chainId: chain.id }),\n collect,\n onReorg: (_: number) => {},\n };\n}\n","export type Name =\n | \"mempool_offers\"\n | \"consumed_events\"\n | \"buy_with_empty_callback_liquidity\"\n | \"chain_reorgs\";\n\n/** A general collector interface. */\nexport type Collector<name extends Name = Name> = {\n /** The name of the collector. */\n name: name;\n\n /** Start collecting data from external sources.\n * @yields The last block number processed by the collector.\n */\n collect: () => AsyncGenerator<number, void, void>;\n\n /** The last block number processed by the collector. */\n lastSyncedBlock: () => Promise<number>;\n\n /** The callback to call when a reorg is detected. */\n onReorg(lastFinalizedBlockNumber: number): void;\n};\n\n/** Start a collector.\n * @param collector - The collector to start.\n * @returns A function to stop the collector.\n */\nexport function start(collector: Collector): () => void {\n let stopped = false;\n const it = collector.collect();\n\n (async () => {\n while (!stopped) await it.next();\n await it.return();\n })();\n\n return () => {\n stopped = true;\n };\n}\n","import { Chain, Utils } from \"@morpho-dev/mempool\";\nimport { type Address, type PublicClient, parseEventLogs } from \"viem\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport * as RouterOffer from \"#core/RouterOffer.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createConsumedEventsCollector(parameters: {\n client: PublicClient;\n contractAddress: Address;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n chainId: Chain.Id;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"consumed_events\"> {\n const {\n client,\n contractAddress,\n offerStore,\n collectorBlockStore,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n chainId,\n } = parameters;\n const collector = \"consumed_events\";\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chainId.toString(),\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n return Utils.poll(\n async () => {\n const lastSyncedBlock = await collectorBlockStore.getBlockNumber({\n collectorName: collector,\n chainId,\n });\n\n logger.debug({ collector, chainId, msg: \"stream started\", blockNumber: lastSyncedBlock });\n\n const stream = Chain.streamLogs({\n client,\n contractAddress,\n event: RouterOffer.consumedEvent,\n blockNumberGte: lastSyncedBlock,\n order: \"asc\",\n options: { maxBatchSize },\n });\n\n let blockNumber = lastSyncedBlock;\n for await (const { logs, blockNumber: lastStreamBlockNumber } of stream) {\n try {\n const parsedLogs = parseEventLogs({ abi: [RouterOffer.consumedEvent], logs });\n logger.debug({ collector, chainId, msg: `found ${parsedLogs.length} consumed events` });\n for (const log of parsedLogs) {\n if (\n log.blockNumber === null ||\n log.logIndex === null ||\n log.transactionHash === null\n ) {\n logger.debug({\n collector,\n chainId,\n msg: \"skipping log because it is missing required fields\",\n });\n continue;\n }\n\n const offer = RouterOffer.fromConsumedLog({\n blockNumber: log.blockNumber,\n logIndex: log.logIndex,\n chainId: Number(chainId),\n transactionHash: log.transactionHash,\n user: log.args.user,\n nonce: log.args.nonce,\n amount: log.args.amount,\n });\n\n await offerStore.updateConsumedAmount({\n id: offer.id,\n chainId: offer.chainId,\n offering: offer.offering,\n nonce: offer.nonce,\n consumed: offer.amount,\n });\n }\n\n blockNumber = lastStreamBlockNumber;\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId,\n blockNumber,\n });\n\n emit(blockNumber);\n } catch (err) {\n logger.error({ err, msg: \"Failed to process offer_consumed events\" });\n }\n }\n\n logger.info({\n collector,\n chainId,\n msg: \"stream finished\",\n startBlock: lastSyncedBlock,\n endBlock: blockNumber,\n });\n },\n { interval },\n );\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId }),\n onReorg,\n collect,\n };\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 { Chain, Offer } from \"@morpho-dev/mempool\";\nimport type { Address } from \"viem\";\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 chain: Chain.Chain;\n};\n\nexport function morpho() {\n const chainId = single(\"chain_id\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n if (chain.id !== offer.chainId) {\n return {\n message: `Chain ID ${offer.chainId} is not the same as the chain ID in the context (${chain.id})`,\n };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n const tokens = new Set(\n Array.from(chain.whitelistedAssets.values()).map((a) => a.toLowerCase() as Address),\n );\n\n if (!tokens.has(offer.loanToken.toLowerCase() as Address)) {\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 const callback = single(\"empty_callback\", (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy || offer.callback.data !== \"0x\") {\n return { message: \"Callback not supported yet.\" };\n }\n });\n\n return [\n chainId,\n loanToken,\n expiry,\n // note: callback rule should be the last one, since it does not mean that the offer is forever invalid\n // integrators should be able to choose if they want to keep the offer or not\n callback,\n ];\n}\n","import { type Chain, type Mempool, type Offer, Utils } from \"@morpho-dev/mempool\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\nimport * as Validation from \"#core/Validation.ts\";\nimport * as ValidationRule from \"#core/ValidationRule.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createMempoolCollector(parameters: {\n mempool: Mempool.Client;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"mempool_offers\"> {\n const {\n mempool,\n offerStore,\n collectorBlockStore,\n chain,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n } = parameters;\n const collector = \"mempool_offers\";\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n\n let lastSyncedBlock: number | null = null;\n return mempool.watch({\n lastSyncedBlock: async () => {\n lastSyncedBlock = await collectorBlockStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"stream started\",\n blockNumber: lastSyncedBlock,\n });\n return lastSyncedBlock;\n },\n polling: { maxBatchSize, interval },\n onOffers: async (offers, blockNumber) => {\n logger.debug({ collector, chainId: chain.id, msg: `found ${offers.length} offers` });\n try {\n const { valid: validOffers, issues } = await Validation.run({\n items: offers,\n rules: ValidationRule.morpho(),\n ctx: { chain },\n });\n\n const invalidOffersToSave: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[] = [];\n\n const issueToStatus: Record<string, RouterOffer.OfferStatus> = {\n empty_callback: \"callback_not_supported\",\n sell_offers_empty_callback: \"callback_not_supported\",\n buy_offers_empty_callback: \"callback_error\",\n };\n\n for (const issue of issues) {\n const status = issueToStatus[issue.ruleName];\n if (status) {\n invalidOffersToSave.push({\n offer: issue.item as Offer.Offer,\n status,\n metadata: { issue: issue.ruleName },\n });\n }\n }\n\n await offerStore.createMany([\n ...validOffers.map((offer) => ({\n offer: offer as Offer.Offer,\n status: \"valid\" as const,\n })),\n ...invalidOffersToSave,\n ]);\n } catch (err) {\n logger.error({\n err,\n msg: \"Failed to process offer_created events, falling back to unverified status\",\n });\n await offerStore.createMany(\n offers.map((offer) => ({\n offer,\n status: \"unverified\" as const,\n metadata: { issue: \"Offer processing failed\" },\n })),\n );\n }\n\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n });\n\n emit(blockNumber);\n\n if (lastSyncedBlock === null) return;\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"stream finished\",\n startBlock: lastSyncedBlock,\n endBlock: blockNumber,\n });\n },\n });\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId: chain.id }),\n collect,\n onReorg,\n };\n}\n","import { Chain } from \"@morpho-dev/mempool\";\nimport { and, eq } from \"drizzle-orm\";\nimport type * as Collector from \"#core/Collector/index.ts\";\nimport { collectorBlockNumbers } from \"#core/OfferStore/drizzle/schema.ts\";\nimport type * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type CollectorBlockStore = {\n /** Get the latest block number processed by a collector for a given chain. */\n getBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n }) => Promise<number>;\n\n /** Save the latest block number processed by a collector for a given chain. */\n saveBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): CollectorBlockStore => {\n const db = config.db;\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n const result = await db\n .select({ blockNumber: collectorBlockNumbers.blockNumber })\n .from(collectorBlockNumbers)\n .where(\n and(\n eq(collectorBlockNumbers.name, name),\n eq(collectorBlockNumbers.chainId, parameters.chainId),\n ),\n )\n .limit(1);\n\n if (result.length === 0)\n return Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0;\n return Number(result[0]!.blockNumber);\n },\n\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n await db\n .insert(collectorBlockNumbers)\n .values({\n chainId: parameters.chainId,\n name,\n blockNumber: parameters.blockNumber,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [collectorBlockNumbers.chainId, collectorBlockNumbers.name],\n set: {\n blockNumber: parameters.blockNumber,\n updatedAt: new Date(),\n },\n });\n },\n };\n};\n\nexport function memory(): CollectorBlockStore {\n const blockNumbers = new Map<Collector.Name, Map<Chain.Id, number>>();\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n return (\n blockNumbers.get(name)?.get(parameters.chainId) ||\n Chain.getChain(parameters.chainId)?.mempool.deploymentBlock ||\n 0\n );\n },\n\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n if (!blockNumbers.has(name)) {\n blockNumbers.set(name, new Map());\n }\n\n if (!blockNumbers.get(name)?.has(parameters.chainId)) {\n blockNumbers.get(name)!.set(parameters.chainId, parameters.blockNumber);\n }\n\n blockNumbers.get(name)!.set(parameters.chainId, parameters.blockNumber);\n },\n };\n}\n","import { desc } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n numeric,\n pgSchema,\n primaryKey,\n serial,\n text,\n timestamp,\n uniqueIndex,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\n\n// Should be updated when the data should need to be re-synced from scratch\nexport const VERSION = \"offers_v1.1\";\nconst s = pgSchema(VERSION);\n\nexport const offers = s.table(\n \"offers\",\n {\n hash: varchar(\"hash\", { length: 66 }).primaryKey(),\n offering: varchar(\"offering\", { length: 42 }).notNull(),\n assets: numeric(\"assets\", { precision: 78, scale: 0 }).notNull(),\n rate: bigint(\"rate\", { mode: \"bigint\" }).notNull(),\n maturity: integer(\"maturity\").notNull(),\n expiry: integer(\"expiry\").notNull(),\n start: integer(\"start\").notNull(),\n nonce: bigint(\"nonce\", { mode: \"bigint\" }).notNull(),\n buy: boolean(\"buy\").notNull(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n loanToken: varchar(\"loan_token\", { length: 42 }).notNull(),\n callbackAddress: varchar(\"callback_address\", { length: 42 }).notNull(),\n callbackData: text(\"callback_data\").notNull(),\n callbackGasLimit: bigint(\"callback_gas_limit\", { mode: \"bigint\" }).notNull(),\n signature: varchar(\"signature\", { length: 132 }),\n callbackId: varchar(\"callback_id\", { length: 256 }),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"offers_offering_idx\").on(table.offering),\n index(\"offers_buy_idx\").on(table.buy),\n index(\"offers_chain_id_idx\").on(table.chainId),\n index(\"offers_loan_token_idx\").on(table.loanToken),\n index(\"offers_maturity_idx\").on(table.maturity),\n index(\"offers_expiry_idx\").on(table.expiry),\n index(\"offers_rate_idx\").on(table.rate),\n index(\"offers_assets_idx\").on(table.assets),\n // Compound indices for cursor pagination with hash\n index(\"offers_rate_hash_idx\").on(table.rate, table.hash),\n index(\"offers_maturity_hash_idx\").on(table.maturity, table.hash),\n index(\"offers_expiry_hash_idx\").on(table.expiry, table.hash),\n index(\"offers_assets_hash_idx\").on(table.assets, table.hash),\n ],\n);\n\nexport const offerCollaterals = s.table(\n \"offer_collaterals\",\n {\n id: serial(\"id\").primaryKey(),\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n asset: varchar(\"asset\", { length: 42 }).notNull(),\n oracle: varchar(\"oracle\", { length: 42 }).notNull(),\n lltv: bigint(\"lltv\", { mode: \"bigint\" }).notNull(),\n },\n (table) => [\n index(\"offer_collaterals_offer_hash_idx\").on(table.offerHash),\n index(\"offer_collaterals_asset_idx\").on(table.asset),\n index(\"offer_collaterals_oracle_idx\").on(table.oracle),\n // Composite index\n index(\"offer_collaterals_tuple_idx\").on(table.asset, table.oracle, table.lltv),\n ],\n);\n\nexport const offerStatus = s.table(\n \"offer_status\",\n {\n id: serial(\"id\").primaryKey(),\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n status: text(\"status\").$type<RouterOffer.OfferStatus>().notNull(),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"offer_status_offer_hash_created_at_idx\").on(table.offerHash, desc(table.createdAt)),\n index(\"offer_status_status_idx\").on(table.status),\n ],\n);\n\nexport const consumed = s.table(\n \"consumed_per_user_and_nonce\",\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n offering: varchar(\"offering\", { length: 42 }).notNull(),\n nonce: bigint(\"nonce\", { mode: \"bigint\" }).notNull(),\n consumed: numeric(\"consumed\", { precision: 78, scale: 0 }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"consumed_per_user_and_nonce_chain_id_offering_nonce_created_at_idx\").on(\n table.chainId,\n table.offering,\n table.nonce,\n desc(table.createdAt),\n ),\n ],\n);\n\nexport const collectorBlockNumbers = s.table(\n \"collector_block_numbers\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n name: text(\"name\").notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [uniqueIndex(\"collector_block_numbers_chain_name_idx\").on(table.chainId, table.name)],\n);\n\nexport const availableLiquidityPools = s.table(\"available_liquidity_pools\", {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n});\n\nexport const availableLiquidityQueues = s.table(\n \"available_liquidity_queues\",\n {\n queueId: varchar(\"queue_id\", { length: 255 }).notNull(),\n availableLiquidityPoolId: varchar(\"available_liquidity_pool_id\", { length: 255 })\n .notNull()\n .references(() => availableLiquidityPools.id, { onDelete: \"cascade\" }),\n index: integer(\"index\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.queueId, table.availableLiquidityPoolId],\n name: \"available_liquidity_queues_pk\",\n }),\n index(\"available_liquidity_queues_queue_index_idx\").on(table.queueId, table.index),\n ],\n);\n\nexport const userPositions = s.table(\n \"user_positions\",\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n availableLiquidityQueueId: varchar(\"available_liquidity_queue_id\", { length: 255 }).notNull(),\n user: varchar(\"user\", { length: 255 }).notNull(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"user_positions_available_liquidity_queue_id_idx\").on(table.availableLiquidityQueueId),\n ],\n);\n","import { eq } from \"drizzle-orm\";\nimport type * as Liquidity from \"#core/Liquidity.ts\";\nimport {\n availableLiquidityPools,\n availableLiquidityQueues,\n userPositions,\n} from \"#core/OfferStore/drizzle/schema.ts\";\nimport type * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type LiquidityStore = {\n /** Get a liquidity entry by user position id, including queues and pools. */\n getByUserPositionId: (parameters: {\n userPositionId: string;\n }) => Promise<Liquidity.Liquidity | null>;\n\n /** Get all liquidity entries, grouped by user position, including queues and pools. */\n getAll: () => Promise<Liquidity.Liquidity[]>;\n\n /** Save or update a liquidity entry (transactional upsert across all three tables). */\n save: (parameters: { liquidity: Liquidity.Liquidity }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): LiquidityStore => {\n const db = config.db;\n\n return {\n getByUserPositionId: async (parameters: { userPositionId: string }) => {\n const up = await db\n .select()\n .from(userPositions)\n .where(eq(userPositions.id, parameters.userPositionId))\n .limit(1);\n\n if (up.length === 0) return null;\n const userPositionRow = up[0]!;\n\n const rows = await db\n .select({ queue: availableLiquidityQueues, pool: availableLiquidityPools })\n .from(availableLiquidityQueues)\n .innerJoin(\n availableLiquidityPools,\n eq(availableLiquidityPools.id, availableLiquidityQueues.availableLiquidityPoolId),\n )\n .where(eq(availableLiquidityQueues.queueId, userPositionRow.availableLiquidityQueueId));\n\n const queues: Liquidity.LiquidityQueueWithPool[] = rows.map((row) => ({\n queue: row.queue,\n pool: row.pool,\n }));\n\n return { userPosition: userPositionRow, queues };\n },\n\n getAll: async () => {\n const rows = await db\n .select({\n userPosition: userPositions,\n queue: availableLiquidityQueues,\n pool: availableLiquidityPools,\n })\n .from(userPositions)\n .innerJoin(\n availableLiquidityQueues,\n eq(availableLiquidityQueues.queueId, userPositions.availableLiquidityQueueId),\n )\n .innerJoin(\n availableLiquidityPools,\n eq(availableLiquidityPools.id, availableLiquidityQueues.availableLiquidityPoolId),\n );\n\n const byUserPosition = new Map<string, Liquidity.Liquidity>();\n for (const row of rows) {\n const id = row.userPosition.id;\n if (!byUserPosition.has(id)) {\n byUserPosition.set(id, { userPosition: row.userPosition, queues: [] });\n }\n byUserPosition.get(id)!.queues.push({ queue: row.queue, pool: row.pool });\n }\n\n return Array.from(byUserPosition.values());\n },\n\n save: async (parameters: { liquidity: Liquidity.Liquidity }) => {\n const { liquidity } = parameters;\n await db.transaction(async (tx) => {\n for (const qp of liquidity.queues) {\n await tx\n .insert(availableLiquidityPools)\n .values({\n id: qp.pool.id,\n amount: qp.pool.amount,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: availableLiquidityPools.id,\n set: {\n amount: qp.pool.amount,\n updatedAt: new Date(),\n },\n });\n }\n\n for (const qp of liquidity.queues) {\n await tx\n .insert(availableLiquidityQueues)\n .values({\n queueId: qp.queue.queueId,\n availableLiquidityPoolId: qp.pool.id,\n index: qp.queue.index,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [\n availableLiquidityQueues.queueId,\n availableLiquidityQueues.availableLiquidityPoolId,\n ],\n set: {\n index: qp.queue.index,\n updatedAt: new Date(),\n },\n });\n }\n\n await tx\n .insert(userPositions)\n .values({\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: userPositions.id,\n set: {\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n },\n });\n });\n },\n };\n};\n\nexport function memory(): LiquidityStore {\n const poolsById = new Map<string, Liquidity.LiquidityPool>();\n const queuesByComposite = new Map<string, Liquidity.LiquidityQueue>();\n const queueIndexByQueueId = new Map<string, Set<string>>(); // queueId -> composite keys\n const userPositionsById = new Map<string, Liquidity.LiquidityUserPosition>();\n\n return {\n getByUserPositionId: async (parameters: { userPositionId: string }) => {\n const up = userPositionsById.get(parameters.userPositionId);\n if (!up) return null;\n\n const compositeKeys = queueIndexByQueueId.get(up.availableLiquidityQueueId) || new Set();\n const queues: Liquidity.LiquidityQueueWithPool[] = [];\n for (const key of compositeKeys) {\n const q = queuesByComposite.get(key);\n if (!q) continue;\n const p = poolsById.get(q.availableLiquidityPoolId);\n if (!p) continue;\n queues.push({ queue: q, pool: p });\n }\n\n return { userPosition: up, queues };\n },\n\n getAll: async () => {\n const results: Liquidity.Liquidity[] = [];\n for (const up of userPositionsById.values()) {\n const compositeKeys = queueIndexByQueueId.get(up.availableLiquidityQueueId) || new Set();\n const queues: Liquidity.LiquidityQueueWithPool[] = [];\n for (const key of compositeKeys) {\n const q = queuesByComposite.get(key);\n if (!q) continue;\n const p = poolsById.get(q.availableLiquidityPoolId);\n if (!p) continue;\n queues.push({ queue: q, pool: p });\n }\n results.push({ userPosition: up, queues });\n }\n return results;\n },\n\n save: async (parameters: { liquidity: Liquidity.Liquidity }) => {\n const { liquidity } = parameters;\n\n for (const qp of liquidity.queues) {\n poolsById.set(qp.pool.id, {\n id: qp.pool.id,\n amount: qp.pool.amount,\n updatedAt: new Date(),\n });\n }\n\n for (const qp of liquidity.queues) {\n const qid = qp.queue.queueId;\n if (!qid) continue;\n const composite = `${qid}::${qp.pool.id}`;\n queuesByComposite.set(composite, {\n queueId: qid,\n availableLiquidityPoolId: qp.pool.id,\n index: qp.queue.index,\n updatedAt: new Date(),\n });\n if (!queueIndexByQueueId.has(qid)) queueIndexByQueueId.set(qid, new Set());\n queueIndexByQueueId.get(qid)!.add(composite);\n }\n\n userPositionsById.set(liquidity.userPosition.id, {\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n });\n },\n };\n}\n","export * from \"./OfferStore.ts\";\nexport * from \"./OfferStorePg.ts\";\n","import { LLTV, Maturity, Offer, Time } from \"@morpho-dev/mempool\";\nimport { and, asc, desc, eq, gte, inArray, lte, sql } from \"drizzle-orm\";\nimport { type Address, type Hex, parseUnits } from \"viem\";\nimport * as Callback from \"#core/Callback.ts\";\nimport * as Cursor from \"#core/Cursor.ts\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\nimport {\n availableLiquidityPools,\n availableLiquidityQueues,\n consumed as consumedTable,\n offerCollaterals,\n offerStatus,\n offers,\n userPositions,\n} from \"./drizzle/schema.ts\";\nimport type * as OfferStore from \"./OfferStore.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type PgConfig = {\n /** The database instance to use for operations. */\n db: PG.PG;\n};\n\nexport function create(config: PgConfig): OfferStore.OfferStore {\n const db = config.db;\n\n return {\n create: async (parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<string> => {\n const { offer, status, metadata } = parameters;\n\n return await db.transaction(async (tx) => {\n const callbackId = Callback.getCallbackIdForOffer(offer);\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n offering: offer.offering.toLowerCase(),\n assets: offer.assets.toString(),\n rate: offer.rate,\n maturity: offer.maturity,\n expiry: offer.expiry,\n start: offer.start,\n nonce: offer.nonce,\n buy: offer.buy,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n callbackAddress: offer.callback.address.toLowerCase(),\n callbackData: offer.callback.data,\n callbackGasLimit: offer.callback.gasLimit,\n signature: offer.signature,\n callbackId: callbackId ?? null,\n })\n .onConflictDoNothing()\n .returning();\n\n if (result.length === 0) {\n return offer.hash;\n }\n\n for (const collateral of offer.collaterals) {\n await tx.insert(offerCollaterals).values({\n offerHash: offer.hash.toLowerCase(),\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n });\n }\n\n await tx.insert(offerStatus).values({\n offerHash: offer.hash.toLowerCase(),\n status,\n metadata,\n });\n\n return offer.hash;\n });\n },\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[],\n ): Promise<string[]> => {\n return await db.transaction(async (tx) => {\n const hashes: string[] = [];\n\n for (const { offer, status, metadata } of parameters) {\n const callbackId = Callback.getCallbackIdForOffer(offer);\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n offering: offer.offering.toLowerCase(),\n assets: offer.assets.toString(),\n rate: offer.rate,\n maturity: offer.maturity,\n expiry: offer.expiry,\n start: offer.start,\n nonce: offer.nonce,\n buy: offer.buy,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n callbackAddress: offer.callback.address.toLowerCase(),\n callbackData: offer.callback.data,\n callbackGasLimit: offer.callback.gasLimit,\n signature: offer.signature,\n callbackId: callbackId ?? null,\n })\n .onConflictDoNothing()\n .returning();\n\n // early return to avoid inserting collaterals and status if the offer already exists\n if (result.length === 0) continue;\n\n for (const collateral of offer.collaterals) {\n await tx.insert(offerCollaterals).values({\n offerHash: offer.hash.toLowerCase(),\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n });\n }\n\n await tx.insert(offerStatus).values({\n offerHash: offer.hash.toLowerCase(),\n status,\n metadata,\n });\n\n hashes.push(offer.hash);\n }\n\n return hashes;\n });\n },\n\n getAll: async (\n params?: OfferStore.GetAllParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const { query } = params ?? {};\n\n const conditions: ReturnType<typeof sql>[] = [];\n const now = Time.now();\n\n if (query?.creators && query.creators.length > 0) {\n conditions.push(\n inArray(\n offers.offering,\n query.creators.map((c) => c.toLowerCase()),\n ),\n );\n }\n\n if (query?.side) {\n conditions.push(eq(offers.buy, query.side === \"buy\"));\n }\n\n if (query?.chains && query.chains.length > 0) {\n conditions.push(\n inArray(\n offers.chainId,\n query.chains.map((chain) => BigInt(chain)),\n ),\n );\n }\n\n if (query?.loanTokens && query.loanTokens.length > 0) {\n conditions.push(\n inArray(\n offers.loanToken,\n query.loanTokens.map((t) => t.toLowerCase()),\n ),\n );\n }\n\n if (query?.callbackAddresses && query.callbackAddresses.length > 0) {\n conditions.push(\n inArray(\n offers.callbackAddress,\n query.callbackAddresses.map((c) => c.toLowerCase()),\n ),\n );\n }\n\n // Always exclude expired offers\n conditions.push(gte(offers.expiry, now));\n\n // Filter by amount range\n if (query?.minAmount !== undefined) {\n conditions.push(gte(offers.assets, query.minAmount.toString()));\n }\n if (query?.maxAmount !== undefined) {\n conditions.push(lte(offers.assets, query.maxAmount.toString()));\n }\n\n // Filter by rate range\n if (query?.minRate !== undefined) {\n conditions.push(gte(offers.rate, query.minRate));\n }\n if (query?.maxRate !== undefined) {\n conditions.push(lte(offers.rate, query.maxRate));\n }\n\n // Filter by maturity range\n if (query?.minMaturity !== undefined) {\n conditions.push(gte(offers.maturity, query.minMaturity));\n }\n if (query?.maxMaturity !== undefined) {\n conditions.push(lte(offers.maturity, query.maxMaturity));\n }\n\n // Filter by expiry range\n if (query?.minExpiry !== undefined) {\n conditions.push(gte(offers.expiry, query.minExpiry));\n }\n if (query?.maxExpiry !== undefined) {\n conditions.push(lte(offers.expiry, query.maxExpiry));\n }\n\n // Filter by collateral assets\n if (query?.collateralAssets && query.collateralAssets.length > 0) {\n conditions.push(\n inArray(\n offerCollaterals.asset,\n query.collateralAssets.map((a) => a.toLowerCase()),\n ),\n );\n }\n\n if (query?.collateralOracles && query.collateralOracles.length > 0) {\n conditions.push(\n inArray(\n offerCollaterals.oracle,\n query.collateralOracles.map((o) => o.toLowerCase()),\n ),\n );\n }\n\n // Collateral tuple filtering (match all specified fields per tuple)\n if (query?.collateralTuple && query.collateralTuple.length > 0) {\n const tupleClauses = query.collateralTuple\n .map((tuple) => {\n const parts: [ReturnType<typeof sql>, ...ReturnType<typeof sql>[]] = [\n sql`${offerCollaterals.asset} = ${tuple.asset.toLowerCase()}`,\n ];\n if (tuple.oracle) {\n parts.push(sql`${offerCollaterals.oracle} = ${tuple.oracle.toLowerCase()}`);\n }\n if (tuple.lltv !== undefined) {\n parts.push(sql`${offerCollaterals.lltv} = ${tuple.lltv}`);\n }\n // Manually join parts with AND to avoid undefined type from drizzle's and()\n let clause = parts[0]!;\n for (let i = 1; i < parts.length; i++) {\n clause = sql`${clause} AND ${parts[i]!}`;\n }\n return sql`(${clause})`;\n })\n .filter((c): c is ReturnType<typeof sql> => c !== undefined);\n\n if (tupleClauses.length > 0) {\n let combined = tupleClauses[0]!;\n for (let i = 1; i < tupleClauses.length; i++) {\n combined = sql`${combined} OR ${tupleClauses[i]!}`;\n }\n conditions.push(sql`(${combined})`);\n }\n }\n\n // Filter by LLTV range\n if (query?.minLltv !== undefined) {\n conditions.push(gte(offerCollaterals.lltv, parseUnits(query.minLltv.toString(), 16)));\n }\n if (query?.maxLltv !== undefined) {\n conditions.push(lte(offerCollaterals.lltv, parseUnits(query.maxLltv.toString(), 16)));\n }\n\n // Build the main query with proper chaining\n const sortBy = query?.sortBy ?? \"expiry\";\n const sortOrder = query?.sortOrder ?? \"desc\";\n\n const sortColumn = (() => {\n switch (sortBy) {\n case \"rate\":\n return offers.rate;\n case \"maturity\":\n return offers.maturity;\n case \"expiry\":\n return offers.expiry;\n case \"amount\":\n return offers.assets;\n default:\n return offers.expiry;\n }\n })();\n\n // --- Cursor decoding ---\n const cursor = Cursor.decode(query?.cursor);\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 const op = sortOrder === \"asc\" ? sql`>` : sql`<`;\n\n const cursorVal = (() => {\n switch (sortBy) {\n case \"rate\":\n return BigInt(cursor.rate!);\n case \"amount\":\n return BigInt(cursor.assets!);\n case \"maturity\":\n return cursor.maturity!;\n case \"expiry\":\n return cursor.expiry!;\n default:\n return cursor.expiry!; // expiry by default\n }\n })();\n\n conditions.push(sql`(${sortColumn}, ${offers.hash}) ${op} (${cursorVal}, ${cursor.hash})`);\n }\n\n const limit = query?.limit ?? 20;\n\n const latestStatus = db\n .select({\n status: offerStatus.status,\n metadata: offerStatus.metadata,\n })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, offers.hash))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1)\n .as(\"latest_status\");\n\n const sumConsumed = db\n .select({\n consumed: sql<string>`COALESCE(SUM(${consumedTable.consumed}), 0)`.as(\"consumed\"),\n })\n .from(consumedTable)\n .where(\n and(\n eq(consumedTable.offering, offers.offering),\n eq(consumedTable.nonce, offers.nonce),\n eq(consumedTable.chainId, offers.chainId),\n ),\n )\n .as(\"sum_consumed\");\n\n const results = await db\n .select({\n hash: offers.hash,\n offering: offers.offering,\n assets: offers.assets,\n consumed: sumConsumed.consumed,\n rate: offers.rate,\n maturity: offers.maturity,\n expiry: offers.expiry,\n start: offers.start,\n nonce: offers.nonce,\n buy: offers.buy,\n chainId: offers.chainId,\n loanToken: offers.loanToken,\n callbackAddress: offers.callbackAddress,\n callbackData: offers.callbackData,\n callbackGasLimit: offers.callbackGasLimit,\n signature: offers.signature,\n createdAt: offers.createdAt,\n collateralAsset: offerCollaterals.asset,\n collateralOracle: offerCollaterals.oracle,\n collateralLltv: offerCollaterals.lltv,\n status: latestStatus.status,\n metadata: latestStatus.metadata,\n })\n .from(offers)\n .leftJoin(offerCollaterals, eq(offers.hash, offerCollaterals.offerHash))\n .leftJoinLateral(latestStatus, sql`true`)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n conditions.length > 0 ? and(...conditions) : sql`true`,\n query?.status && query.status.length > 0\n ? inArray(latestStatus.status, query.status)\n : eq(latestStatus.status, \"valid\"),\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n ...(sortOrder === \"asc\"\n ? [asc(sortColumn), asc(offers.hash)]\n : [desc(sortColumn), desc(offers.hash)]),\n )\n .limit(limit);\n\n // Group results by offer hash and aggregate collaterals\n const offerMap = new Map<\n string,\n {\n hash: Hex;\n offering: Address;\n assets: bigint;\n consumed: bigint;\n rate: bigint;\n maturity: number;\n expiry: number;\n start: number;\n nonce: bigint;\n buy: boolean;\n chainId: bigint;\n loanToken: Address;\n callbackAddress: Address;\n callbackData: Hex;\n callbackGasLimit: bigint;\n signature: Hex | null;\n createdAt: Date;\n collaterals: Array<{ asset: Address; oracle: Address; lltv: LLTV.LLTV }>;\n status: RouterOffer.OfferStatus;\n metadata: RouterOffer.OfferMetadata | null;\n }\n >();\n\n for (const row of results) {\n const offer = offerMap.get(row.hash) || {\n hash: row.hash as Hex,\n offering: row.offering as Address,\n assets: BigInt(row.assets),\n consumed: BigInt(row.consumed),\n rate: row.rate,\n maturity: row.maturity,\n expiry: row.expiry,\n start: row.start,\n nonce: row.nonce,\n buy: row.buy,\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n callbackAddress: row.callbackAddress as Address,\n callbackData: row.callbackData as Hex,\n callbackGasLimit: row.callbackGasLimit,\n signature: row.signature as Hex | null,\n createdAt: row.createdAt,\n collaterals: [],\n status: row.status as RouterOffer.OfferStatus,\n metadata: row.metadata as RouterOffer.OfferMetadata | null,\n };\n\n if (row.collateralAsset && row.collateralOracle && row.collateralLltv) {\n offer.collaterals.push({\n asset: row.collateralAsset as Address,\n oracle: row.collateralOracle as Address,\n lltv: LLTV.from(row.collateralLltv),\n });\n }\n\n offerMap.set(row.hash, offer);\n }\n\n // compute nextCursor\n let nextCursor: string | null = null;\n if (results.length === limit && results.length > 0) {\n const lastRow = results[results.length - 1]!;\n const base: Cursor.Cursor = {\n sort: sortBy,\n dir: sortOrder,\n hash: lastRow.hash,\n } as Cursor.Cursor;\n\n switch (sortBy) {\n case \"rate\":\n base.rate = lastRow.rate.toString();\n break;\n case \"amount\":\n base.assets = lastRow.assets.toString();\n break;\n case \"maturity\":\n base.maturity = lastRow.maturity;\n break;\n default:\n base.expiry = lastRow.expiry;\n }\n nextCursor = Cursor.encode(base);\n }\n\n const transformedResults: RouterOffer.RouterOffer[] = [];\n\n for (const offerData of offerMap.values()) {\n const offer = Offer.from({\n offering: offerData.offering,\n assets: offerData.assets,\n rate: offerData.rate,\n maturity: Maturity.from(offerData.maturity),\n expiry: offerData.expiry,\n start: offerData.start,\n nonce: offerData.nonce,\n buy: offerData.buy,\n chainId: offerData.chainId,\n loanToken: offerData.loanToken,\n collaterals: offerData.collaterals\n .map((c) => ({\n asset: c.asset,\n oracle: c.oracle,\n lltv: LLTV.from(c.lltv),\n }))\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: offerData.callbackAddress,\n data: offerData.callbackData,\n gasLimit: offerData.callbackGasLimit,\n },\n ...(offerData.signature !== null ? { signature: offerData.signature } : undefined),\n });\n\n transformedResults.push({\n ...offer,\n consumed: offerData.consumed,\n status: offerData.status,\n ...(offerData.metadata !== null ? { metadata: offerData.metadata } : undefined),\n });\n }\n\n return { offers: transformedResults, nextCursor };\n },\n\n /**\n * Returns offers that match specified offer based on the provided parameters.\n *\n * Rules for filtering:\n * - If offer expiry is in the past compared to now, it should not be included\n * - If offer maturity is in the past compared to now, it should not be included\n * - It should return if buyOffer.rate >= sellOffer.rate\n * - It should return if buyOffer.userAddress != sellOffer.userAddress\n * - It should return if maturity matches\n * - It should return if loanToken matches\n * - If the incoming intent is a buy / lend offer, only consider existing sell / borrow offers.\n * - If the incoming intent is a sell / borrow offer, only consider existing buy / lend offers.\n * - When the intent is lend: require offer_collaterals ⊆ intent_collaterals\n * - When the intent is borrow: require intent_collaterals ⊆ offer_collaterals\n * - It should sort by increasing rate if the input offer is a buy/lend offer\n * - It should sort by decreasing rate if the input offer is a sell/borrow offer\n */\n findMatchingOffers: async (\n params: OfferStore.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 cursor,\n limit = 20,\n } = params;\n\n const isIncomingBuy = side === \"buy\";\n const nowEpochSeconds = Math.floor(Date.now() / 1000);\n const rateSortDirection: \"asc\" | \"desc\" = isIncomingBuy ? \"desc\" : \"asc\";\n\n const baseWhereClauses: ReturnType<typeof sql>[] = [];\n baseWhereClauses.push(eq(offers.buy, !isIncomingBuy));\n baseWhereClauses.push(eq(offers.chainId, BigInt(chainId)));\n baseWhereClauses.push(gte(offers.expiry, nowEpochSeconds));\n baseWhereClauses.push(gte(offers.maturity, nowEpochSeconds));\n if (maturity) baseWhereClauses.push(eq(offers.maturity, maturity));\n if (minMaturity) baseWhereClauses.push(gte(offers.maturity, minMaturity));\n if (maxMaturity) baseWhereClauses.push(lte(offers.maturity, maxMaturity));\n if (loanToken) baseWhereClauses.push(eq(offers.loanToken, loanToken.toLowerCase()));\n if (creator) baseWhereClauses.push(eq(offers.offering, creator.toLowerCase()));\n if (rate)\n baseWhereClauses.push(isIncomingBuy ? gte(offers.rate, rate) : lte(offers.rate, rate));\n\n // Cursor decode/validation (windowing handled later to support pre-consumption)\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor) {\n if (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n }\n\n // Collateral filters\n if (collaterals.length > 0) {\n const collateralValues = collaterals\n .map(\n (c) =>\n `('${c.asset.toLowerCase()}', '${c.oracle.toLowerCase()}', ${c.lltv.toString()})`,\n )\n .join(\", \");\n\n const userCollaterals = sql`(VALUES ${sql.raw(collateralValues)}) AS user_collaterals(asset, oracle, lltv)`;\n\n // when wanting to sell, user sell collaterals ⊆ buy offer collaterals\n const sellPredicate = sql`\n NOT EXISTS (\n SELECT 1 FROM ${userCollaterals}\n WHERE NOT EXISTS (\n SELECT 1 FROM ${offerCollaterals} offer_collaterals\n WHERE offer_collaterals.offer_hash = ${offers.hash}\n AND offer_collaterals.asset = user_collaterals.asset\n AND offer_collaterals.oracle = user_collaterals.oracle\n AND offer_collaterals.lltv = user_collaterals.lltv\n )\n )\n `;\n\n // when wanting to buy, sell offer collaterals ⊆ user buy collaterals\n const buyPredicate = sql`\n NOT EXISTS (\n SELECT 1 FROM ${offerCollaterals} offer_collaterals\n WHERE offer_collaterals.offer_hash = ${offers.hash}\n AND NOT EXISTS (\n SELECT 1 FROM ${userCollaterals}\n WHERE user_collaterals.asset = offer_collaterals.asset\n AND user_collaterals.oracle = offer_collaterals.oracle\n AND user_collaterals.lltv = offer_collaterals.lltv\n )\n )\n `;\n\n baseWhereClauses.push(isIncomingBuy ? buyPredicate : sellPredicate);\n }\n\n const latestStatus = db\n .select({\n status: offerStatus.status,\n metadata: offerStatus.metadata,\n })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, offers.hash))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1)\n .as(\"latest_status\");\n\n const sumConsumed = db\n .select({\n consumed: sql<string>`COALESCE(SUM(${consumedTable.consumed}), 0)`.as(\"consumed\"),\n })\n .from(consumedTable)\n .where(\n and(\n eq(consumedTable.offering, offers.offering),\n eq(consumedTable.nonce, offers.nonce),\n eq(consumedTable.chainId, offers.chainId),\n ),\n )\n .as(\"sum_consumed\");\n\n const statusCondition = eq(latestStatus.status, \"valid\");\n\n // ------------------------------------------------------------------\n // Best‑offer selection per (offering, nonce, side) group\n // ------------------------------------------------------------------\n //\n // • DISTINCT ON (offering, nonce, buy) keeps only one offer per group.\n // • ORDER BY inside DISTINCT ON realises the priority rules:\n // 1 price – lower rate for lenders (buy = true), higher rate for borrowers (buy = false)\n // 2 size – larger remaining size (assets – consumed)\n // 3 term – longer maturity\n //\n //\n // NOTE: we first pick the winner rows into a CTE (“best_offers”) and\n // only then join collaterals so that the ranking is not disturbed\n // by the 1‑to‑N relationship.\n // ------------------------------------------------------------------\n\n const bestOffers = db\n .selectDistinctOn(\n // group key\n [offers.offering, offers.nonce, offers.buy],\n {\n hash: offers.hash,\n offering: offers.offering,\n assets: offers.assets,\n consumed: sumConsumed.consumed,\n remaining: sql`${offers.assets} - COALESCE(${sumConsumed.consumed}, 0)`.as(\"remaining\"),\n rate: offers.rate,\n maturity: offers.maturity,\n expiry: offers.expiry,\n start: offers.start,\n nonce: offers.nonce,\n buy: offers.buy,\n chainId: offers.chainId,\n loanToken: offers.loanToken,\n callbackAddress: offers.callbackAddress,\n callbackData: offers.callbackData,\n callbackGasLimit: offers.callbackGasLimit,\n signature: offers.signature,\n callbackId: offers.callbackId,\n status: latestStatus.status,\n metadata: latestStatus.metadata,\n },\n )\n .from(offers)\n .leftJoinLateral(latestStatus, sql`true`)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n and(...baseWhereClauses),\n statusCondition,\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n offers.offering,\n offers.nonce,\n offers.buy,\n // 1 price (direction depends on side)\n sql`CASE WHEN ${offers.buy} THEN ${offers.rate} ELSE -${offers.rate} END`,\n // 2 size (remaining)\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) DESC`,\n // 3 term (longer maturity)\n desc(offers.maturity),\n )\n .as(\"best_offers\");\n\n // total liquidity per callbackId (sum of pools behind the user's queue)\n // Note: queue order doesn't change the sum; ordering will matter in the window step below.\n const queueLiquidity = db\n .select({\n callbackId: userPositions.id,\n userAmount: userPositions.amount, // user's per-callback cap\n queueLiquidity: sql<bigint>`COALESCE(SUM(${availableLiquidityPools.amount}), 0)`.as(\n \"queue_liquidity\",\n ),\n })\n .from(userPositions)\n .leftJoin(\n availableLiquidityQueues,\n eq(userPositions.availableLiquidityQueueId, availableLiquidityQueues.queueId),\n )\n .leftJoin(\n availableLiquidityPools,\n eq(availableLiquidityQueues.availableLiquidityPoolId, availableLiquidityPools.id),\n )\n .groupBy(userPositions.id)\n .as(\"queue_liquidity\");\n\n const sortExpr = sql`CASE WHEN ${bestOffers.buy} THEN ${bestOffers.rate} ELSE -${bestOffers.rate} END`;\n\n const offersWithEligibility = db\n .select({\n hash: bestOffers.hash,\n offering: bestOffers.offering,\n assets: bestOffers.assets,\n consumed: bestOffers.consumed,\n remaining: bestOffers.remaining,\n rate: bestOffers.rate,\n maturity: bestOffers.maturity,\n expiry: bestOffers.expiry,\n start: bestOffers.start,\n nonce: bestOffers.nonce,\n buy: bestOffers.buy,\n chainId: bestOffers.chainId,\n loanToken: bestOffers.loanToken,\n callbackAddress: bestOffers.callbackAddress,\n callbackData: bestOffers.callbackData,\n callbackGasLimit: bestOffers.callbackGasLimit,\n signature: bestOffers.signature,\n callbackId: bestOffers.callbackId,\n status: bestOffers.status,\n metadata: bestOffers.metadata,\n\n // liquidity caps\n userAmount: sql<bigint>`COALESCE(${queueLiquidity.userAmount}, 0)`.as(\"user_amount\"),\n queueLiquidity: sql<bigint>`COALESCE(${queueLiquidity.queueLiquidity}, 0)`.as(\n \"queue_liquidity\",\n ),\n\n // running total of remaining per callback, ordered by the *same* priority as selection\n cumulativeRemaining: sql<bigint>`\n SUM(${bestOffers.remaining}) OVER (\n PARTITION BY ${bestOffers.callbackId}\n ORDER BY ${sortExpr}, ${asc(bestOffers.hash)}\n ROWS UNBOUNDED PRECEDING\n )\n `.as(\"cumulative_remaining\"),\n\n eligible: sql<boolean>`\n CASE\n WHEN ${bestOffers.buy} = false THEN true\n WHEN ${bestOffers.remaining} <= 0 THEN false\n ELSE ( SUM(${bestOffers.remaining}) OVER (\n PARTITION BY ${bestOffers.callbackId}\n ORDER BY ${sortExpr}, ${asc(bestOffers.hash)}\n ROWS UNBOUNDED PRECEDING\n )\n <= LEAST(\n COALESCE(${queueLiquidity.userAmount}, 0),\n COALESCE(${queueLiquidity.queueLiquidity}, 0)\n )\n )\n END\n `.as(\"eligible\"),\n })\n .from(bestOffers)\n .leftJoin(queueLiquidity, eq(bestOffers.callbackId, queueLiquidity.callbackId))\n .as(\"offers_with_eligibility\");\n\n const hardCap = limit * 5 + 1 + (parsedCursor ? 1 : 0);\n const validOffers = db\n .select({\n // pass-through all fields + a global row_number for hard cap\n hash: offersWithEligibility.hash,\n offering: offersWithEligibility.offering,\n assets: offersWithEligibility.assets,\n consumed: offersWithEligibility.consumed,\n remaining: offersWithEligibility.remaining,\n rate: offersWithEligibility.rate,\n maturity: offersWithEligibility.maturity,\n expiry: offersWithEligibility.expiry,\n start: offersWithEligibility.start,\n nonce: offersWithEligibility.nonce,\n buy: offersWithEligibility.buy,\n chainId: offersWithEligibility.chainId,\n loanToken: offersWithEligibility.loanToken,\n callbackAddress: offersWithEligibility.callbackAddress,\n callbackData: offersWithEligibility.callbackData,\n callbackGasLimit: offersWithEligibility.callbackGasLimit,\n signature: offersWithEligibility.signature,\n callbackId: offersWithEligibility.callbackId,\n status: offersWithEligibility.status,\n metadata: offersWithEligibility.metadata,\n userAmount: offersWithEligibility.userAmount,\n queueLiquidity: offersWithEligibility.queueLiquidity,\n cumulativeRemaining: offersWithEligibility.cumulativeRemaining,\n eligible: offersWithEligibility.eligible,\n // sort expression is the same again as in offersWithEligibility\n rowNumber: sql<number>`\n ROW_NUMBER() OVER (\n ORDER BY\n CASE WHEN ${offersWithEligibility.buy} THEN ${offersWithEligibility.rate} ELSE -${offersWithEligibility.rate} END,\n ${asc(offersWithEligibility.hash)}\n )\n `.as(\"row_number\"),\n })\n .from(offersWithEligibility)\n .where(sql`${offersWithEligibility.eligible} = true`)\n .limit(hardCap)\n .as(\"valid_offers\");\n\n const cursorTuple = parsedCursor\n ? {\n rate: BigInt(parsedCursor.rate!),\n hash: parsedCursor.hash!,\n }\n : null;\n\n const withCollats = await db\n .select({\n // base fields\n hash: sql<Hex>`${validOffers.hash}`,\n offering: sql<Address>`${validOffers.offering}`,\n assets: validOffers.assets,\n consumed: validOffers.consumed,\n rate: validOffers.rate,\n maturity: validOffers.maturity,\n expiry: validOffers.expiry,\n start: validOffers.start,\n nonce: validOffers.nonce,\n buy: validOffers.buy,\n chainId: validOffers.chainId,\n loanToken: sql<Address>`${validOffers.loanToken}`,\n callbackAddress: sql<Address>`${validOffers.callbackAddress}`,\n callbackData: sql<Hex>`${validOffers.callbackData}`,\n callbackGasLimit: validOffers.callbackGasLimit,\n signature: sql<Hex | undefined>`${validOffers.signature}`,\n callbackId: validOffers.callbackId,\n status: sql<\"valid\">`${validOffers.status}`,\n metadata: validOffers.metadata,\n\n // collateral fields\n collateralAsset: sql<Address>`${offerCollaterals.asset}`,\n collateralOracle: sql<Address>`${offerCollaterals.oracle}`,\n collateralLltv: offerCollaterals.lltv,\n })\n .from(validOffers)\n .leftJoin(offerCollaterals, eq(validOffers.hash, offerCollaterals.offerHash))\n .where(\n and(\n ...(cursorTuple\n ? [\n sql`(${validOffers.rate}, ${validOffers.hash}) ${rateSortDirection === \"asc\" ? sql`>` : sql`<`} (${cursorTuple.rate}, ${cursorTuple.hash})`,\n ]\n : []),\n ),\n )\n .orderBy(\n rateSortDirection === \"asc\" ? asc(validOffers.rate) : desc(validOffers.rate),\n asc(validOffers.hash),\n );\n\n type OfferMapEntry = {\n base: Omit<Offer.Offer, \"collaterals\" | \"callback\" | \"maturity\" | \"assets\" | \"consumed\"> & {\n callbackAddress: Address;\n callbackData: Hex;\n callbackGasLimit: bigint;\n collateralAsset: Address;\n collateralOracle: Address;\n collateralLltv: bigint | null;\n maturity: number;\n assets: string;\n consumed: string;\n status: \"valid\";\n metadata: unknown;\n };\n collaterals: { asset: Address; oracle: Address; lltv: LLTV.LLTV }[];\n };\n\n const buildOffersMap = (\n rows: OfferMapEntry[\"base\"][],\n skipHash?: string,\n ): Map<string, OfferMapEntry> => {\n const map = new Map<string, OfferMapEntry>();\n for (const row of rows) {\n if (skipHash && row.hash === skipHash) continue;\n const entry = map.get(row.hash) ?? { base: row, collaterals: [] };\n if (row.collateralAsset && row.collateralOracle && row.collateralLltv) {\n entry.collaterals.push({\n asset: row.collateralAsset as Address,\n oracle: row.collateralOracle as Address,\n lltv: LLTV.from(row.collateralLltv),\n });\n }\n map.set(row.hash, entry);\n }\n return map;\n };\n\n const allEntries = Array.from(buildOffersMap(withCollats).values());\n const pageEntries = allEntries.slice(0, limit);\n\n // nextCursor if we saw more than 'limit'\n let nextCursor: string | null = null;\n if (allEntries.length > limit) {\n const last = pageEntries[pageEntries.length - 1]!.base;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n });\n }\n\n const data = pageEntries.map(({ base, collaterals: cols }) => ({\n ...Offer.from({\n offering: base.offering,\n assets: BigInt(base.assets),\n rate: base.rate,\n maturity: Maturity.from(base.maturity),\n expiry: base.expiry,\n start: base.start,\n nonce: base.nonce,\n buy: base.buy,\n chainId: base.chainId,\n loanToken: base.loanToken,\n collaterals: cols.sort((a, b) =>\n a.asset.toLowerCase().localeCompare(b.asset.toLowerCase()),\n ),\n callback: {\n address: base.callbackAddress,\n data: base.callbackData,\n gasLimit: base.callbackGasLimit,\n },\n ...(base.signature !== null ? { signature: base.signature as Hex } : undefined),\n }),\n consumed: BigInt(base.consumed),\n status: base.status,\n ...(base.metadata ? { metadata: base.metadata as RouterOffer.OfferMetadata } : {}),\n }));\n\n return { offers: data, nextCursor };\n },\n\n delete: async (hash: Offer.Offer[\"hash\"]): Promise<boolean> => {\n const result = await db.delete(offers).where(eq(offers.hash, hash.toLowerCase()));\n\n return (result as { affectedRows: number }).affectedRows > 0;\n },\n\n deleteMany: async (hashes: Offer.Offer[\"hash\"][]): Promise<number> => {\n if (hashes.length === 0) {\n return 0;\n }\n\n return await db.transaction(async (tx) => {\n const normalizedHashes = hashes.map((hash) => hash.toLowerCase());\n const result = await tx\n .delete(offers)\n .where(\n sql`${offers.hash} = ANY(${sql.raw(`ARRAY[${normalizedHashes.map((h) => `'${h}'`).join(\", \")}]`)})`,\n );\n return (result as { affectedRows: number }).affectedRows;\n });\n },\n\n updateStatus: async (parameters: {\n offerHash: Offer.Offer[\"hash\"];\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<void> => {\n const latest = await db\n .select({ status: offerStatus.status })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, parameters.offerHash.toLowerCase()))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1);\n\n if (latest.length > 0 && latest[0]!.status === parameters.status) return;\n\n await db.insert(offerStatus).values({\n offerHash: parameters.offerHash.toLowerCase(),\n status: parameters.status,\n metadata: parameters.metadata,\n });\n },\n\n updateConsumedAmount: async (parameters: {\n id: string;\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n }): Promise<void> => {\n await db\n .insert(consumedTable)\n .values({\n id: parameters.id,\n chainId: parameters.chainId,\n offering: parameters.offering.toLowerCase(),\n nonce: parameters.nonce,\n consumed: parameters.consumed.toString(),\n })\n .onConflictDoNothing();\n },\n };\n}\n","import path from \"node:path\";\nimport { PGlite } from \"@electric-sql/pglite\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { migrate as migratePostgres } from \"drizzle-orm/node-postgres/migrator\";\nimport { drizzle as drizzleLite } from \"drizzle-orm/pglite\";\nimport { migrate as migratePGLite } from \"drizzle-orm/pglite/migrator\";\n\nimport { Pool } from \"pg\";\nimport * as offersSchema from \"./drizzle/schema.ts\";\n\nexport type PgDB = ReturnType<typeof drizzle> & {\n name: \"pg\";\n pool: Pool;\n};\nexport type PGLiteDB = ReturnType<typeof drizzleLite> & {\n name: \"pglite\";\n pool: PGlite;\n};\n\nexport type PG = PgDB | PGLiteDB;\n\nexport function connect(\n parameters:\n | {\n type: \"pg\";\n endpoint: string;\n }\n | {\n type: \"pglite\";\n },\n): PG {\n if (parameters.type === \"pg\") {\n const pool = new Pool({ connectionString: parameters.endpoint });\n const client = drizzle(pool, { schema: offersSchema });\n return Object.assign(client, { name: \"pg\", pool } as const);\n }\n\n const pool = new PGlite();\n const client = drizzleLite(pool, { schema: offersSchema });\n return Object.assign(client, { name: \"pglite\", pool } as const);\n}\n\nexport async function applyMigrations(pg: PG): Promise<void> {\n // In Lambda, drizzle files are in the working directory, not relative to __dirname\n const migrationsFolder = process.env.AWS_LAMBDA_FUNCTION_NAME\n ? path.join(process.cwd(), \"drizzle\", offersSchema.VERSION)\n : path.join(__dirname, \"drizzle\", offersSchema.VERSION);\n\n await pg.execute(`create schema if not exists \"${offersSchema.VERSION}\"`);\n\n if (pg.name === \"pg\") {\n await migratePostgres(pg, { migrationsFolder });\n return;\n }\n await migratePGLite(pg, { migrationsFolder });\n}\n\nexport async function clean(pg: PG) {\n await pg.execute(`drop schema if exists \"${offersSchema.VERSION}\" cascade`);\n await pg.execute(`create schema \"${offersSchema.VERSION}\"`);\n await pg.execute(\"drop schema if exists drizzle cascade\");\n}\n","export * from \"./Client.ts\";\nexport * from \"./Server.ts\";\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 \"#core/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; headers?: Headers }): 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 = opts?.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 { serve as serveHono } from \"@hono/node-server\";\nimport { Format } from \"@morpho-dev/mempool\";\nimport { type Context, Hono } from \"hono\";\nimport { z } from \"zod/v4\";\nimport * as ApiSchema from \"#core/apiSchema/index.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\n\n/**\n * Start a local router server.\n * @example\n * ```ts\n * import { Router } from \"@morpho-dev/router\";\n * await Router.serve(); // local router server running on http://localhost:8081\n * ```\n */\nexport async function serve(parameters: { port: number; store: OfferStore.OfferStore }) {\n const app = new Hono();\n const store: OfferStore.OfferStore = parameters.store;\n const logger = Logger.getLogger();\n\n app.get(\"/v1/offers\", async (c) => {\n try {\n const params = ApiSchema.parse(\"get_offers\", c.req.query());\n\n const offers = await store.getAll({\n query: {\n creators: params.creators,\n side: params.side,\n chains: params.chains,\n loanTokens: params.loan_tokens,\n status: params.status,\n callbackAddresses: params.callback_addresses,\n minAmount: params.min_amount,\n maxAmount: params.max_amount,\n minRate: params.min_rate,\n maxRate: params.max_rate,\n minMaturity: params.min_maturity,\n maxMaturity: params.max_maturity,\n minExpiry: params.min_expiry,\n maxExpiry: params.max_expiry,\n collateralAssets: params.collateral_assets,\n collateralOracles: params.collateral_oracles,\n collateralTuple: params.collateral_tuple,\n minLltv: params.min_lltv,\n maxLltv: params.max_lltv,\n sortBy: params.sort_by,\n sortOrder: params.sort_order,\n cursor: params.cursor,\n limit: params.limit,\n },\n });\n\n return success(c, {\n data: offers.offers.map((offer) =>\n Format.stringifyBigint(Format.toSnakeCase(ApiSchema.toResponse(offer))),\n ),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: debug message\n console.error(err);\n return error(err, c);\n }\n });\n\n app.get(\"/v1/offers/match\", async (c) => {\n try {\n const params = ApiSchema.parse(\"match_offers\", c.req.query());\n const offers = await store.findMatchingOffers({\n side: params.side,\n chainId: params.chain_id,\n rate: params.rate,\n collaterals: params.collaterals,\n maturity: params.maturity,\n minMaturity: params.min_maturity,\n maxMaturity: params.max_maturity,\n loanToken: params.loan_token,\n creator: params.creator,\n cursor: params.cursor,\n limit: params.limit,\n });\n return success(c, {\n data: offers.offers.map((offer) =>\n Format.stringifyBigint(Format.toSnakeCase(ApiSchema.toResponse(offer))),\n ),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: debug message\n console.error(err);\n return error(err, c);\n }\n });\n\n serveHono(\n {\n fetch: app.fetch,\n port: parameters.port,\n },\n (info) => {\n logger.info({ service: \"api\", msg: \"Router server started\", port: info.port });\n },\n );\n}\n\nexport function error(error: unknown, c: Context) {\n if (error instanceof APIError) {\n return handleAPIError(error, c);\n }\n\n if (error instanceof SyntaxError) {\n return handleAPIError(new BadRequestError(error.message), c);\n }\n\n if (error instanceof z.ZodError) {\n return handleAPIError(handleZodError(error), c);\n }\n\n return handleAPIError(new InternalServerError(), c);\n}\n\nexport function success<T>(\n c: Context,\n {\n data,\n cursor,\n }: {\n data: T | T[];\n cursor?: string | null;\n },\n) {\n return c.json({\n status: \"success\",\n cursor,\n data,\n meta: {\n timestamp: new Date().toISOString(),\n },\n });\n}\n\nexport class APIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n public code: string,\n public details?: unknown,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\nexport class ValidationError extends APIError {\n constructor(message: string, details?: unknown) {\n super(400, message, \"VALIDATION_ERROR\", details);\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(message: string) {\n super(404, message, \"NOT_FOUND\");\n }\n}\n\nexport class InternalServerError extends APIError {\n constructor(message = \"Internal server error\") {\n super(500, message, \"INTERNAL_SERVER_ERROR\");\n }\n}\n\nexport class BadRequestError extends APIError {\n constructor(message = \"Invalid JSON format\", details?: unknown) {\n super(400, message, \"BAD_REQUEST\", details);\n }\n}\n\nexport function handleZodError(error: z.ZodError): ValidationError {\n const formattedErrors = error.issues.map((err) => {\n const field = err.path.join(\".\");\n let issue = err.message;\n\n if (err.code === \"invalid_type\") {\n if (err.message.includes(\"received undefined\")) {\n issue = `${field} is required`;\n } else {\n issue = err.message;\n }\n } else if (err.code === \"invalid_format\") {\n issue = `${field} has an invalid format`;\n }\n\n return {\n field,\n issue,\n };\n });\n\n return new ValidationError(\"Validation failed\", formattedErrors);\n}\n\nfunction handleAPIError(error: APIError, c: Context) {\n return c.json({\n statusCode: error.statusCode,\n body: JSON.stringify({\n status: \"error\",\n error: {\n code: error.code,\n message: error.message,\n ...(error.details && typeof error.details === \"object\" ? { details: error.details } : {}),\n },\n meta: {\n timestamp: new Date().toISOString(),\n },\n }),\n });\n}\n","import { type Chain, Mempool } from \"@morpho-dev/mempool\";\nimport { createWalletClient, http, publicActions, type Chain as ViemChain } from \"viem\";\nimport * as Collector from \"#core/Collector/index.ts\";\nimport * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as LiquidityStore from \"#core/LiquidityStore.ts\";\nimport * as OfferStore from \"#core/OfferStore/index.ts\";\nimport * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type config = {\n chain: Chain.Chain;\n rpcUrl: string;\n dbConfig: {\n type: \"pg\" | \"pglite\";\n endpoint?: string;\n };\n};\n\nexport type Services = {\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n mempoolOffersCollector: Collector.Collector<\"mempool_offers\">;\n consumedEventsCollector: Collector.Collector<\"consumed_events\">;\n buyWithEmptyCallbackLiquidityCollector: Collector.Collector<\"buy_with_empty_callback_liquidity\">;\n DB: PG.PG;\n};\n\nexport function from(config: config): Services {\n const { chain, rpcUrl, dbConfig } = config;\n\n const walletClient = createWalletClient({\n chain: chain as unknown as ViemChain,\n transport: http(rpcUrl),\n }).extend(publicActions);\n\n if (dbConfig.type === \"pg\" && !dbConfig.endpoint) {\n throw new Error(\"dbOffer.endpoint is required when dbOffer.type is pg\");\n }\n\n const DB: PG.PG =\n dbConfig.type === \"pg\"\n ? PG.connect({ type: \"pg\", endpoint: dbConfig.endpoint! })\n : PG.connect({ type: \"pglite\" });\n\n const offerStore: OfferStore.OfferStore = OfferStore.create({ db: DB });\n\n const collectorBlockStore: CollectorBlockStore.CollectorBlockStore = CollectorBlockStore.create({\n db: DB,\n });\n const liquidityStore: LiquidityStore.LiquidityStore = LiquidityStore.create({ db: DB });\n\n const interval = 10_000;\n const maxBatchSize = 1000;\n const mempoolOffersCollector = Collector.createMempoolCollector({\n mempool: Mempool.connect({\n client: walletClient,\n mempoolAddress: chain.mempool!.address,\n }),\n offerStore,\n collectorBlockStore,\n chain,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n const consumedEventsCollector = Collector.createConsumedEventsCollector({\n client: walletClient,\n contractAddress: chain.morpho,\n offerStore,\n collectorBlockStore,\n chainId: chain.id,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n const buyWithEmptyCallbackLiquidityCollector =\n Collector.createBuyWithEmptyCallbackLiquidityCollector({\n client: walletClient,\n offerStore,\n collectorBlockStore,\n liquidityStore,\n chain,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n return {\n offerStore,\n collectorBlockStore,\n liquidityStore,\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n DB,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/apiSchema/index.ts","../src/core/Cursor.ts","../src/core/RouterOffer.ts","../src/core/apiSchema/requests.ts","../src/core/apiSchema/openapi.ts","../src/core/apiSchema/utils.ts","../src/core/Callback.ts","../src/core/Collector/index.ts","../src/core/Liquidity.ts","../src/core/Logger.ts","../src/core/Collector/BuyWithEmptyCallbackLiquidityCollector.ts","../src/core/Collector/ChainReorgsCollector.ts","../src/core/Collector/Collector.ts","../src/core/Collector/ConsumedEventsCollector.ts","../src/core/Validation.ts","../src/core/ValidationRule.ts","../src/core/Collector/MempoolCollector.ts","../src/core/CollectorBlockStore.ts","../src/core/OfferStore/drizzle/schema.ts","../src/core/LiquidityStore.ts","../src/core/OfferStore/index.ts","../src/core/OfferStore/OfferStorePg.ts","../src/core/OfferStore/PG.ts","../src/core/router/index.ts","../src/core/router/Client.ts","../src/core/router/Server.ts","../src/core/Services.ts"],"names":["Base64","Offer","z","maxUint256","error","Format","Errors","LLTV","parseUnits","createDocument","consumed","decode","encode","CallbackType","index","decodeAbiParameters","encodeAbiParameters","fetch","Utils","erc20Abi","stringify","AsyncLocalStorage","offers","publicActions","getBlockNumber","missingBlockNumbers","start","Chain","parseEventLogs","run","_","offerCollaterals","mempool","pgSchema","varchar","numeric","bigint","integer","boolean","text","timestamp","serial","jsonb","desc","uniqueIndex","primaryKey","and","eq","create","memory","Time","inArray","gte","lte","sql","asc","Maturity","pool","Pool","client","drizzle","PGlite","drizzleLite","path","migratePostgres","migratePGLite","connect","formatUnits","Hono","serveHono","from","createWalletClient","http","Mempool"],"mappings":"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","file":"index.node.js","sourcesContent":["export * from \"./openapi.ts\";\nexport { parse, safeParse } from \"./requests.ts\";\nexport * from \"./utils.ts\";\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 validate(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 encode(c: Cursor): string {\n // Use browser-compatible Base64\n return Base64.encodeURL(JSON.stringify(c));\n}\n\nexport function decode(token?: string): Cursor | null {\n if (!token) return null;\n const decoded = JSON.parse(Base64.decode(token));\n validate(decoded);\n return decoded;\n}\n","import { Errors, Format, Offer } from \"@morpho-dev/mempool\";\nimport { type Address, type Hex, 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 type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\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 * ABI for the Consumed event emitted by the terms contract.\n */\nexport const consumedEvent = {\n type: \"event\",\n name: \"Consumed\",\n inputs: [\n { name: \"user\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"nonce\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", indexed: false, internalType: \"uint256\" },\n ],\n anonymous: false,\n} as const;\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 function fromConsumedLog(parameters: {\n blockNumber: bigint;\n logIndex: number;\n chainId: number;\n transactionHash: Hex;\n user: Address;\n nonce: bigint;\n amount: bigint;\n}): OfferConsumed {\n const { blockNumber, logIndex, chainId, transactionHash, user, nonce, amount } = parameters;\n return {\n id: `${blockNumber.toString()}-${logIndex.toString()}-${chainId}-${transactionHash}`,\n chainId: BigInt(chainId),\n offering: user,\n nonce,\n amount,\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","import { LLTV } from \"@morpho-dev/mempool\";\nimport { parseUnits } from \"viem\";\nimport { z } from \"zod/v4\";\nimport * as Cursor from \"#core/Cursor.ts\";\nimport { type OfferStatus, OfferStatusValues } from \"#core/RouterOffer.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.number().int().min(0).optional().meta({\n description: \"Minimum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Maximum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\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 .transform((val, ctx) => {\n const pattern =\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 if (!pattern.test(val)) {\n ctx.addIssue({\n code: \"custom\",\n message: \"collateral_tuple has an invalid format\",\n input: val,\n });\n }\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 .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 .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 = Cursor.decode(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 .transform((val, ctx) => {\n const numericLike = /^-?\\d+$/.test(val);\n if (!numericLike) {\n ctx.addIssue({\n code: \"custom\",\n message: \"chain_id has an invalid format\",\n input: val,\n });\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid input: expected number, received NaN\",\n input: val,\n });\n return z.NEVER;\n }\n return Number.parseInt(val, 10);\n })\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 .transform((val, ctx) => {\n const pattern =\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 if (!pattern.test(val)) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Collaterals must be in format: asset:oracle:lltv#asset2:oracle2:lltv2. All fields are required for each collateral.\",\n input: val,\n });\n }\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.number().int().min(0).optional().meta({\n description: \"Maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n min_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Minimum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1700000000\",\n }),\n max_maturity: z.coerce.number().int().min(0).optional().meta({\n description: \"Maximum maturity timestamp (Unix timestamp in seconds)\",\n example: \"1800000000\",\n }),\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 // Pagination\n cursor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (!val) return true; // Optional field\n try {\n const decoded = Cursor.decode(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 \"#core/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","import type { Offer } from \"@morpho-dev/mempool\";\nimport type { Address, Hex } from \"viem\";\nimport { decodeAbiParameters, encodeAbiParameters } from \"viem\";\nimport type * as Liquidity from \"#core/Liquidity.ts\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n SellWithdrawFromWallet = \"sell_withdraw_from_wallet\",\n}\n\nexport const WhitelistedCallbackAddresses: Record<CallbackType, readonly string[]> = {\n [CallbackType.BuyWithEmptyCallback]: [],\n [CallbackType.SellWithdrawFromWallet]: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\", // @TODO: update once deployed and add mapping per chain if needed\n ],\n} as const;\n\nexport function buildLiquidity(parameters: {\n type: CallbackType;\n user: string;\n contract: string; // token or callback contract address, depending on type\n chainId: bigint;\n amount: string | bigint;\n index?: number;\n updatedAt?: Date;\n}): Liquidity.Liquidity {\n const { type, user, contract, chainId, amount, index = 0, updatedAt = new Date() } = parameters;\n if (type !== CallbackType.BuyWithEmptyCallback)\n throw new Error(`CallbackType not implemented: ${type}`);\n const amountStr = amount.toString();\n const id = `${user}-${chainId.toString()}-${type}-${contract}`.toLowerCase();\n return {\n userPosition: {\n id,\n availableLiquidityQueueId: id,\n user: user.toLowerCase(),\n chainId,\n amount: amountStr,\n updatedAt,\n },\n queues: [\n {\n queue: {\n queueId: id,\n availableLiquidityPoolId: id,\n index,\n updatedAt,\n },\n pool: {\n id,\n amount: amountStr,\n updatedAt,\n },\n },\n ],\n };\n}\n\nexport function getCallbackIdForOffer(offer: Offer.Offer): string | null {\n if (offer.buy && offer.callback.data === \"0x\") {\n const type = CallbackType.BuyWithEmptyCallback;\n const user = offer.offering;\n const loanToken = offer.loanToken;\n return `${user}-${offer.chainId.toString()}-${type}-${loanToken}`.toLowerCase();\n }\n return null;\n}\n\nfunction decodeSellWithdrawFromWalletData(data: Hex): Array<{\n collateral: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [collaterals, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (collaterals.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return collaterals.map((c, i) => ({ collateral: c, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid SellWithdrawFromWallet callback data\");\n }\n}\n\nexport function decode(parameters: { type: CallbackType; data: Hex }): Array<{\n collateral: Address;\n amount: bigint;\n}> {\n const { type, data } = parameters;\n if (type === CallbackType.SellWithdrawFromWallet) {\n return decodeSellWithdrawFromWalletData(data);\n }\n throw new Error(`CallbackType not implemented: ${type}`);\n}\n\nexport function encode(parameters: {\n type: CallbackType;\n data: { collaterals: Address[]; amounts: bigint[] };\n}): Hex {\n const { type, data } = parameters;\n if (type === CallbackType.SellWithdrawFromWallet) {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [data.collaterals, data.amounts],\n );\n }\n throw new Error(`CallbackType not implemented: ${type}`);\n}\n","export * from \"./BuyWithEmptyCallbackLiquidityCollector.ts\";\nexport * from \"./ChainReorgsCollector.ts\";\nexport * from \"./Collector.ts\";\nexport * from \"./ConsumedEventsCollector.ts\";\nexport * from \"./MempoolCollector.ts\";\n","import { Utils } from \"@morpho-dev/mempool\";\nimport { type Address, erc20Abi, type PublicActions } from \"viem\";\nimport * as Callback from \"#core/Callback.ts\";\n\nexport async function fetchBalancesAndAllowances(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n spender: Address;\n pairs: Array<{ user: Address; token: Address }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<\n Map<\n Address,\n Map<\n Address,\n {\n balance: bigint;\n allowance: bigint;\n }\n >\n >\n> {\n const { client, spender, pairs, options } = parameters;\n if (pairs.length === 0) return new Map();\n\n const batchSize = Math.max(1, options?.batchSize ?? 5000);\n const retryAttempts = Math.max(1, options?.retryAttempts ?? 3);\n const retryDelayMs = Math.max(0, options?.retryDelayMs ?? 50);\n const blockNumber = options?.blockNumber ? BigInt(options.blockNumber) : undefined;\n\n // user address -> token address -> { balance, allowance }\n const out: Map<Address, Map<Address, { balance: bigint; allowance: bigint }>> = new Map();\n\n for (const pairsBatch of Utils.batch(pairs, batchSize)) {\n const balanceContracts: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"balanceOf\";\n args: [Address];\n }> = [];\n const allowanceContracts: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"allowance\";\n args: [Address, Address];\n }> = [];\n\n for (const { user, token } of pairsBatch) {\n balanceContracts.push({\n address: token,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n });\n allowanceContracts.push({\n address: token,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n });\n }\n\n const [balances, allowances] = await Promise.all([\n Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: balanceContracts,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n ),\n Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: allowanceContracts,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n ),\n ]);\n\n for (let i = 0; i < pairsBatch.length; i++) {\n const { user, token } = pairsBatch[i]!;\n const balance = balances[i]! as unknown as bigint;\n const allowance = allowances[i]! as unknown as bigint;\n let perUser = out.get(user);\n if (!perUser) {\n perUser = new Map();\n out.set(user, perUser);\n }\n perUser.set(token, { balance, allowance });\n }\n }\n\n return out;\n}\n\nexport type LiquidityUserPosition = {\n id: string;\n availableLiquidityQueueId: string;\n user: string;\n chainId: bigint;\n amount: string;\n updatedAt: Date;\n};\n\nexport type LiquidityQueue = {\n queueId: string;\n availableLiquidityPoolId: string;\n index: number;\n updatedAt: Date;\n};\n\nexport type LiquidityPool = {\n id: string;\n amount: string;\n updatedAt: Date;\n};\n\nexport type LiquidityQueueWithPool = { queue: LiquidityQueue; pool: LiquidityPool };\n\nexport type Liquidity = { userPosition: LiquidityUserPosition; queues: LiquidityQueueWithPool[] };\n\nexport async function fetch(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\n spender: Address;\n type: Callback.CallbackType;\n pairs: Array<{ user: Address; contract: Address }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<Liquidity[]> {\n const { client, chainId, spender, type, pairs, options } = parameters;\n if (type !== Callback.CallbackType.BuyWithEmptyCallback)\n throw new Error(`CallbackType not implemented: ${type}`);\n\n const map = await fetchBalancesAndAllowances({\n client,\n spender,\n pairs: pairs.map(({ user, contract }) => ({ user, token: contract })),\n options,\n });\n\n const out: Liquidity[] = [];\n for (const [user, perContract] of map) {\n for (const [contract, { balance, allowance }] of perContract) {\n const amount = balance < allowance ? balance : allowance;\n out.push(\n Callback.buildLiquidity({\n type,\n user,\n contract,\n chainId,\n amount: amount.toString(),\n index: 0,\n }),\n );\n }\n }\n return out;\n}\n\nexport function serialize(liquidity: Liquidity): string {\n const normalized = {\n userPosition: {\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: String(liquidity.userPosition.chainId),\n amount: String(liquidity.userPosition.amount),\n },\n queues: liquidity.queues\n .map((queueWithPool) => ({\n queue: {\n queueId: queueWithPool.queue.queueId,\n availableLiquidityPoolId: queueWithPool.queue.availableLiquidityPoolId,\n index: queueWithPool.queue.index,\n },\n pool: {\n id: queueWithPool.pool.id,\n amount: String(queueWithPool.pool.amount),\n },\n }))\n .sort(\n (\n left: { queue: { queueId: string | null; index: number }; pool: { id: string } },\n right: { queue: { queueId: string | null; index: number }; pool: { id: string } },\n ) => {\n const leftQueueId = left.queue.queueId || \"\";\n const rightQueueId = right.queue.queueId || \"\";\n if (leftQueueId < rightQueueId) return -1;\n if (leftQueueId > rightQueueId) return 1;\n\n const leftPoolId = left.pool.id;\n const rightPoolId = right.pool.id;\n if (leftPoolId < rightPoolId) return -1;\n if (leftPoolId > rightPoolId) return 1;\n\n const leftIndex = left.queue.index;\n const rightIndex = right.queue.index;\n if (leftIndex < rightIndex) return -1;\n if (leftIndex > rightIndex) return 1;\n return 0;\n },\n ),\n };\n return JSON.stringify(normalized);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Compute } from \"@morpho-dev/mempool\";\nimport { stringify } from \"viem\";\n\nexport const LogLevelValues = [\n \"silent\",\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n] as const;\nexport type LogLevel = (typeof LogLevelValues)[number];\ntype ActiveLogLevel = Exclude<LogLevel, \"silent\">;\n\nexport type LogEntry = Compute<{ msg: string } & Record<string, unknown>>;\nexport type LogFn = (entry: LogEntry) => void;\n\nexport type Logger = {\n trace: LogFn;\n debug: LogFn;\n info: LogFn;\n warn: LogFn;\n error: LogFn;\n fatal: LogFn;\n};\n\nexport function defaultLogger(minLevel?: LogLevel): Logger {\n const threshold: LogLevel = minLevel ?? \"info\";\n\n const levelIndexByName: Record<LogLevel, number> = LogLevelValues.reduce(\n (acc, lvl, idx) => {\n acc[lvl] = idx;\n return acc;\n },\n {} as Record<LogLevel, number>,\n );\n\n const isEnabled = (methodLevel: LogLevel): boolean =>\n levelIndexByName[methodLevel] >= levelIndexByName[threshold];\n\n const wrap = <L extends ActiveLogLevel>(\n consoleMethod: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\",\n methodLevel: L,\n ): LogFn =>\n isEnabled(methodLevel)\n ? (entry: LogEntry) => {\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](stringify({ level: methodLevel, ...entry }));\n }\n : () => {};\n\n return {\n trace: wrap(\"trace\", \"trace\"),\n debug: wrap(\"debug\", \"debug\"),\n info: wrap(\"info\", \"info\"),\n warn: wrap(\"warn\", \"warn\"),\n error: wrap(\"error\", \"error\"),\n fatal: wrap(\"error\", \"fatal\"),\n };\n}\n\nexport function silentLogger(): Logger {\n const noop = (() => {}) as LogFn;\n return { trace: noop, debug: noop, info: noop, warn: noop, error: noop, fatal: noop };\n}\n\nconst loggerContext = new AsyncLocalStorage<Logger>();\n\nexport function runWithLogger<T>(logger: Logger, fn: () => Promise<T>): Promise<T> {\n return loggerContext.run(logger, fn);\n}\n\nexport function getLogger(): Logger {\n return loggerContext.getStore() ?? defaultLogger();\n}\n","import { type Chain, Utils } from \"@morpho-dev/mempool\";\nimport { type Address, publicActions, type WalletClient as ViemClient } from \"viem\";\nimport { getBlockNumber } from \"viem/actions\";\nimport * as Callback from \"#core/Callback.ts\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Liquidity from \"#core/Liquidity.ts\";\nimport type * as LiquidityStore from \"#core/LiquidityStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createBuyWithEmptyCallbackLiquidityCollector(params: {\n client: ViemClient;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"buy_with_empty_callback_liquidity\"> {\n const {\n client,\n collectorBlockStore,\n liquidityStore,\n offerStore,\n chain,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n } = params;\n\n const collector = \"buy_with_empty_callback_liquidity\";\n\n async function getUniqueUserTokenPairs(): Promise<Array<{ user: Address; token: Address }>> {\n const unique = new Set<string>();\n const pairs: Array<{ user: Address; token: Address }> = [];\n\n let cursor: string | undefined;\n do {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n cursor,\n limit: 1000,\n },\n });\n cursor = nextCursor ?? undefined;\n\n for (const offer of offers) {\n const creator = offer.offering;\n const loanToken = offer.loanToken;\n const key = `${offer.offering}-${offer.loanToken}`.toLowerCase();\n if (unique.has(key)) continue;\n unique.add(key);\n pairs.push({ user: creator as Address, token: loanToken as Address });\n }\n } while (cursor);\n\n return pairs;\n }\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n return Utils.poll(\n async () => {\n const publicClient = client.extend(publicActions);\n const pairs = await getUniqueUserTokenPairs();\n\n const latestBlockNumber = Number(await getBlockNumber(publicClient));\n\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"snapshot started\",\n blockNumber: latestBlockNumber,\n });\n\n const liquidityEntries = await Liquidity.fetch({\n client: publicClient,\n chainId: chain.id,\n spender: chain!.morpho,\n type: Callback.CallbackType.BuyWithEmptyCallback,\n pairs: pairs.map(({ user, token }) => ({ user, contract: token })),\n options: {\n blockNumber: latestBlockNumber,\n batchSize: maxBatchSize,\n },\n });\n\n logger.debug({\n collector,\n chainId: chain.id,\n msg: `found ${liquidityEntries.length} liquidity entries`,\n blockNumber: latestBlockNumber,\n });\n\n const existingLiquidityEntries = await liquidityStore.getAll();\n const existingById = new Map<string, string>();\n\n for (const liquidityEntry of existingLiquidityEntries) {\n const liquidityId = liquidityEntry.userPosition.id;\n const serializedEntry = Liquidity.serialize(liquidityEntry);\n existingById.set(liquidityId, serializedEntry);\n }\n\n for (const liquidity of liquidityEntries) {\n const serialized = Liquidity.serialize(liquidity);\n const prevSerialized = existingById.get(liquidity.userPosition.id);\n if (prevSerialized === serialized) continue; // No change across any relevant field\n await liquidityStore.save({ liquidity });\n }\n\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumber,\n });\n\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"snapshot done\",\n blockNumber: latestBlockNumber,\n });\n\n emit(latestBlockNumber);\n },\n { interval },\n );\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId: chain.id }),\n collect,\n onReorg,\n };\n}\n","import { type Chain, Utils } from \"@morpho-dev/mempool\";\nimport type { Block, Hex, PublicClient } from \"viem\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createChainReorgsCollector(parameters: {\n client: PublicClient;\n subscribers: Collector.Collector[];\n collectorStore: CollectorBlockStore.CollectorBlockStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"chain_reorgs\"> {\n const collectorName = \"chain_reorgs\";\n const {\n client,\n subscribers,\n collectorStore,\n chain,\n options: { maxBatchSize = 25, interval } = {},\n } = parameters;\n\n type LightBlock = {\n hash: Hex;\n number: bigint;\n parentHash: Hex;\n };\n\n let finalizedBlock: LightBlock | null = null;\n let unfinalizedBlocks: LightBlock[] = [];\n\n const commonAncestor = (block: Block) => {\n const parent = unfinalizedBlocks.find((b) => b.hash === block.parentHash);\n if (parent) return parent;\n\n if (finalizedBlock == null) throw new Error(\"Failed to get common ancestor\");\n return finalizedBlock;\n };\n\n // greatly inspired by Ponder `ReconcileBlock`\n // https://github.com/ponder-sh/ponder/blob/d0bdadee06ebd93f05903b5a692ad46fe95371b9/packages/core/src/sync-realtime/index.ts#L792\n const reconcile = async (block: Block) => {\n if (block.hash === null || block.number === null || block.parentHash === null)\n throw new Error(\"Failed to get block\");\n const latestBlock = unfinalizedBlocks[unfinalizedBlocks.length - 1];\n if (latestBlock === undefined) {\n unfinalizedBlocks.push({\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n });\n return;\n }\n\n if (latestBlock.hash === block.hash) return;\n\n if (latestBlock.number >= block.number) {\n const ancestor = commonAncestor(block);\n // biome-ignore lint: debug message\n console.log(\n `reorg detected, latestBlock.number: ${latestBlock.number} > block.number: ${block.number} on chain ${chain.id}. Ancestor: ${ancestor.number}`,\n );\n subscribers.forEach((subscriber) => subscriber.onReorg(Number(ancestor.number)));\n unfinalizedBlocks = [];\n return;\n }\n\n if (latestBlock.number + 1n < block.number) {\n // biome-ignore lint: debug message\n console.log(\n `missing blocks between block ${latestBlock.number} and block ${block.number} on chain ${chain.id}`,\n );\n\n const missingBlockNumbers = (() => {\n const missingBlockNumbers = [];\n let start = latestBlock.number + 1n;\n const threshold =\n latestBlock.number + BigInt(maxBatchSize) > block.number\n ? block.number\n : latestBlock.number + BigInt(maxBatchSize);\n while (start < threshold) {\n missingBlockNumbers.push(start);\n start = start + 1n;\n }\n return missingBlockNumbers;\n })();\n\n const missingBlocks = await Promise.all(\n missingBlockNumbers.map((blockNumber) =>\n client.getBlock({ blockNumber, includeTransactions: false }),\n ),\n );\n\n for (const missingBlock of missingBlocks) await reconcile(missingBlock);\n await reconcile(block);\n return;\n }\n\n if (block.parentHash !== latestBlock.hash) {\n const ancestor = commonAncestor(block);\n // biome-ignore lint: debug message\n console.log(\n `reorg detected, block.parentHash: ${block.parentHash} !== latestBlock.hash: ${latestBlock.hash} on chain ${chain.id}. Ancestor: ${ancestor.number}`,\n );\n subscribers.forEach((subscriber) => subscriber.onReorg(Number(ancestor.number)));\n unfinalizedBlocks = [];\n return;\n }\n\n unfinalizedBlocks.push({\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n });\n };\n\n const collect = Utils.lazy<number>((emit) => {\n let tick = 0;\n const fetchFinalizedBlock = async () => {\n if (tick % 20 === 0 || finalizedBlock === null) {\n finalizedBlock = await client.getBlock({\n blockTag: \"finalized\",\n includeTransactions: false,\n });\n if (finalizedBlock === null) throw new Error(\"Failed to get finalized block\");\n }\n tick++;\n };\n\n return Utils.poll(\n async () => {\n await fetchFinalizedBlock();\n\n const latestBlock = await client.getBlock({\n blockTag: \"latest\",\n includeTransactions: false,\n });\n\n await reconcile(latestBlock);\n\n const lastBlockNumber = Number(latestBlock.number);\n await collectorStore.saveBlockNumber({\n collectorName: \"chain_reorgs\",\n chainId: chain.id,\n blockNumber: lastBlockNumber,\n });\n\n emit(lastBlockNumber);\n },\n { interval: interval ?? 30_000 },\n );\n });\n\n return {\n name: collectorName,\n lastSyncedBlock: async () =>\n await collectorStore.getBlockNumber({ collectorName, chainId: chain.id }),\n collect,\n onReorg: (_: number) => {},\n };\n}\n","export type Name =\n | \"mempool_offers\"\n | \"consumed_events\"\n | \"buy_with_empty_callback_liquidity\"\n | \"chain_reorgs\";\n\n/** A general collector interface. */\nexport type Collector<name extends Name = Name> = {\n /** The name of the collector. */\n name: name;\n\n /** Start collecting data from external sources.\n * @yields The last block number processed by the collector.\n */\n collect: () => AsyncGenerator<number, void, void>;\n\n /** The last block number processed by the collector. */\n lastSyncedBlock: () => Promise<number>;\n\n /** The callback to call when a reorg is detected. */\n onReorg(lastFinalizedBlockNumber: number): void;\n};\n\n/** Start a collector.\n * @param collector - The collector to start.\n * @returns A function to stop the collector.\n */\nexport function start(collector: Collector): () => void {\n let stopped = false;\n const it = collector.collect();\n\n (async () => {\n while (!stopped) await it.next();\n await it.return();\n })();\n\n return () => {\n stopped = true;\n };\n}\n","import { Chain, Utils } from \"@morpho-dev/mempool\";\nimport { type Address, type PublicClient, parseEventLogs } from \"viem\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport * as RouterOffer from \"#core/RouterOffer.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createConsumedEventsCollector(parameters: {\n client: PublicClient;\n contractAddress: Address;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n chainId: Chain.Id;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"consumed_events\"> {\n const {\n client,\n contractAddress,\n offerStore,\n collectorBlockStore,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n chainId,\n } = parameters;\n const collector = \"consumed_events\";\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chainId.toString(),\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n return Utils.poll(\n async () => {\n const lastSyncedBlock = await collectorBlockStore.getBlockNumber({\n collectorName: collector,\n chainId,\n });\n\n logger.debug({ collector, chainId, msg: \"stream started\", blockNumber: lastSyncedBlock });\n\n const stream = Chain.streamLogs({\n client,\n contractAddress,\n event: RouterOffer.consumedEvent,\n blockNumberGte: lastSyncedBlock,\n order: \"asc\",\n options: { maxBatchSize },\n });\n\n let blockNumber = lastSyncedBlock;\n for await (const { logs, blockNumber: lastStreamBlockNumber } of stream) {\n try {\n const parsedLogs = parseEventLogs({ abi: [RouterOffer.consumedEvent], logs });\n logger.debug({ collector, chainId, msg: `found ${parsedLogs.length} consumed events` });\n for (const log of parsedLogs) {\n if (\n log.blockNumber === null ||\n log.logIndex === null ||\n log.transactionHash === null\n ) {\n logger.debug({\n collector,\n chainId,\n msg: \"skipping log because it is missing required fields\",\n });\n continue;\n }\n\n const offer = RouterOffer.fromConsumedLog({\n blockNumber: log.blockNumber,\n logIndex: log.logIndex,\n chainId: Number(chainId),\n transactionHash: log.transactionHash,\n user: log.args.user,\n nonce: log.args.nonce,\n amount: log.args.amount,\n });\n\n await offerStore.updateConsumedAmount({\n id: offer.id,\n chainId: offer.chainId,\n offering: offer.offering,\n nonce: offer.nonce,\n consumed: offer.amount,\n });\n }\n\n blockNumber = lastStreamBlockNumber;\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId,\n blockNumber,\n });\n\n emit(blockNumber);\n } catch (err) {\n logger.error({ err, msg: \"Failed to process offer_consumed events\" });\n }\n }\n\n logger.info({\n collector,\n chainId,\n msg: \"stream finished\",\n startBlock: lastSyncedBlock,\n endBlock: blockNumber,\n });\n },\n { interval },\n );\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId }),\n onReorg,\n collect,\n };\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 { Chain, Offer } from \"@morpho-dev/mempool\";\nimport type { Address } from \"viem\";\nimport * as Callback from \"./Callback.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 chain: Chain.Chain;\n};\n\nexport function morpho() {\n const chainId = single(\"chain_id\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n if (chain.id !== offer.chainId) {\n return {\n message: `Chain ID ${offer.chainId} is not the same as the chain ID in the context (${chain.id})`,\n };\n }\n });\n\n const loanToken = single(\"loan_token\", (offer: Offer.Offer, { chain }: MorphoContext) => {\n const tokens = new Set(\n Array.from(chain.whitelistedAssets.values()).map((a) => a.toLowerCase() as Address),\n );\n\n if (!tokens.has(offer.loanToken.toLowerCase() as Address)) {\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 const sellEmptyCallback = single(\n \"sell_offers_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data === \"0x\") {\n return { message: \"Sell offers require a non-empty callback.\" };\n }\n },\n );\n\n const buyNonEmptyCallback = single(\n \"buy_offers_non_empty_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n return { message: \"Buy offers must use an empty callback.\" };\n }\n },\n );\n\n const sellNonWhitelistedCallback = single(\n \"sell_offers_non_whitelisted_callback\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.SellWithdrawFromWallet].map(\n (a) => a.toLowerCase(),\n ),\n );\n const callbackAddress = offer.callback.address?.toLowerCase() as Address | undefined;\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return { message: \"Sell offer callback address is not whitelisted.\" };\n }\n }\n },\n );\n\n const sellCallbackDataInvalid = single(\n \"sell_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decode({\n type: Callback.CallbackType.SellWithdrawFromWallet,\n data: offer.callback.data,\n });\n if (decoded.length === 0) {\n return { message: \"Sell offer callback data must include at least one collateral.\" };\n }\n } catch (_) {\n return { message: \"Sell offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const sellCallbackCollateralInvalid = single(\n \"sell_offers_callback_collateral_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (!offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decode({\n type: Callback.CallbackType.SellWithdrawFromWallet,\n data: offer.callback.data,\n });\n const offerCollaterals = new Set(\n offer.collaterals.map((c) => c.asset.toLowerCase() as Address),\n );\n for (const { collateral } of decoded) {\n if (!offerCollaterals.has(collateral.toLowerCase() as Address)) {\n return { message: \"Sell callback collateral is not part of offer collaterals.\" };\n }\n }\n } catch (_) {}\n }\n },\n );\n\n return [\n chainId,\n loanToken,\n expiry,\n // note: callback rules should be the last ones, since they do not mean that the offer is forever invalid\n // integrators should be able to choose if they want to keep the offer or not\n sellEmptyCallback,\n buyNonEmptyCallback,\n sellNonWhitelistedCallback,\n sellCallbackDataInvalid,\n sellCallbackCollateralInvalid,\n ];\n}\n","import { type Chain, type Mempool, type Offer, Utils } from \"@morpho-dev/mempool\";\nimport type * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\nimport * as Validation from \"#core/Validation.ts\";\nimport * as ValidationRule from \"#core/ValidationRule.ts\";\nimport type * as Collector from \"./Collector.ts\";\n\nexport function createMempoolCollector(parameters: {\n mempool: Mempool.Client;\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n chain: Chain.Chain;\n options?: {\n maxBatchSize?: number;\n interval?: number;\n };\n}): Collector.Collector<\"mempool_offers\"> {\n const {\n mempool,\n offerStore,\n collectorBlockStore,\n chain,\n options: { maxBatchSize = 1_000, interval = 30_000 } = {},\n } = parameters;\n const collector = \"mempool_offers\";\n\n const collect = Utils.lazy<number>((emit) => {\n const logger = Logger.getLogger();\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"start\",\n interval,\n maxBatchSize,\n });\n\n let lastSyncedBlock: number | null = null;\n return mempool.watch({\n lastSyncedBlock: async () => {\n lastSyncedBlock = await collectorBlockStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"stream started\",\n blockNumber: lastSyncedBlock,\n });\n return lastSyncedBlock;\n },\n polling: { maxBatchSize, interval },\n onOffers: async (offers, blockNumber) => {\n logger.debug({ collector, chainId: chain.id, msg: `found ${offers.length} offers` });\n try {\n const { valid: validOffers, issues } = await Validation.run({\n items: offers,\n rules: ValidationRule.morpho(),\n ctx: { chain },\n });\n\n const invalidOffersToSave: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[] = [];\n\n const issueToStatus: Record<string, RouterOffer.OfferStatus> = {\n sell_offers_empty_callback: \"callback_not_supported\",\n buy_offers_non_empty_callback: \"callback_not_supported\",\n sell_offers_non_whitelisted_callback: \"callback_not_supported\",\n sell_offers_callback_data_invalid: \"callback_error\",\n sell_offers_callback_collateral_invalid: \"callback_error\",\n };\n\n for (const issue of issues) {\n const status = issueToStatus[issue.ruleName];\n if (status) {\n invalidOffersToSave.push({\n offer: issue.item as Offer.Offer,\n status,\n metadata: { issue: issue.ruleName },\n });\n }\n }\n\n await offerStore.createMany([\n ...validOffers.map((offer) => ({\n offer: offer as Offer.Offer,\n status: \"valid\" as const,\n })),\n ...invalidOffersToSave,\n ]);\n } catch (err) {\n logger.error({\n err,\n msg: \"Failed to process offer_created events, falling back to unverified status\",\n });\n await offerStore.createMany(\n offers.map((offer) => ({\n offer,\n status: \"unverified\" as const,\n metadata: { issue: \"Offer processing failed\" },\n })),\n );\n }\n\n await collectorBlockStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n });\n\n emit(blockNumber);\n\n if (lastSyncedBlock === null) return;\n logger.info({\n collector,\n chainId: chain.id,\n msg: \"stream finished\",\n startBlock: lastSyncedBlock,\n endBlock: blockNumber,\n });\n },\n });\n });\n\n const onReorg = (_lastFinalizedBlockNumber: number) => {};\n\n return {\n name: collector,\n lastSyncedBlock: async () =>\n await collectorBlockStore.getBlockNumber({ collectorName: collector, chainId: chain.id }),\n collect,\n onReorg,\n };\n}\n","import { Chain } from \"@morpho-dev/mempool\";\nimport { and, eq } from \"drizzle-orm\";\nimport type * as Collector from \"#core/Collector/index.ts\";\nimport { collectorBlockNumbers } from \"#core/OfferStore/drizzle/schema.ts\";\nimport type * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type CollectorBlockStore = {\n /** Get the latest block number processed by a collector for a given chain. */\n getBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n }) => Promise<number>;\n\n /** Save the latest block number processed by a collector for a given chain. */\n saveBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): CollectorBlockStore => {\n const db = config.db;\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n const result = await db\n .select({ blockNumber: collectorBlockNumbers.blockNumber })\n .from(collectorBlockNumbers)\n .where(\n and(\n eq(collectorBlockNumbers.name, name),\n eq(collectorBlockNumbers.chainId, parameters.chainId),\n ),\n )\n .limit(1);\n\n if (result.length === 0)\n return Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0;\n return Number(result[0]!.blockNumber);\n },\n\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n await db\n .insert(collectorBlockNumbers)\n .values({\n chainId: parameters.chainId,\n name,\n blockNumber: parameters.blockNumber,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [collectorBlockNumbers.chainId, collectorBlockNumbers.name],\n set: {\n blockNumber: parameters.blockNumber,\n updatedAt: new Date(),\n },\n });\n },\n };\n};\n\nexport function memory(): CollectorBlockStore {\n const blockNumbers = new Map<Collector.Name, Map<Chain.Id, number>>();\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n return (\n blockNumbers.get(name)?.get(parameters.chainId) ||\n Chain.getChain(parameters.chainId)?.mempool.deploymentBlock ||\n 0\n );\n },\n\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n if (!blockNumbers.has(name)) {\n blockNumbers.set(name, new Map());\n }\n\n if (!blockNumbers.get(name)?.has(parameters.chainId)) {\n blockNumbers.get(name)!.set(parameters.chainId, parameters.blockNumber);\n }\n\n blockNumbers.get(name)!.set(parameters.chainId, parameters.blockNumber);\n },\n };\n}\n","import { desc } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n numeric,\n pgSchema,\n primaryKey,\n serial,\n text,\n timestamp,\n uniqueIndex,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\n\n// Should be updated when the data should need to be re-synced from scratch\nexport const VERSION = \"offers_v1.1\";\nconst s = pgSchema(VERSION);\n\nexport const offers = s.table(\n \"offers\",\n {\n hash: varchar(\"hash\", { length: 66 }).primaryKey(),\n offering: varchar(\"offering\", { length: 42 }).notNull(),\n assets: numeric(\"assets\", { precision: 78, scale: 0 }).notNull(),\n rate: bigint(\"rate\", { mode: \"bigint\" }).notNull(),\n maturity: integer(\"maturity\").notNull(),\n expiry: integer(\"expiry\").notNull(),\n start: integer(\"start\").notNull(),\n nonce: bigint(\"nonce\", { mode: \"bigint\" }).notNull(),\n buy: boolean(\"buy\").notNull(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n loanToken: varchar(\"loan_token\", { length: 42 }).notNull(),\n callbackAddress: varchar(\"callback_address\", { length: 42 }).notNull(),\n callbackData: text(\"callback_data\").notNull(),\n callbackGasLimit: bigint(\"callback_gas_limit\", { mode: \"bigint\" }).notNull(),\n signature: varchar(\"signature\", { length: 132 }),\n callbackId: varchar(\"callback_id\", { length: 256 }),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"offers_offering_idx\").on(table.offering),\n index(\"offers_buy_idx\").on(table.buy),\n index(\"offers_chain_id_idx\").on(table.chainId),\n index(\"offers_loan_token_idx\").on(table.loanToken),\n index(\"offers_maturity_idx\").on(table.maturity),\n index(\"offers_expiry_idx\").on(table.expiry),\n index(\"offers_rate_idx\").on(table.rate),\n index(\"offers_assets_idx\").on(table.assets),\n // Compound indices for cursor pagination with hash\n index(\"offers_rate_hash_idx\").on(table.rate, table.hash),\n index(\"offers_maturity_hash_idx\").on(table.maturity, table.hash),\n index(\"offers_expiry_hash_idx\").on(table.expiry, table.hash),\n index(\"offers_assets_hash_idx\").on(table.assets, table.hash),\n ],\n);\n\nexport const offerCollaterals = s.table(\n \"offer_collaterals\",\n {\n id: serial(\"id\").primaryKey(),\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n asset: varchar(\"asset\", { length: 42 }).notNull(),\n oracle: varchar(\"oracle\", { length: 42 }).notNull(),\n lltv: bigint(\"lltv\", { mode: \"bigint\" }).notNull(),\n },\n (table) => [\n index(\"offer_collaterals_offer_hash_idx\").on(table.offerHash),\n index(\"offer_collaterals_asset_idx\").on(table.asset),\n index(\"offer_collaterals_oracle_idx\").on(table.oracle),\n // Composite index\n index(\"offer_collaterals_tuple_idx\").on(table.asset, table.oracle, table.lltv),\n ],\n);\n\nexport const offerStatus = s.table(\n \"offer_status\",\n {\n id: serial(\"id\").primaryKey(),\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n status: text(\"status\").$type<RouterOffer.OfferStatus>().notNull(),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"offer_status_offer_hash_created_at_idx\").on(table.offerHash, desc(table.createdAt)),\n index(\"offer_status_status_idx\").on(table.status),\n ],\n);\n\nexport const consumed = s.table(\n \"consumed_per_user_and_nonce\",\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n offering: varchar(\"offering\", { length: 42 }).notNull(),\n nonce: bigint(\"nonce\", { mode: \"bigint\" }).notNull(),\n consumed: numeric(\"consumed\", { precision: 78, scale: 0 }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"consumed_per_user_and_nonce_chain_id_offering_nonce_created_at_idx\").on(\n table.chainId,\n table.offering,\n table.nonce,\n desc(table.createdAt),\n ),\n ],\n);\n\nexport const collectorBlockNumbers = s.table(\n \"collector_block_numbers\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n name: text(\"name\").notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [uniqueIndex(\"collector_block_numbers_chain_name_idx\").on(table.chainId, table.name)],\n);\n\nexport const availableLiquidityPools = s.table(\"available_liquidity_pools\", {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n});\n\nexport const availableLiquidityQueues = s.table(\n \"available_liquidity_queues\",\n {\n queueId: varchar(\"queue_id\", { length: 255 }).notNull(),\n availableLiquidityPoolId: varchar(\"available_liquidity_pool_id\", { length: 255 })\n .notNull()\n .references(() => availableLiquidityPools.id, { onDelete: \"cascade\" }),\n index: integer(\"index\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.queueId, table.availableLiquidityPoolId],\n name: \"available_liquidity_queues_pk\",\n }),\n index(\"available_liquidity_queues_queue_index_idx\").on(table.queueId, table.index),\n ],\n);\n\nexport const userPositions = s.table(\n \"user_positions\",\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n availableLiquidityQueueId: varchar(\"available_liquidity_queue_id\", { length: 255 }).notNull(),\n user: varchar(\"user\", { length: 255 }).notNull(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"user_positions_available_liquidity_queue_id_idx\").on(table.availableLiquidityQueueId),\n ],\n);\n","import { eq } from \"drizzle-orm\";\nimport type * as Liquidity from \"#core/Liquidity.ts\";\nimport {\n availableLiquidityPools,\n availableLiquidityQueues,\n userPositions,\n} from \"#core/OfferStore/drizzle/schema.ts\";\nimport type * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type LiquidityStore = {\n /** Get a liquidity entry by user position id, including queues and pools. */\n getByUserPositionId: (parameters: {\n userPositionId: string;\n }) => Promise<Liquidity.Liquidity | null>;\n\n /** Get all liquidity entries, grouped by user position, including queues and pools. */\n getAll: () => Promise<Liquidity.Liquidity[]>;\n\n /** Save or update a liquidity entry (transactional upsert across all three tables). */\n save: (parameters: { liquidity: Liquidity.Liquidity }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): LiquidityStore => {\n const db = config.db;\n\n return {\n getByUserPositionId: async (parameters: { userPositionId: string }) => {\n const up = await db\n .select()\n .from(userPositions)\n .where(eq(userPositions.id, parameters.userPositionId))\n .limit(1);\n\n if (up.length === 0) return null;\n const userPositionRow = up[0]!;\n\n const rows = await db\n .select({ queue: availableLiquidityQueues, pool: availableLiquidityPools })\n .from(availableLiquidityQueues)\n .innerJoin(\n availableLiquidityPools,\n eq(availableLiquidityPools.id, availableLiquidityQueues.availableLiquidityPoolId),\n )\n .where(eq(availableLiquidityQueues.queueId, userPositionRow.availableLiquidityQueueId));\n\n const queues: Liquidity.LiquidityQueueWithPool[] = rows.map((row) => ({\n queue: row.queue,\n pool: row.pool,\n }));\n\n return { userPosition: userPositionRow, queues };\n },\n\n getAll: async () => {\n const rows = await db\n .select({\n userPosition: userPositions,\n queue: availableLiquidityQueues,\n pool: availableLiquidityPools,\n })\n .from(userPositions)\n .innerJoin(\n availableLiquidityQueues,\n eq(availableLiquidityQueues.queueId, userPositions.availableLiquidityQueueId),\n )\n .innerJoin(\n availableLiquidityPools,\n eq(availableLiquidityPools.id, availableLiquidityQueues.availableLiquidityPoolId),\n );\n\n const byUserPosition = new Map<string, Liquidity.Liquidity>();\n for (const row of rows) {\n const id = row.userPosition.id;\n if (!byUserPosition.has(id)) {\n byUserPosition.set(id, { userPosition: row.userPosition, queues: [] });\n }\n byUserPosition.get(id)!.queues.push({ queue: row.queue, pool: row.pool });\n }\n\n return Array.from(byUserPosition.values());\n },\n\n save: async (parameters: { liquidity: Liquidity.Liquidity }) => {\n const { liquidity } = parameters;\n await db.transaction(async (tx) => {\n for (const qp of liquidity.queues) {\n await tx\n .insert(availableLiquidityPools)\n .values({\n id: qp.pool.id,\n amount: qp.pool.amount,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: availableLiquidityPools.id,\n set: {\n amount: qp.pool.amount,\n updatedAt: new Date(),\n },\n });\n }\n\n for (const qp of liquidity.queues) {\n await tx\n .insert(availableLiquidityQueues)\n .values({\n queueId: qp.queue.queueId,\n availableLiquidityPoolId: qp.pool.id,\n index: qp.queue.index,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [\n availableLiquidityQueues.queueId,\n availableLiquidityQueues.availableLiquidityPoolId,\n ],\n set: {\n index: qp.queue.index,\n updatedAt: new Date(),\n },\n });\n }\n\n await tx\n .insert(userPositions)\n .values({\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: userPositions.id,\n set: {\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n },\n });\n });\n },\n };\n};\n\nexport function memory(): LiquidityStore {\n const poolsById = new Map<string, Liquidity.LiquidityPool>();\n const queuesByComposite = new Map<string, Liquidity.LiquidityQueue>();\n const queueIndexByQueueId = new Map<string, Set<string>>(); // queueId -> composite keys\n const userPositionsById = new Map<string, Liquidity.LiquidityUserPosition>();\n\n return {\n getByUserPositionId: async (parameters: { userPositionId: string }) => {\n const up = userPositionsById.get(parameters.userPositionId);\n if (!up) return null;\n\n const compositeKeys = queueIndexByQueueId.get(up.availableLiquidityQueueId) || new Set();\n const queues: Liquidity.LiquidityQueueWithPool[] = [];\n for (const key of compositeKeys) {\n const q = queuesByComposite.get(key);\n if (!q) continue;\n const p = poolsById.get(q.availableLiquidityPoolId);\n if (!p) continue;\n queues.push({ queue: q, pool: p });\n }\n\n return { userPosition: up, queues };\n },\n\n getAll: async () => {\n const results: Liquidity.Liquidity[] = [];\n for (const up of userPositionsById.values()) {\n const compositeKeys = queueIndexByQueueId.get(up.availableLiquidityQueueId) || new Set();\n const queues: Liquidity.LiquidityQueueWithPool[] = [];\n for (const key of compositeKeys) {\n const q = queuesByComposite.get(key);\n if (!q) continue;\n const p = poolsById.get(q.availableLiquidityPoolId);\n if (!p) continue;\n queues.push({ queue: q, pool: p });\n }\n results.push({ userPosition: up, queues });\n }\n return results;\n },\n\n save: async (parameters: { liquidity: Liquidity.Liquidity }) => {\n const { liquidity } = parameters;\n\n for (const qp of liquidity.queues) {\n poolsById.set(qp.pool.id, {\n id: qp.pool.id,\n amount: qp.pool.amount,\n updatedAt: new Date(),\n });\n }\n\n for (const qp of liquidity.queues) {\n const qid = qp.queue.queueId;\n if (!qid) continue;\n const composite = `${qid}::${qp.pool.id}`;\n queuesByComposite.set(composite, {\n queueId: qid,\n availableLiquidityPoolId: qp.pool.id,\n index: qp.queue.index,\n updatedAt: new Date(),\n });\n if (!queueIndexByQueueId.has(qid)) queueIndexByQueueId.set(qid, new Set());\n queueIndexByQueueId.get(qid)!.add(composite);\n }\n\n userPositionsById.set(liquidity.userPosition.id, {\n id: liquidity.userPosition.id,\n availableLiquidityQueueId: liquidity.userPosition.availableLiquidityQueueId,\n user: liquidity.userPosition.user,\n chainId: liquidity.userPosition.chainId,\n amount: liquidity.userPosition.amount,\n updatedAt: new Date(),\n });\n },\n };\n}\n","export * from \"./OfferStore.ts\";\nexport * from \"./OfferStorePg.ts\";\n","import { LLTV, Maturity, Offer, Time } from \"@morpho-dev/mempool\";\nimport { and, asc, desc, eq, gte, inArray, lte, sql } from \"drizzle-orm\";\nimport { type Address, type Hex, parseUnits } from \"viem\";\nimport * as Callback from \"#core/Callback.ts\";\nimport * as Cursor from \"#core/Cursor.ts\";\nimport type * as RouterOffer from \"#core/RouterOffer.ts\";\nimport {\n availableLiquidityPools,\n availableLiquidityQueues,\n consumed as consumedTable,\n offerCollaterals,\n offerStatus,\n offers,\n userPositions,\n} from \"./drizzle/schema.ts\";\nimport type * as OfferStore from \"./OfferStore.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type PgConfig = {\n /** The database instance to use for operations. */\n db: PG.PG;\n};\n\nexport function create(config: PgConfig): OfferStore.OfferStore {\n const db = config.db;\n\n return {\n create: async (parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<string> => {\n const { offer, status, metadata } = parameters;\n\n return await db.transaction(async (tx) => {\n const callbackId = Callback.getCallbackIdForOffer(offer);\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n offering: offer.offering.toLowerCase(),\n assets: offer.assets.toString(),\n rate: offer.rate,\n maturity: offer.maturity,\n expiry: offer.expiry,\n start: offer.start,\n nonce: offer.nonce,\n buy: offer.buy,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n callbackAddress: offer.callback.address.toLowerCase(),\n callbackData: offer.callback.data,\n callbackGasLimit: offer.callback.gasLimit,\n signature: offer.signature,\n callbackId: callbackId ?? null,\n })\n .onConflictDoNothing()\n .returning();\n\n if (result.length === 0) {\n return offer.hash;\n }\n\n for (const collateral of offer.collaterals) {\n await tx.insert(offerCollaterals).values({\n offerHash: offer.hash.toLowerCase(),\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n });\n }\n\n await tx.insert(offerStatus).values({\n offerHash: offer.hash.toLowerCase(),\n status,\n metadata,\n });\n\n return offer.hash;\n });\n },\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }[],\n ): Promise<string[]> => {\n return await db.transaction(async (tx) => {\n const hashes: string[] = [];\n\n for (const { offer, status, metadata } of parameters) {\n const callbackId = Callback.getCallbackIdForOffer(offer);\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n offering: offer.offering.toLowerCase(),\n assets: offer.assets.toString(),\n rate: offer.rate,\n maturity: offer.maturity,\n expiry: offer.expiry,\n start: offer.start,\n nonce: offer.nonce,\n buy: offer.buy,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n callbackAddress: offer.callback.address.toLowerCase(),\n callbackData: offer.callback.data,\n callbackGasLimit: offer.callback.gasLimit,\n signature: offer.signature,\n callbackId: callbackId ?? null,\n })\n .onConflictDoNothing()\n .returning();\n\n // early return to avoid inserting collaterals and status if the offer already exists\n if (result.length === 0) continue;\n\n for (const collateral of offer.collaterals) {\n await tx.insert(offerCollaterals).values({\n offerHash: offer.hash.toLowerCase(),\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n });\n }\n\n await tx.insert(offerStatus).values({\n offerHash: offer.hash.toLowerCase(),\n status,\n metadata,\n });\n\n hashes.push(offer.hash);\n }\n\n return hashes;\n });\n },\n\n getAll: async (\n params?: OfferStore.GetAllParams,\n ): Promise<{\n offers: RouterOffer.RouterOffer[];\n nextCursor: string | null;\n }> => {\n const { query } = params ?? {};\n\n const conditions: ReturnType<typeof sql>[] = [];\n const now = Time.now();\n\n if (query?.creators && query.creators.length > 0) {\n conditions.push(\n inArray(\n offers.offering,\n query.creators.map((c) => c.toLowerCase()),\n ),\n );\n }\n\n if (query?.side) {\n conditions.push(eq(offers.buy, query.side === \"buy\"));\n }\n\n if (query?.chains && query.chains.length > 0) {\n conditions.push(\n inArray(\n offers.chainId,\n query.chains.map((chain) => BigInt(chain)),\n ),\n );\n }\n\n if (query?.loanTokens && query.loanTokens.length > 0) {\n conditions.push(\n inArray(\n offers.loanToken,\n query.loanTokens.map((t) => t.toLowerCase()),\n ),\n );\n }\n\n if (query?.callbackAddresses && query.callbackAddresses.length > 0) {\n conditions.push(\n inArray(\n offers.callbackAddress,\n query.callbackAddresses.map((c) => c.toLowerCase()),\n ),\n );\n }\n\n // Always exclude expired offers\n conditions.push(gte(offers.expiry, now));\n\n // Filter by amount range\n if (query?.minAmount !== undefined) {\n conditions.push(gte(offers.assets, query.minAmount.toString()));\n }\n if (query?.maxAmount !== undefined) {\n conditions.push(lte(offers.assets, query.maxAmount.toString()));\n }\n\n // Filter by rate range\n if (query?.minRate !== undefined) {\n conditions.push(gte(offers.rate, query.minRate));\n }\n if (query?.maxRate !== undefined) {\n conditions.push(lte(offers.rate, query.maxRate));\n }\n\n // Filter by maturity range\n if (query?.minMaturity !== undefined) {\n conditions.push(gte(offers.maturity, query.minMaturity));\n }\n if (query?.maxMaturity !== undefined) {\n conditions.push(lte(offers.maturity, query.maxMaturity));\n }\n\n // Filter by expiry range\n if (query?.minExpiry !== undefined) {\n conditions.push(gte(offers.expiry, query.minExpiry));\n }\n if (query?.maxExpiry !== undefined) {\n conditions.push(lte(offers.expiry, query.maxExpiry));\n }\n\n // Filter by collateral assets\n if (query?.collateralAssets && query.collateralAssets.length > 0) {\n conditions.push(\n inArray(\n offerCollaterals.asset,\n query.collateralAssets.map((a) => a.toLowerCase()),\n ),\n );\n }\n\n if (query?.collateralOracles && query.collateralOracles.length > 0) {\n conditions.push(\n inArray(\n offerCollaterals.oracle,\n query.collateralOracles.map((o) => o.toLowerCase()),\n ),\n );\n }\n\n // Collateral tuple filtering (match all specified fields per tuple)\n if (query?.collateralTuple && query.collateralTuple.length > 0) {\n const tupleClauses = query.collateralTuple\n .map((tuple) => {\n const parts: [ReturnType<typeof sql>, ...ReturnType<typeof sql>[]] = [\n sql`${offerCollaterals.asset} = ${tuple.asset.toLowerCase()}`,\n ];\n if (tuple.oracle) {\n parts.push(sql`${offerCollaterals.oracle} = ${tuple.oracle.toLowerCase()}`);\n }\n if (tuple.lltv !== undefined) {\n parts.push(sql`${offerCollaterals.lltv} = ${tuple.lltv}`);\n }\n // Manually join parts with AND to avoid undefined type from drizzle's and()\n let clause = parts[0]!;\n for (let i = 1; i < parts.length; i++) {\n clause = sql`${clause} AND ${parts[i]!}`;\n }\n return sql`(${clause})`;\n })\n .filter((c): c is ReturnType<typeof sql> => c !== undefined);\n\n if (tupleClauses.length > 0) {\n let combined = tupleClauses[0]!;\n for (let i = 1; i < tupleClauses.length; i++) {\n combined = sql`${combined} OR ${tupleClauses[i]!}`;\n }\n conditions.push(sql`(${combined})`);\n }\n }\n\n // Filter by LLTV range\n if (query?.minLltv !== undefined) {\n conditions.push(gte(offerCollaterals.lltv, parseUnits(query.minLltv.toString(), 16)));\n }\n if (query?.maxLltv !== undefined) {\n conditions.push(lte(offerCollaterals.lltv, parseUnits(query.maxLltv.toString(), 16)));\n }\n\n // Build the main query with proper chaining\n const sortBy = query?.sortBy ?? \"expiry\";\n const sortOrder = query?.sortOrder ?? \"desc\";\n\n const sortColumn = (() => {\n switch (sortBy) {\n case \"rate\":\n return offers.rate;\n case \"maturity\":\n return offers.maturity;\n case \"expiry\":\n return offers.expiry;\n case \"amount\":\n return offers.assets;\n default:\n return offers.expiry;\n }\n })();\n\n // --- Cursor decoding ---\n const cursor = Cursor.decode(query?.cursor);\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 const op = sortOrder === \"asc\" ? sql`>` : sql`<`;\n\n const cursorVal = (() => {\n switch (sortBy) {\n case \"rate\":\n return BigInt(cursor.rate!);\n case \"amount\":\n return BigInt(cursor.assets!);\n case \"maturity\":\n return cursor.maturity!;\n case \"expiry\":\n return cursor.expiry!;\n default:\n return cursor.expiry!; // expiry by default\n }\n })();\n\n conditions.push(sql`(${sortColumn}, ${offers.hash}) ${op} (${cursorVal}, ${cursor.hash})`);\n }\n\n const limit = query?.limit ?? 20;\n\n const latestStatus = db\n .select({\n status: offerStatus.status,\n metadata: offerStatus.metadata,\n })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, offers.hash))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1)\n .as(\"latest_status\");\n\n const sumConsumed = db\n .select({\n consumed: sql<string>`COALESCE(SUM(${consumedTable.consumed}), 0)`.as(\"consumed\"),\n })\n .from(consumedTable)\n .where(\n and(\n eq(consumedTable.offering, offers.offering),\n eq(consumedTable.nonce, offers.nonce),\n eq(consumedTable.chainId, offers.chainId),\n ),\n )\n .as(\"sum_consumed\");\n\n const results = await db\n .select({\n hash: offers.hash,\n offering: offers.offering,\n assets: offers.assets,\n consumed: sumConsumed.consumed,\n rate: offers.rate,\n maturity: offers.maturity,\n expiry: offers.expiry,\n start: offers.start,\n nonce: offers.nonce,\n buy: offers.buy,\n chainId: offers.chainId,\n loanToken: offers.loanToken,\n callbackAddress: offers.callbackAddress,\n callbackData: offers.callbackData,\n callbackGasLimit: offers.callbackGasLimit,\n signature: offers.signature,\n createdAt: offers.createdAt,\n collateralAsset: offerCollaterals.asset,\n collateralOracle: offerCollaterals.oracle,\n collateralLltv: offerCollaterals.lltv,\n status: latestStatus.status,\n metadata: latestStatus.metadata,\n })\n .from(offers)\n .leftJoin(offerCollaterals, eq(offers.hash, offerCollaterals.offerHash))\n .leftJoinLateral(latestStatus, sql`true`)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n conditions.length > 0 ? and(...conditions) : sql`true`,\n query?.status && query.status.length > 0\n ? inArray(latestStatus.status, query.status)\n : eq(latestStatus.status, \"valid\"),\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n ...(sortOrder === \"asc\"\n ? [asc(sortColumn), asc(offers.hash)]\n : [desc(sortColumn), desc(offers.hash)]),\n )\n .limit(limit);\n\n // Group results by offer hash and aggregate collaterals\n const offerMap = new Map<\n string,\n {\n hash: Hex;\n offering: Address;\n assets: bigint;\n consumed: bigint;\n rate: bigint;\n maturity: number;\n expiry: number;\n start: number;\n nonce: bigint;\n buy: boolean;\n chainId: bigint;\n loanToken: Address;\n callbackAddress: Address;\n callbackData: Hex;\n callbackGasLimit: bigint;\n signature: Hex | null;\n createdAt: Date;\n collaterals: Array<{ asset: Address; oracle: Address; lltv: LLTV.LLTV }>;\n status: RouterOffer.OfferStatus;\n metadata: RouterOffer.OfferMetadata | null;\n }\n >();\n\n for (const row of results) {\n const offer = offerMap.get(row.hash) || {\n hash: row.hash as Hex,\n offering: row.offering as Address,\n assets: BigInt(row.assets),\n consumed: BigInt(row.consumed),\n rate: row.rate,\n maturity: row.maturity,\n expiry: row.expiry,\n start: row.start,\n nonce: row.nonce,\n buy: row.buy,\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n callbackAddress: row.callbackAddress as Address,\n callbackData: row.callbackData as Hex,\n callbackGasLimit: row.callbackGasLimit,\n signature: row.signature as Hex | null,\n createdAt: row.createdAt,\n collaterals: [],\n status: row.status as RouterOffer.OfferStatus,\n metadata: row.metadata as RouterOffer.OfferMetadata | null,\n };\n\n if (row.collateralAsset && row.collateralOracle && row.collateralLltv) {\n offer.collaterals.push({\n asset: row.collateralAsset as Address,\n oracle: row.collateralOracle as Address,\n lltv: LLTV.from(row.collateralLltv),\n });\n }\n\n offerMap.set(row.hash, offer);\n }\n\n // compute nextCursor\n let nextCursor: string | null = null;\n if (results.length === limit && results.length > 0) {\n const lastRow = results[results.length - 1]!;\n const base: Cursor.Cursor = {\n sort: sortBy,\n dir: sortOrder,\n hash: lastRow.hash,\n } as Cursor.Cursor;\n\n switch (sortBy) {\n case \"rate\":\n base.rate = lastRow.rate.toString();\n break;\n case \"amount\":\n base.assets = lastRow.assets.toString();\n break;\n case \"maturity\":\n base.maturity = lastRow.maturity;\n break;\n default:\n base.expiry = lastRow.expiry;\n }\n nextCursor = Cursor.encode(base);\n }\n\n const transformedResults: RouterOffer.RouterOffer[] = [];\n\n for (const offerData of offerMap.values()) {\n const offer = Offer.from({\n offering: offerData.offering,\n assets: offerData.assets,\n rate: offerData.rate,\n maturity: Maturity.from(offerData.maturity),\n expiry: offerData.expiry,\n start: offerData.start,\n nonce: offerData.nonce,\n buy: offerData.buy,\n chainId: offerData.chainId,\n loanToken: offerData.loanToken,\n collaterals: offerData.collaterals\n .map((c) => ({\n asset: c.asset,\n oracle: c.oracle,\n lltv: LLTV.from(c.lltv),\n }))\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: offerData.callbackAddress,\n data: offerData.callbackData,\n gasLimit: offerData.callbackGasLimit,\n },\n ...(offerData.signature !== null ? { signature: offerData.signature } : undefined),\n });\n\n transformedResults.push({\n ...offer,\n consumed: offerData.consumed,\n status: offerData.status,\n ...(offerData.metadata !== null ? { metadata: offerData.metadata } : undefined),\n });\n }\n\n return { offers: transformedResults, nextCursor };\n },\n\n /**\n * Returns offers that match specified offer based on the provided parameters.\n *\n * Rules for filtering:\n * - If offer expiry is in the past compared to now, it should not be included\n * - If offer maturity is in the past compared to now, it should not be included\n * - It should return if buyOffer.rate >= sellOffer.rate\n * - It should return if buyOffer.userAddress != sellOffer.userAddress\n * - It should return if maturity matches\n * - It should return if loanToken matches\n * - If the incoming intent is a buy / lend offer, only consider existing sell / borrow offers.\n * - If the incoming intent is a sell / borrow offer, only consider existing buy / lend offers.\n * - When the intent is lend: require offer_collaterals ⊆ intent_collaterals\n * - When the intent is borrow: require intent_collaterals ⊆ offer_collaterals\n * - It should sort by increasing rate if the input offer is a buy/lend offer\n * - It should sort by decreasing rate if the input offer is a sell/borrow offer\n */\n findMatchingOffers: async (\n params: OfferStore.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 cursor,\n limit = 20,\n } = params;\n\n const isIncomingBuy = side === \"buy\";\n const nowEpochSeconds = Math.floor(Date.now() / 1000);\n const rateSortDirection: \"asc\" | \"desc\" = isIncomingBuy ? \"desc\" : \"asc\";\n\n const baseWhereClauses: ReturnType<typeof sql>[] = [];\n baseWhereClauses.push(eq(offers.buy, !isIncomingBuy));\n baseWhereClauses.push(eq(offers.chainId, BigInt(chainId)));\n baseWhereClauses.push(gte(offers.expiry, nowEpochSeconds));\n baseWhereClauses.push(gte(offers.maturity, nowEpochSeconds));\n if (maturity) baseWhereClauses.push(eq(offers.maturity, maturity));\n if (minMaturity) baseWhereClauses.push(gte(offers.maturity, minMaturity));\n if (maxMaturity) baseWhereClauses.push(lte(offers.maturity, maxMaturity));\n if (loanToken) baseWhereClauses.push(eq(offers.loanToken, loanToken.toLowerCase()));\n if (creator) baseWhereClauses.push(eq(offers.offering, creator.toLowerCase()));\n if (rate)\n baseWhereClauses.push(isIncomingBuy ? gte(offers.rate, rate) : lte(offers.rate, rate));\n\n // Cursor decode/validation (windowing handled later to support pre-consumption)\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor) {\n if (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n }\n\n // Collateral filters\n if (collaterals.length > 0) {\n const collateralValues = collaterals\n .map(\n (c) =>\n `('${c.asset.toLowerCase()}', '${c.oracle.toLowerCase()}', ${c.lltv.toString()})`,\n )\n .join(\", \");\n\n const userCollaterals = sql`(VALUES ${sql.raw(collateralValues)}) AS user_collaterals(asset, oracle, lltv)`;\n\n // when wanting to sell, user sell collaterals ⊆ buy offer collaterals\n const sellPredicate = sql`\n NOT EXISTS (\n SELECT 1 FROM ${userCollaterals}\n WHERE NOT EXISTS (\n SELECT 1 FROM ${offerCollaterals} offer_collaterals\n WHERE offer_collaterals.offer_hash = ${offers.hash}\n AND offer_collaterals.asset = user_collaterals.asset\n AND offer_collaterals.oracle = user_collaterals.oracle\n AND offer_collaterals.lltv = user_collaterals.lltv\n )\n )\n `;\n\n // when wanting to buy, sell offer collaterals ⊆ user buy collaterals\n const buyPredicate = sql`\n NOT EXISTS (\n SELECT 1 FROM ${offerCollaterals} offer_collaterals\n WHERE offer_collaterals.offer_hash = ${offers.hash}\n AND NOT EXISTS (\n SELECT 1 FROM ${userCollaterals}\n WHERE user_collaterals.asset = offer_collaterals.asset\n AND user_collaterals.oracle = offer_collaterals.oracle\n AND user_collaterals.lltv = offer_collaterals.lltv\n )\n )\n `;\n\n baseWhereClauses.push(isIncomingBuy ? buyPredicate : sellPredicate);\n }\n\n const latestStatus = db\n .select({\n status: offerStatus.status,\n metadata: offerStatus.metadata,\n })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, offers.hash))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1)\n .as(\"latest_status\");\n\n const sumConsumed = db\n .select({\n consumed: sql<string>`COALESCE(SUM(${consumedTable.consumed}), 0)`.as(\"consumed\"),\n })\n .from(consumedTable)\n .where(\n and(\n eq(consumedTable.offering, offers.offering),\n eq(consumedTable.nonce, offers.nonce),\n eq(consumedTable.chainId, offers.chainId),\n ),\n )\n .as(\"sum_consumed\");\n\n const statusCondition = eq(latestStatus.status, \"valid\");\n\n // ------------------------------------------------------------------\n // Best‑offer selection per (offering, nonce, side) group\n // ------------------------------------------------------------------\n //\n // • DISTINCT ON (offering, nonce, buy) keeps only one offer per group.\n // • ORDER BY inside DISTINCT ON realises the priority rules:\n // 1 price – lower rate for lenders (buy = true), higher rate for borrowers (buy = false)\n // 2 size – larger remaining size (assets – consumed)\n // 3 term – longer maturity\n //\n //\n // NOTE: we first pick the winner rows into a CTE (“best_offers”) and\n // only then join collaterals so that the ranking is not disturbed\n // by the 1‑to‑N relationship.\n // ------------------------------------------------------------------\n\n const bestOffers = db\n .selectDistinctOn(\n // group key\n [offers.offering, offers.nonce, offers.buy],\n {\n hash: offers.hash,\n offering: offers.offering,\n assets: offers.assets,\n consumed: sumConsumed.consumed,\n remaining: sql`${offers.assets} - COALESCE(${sumConsumed.consumed}, 0)`.as(\"remaining\"),\n rate: offers.rate,\n maturity: offers.maturity,\n expiry: offers.expiry,\n start: offers.start,\n nonce: offers.nonce,\n buy: offers.buy,\n chainId: offers.chainId,\n loanToken: offers.loanToken,\n callbackAddress: offers.callbackAddress,\n callbackData: offers.callbackData,\n callbackGasLimit: offers.callbackGasLimit,\n signature: offers.signature,\n callbackId: offers.callbackId,\n status: latestStatus.status,\n metadata: latestStatus.metadata,\n },\n )\n .from(offers)\n .leftJoinLateral(latestStatus, sql`true`)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n and(...baseWhereClauses),\n statusCondition,\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n offers.offering,\n offers.nonce,\n offers.buy,\n // 1 price (direction depends on side)\n sql`CASE WHEN ${offers.buy} THEN ${offers.rate} ELSE -${offers.rate} END`,\n // 2 size (remaining)\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) DESC`,\n // 3 term (longer maturity)\n desc(offers.maturity),\n )\n .as(\"best_offers\");\n\n // total liquidity per callbackId (sum of pools behind the user's queue)\n // Note: queue order doesn't change the sum; ordering will matter in the window step below.\n const queueLiquidity = db\n .select({\n callbackId: userPositions.id,\n userAmount: userPositions.amount, // user's per-callback cap\n queueLiquidity: sql<bigint>`COALESCE(SUM(${availableLiquidityPools.amount}), 0)`.as(\n \"queue_liquidity\",\n ),\n })\n .from(userPositions)\n .leftJoin(\n availableLiquidityQueues,\n eq(userPositions.availableLiquidityQueueId, availableLiquidityQueues.queueId),\n )\n .leftJoin(\n availableLiquidityPools,\n eq(availableLiquidityQueues.availableLiquidityPoolId, availableLiquidityPools.id),\n )\n .groupBy(userPositions.id)\n .as(\"queue_liquidity\");\n\n const sortExpr = sql`CASE WHEN ${bestOffers.buy} THEN ${bestOffers.rate} ELSE -${bestOffers.rate} END`;\n\n const offersWithEligibility = db\n .select({\n hash: bestOffers.hash,\n offering: bestOffers.offering,\n assets: bestOffers.assets,\n consumed: bestOffers.consumed,\n remaining: bestOffers.remaining,\n rate: bestOffers.rate,\n maturity: bestOffers.maturity,\n expiry: bestOffers.expiry,\n start: bestOffers.start,\n nonce: bestOffers.nonce,\n buy: bestOffers.buy,\n chainId: bestOffers.chainId,\n loanToken: bestOffers.loanToken,\n callbackAddress: bestOffers.callbackAddress,\n callbackData: bestOffers.callbackData,\n callbackGasLimit: bestOffers.callbackGasLimit,\n signature: bestOffers.signature,\n callbackId: bestOffers.callbackId,\n status: bestOffers.status,\n metadata: bestOffers.metadata,\n\n // liquidity caps\n userAmount: sql<bigint>`COALESCE(${queueLiquidity.userAmount}, 0)`.as(\"user_amount\"),\n queueLiquidity: sql<bigint>`COALESCE(${queueLiquidity.queueLiquidity}, 0)`.as(\n \"queue_liquidity\",\n ),\n\n // running total of remaining per callback, ordered by the *same* priority as selection\n cumulativeRemaining: sql<bigint>`\n SUM(${bestOffers.remaining}) OVER (\n PARTITION BY ${bestOffers.callbackId}\n ORDER BY ${sortExpr}, ${asc(bestOffers.hash)}\n ROWS UNBOUNDED PRECEDING\n )\n `.as(\"cumulative_remaining\"),\n\n eligible: sql<boolean>`\n CASE\n WHEN ${bestOffers.buy} = false THEN true\n WHEN ${bestOffers.remaining} <= 0 THEN false\n ELSE ( SUM(${bestOffers.remaining}) OVER (\n PARTITION BY ${bestOffers.callbackId}\n ORDER BY ${sortExpr}, ${asc(bestOffers.hash)}\n ROWS UNBOUNDED PRECEDING\n )\n <= LEAST(\n COALESCE(${queueLiquidity.userAmount}, 0),\n COALESCE(${queueLiquidity.queueLiquidity}, 0)\n )\n )\n END\n `.as(\"eligible\"),\n })\n .from(bestOffers)\n .leftJoin(queueLiquidity, eq(bestOffers.callbackId, queueLiquidity.callbackId))\n .as(\"offers_with_eligibility\");\n\n const hardCap = limit * 5 + 1 + (parsedCursor ? 1 : 0);\n const validOffers = db\n .select({\n // pass-through all fields + a global row_number for hard cap\n hash: offersWithEligibility.hash,\n offering: offersWithEligibility.offering,\n assets: offersWithEligibility.assets,\n consumed: offersWithEligibility.consumed,\n remaining: offersWithEligibility.remaining,\n rate: offersWithEligibility.rate,\n maturity: offersWithEligibility.maturity,\n expiry: offersWithEligibility.expiry,\n start: offersWithEligibility.start,\n nonce: offersWithEligibility.nonce,\n buy: offersWithEligibility.buy,\n chainId: offersWithEligibility.chainId,\n loanToken: offersWithEligibility.loanToken,\n callbackAddress: offersWithEligibility.callbackAddress,\n callbackData: offersWithEligibility.callbackData,\n callbackGasLimit: offersWithEligibility.callbackGasLimit,\n signature: offersWithEligibility.signature,\n callbackId: offersWithEligibility.callbackId,\n status: offersWithEligibility.status,\n metadata: offersWithEligibility.metadata,\n userAmount: offersWithEligibility.userAmount,\n queueLiquidity: offersWithEligibility.queueLiquidity,\n cumulativeRemaining: offersWithEligibility.cumulativeRemaining,\n eligible: offersWithEligibility.eligible,\n // sort expression is the same again as in offersWithEligibility\n rowNumber: sql<number>`\n ROW_NUMBER() OVER (\n ORDER BY\n CASE WHEN ${offersWithEligibility.buy} THEN ${offersWithEligibility.rate} ELSE -${offersWithEligibility.rate} END,\n ${asc(offersWithEligibility.hash)}\n )\n `.as(\"row_number\"),\n })\n .from(offersWithEligibility)\n .where(sql`${offersWithEligibility.eligible} = true`)\n .limit(hardCap)\n .as(\"valid_offers\");\n\n const cursorTuple = parsedCursor\n ? {\n rate: BigInt(parsedCursor.rate!),\n hash: parsedCursor.hash!,\n }\n : null;\n\n const withCollats = await db\n .select({\n // base fields\n hash: sql<Hex>`${validOffers.hash}`,\n offering: sql<Address>`${validOffers.offering}`,\n assets: validOffers.assets,\n consumed: validOffers.consumed,\n rate: validOffers.rate,\n maturity: validOffers.maturity,\n expiry: validOffers.expiry,\n start: validOffers.start,\n nonce: validOffers.nonce,\n buy: validOffers.buy,\n chainId: validOffers.chainId,\n loanToken: sql<Address>`${validOffers.loanToken}`,\n callbackAddress: sql<Address>`${validOffers.callbackAddress}`,\n callbackData: sql<Hex>`${validOffers.callbackData}`,\n callbackGasLimit: validOffers.callbackGasLimit,\n signature: sql<Hex | undefined>`${validOffers.signature}`,\n callbackId: validOffers.callbackId,\n status: sql<\"valid\">`${validOffers.status}`,\n metadata: validOffers.metadata,\n\n // collateral fields\n collateralAsset: sql<Address>`${offerCollaterals.asset}`,\n collateralOracle: sql<Address>`${offerCollaterals.oracle}`,\n collateralLltv: offerCollaterals.lltv,\n })\n .from(validOffers)\n .leftJoin(offerCollaterals, eq(validOffers.hash, offerCollaterals.offerHash))\n .where(\n and(\n ...(cursorTuple\n ? [\n sql`(${validOffers.rate}, ${validOffers.hash}) ${rateSortDirection === \"asc\" ? sql`>` : sql`<`} (${cursorTuple.rate}, ${cursorTuple.hash})`,\n ]\n : []),\n ),\n )\n .orderBy(\n rateSortDirection === \"asc\" ? asc(validOffers.rate) : desc(validOffers.rate),\n asc(validOffers.hash),\n );\n\n type OfferMapEntry = {\n base: Omit<Offer.Offer, \"collaterals\" | \"callback\" | \"maturity\" | \"assets\" | \"consumed\"> & {\n callbackAddress: Address;\n callbackData: Hex;\n callbackGasLimit: bigint;\n collateralAsset: Address;\n collateralOracle: Address;\n collateralLltv: bigint | null;\n maturity: number;\n assets: string;\n consumed: string;\n status: \"valid\";\n metadata: unknown;\n };\n collaterals: { asset: Address; oracle: Address; lltv: LLTV.LLTV }[];\n };\n\n const buildOffersMap = (\n rows: OfferMapEntry[\"base\"][],\n skipHash?: string,\n ): Map<string, OfferMapEntry> => {\n const map = new Map<string, OfferMapEntry>();\n for (const row of rows) {\n if (skipHash && row.hash === skipHash) continue;\n const entry = map.get(row.hash) ?? { base: row, collaterals: [] };\n if (row.collateralAsset && row.collateralOracle && row.collateralLltv) {\n entry.collaterals.push({\n asset: row.collateralAsset as Address,\n oracle: row.collateralOracle as Address,\n lltv: LLTV.from(row.collateralLltv),\n });\n }\n map.set(row.hash, entry);\n }\n return map;\n };\n\n const allEntries = Array.from(buildOffersMap(withCollats).values());\n const pageEntries = allEntries.slice(0, limit);\n\n // nextCursor if we saw more than 'limit'\n let nextCursor: string | null = null;\n if (allEntries.length > limit) {\n const last = pageEntries[pageEntries.length - 1]!.base;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n });\n }\n\n const data = pageEntries.map(({ base, collaterals: cols }) => ({\n ...Offer.from({\n offering: base.offering,\n assets: BigInt(base.assets),\n rate: base.rate,\n maturity: Maturity.from(base.maturity),\n expiry: base.expiry,\n start: base.start,\n nonce: base.nonce,\n buy: base.buy,\n chainId: base.chainId,\n loanToken: base.loanToken,\n collaterals: cols.sort((a, b) =>\n a.asset.toLowerCase().localeCompare(b.asset.toLowerCase()),\n ),\n callback: {\n address: base.callbackAddress,\n data: base.callbackData,\n gasLimit: base.callbackGasLimit,\n },\n ...(base.signature !== null ? { signature: base.signature as Hex } : undefined),\n }),\n consumed: BigInt(base.consumed),\n status: base.status,\n ...(base.metadata ? { metadata: base.metadata as RouterOffer.OfferMetadata } : {}),\n }));\n\n return { offers: data, nextCursor };\n },\n\n delete: async (hash: Offer.Offer[\"hash\"]): Promise<boolean> => {\n const result = await db.delete(offers).where(eq(offers.hash, hash.toLowerCase()));\n\n return (result as { affectedRows: number }).affectedRows > 0;\n },\n\n deleteMany: async (hashes: Offer.Offer[\"hash\"][]): Promise<number> => {\n if (hashes.length === 0) {\n return 0;\n }\n\n return await db.transaction(async (tx) => {\n const normalizedHashes = hashes.map((hash) => hash.toLowerCase());\n const result = await tx\n .delete(offers)\n .where(\n sql`${offers.hash} = ANY(${sql.raw(`ARRAY[${normalizedHashes.map((h) => `'${h}'`).join(\", \")}]`)})`,\n );\n return (result as { affectedRows: number }).affectedRows;\n });\n },\n\n updateStatus: async (parameters: {\n offerHash: Offer.Offer[\"hash\"];\n status: RouterOffer.OfferStatus;\n metadata?: RouterOffer.OfferMetadata;\n }): Promise<void> => {\n const latest = await db\n .select({ status: offerStatus.status })\n .from(offerStatus)\n .where(eq(offerStatus.offerHash, parameters.offerHash.toLowerCase()))\n .orderBy(desc(offerStatus.createdAt))\n .limit(1);\n\n if (latest.length > 0 && latest[0]!.status === parameters.status) return;\n\n await db.insert(offerStatus).values({\n offerHash: parameters.offerHash.toLowerCase(),\n status: parameters.status,\n metadata: parameters.metadata,\n });\n },\n\n updateConsumedAmount: async (parameters: {\n id: string;\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n }): Promise<void> => {\n await db\n .insert(consumedTable)\n .values({\n id: parameters.id,\n chainId: parameters.chainId,\n offering: parameters.offering.toLowerCase(),\n nonce: parameters.nonce,\n consumed: parameters.consumed.toString(),\n })\n .onConflictDoNothing();\n },\n };\n}\n","import path from \"node:path\";\nimport { PGlite } from \"@electric-sql/pglite\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { migrate as migratePostgres } from \"drizzle-orm/node-postgres/migrator\";\nimport { drizzle as drizzleLite } from \"drizzle-orm/pglite\";\nimport { migrate as migratePGLite } from \"drizzle-orm/pglite/migrator\";\n\nimport { Pool } from \"pg\";\nimport * as offersSchema from \"./drizzle/schema.ts\";\n\nexport type PgDB = ReturnType<typeof drizzle> & {\n name: \"pg\";\n pool: Pool;\n};\nexport type PGLiteDB = ReturnType<typeof drizzleLite> & {\n name: \"pglite\";\n pool: PGlite;\n};\n\nexport type PG = PgDB | PGLiteDB;\n\nexport function connect(\n parameters:\n | {\n type: \"pg\";\n endpoint: string;\n }\n | {\n type: \"pglite\";\n },\n): PG {\n if (parameters.type === \"pg\") {\n const pool = new Pool({ connectionString: parameters.endpoint });\n const client = drizzle(pool, { schema: offersSchema });\n return Object.assign(client, { name: \"pg\", pool } as const);\n }\n\n const pool = new PGlite();\n const client = drizzleLite(pool, { schema: offersSchema });\n return Object.assign(client, { name: \"pglite\", pool } as const);\n}\n\nexport async function applyMigrations(pg: PG): Promise<void> {\n // In Lambda, drizzle files are in the working directory, not relative to __dirname\n const migrationsFolder = process.env.AWS_LAMBDA_FUNCTION_NAME\n ? path.join(process.cwd(), \"drizzle\", offersSchema.VERSION)\n : path.join(__dirname, \"drizzle\", offersSchema.VERSION);\n\n await pg.execute(`create schema if not exists \"${offersSchema.VERSION}\"`);\n\n if (pg.name === \"pg\") {\n await migratePostgres(pg, { migrationsFolder });\n return;\n }\n await migratePGLite(pg, { migrationsFolder });\n}\n\nexport async function clean(pg: PG) {\n await pg.execute(`drop schema if exists \"${offersSchema.VERSION}\" cascade`);\n await pg.execute(`create schema \"${offersSchema.VERSION}\"`);\n await pg.execute(\"drop schema if exists drizzle cascade\");\n}\n","export * from \"./Client.ts\";\nexport * from \"./Server.ts\";\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 \"#core/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; headers?: Headers }): 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 = opts?.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 { serve as serveHono } from \"@hono/node-server\";\nimport { Format } from \"@morpho-dev/mempool\";\nimport { type Context, Hono } from \"hono\";\nimport { z } from \"zod/v4\";\nimport * as ApiSchema from \"#core/apiSchema/index.ts\";\nimport * as Logger from \"#core/Logger.ts\";\nimport type * as OfferStore from \"#core/OfferStore/index.ts\";\n\n/**\n * Start a local router server.\n * @example\n * ```ts\n * import { Router } from \"@morpho-dev/router\";\n * await Router.serve(); // local router server running on http://localhost:8081\n * ```\n */\nexport async function serve(parameters: { port: number; store: OfferStore.OfferStore }) {\n const app = new Hono();\n const store: OfferStore.OfferStore = parameters.store;\n const logger = Logger.getLogger();\n\n app.get(\"/v1/offers\", async (c) => {\n try {\n const params = ApiSchema.parse(\"get_offers\", c.req.query());\n\n const offers = await store.getAll({\n query: {\n creators: params.creators,\n side: params.side,\n chains: params.chains,\n loanTokens: params.loan_tokens,\n status: params.status,\n callbackAddresses: params.callback_addresses,\n minAmount: params.min_amount,\n maxAmount: params.max_amount,\n minRate: params.min_rate,\n maxRate: params.max_rate,\n minMaturity: params.min_maturity,\n maxMaturity: params.max_maturity,\n minExpiry: params.min_expiry,\n maxExpiry: params.max_expiry,\n collateralAssets: params.collateral_assets,\n collateralOracles: params.collateral_oracles,\n collateralTuple: params.collateral_tuple,\n minLltv: params.min_lltv,\n maxLltv: params.max_lltv,\n sortBy: params.sort_by,\n sortOrder: params.sort_order,\n cursor: params.cursor,\n limit: params.limit,\n },\n });\n\n return success(c, {\n data: offers.offers.map((offer) =>\n Format.stringifyBigint(Format.toSnakeCase(ApiSchema.toResponse(offer))),\n ),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: debug message\n console.error(err);\n return error(err, c);\n }\n });\n\n app.get(\"/v1/offers/match\", async (c) => {\n try {\n const params = ApiSchema.parse(\"match_offers\", c.req.query());\n const offers = await store.findMatchingOffers({\n side: params.side,\n chainId: params.chain_id,\n rate: params.rate,\n collaterals: params.collaterals,\n maturity: params.maturity,\n minMaturity: params.min_maturity,\n maxMaturity: params.max_maturity,\n loanToken: params.loan_token,\n creator: params.creator,\n cursor: params.cursor,\n limit: params.limit,\n });\n return success(c, {\n data: offers.offers.map((offer) =>\n Format.stringifyBigint(Format.toSnakeCase(ApiSchema.toResponse(offer))),\n ),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: debug message\n console.error(err);\n return error(err, c);\n }\n });\n\n serveHono(\n {\n fetch: app.fetch,\n port: parameters.port,\n },\n (info) => {\n logger.info({ service: \"api\", msg: \"Router server started\", port: info.port });\n },\n );\n}\n\nexport function error(error: unknown, c: Context) {\n if (error instanceof APIError) {\n return handleAPIError(error, c);\n }\n\n if (error instanceof SyntaxError) {\n return handleAPIError(new BadRequestError(error.message), c);\n }\n\n if (error instanceof z.ZodError) {\n return handleAPIError(handleZodError(error), c);\n }\n\n return handleAPIError(new InternalServerError(), c);\n}\n\nexport function success<T>(\n c: Context,\n {\n data,\n cursor,\n }: {\n data: T | T[];\n cursor?: string | null;\n },\n) {\n return c.json({\n status: \"success\",\n cursor,\n data,\n meta: {\n timestamp: new Date().toISOString(),\n },\n });\n}\n\nexport class APIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n public code: string,\n public details?: unknown,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\nexport class ValidationError extends APIError {\n constructor(message: string, details?: unknown) {\n super(400, message, \"VALIDATION_ERROR\", details);\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(message: string) {\n super(404, message, \"NOT_FOUND\");\n }\n}\n\nexport class InternalServerError extends APIError {\n constructor(message = \"Internal server error\") {\n super(500, message, \"INTERNAL_SERVER_ERROR\");\n }\n}\n\nexport class BadRequestError extends APIError {\n constructor(message = \"Invalid JSON format\", details?: unknown) {\n super(400, message, \"BAD_REQUEST\", details);\n }\n}\n\nexport function handleZodError(error: z.ZodError): ValidationError {\n const formattedErrors = error.issues.map((err) => {\n const field = err.path.join(\".\");\n let issue = err.message;\n\n if (err.code === \"invalid_type\") {\n if (err.message.includes(\"received undefined\")) {\n issue = `${field} is required`;\n } else {\n issue = err.message;\n }\n } else if (err.code === \"invalid_format\") {\n issue = `${field} has an invalid format`;\n }\n\n return {\n field,\n issue,\n };\n });\n\n return new ValidationError(\"Validation failed\", formattedErrors);\n}\n\nfunction handleAPIError(error: APIError, c: Context) {\n return c.json({\n statusCode: error.statusCode,\n body: JSON.stringify({\n status: \"error\",\n error: {\n code: error.code,\n message: error.message,\n ...(error.details && typeof error.details === \"object\" ? { details: error.details } : {}),\n },\n meta: {\n timestamp: new Date().toISOString(),\n },\n }),\n });\n}\n","import { type Chain, Mempool } from \"@morpho-dev/mempool\";\nimport { createWalletClient, http, publicActions, type Chain as ViemChain } from \"viem\";\nimport * as Collector from \"#core/Collector/index.ts\";\nimport * as CollectorBlockStore from \"#core/CollectorBlockStore.ts\";\nimport * as LiquidityStore from \"#core/LiquidityStore.ts\";\nimport * as OfferStore from \"#core/OfferStore/index.ts\";\nimport * as PG from \"#core/OfferStore/PG.ts\";\n\nexport type config = {\n chain: Chain.Chain;\n rpcUrl: string;\n dbConfig: {\n type: \"pg\" | \"pglite\";\n endpoint?: string;\n };\n};\n\nexport type Services = {\n offerStore: OfferStore.OfferStore;\n collectorBlockStore: CollectorBlockStore.CollectorBlockStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n mempoolOffersCollector: Collector.Collector<\"mempool_offers\">;\n consumedEventsCollector: Collector.Collector<\"consumed_events\">;\n buyWithEmptyCallbackLiquidityCollector: Collector.Collector<\"buy_with_empty_callback_liquidity\">;\n DB: PG.PG;\n};\n\nexport function from(config: config): Services {\n const { chain, rpcUrl, dbConfig } = config;\n\n const walletClient = createWalletClient({\n chain: chain as unknown as ViemChain,\n transport: http(rpcUrl),\n }).extend(publicActions);\n\n if (dbConfig.type === \"pg\" && !dbConfig.endpoint) {\n throw new Error(\"dbOffer.endpoint is required when dbOffer.type is pg\");\n }\n\n const DB: PG.PG =\n dbConfig.type === \"pg\"\n ? PG.connect({ type: \"pg\", endpoint: dbConfig.endpoint! })\n : PG.connect({ type: \"pglite\" });\n\n const offerStore: OfferStore.OfferStore = OfferStore.create({ db: DB });\n\n const collectorBlockStore: CollectorBlockStore.CollectorBlockStore = CollectorBlockStore.create({\n db: DB,\n });\n const liquidityStore: LiquidityStore.LiquidityStore = LiquidityStore.create({ db: DB });\n\n const interval = 10_000;\n const maxBatchSize = 1000;\n const mempoolOffersCollector = Collector.createMempoolCollector({\n mempool: Mempool.connect({\n client: walletClient,\n mempoolAddress: chain.mempool!.address,\n }),\n offerStore,\n collectorBlockStore,\n chain,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n const consumedEventsCollector = Collector.createConsumedEventsCollector({\n client: walletClient,\n contractAddress: chain.morpho,\n offerStore,\n collectorBlockStore,\n chainId: chain.id,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n const buyWithEmptyCallbackLiquidityCollector =\n Collector.createBuyWithEmptyCallbackLiquidityCollector({\n client: walletClient,\n offerStore,\n collectorBlockStore,\n liquidityStore,\n chain,\n options: {\n interval,\n maxBatchSize,\n },\n });\n\n return {\n offerStore,\n collectorBlockStore,\n liquidityStore,\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n DB,\n };\n}\n"]}
|