@morpho-dev/router 0.1.17 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -24
- package/dist/cli.js +3140 -2143
- package/dist/cli.js.map +1 -1
- package/dist/drizzle/VERSION.ts +3 -0
- package/dist/drizzle/drizzle.config.ts +18 -0
- package/dist/drizzle/index.ts +2 -0
- package/dist/drizzle/{router_v1.4/0000_add_obligation_id.sql → router_v1.5/0000_add_block_number_to_liquidity_graph_and_offer_liquidity_pools_relation.sql} +49 -39
- package/dist/drizzle/router_v1.5/0001_create_new_relations_to_prepare_new_liquidity_model.sql +55 -0
- package/dist/drizzle/router_v1.5/0002_add_new_offer_status_relation.sql +9 -0
- package/dist/drizzle/router_v1.5/0003_insert-status-code.sql +1 -0
- package/dist/drizzle/router_v1.5/0004_add_index_for_fast_book_lookup.sql +3 -0
- package/dist/drizzle/router_v1.5/0005_add_group_consumed_events_table.sql +12 -0
- package/dist/drizzle/router_v1.5/0006_add-trigger-for-consumed-events.sql +58 -0
- package/dist/drizzle/router_v1.5/0007_update_index_for_fast_book_lookup.sql +5 -0
- package/dist/drizzle/router_v1.5/0008_rename_consumed_events_table.sql +8 -0
- package/dist/drizzle/{router_v1.4 → router_v1.5}/meta/0000_snapshot.json +83 -27
- package/dist/drizzle/{router_v1.4 → router_v1.5}/meta/0001_snapshot.json +459 -27
- package/dist/drizzle/router_v1.5/meta/0002_snapshot.json +1463 -0
- package/dist/drizzle/router_v1.5/meta/0003_snapshot.json +1463 -0
- package/dist/drizzle/router_v1.5/meta/0004_snapshot.json +1569 -0
- package/dist/drizzle/router_v1.5/meta/0005_snapshot.json +1664 -0
- package/dist/drizzle/router_v1.5/meta/0006_snapshot.json +1664 -0
- package/dist/drizzle/router_v1.5/meta/0007_snapshot.json +1752 -0
- package/dist/drizzle/router_v1.5/meta/0008_snapshot.json +1752 -0
- package/dist/drizzle/router_v1.5/meta/_journal.json +69 -0
- package/dist/drizzle/schema.ts +363 -0
- package/dist/index.browser.d.cts +909 -159
- package/dist/index.browser.d.ts +909 -159
- package/dist/index.browser.js +1529 -1037
- package/dist/index.browser.js.map +1 -1
- package/dist/index.browser.mjs +1522 -1036
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.node.d.cts +2718 -912
- package/dist/index.node.d.ts +2718 -912
- package/dist/index.node.js +6827 -5521
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +6816 -5515
- package/dist/index.node.mjs.map +1 -1
- package/package.json +21 -17
- package/dist/drizzle/router_v1.4/0001_update-primary-key-on-link.sql +0 -3
- package/dist/drizzle/router_v1.4/meta/_journal.json +0 -20
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/core/Chain.ts","../src/utils/BigMath.ts","../src/utils/batch.ts","../src/utils/Errors.ts","../src/core/Abi.ts","../src/core/Callback.ts","../src/core/Collateral.ts","../src/utils/zod.ts","../src/core/LLTV.ts","../src/core/Liquidity.ts","../src/core/Maturity.ts","../src/core/Obligation.ts","../src/utils/Format.ts","../src/core/Offer.ts","../src/utils/retry.ts","../src/utils/batchMulticall.ts","../src/utils/lazy.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/time.ts","../src/core/Quote.ts","../src/evm/EVM.ts","../src/cli/commands/mempool.ts","../src/services/Logger.ts","../src/api/Schema/health.ts","../src/stores/utils/Cursor.ts","../src/api/Schema/requests.ts","../src/api/Schema/openapi.ts","../src/api/Controllers/getDocs.ts","../src/collectors/index.ts","../src/services/RouterAdmin.ts","../src/collectors/Collector.ts","../src/mempool/MempoolEVMClient.ts","../src/mempool/MempoolClient.ts","../src/stores/CollectorStore.ts","../src/stores/drizzle/schema.ts","../src/collectors/fetchers/fetchBalancesAndAllowances.ts","../src/collectors/fetchers/fetchCollateralAndDebt.ts","../src/collectors/fetchers/fetchOraclePrices.ts","../src/collectors/fetchers/fetchUserVaultMarketLiquidity.ts","../src/collectors/CollectFunctions/collectBuyVaultV1CallbackLiquidity.ts","../src/collectors/CollectFunctions/collectBuyWithEmptyCallbackLiquidity.ts","../src/collectors/CollectFunctions/collectConsumedEvents.ts","../src/collectors/validations/Validation.ts","../src/collectors/validations/ValidationRule.ts","../src/collectors/CollectFunctions/collectOffers.ts","../src/collectors/CollectFunctions/collectSellERC20CallbackLiquidity.ts","../src/collectors/CollectorBuilder.ts","../src/services/Health.ts","../src/api/Payload.ts","../src/api/Controllers/getHealth.ts","../src/api/Schema/ObligationResponse.ts","../src/api/Schema/OfferResponse.ts","../src/api/Controllers/getObligations.ts","../src/api/Controllers/getOffers.ts","../src/api/Api.ts","../src/stores/ChainStore.ts","../src/stores/LiquidityStore.ts","../src/stores/OfferStore.ts","../src/stores/PG.ts","../src/indexer/RouterIndexer.ts","../src/services/Services.ts","../src/cli/commands/RouterCmd.ts","../src/cli/commands/start.ts","../src/cli/commands/tunnel.ts","../src/cli/cli.ts"],"names":["array","viemEthereum","viemBase","viemAnvil","CallbackType","from","z","z2","z3","obligationId","InvalidOptionError","z4","now","fromSnakeCase","s","isAddress","z5","error","encodeAbiParameters","random","toSnakeCase","wait","watch","poll","max","maxUint256","privateKeyToAccount","generatePrivateKey","decodeAbiParameters","z7","keccak256","timestamp","decode","encode","z9","batch","create","newBlock","missingBlockNumbers","start","DEFAULT_BATCH_SIZE","DEFAULT_BLOCK_WINDOW","parameters","offers","publicActions","chains","bigint","boolean","asc","run","_","index","chainIds","collectors","status","z11","obligations","serve","serveHono","eq","sql","and","gte","lte","desc","hash","gt","id","path","connect","pool","client","drizzleLite","migratePostgres","migratePGLite","http","Command","Option","names"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"@morpho-dev/router\",\n \"version\": \"0.1.17\",\n \"description\": \"Router package for Morpho protocol\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"access\": \"public\",\n \"publishConfig\": {\n \"@morpho-dev:registry\": \"https://registry.npmjs.org\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git@github.com:morpho-org/router.git\"\n },\n \"files\": [\n \"dist/*\"\n ],\n \"main\": \"./dist/index.node.js\",\n \"module\": \"./dist/index.node.mjs\",\n \"types\": \"./dist/index.node.d.ts\",\n \"bin\": {\n \"router\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.node.d.ts\",\n \"node\": {\n \"import\": \"./dist/index.node.mjs\",\n \"require\": \"./dist/index.node.js\"\n },\n \"browser\": {\n \"import\": \"./dist/index.browser.mjs\",\n \"require\": \"./dist/index.browser.js\"\n },\n \"default\": \"./dist/index.browser.mjs\"\n }\n },\n \"imports\": {\n \"#core\": \"./src/core/index.ts\",\n \"#*\": \"./src/*\"\n },\n \"scripts\": {\n \"dev\": \"tsup --config tsup.config.ts --watch --onSuccess 'echo \\\"Router package rebuilt\\\"'\",\n \"build\": \"tsup --config tsup.config.ts\",\n \"cli\": \"pnpm build && node dist/cli.js\",\n \"openapi\": \"pnpm build && node ./scripts/generate-openapi.mjs --out static/swagger.json\",\n \"docs:cli\": \"node ./scripts/generate-readme.mjs\",\n \"format\": \"biome format --write src/\",\n \"lint\": \"biome check src/\",\n \"lint:ci\": \"biome ci src/\",\n \"migrations:create\": \"drizzle-kit generate --config src/stores/drizzle/drizzle.config.ts --name\",\n \"migrations:run\": \"drizzle-kit migrate --config src/stores/drizzle/drizzle.config.ts\",\n \"test\": \"vitest\",\n \"test:api\": \"vitest --config vitest.api.config.ts run\",\n \"test:ui\": \"vitest --ui\",\n \"test:watch\": \"vitest watch\",\n \"typecheck\": \"tsc --project tsconfig.json --noEmit --incremental\"\n },\n \"devDependencies\": {\n \"@repo/typescript-config\": \"workspace:*\",\n \"@types/pg\": \"^8.15.5\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vitest/ui\": \"^3.2.4\",\n \"drizzle-kit\": \"^0.31.1\",\n \"prool\": \"^0.0.24\",\n \"tevm\": \"1.0.0-next.149\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"dependencies\": {\n \"@electric-sql/pglite\": \"^0.3.1\",\n \"@hono/node-server\": \"^1.17.1\",\n \"@ngrok/ngrok\": \"^1.5.2\",\n \"commander\": \"^13.1.0\",\n \"dotenv\": \"^17.2.1\",\n \"drizzle-orm\": \"^0.43.1\",\n \"hono\": \"^4.9.7\",\n \"js-base64\": \"^3.7.8\",\n \"pg\": \"^8.16.0\",\n \"viem\": \"^2.37.13\",\n \"zod\": \"^4.1.12\",\n \"zod-openapi\": \"^5.4.3\"\n }\n}\n","import type { AbiEvent, Address, GetLogsReturnType, PublicClient } from \"viem\";\nimport { getBlock, getLogs } from \"viem/actions\";\nimport {\n type Chain as ViemChain,\n anvil as viemAnvil,\n base as viemBase,\n mainnet as viemEthereum,\n} from \"viem/chains\";\nimport * as BigMath from \"#utils/BigMath.ts\";\nimport { batch } from \"#utils/batch.ts\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Compute } from \"./types.ts\";\n\nexport const chainNames = [\"ethereum\", \"base\", \"ethereum-virtual-testnet\", \"anvil\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n \"ETHEREUM-VIRTUAL-TESTNET\": 109111114n,\n ANVIL: 505050505n, // random id to not clash with other chains\n};\nexport type Id = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: Id;\n name: ChainName;\n whitelistedAssets: Set<Address>;\n morpho: Address;\n morphoBlue: Address;\n mempool: {\n address: Address;\n deploymentBlock: number;\n reindexBuffer: number;\n };\n vaultV1Factory: Record<string, Address>;\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: Id): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const getWhitelistedChains = (): Chain[] => {\n return [chains.ethereum, chains.base, chains[\"ethereum-virtual-testnet\"], chains.anvil];\n};\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 23347674,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n whitelistedAssets: new Set(\n [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 35449942,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0xFf62A7c278C62eD665133147129245053Bbf5918\",\n },\n },\n \"ethereum-virtual-testnet\": {\n ...viemEthereum,\n id: ChainId[\"ETHEREUM-VIRTUAL-TESTNET\"],\n name: \"ethereum-virtual-testnet\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x11a002d45db720ed47a80d2f3489cba5b833eaf5\", // @TODO: This is mock Consumed contract, update with Terms once stable\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x5b06224f736a57635b5bcb50b8ef178b189107cb\",\n deploymentBlock: 23224302,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\",\n \"v1.1\": \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\",\n },\n },\n anvil: {\n ...viemAnvil,\n id: ChainId.ANVIL,\n name: \"anvil\",\n whitelistedAssets: new Set(\n [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n ].map((address) => address.toLowerCase() as Address),\n ),\n morpho: \"0x23DFBc4B8B80C14CC5e25011B8491f268395BAd6\",\n morphoBlue: \"0x0000000000000000000000000000000000000000\", // Set dynamically in tests\n mempool: {\n address: \"0xD946246695A9259F3B33a78629026F61B3Ab40aF\",\n deploymentBlock: 23223727,\n reindexBuffer: 10,\n },\n vaultV1Factory: {\n \"v1.0\": \"0x0000000000000000000000000000000000000000\",\n \"v1.1\": \"0x0000000000000000000000000000000000000000\",\n },\n },\n};\n\n// thresholds are set to align with Alchemy's thresholds\n//https://www.alchemy.com/docs/deep-dive-into-eth_getlogs#making-a-request-to-eth_getlogs\nconst MAX_BATCH_SIZE = 10_000;\nconst DEFAULT_BATCH_SIZE = 2_500;\nconst MAX_BLOCK_WINDOW = 2_000;\nconst DEFAULT_BLOCK_WINDOW = 500;\n\nexport async function* streamLogs<abiEvent extends AbiEvent | undefined = undefined>(parameters: {\n client: PublicClient;\n contractAddress: Address;\n event?: abiEvent;\n blockNumberGte?: number;\n blockNumberLte?: number;\n order: \"asc\" | \"desc\";\n options: {\n maxBatchSize?: number;\n blockWindow?: number;\n };\n}): AsyncGenerator<\n { logs: GetLogsReturnType<abiEvent | undefined>; blockNumber: number },\n void,\n void\n> {\n const {\n client,\n contractAddress,\n event,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = DEFAULT_BLOCK_WINDOW } = {},\n } = parameters;\n if (maxBatchSize > MAX_BATCH_SIZE) throw new InvalidBatchSizeError(maxBatchSize);\n if (blockWindow > MAX_BLOCK_WINDOW) throw new InvalidBlockWindowError(blockWindow);\n if (order === \"asc\" && blockNumberGte === undefined) throw new MissingBlockNumberError();\n\n const latestBlock = (await getBlock(client, { blockTag: \"latest\", includeTransactions: false }))\n .number;\n\n let toBlock = 0n;\n if (order === \"asc\")\n toBlock = BigMath.min(BigInt(blockNumberGte!) + BigInt(blockWindow), latestBlock);\n if (order === \"desc\")\n toBlock =\n blockNumberLte === undefined\n ? latestBlock\n : BigMath.min(BigInt(blockNumberLte!), latestBlock);\n\n let fromBlock = 0n;\n if (order === \"asc\") fromBlock = BigMath.min(BigInt(blockNumberGte!), latestBlock);\n if (order === \"desc\")\n fromBlock = BigMath.max(BigInt(blockNumberGte || toBlock - BigInt(blockWindow)), 0n);\n\n if (order === \"asc\") toBlock = BigMath.min(toBlock, fromBlock + BigInt(blockWindow));\n if (order === \"desc\") fromBlock = BigMath.max(fromBlock, toBlock - BigInt(blockWindow));\n if (fromBlock > toBlock) throw new InvalidBlockRangeError(fromBlock, toBlock);\n\n let streaming = true;\n while (streaming) {\n const logs = await getLogs(client, {\n address: contractAddress,\n event,\n fromBlock,\n toBlock,\n });\n\n logs.sort((a, b) => {\n if (a.blockNumber !== b.blockNumber)\n return order === \"asc\"\n ? Number(a.blockNumber - b.blockNumber)\n : Number(b.blockNumber - a.blockNumber);\n if (a.transactionIndex !== b.transactionIndex)\n return order === \"asc\"\n ? a.transactionIndex - b.transactionIndex\n : b.transactionIndex - a.transactionIndex;\n return order === \"asc\" ? a.logIndex - b.logIndex : b.logIndex - a.logIndex;\n });\n\n for (const logBatch of batch(logs, maxBatchSize)) {\n if (logBatch.length === 0) break;\n yield {\n logs: logBatch,\n blockNumber:\n logBatch.length === maxBatchSize\n ? // if the batch is full, return the last block number, block numbers are always sorted\n Number(logBatch[logBatch.length - 1]?.blockNumber)\n : // if the batch is not full, return `toBlock` or `fromBlock` to indicate until which block the logs were fetched\n order === \"asc\"\n ? Number(toBlock)\n : Number(fromBlock),\n };\n }\n\n streaming =\n order === \"asc\"\n ? toBlock < (blockNumberLte || latestBlock)\n : fromBlock > (blockNumberGte || 0n);\n\n if (order === \"asc\") {\n fromBlock = BigMath.min(BigInt(toBlock) + 1n, latestBlock);\n toBlock = BigMath.min(fromBlock + BigInt(blockWindow), latestBlock);\n }\n\n if (order === \"desc\") {\n const lowerBound = BigInt(blockNumberGte || 0);\n const windowSize = BigInt(blockWindow);\n const nextToBlock = BigMath.max(fromBlock - 1n, lowerBound);\n const nextFromBlock = BigMath.max(nextToBlock - windowSize, lowerBound);\n toBlock = nextToBlock;\n fromBlock = nextFromBlock;\n }\n }\n\n yield { logs: [], blockNumber: order === \"asc\" ? Number(toBlock) : Number(fromBlock) };\n return;\n}\n\nexport class InvalidBlockRangeError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockRangeError\";\n constructor(fromBlock: bigint, toBlock: bigint) {\n super(\n `Invalid block range while streaming data from chain. From block ${fromBlock} to block ${toBlock}.`,\n );\n }\n}\n\nexport class InvalidBlockWindowError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockWindowError\";\n constructor(blockWindow: number) {\n super(\n `Invalid block window while streaming data from chain. Maximum is ${MAX_BLOCK_WINDOW}. Got ${blockWindow}.`,\n );\n }\n}\n\nexport class InvalidBatchSizeError extends Errors.BaseError {\n override name = \"Chain.InvalidBatchSizeError\";\n constructor(maxBatchSize: number) {\n super(\n `Invalid batch size while streaming data from chain. Maximum is ${MAX_BATCH_SIZE}. Got ${maxBatchSize}.`,\n );\n }\n}\n\nexport class MissingBlockNumberError extends Errors.BaseError {\n override name = \"Chain.MissingBlockNumberError\";\n constructor() {\n super(\"Missing block number when streaming data from chain in ascending order.\");\n }\n}\n","export function max(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\nexport function min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","export type GlobalErrorType<name extends string = \"Error\"> = Error & {\n name: name;\n};\n\n/**\n * Base error class inherited by all errors thrown by mempool.\n *\n * @example\n * ```ts\n * import { Errors } from 'mempool'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<cause extends Error | undefined = undefined> extends Error {\n details: string;\n shortMessage: string;\n\n override cause: cause;\n override name = \"BaseError\";\n\n constructor(\n shortMessage: string,\n options: {\n cause?: cause | undefined;\n details?: string | undefined;\n metaMessages?: (string | undefined)[] | undefined;\n } = {},\n ) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details;\n if (options.cause.shortMessage) return options.cause.shortMessage;\n }\n if (options.cause && \"details\" in options.cause && typeof options.cause.details === \"string\")\n return options.cause.details;\n if (options.cause?.message) return options.cause.message;\n return options.details!;\n })();\n\n const message = [\n shortMessage || \"An error occurred.\",\n ...(options.metaMessages ? [\"\", ...options.metaMessages] : []),\n ...(details ? [\"\", details ? `Details: ${details}` : undefined] : []),\n ]\n .filter((x) => typeof x === \"string\")\n .join(\"\\n\");\n\n super(message, options.cause ? { cause: options.cause } : undefined);\n\n this.cause = options.cause as cause;\n this.details = details;\n this.shortMessage = shortMessage;\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n walk(fn?: ((err: unknown) => boolean) | undefined): unknown {\n return walk(this, fn);\n }\n}\n\n/** @internal */\nfunction walk(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown {\n if (fn?.(err)) return err;\n if (err && typeof err === \"object\" && \"cause\" in err && err.cause) return walk(err.cause, fn);\n return fn ? null : err;\n}\n","export const Oracle = [\n {\n type: \"function\",\n name: \"price\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC4626 = [\n {\n type: \"function\",\n name: \"asset\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorphoFactory = [\n {\n type: \"function\",\n name: \"isMetaMorpho\",\n inputs: [{ name: \"target\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorpho = [\n {\n type: \"function\",\n name: \"withdrawQueue\",\n inputs: [{ name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"withdrawQueueLength\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxWithdraw\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const Morpho = [\n {\n type: \"function\",\n name: \"collateralOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"debtOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"market\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n ],\n outputs: [\n {\n name: \"totalSupplyAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalSupplyShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"lastUpdate\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"fee\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"position\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n {\n name: \"user\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"supplyShares\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"borrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"collateral\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import type { Address, Hex } from \"viem\";\nimport { decodeAbiParameters, encodeAbiParameters } from \"viem\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n BuyVaultV1Callback = \"buy_vault_v1_callback\",\n SellERC20Callback = \"sell_erc20_callback\",\n}\n\nexport const WhitelistedCallbackAddresses: Record<CallbackType, readonly string[]> = {\n [CallbackType.BuyWithEmptyCallback]: [],\n [CallbackType.BuyVaultV1Callback]: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n [CallbackType.SellERC20Callback]: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\", // @TODO: update once deployed and add mapping per chain if needed\n ].map((address) => address.toLowerCase()),\n} as const;\n\nexport function decodeBuyVaultV1Callback(data: Hex): Array<{\n vault: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [vaults, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (vaults.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return vaults.map((v, i) => ({ vault: v, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid BuyVaultV1Callback callback data\");\n }\n}\n\nexport function decodeSellERC20Callback(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 SellERC20Callback callback data\");\n }\n}\n\nexport function encodeBuyVaultV1Callback(parameters: {\n vaults: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.vaults, parameters.amounts],\n );\n}\n\nexport function encodeSellERC20Callback(parameters: {\n collaterals: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.collaterals, parameters.amounts],\n );\n}\n","import type { Address } from \"viem\";\nimport * as z from \"zod\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport * as LLTV from \"./LLTV.ts\";\n\nexport type Collateral = {\n /** Asset being used as collateral. */\n asset: Address;\n /** Liquidation Loan-to-Value of the collateral. */\n lltv: LLTV.LLTV;\n /** Oracle contract used to price the collateral. */\n oracle: Address;\n};\n\nexport const CollateralSchema = z.object({\n asset: z.string().transform(transformAddress),\n oracle: z.string().transform(transformAddress),\n lltv: LLTV.LLTVSchema,\n});\n\nexport const CollateralsSchema = z\n .array(CollateralSchema)\n .min(1, { message: \"At least one collateral is required\" })\n .refine(\n (collaterals) => {\n for (let i = 1; i < collaterals.length; i++) {\n if (collaterals[i - 1]!.asset.toLowerCase() > collaterals[i]!.asset.toLowerCase()) {\n return false;\n }\n }\n return true;\n },\n {\n message: \"Collaterals must be sorted alphabetically by address\",\n },\n )\n .refine(\n (collaterals) => {\n const uniqueAssets = new Set<string>();\n for (const collateral of collaterals) {\n const assetAddress = collateral.asset.toLowerCase();\n if (uniqueAssets.has(assetAddress)) {\n return false;\n }\n uniqueAssets.add(assetAddress);\n }\n return true;\n },\n {\n message: \"Collaterals must not contain duplicate assets\",\n },\n );\n\nexport const from = (parameters: from.Parameters): from.ReturnType => {\n return {\n asset: parameters.asset.toLowerCase() as Address,\n lltv: LLTV.from(parameters.lltv),\n oracle: parameters.oracle.toLowerCase() as Address,\n };\n};\n\nexport declare namespace from {\n type Parameters = {\n asset: Address;\n lltv: LLTV.Options | bigint;\n oracle: Address;\n };\n type ReturnType = Collateral;\n}\n","import { type Address, isAddress, isHex } from \"viem\";\nimport * as z from \"zod\";\n\nexport const transformHex = (val: string, ctx: z.RefinementCtx) => {\n if (isHex(val)) return val;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"hex\",\n error: \"not a hex\",\n });\n\n return z.NEVER;\n};\n\nexport const transformAddress = (val: string, ctx: z.RefinementCtx) => {\n if (isAddress(val.toLowerCase())) return val.toLowerCase() as Address;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"address\",\n error: \"not a valid address\",\n });\n\n return z.NEVER;\n};\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\nexport type LLTV = bigint & Brand<\"LLTV\">;\n\nexport const Options = [0.385, 0.5, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965, 0.98] as const;\nexport type Options = (typeof Options)[number];\nconst LLTV_SCALED = Options.map((lltv) => BigInt(lltv * 10 ** 18));\n\n/**\n * Convert a LLTV option or a scaled LLTV to a LLTV.\n * @param lltv - The LLTV option or the scaled LLTV.\n * @returns The LLTV.\n */\nexport function from(lltv: Options | bigint): LLTV {\n if (typeof lltv === \"bigint\" && !LLTV_SCALED.includes(lltv)) throw new InvalidLLTVError(lltv);\n if (typeof lltv === \"bigint\") return lltv as LLTV;\n if (typeof lltv === \"number\" && !Options.includes(lltv)) throw new InvalidOptionError(lltv);\n return BigInt(lltv * 10 ** 18) as LLTV;\n}\n\nexport declare namespace from {\n type ErrorType = InvalidOptionError | InvalidLLTVError;\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidOptionError\";\n constructor(input: number) {\n super(\n `Invalid LLTV option. Input: \"${input}\". Accepted values are: ${Options.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidLLTVError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidLLTVError\";\n constructor(input: bigint) {\n super(\n `Invalid LLTV. Input: \"${input}\". Accepted values are: ${LLTV_SCALED.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport const LLTVSchema = z\n .bigint({ coerce: true })\n .refine(\n (lltv) => {\n try {\n from(lltv);\n return true;\n } catch (_) {\n return false;\n }\n },\n {\n error: () => {\n return \"Invalid LLTV: must be one of 0.385, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965 or 0.98 (scaled by 1e18)\";\n },\n },\n )\n .transform((lltv) => from(lltv));\n","import type { Address, Hex } from \"viem\";\nimport { CallbackType } from \"./Callback.ts\";\nimport type * as Offer from \"./Offer.ts\";\n\n/**\n * Represents a liquidity pool with a unique ID and amount.\n */\nexport type LiquidityPool = {\n id: string;\n amount: bigint;\n};\n\n/**\n * Represents a hierarchical relationship between two liquidity pools.\n */\nexport type LiquidityLink = {\n parentPoolId: string;\n childPoolId: string;\n priority: number;\n};\n\n/**\n * Represents the connection between an offer and its liquidity pools.\n */\nexport type OfferLiquidityPool = {\n offerHash: Offer.Offer[\"hash\"];\n poolId: string;\n /**\n * The available capacity/liquidity from this pool for this offer.\n * Meaning varies by pool type:\n * - BuyWithEmptyCallback: Matches allowance amount from pool bellow\n * - SellERC20Callback: Sell Callback/Predeposited -> Maximum debt capacity calculated from collateral (collateralAmount * oraclePrice * lltv)\n * - SellERC20Callback: Existing debt as negative value (reduces available capacity)\n */\n amount: bigint;\n};\n\n/**\n * Calculate maximum debt capacity from collateral amount.\n * @param amount - Collateral amount\n * @param oraclePrice - Oracle price (scaled to 36 decimals)\n * @param lltv - Loan-to-value ratio (scaled to 18 decimals)\n * @returns Maximum debt capacity\n */\nexport function calculateMaxDebt(amount: bigint, oraclePrice: bigint, lltv: bigint): bigint {\n const ORACLE_PRICE_SCALE = 10n ** 36n; // Oracle prices are scaled to 36 decimals\n const PRECISION = 10n ** 18n; // LLTV ratios are scaled to 18 decimals (1e18 = 100%)\n\n const collateralQuoted = (amount * oraclePrice) / ORACLE_PRICE_SCALE;\n const maxDebt = (collateralQuoted * lltv) / PRECISION;\n\n return maxDebt;\n}\n\n/**\n * Generate pool ID for balance pools.\n */\nexport function generateBalancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-balance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for allowance pools.\n */\nexport function generateAllowancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-allowance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for sell ERC20 callback pools.\n * Each offer has its own callback pool to prevent liquidity conflicts.\n */\nexport function generateSellERC20CallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, obligationId, token, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-${offerHash}-sell_erc20_callback`.toLowerCase();\n}\n\n/**\n * Generate pool ID for obligation collateral pools.\n * Obligation collateral pools represent collateral already deposited in the obligation.\n * These pools are shared across all offers with the same obligation.\n */\nexport function generateObligationCollateralPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n}): string {\n const { user, chainId, obligationId, token } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-obligation-collateral`.toLowerCase();\n}\n\n/**\n * Generate pool ID for buy vault callback pools.\n */\nexport function generateBuyVaultCallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, vault, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${vault}-${offerHash}-${CallbackType.BuyVaultV1Callback}`.toLowerCase();\n}\n\n/**\n * Generate pool ID for debt pools.\n */\nexport function generateDebtPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n}): string {\n const { user, chainId, obligationId } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-debt`.toLowerCase();\n}\n\n/**\n * Generate pool ID for user position in a vault.\n */\nexport function generateUserVaultPositionPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n}): string {\n const { user, chainId, vault } = parameters;\n return `${user}-${chainId.toString()}-${vault}-user-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for vault position in a market.\n */\nexport function generateVaultPositionPoolId(parameters: {\n vault: Address;\n chainId: bigint;\n marketId: string;\n}): string {\n const { vault, chainId, marketId } = parameters;\n return `${vault}-${chainId.toString()}-${marketId}-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for market total liquidity.\n */\nexport function generateMarketLiquidityPoolId(parameters: {\n chainId: bigint;\n marketId: string;\n}): string {\n const { chainId, marketId } = parameters;\n return `${chainId.toString()}-${marketId}-market-liquidity`.toLowerCase();\n}\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\n/**\n * Maturity is a number that represents a date in seconds.\n */\nexport type Maturity = number & Brand<\"Maturity\">;\n\nexport const MaturitySchema = z\n .number()\n .int()\n .refine(\n (maturity) => {\n try {\n from(maturity);\n return true;\n } catch (_e) {\n return false;\n }\n },\n {\n error: (issue) => {\n try {\n const maturityDate = new Date((issue.input as number) * 1000);\n return `The maturity is set to ${maturityDate}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n } catch (_) {\n return `The maturity is set to ${issue.input}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n }\n },\n },\n )\n .transform((maturity) => maturity as Maturity);\n\nconst MaturityOptions = {\n end_of_week: () => endOfWeek(),\n end_of_next_week: () => endOfNextWeek(),\n end_of_month: () => endOfMonth(),\n end_of_next_month: () => endOfNextMonth(),\n end_of_quarter: () => endOfQuarter(),\n end_of_next_quarter: () => endOfNextQuarter(),\n} as const;\n\nexport type MaturityOptions = keyof typeof MaturityOptions;\n\n/**\n * Creates a maturity from a timestamp in seconds or a maturity option.\n * @throws {InvalidFormatError} If the maturity is in milliseconds.\n * @throws {InvalidDateError} If the maturity is in seconds but not a valid date.\n * @throws {InvalidOptionError} If the maturity is not a valid option.\n */\nexport function from(ts: from.Parameters): Maturity {\n if (typeof ts === \"string\") {\n if (ts in MaturityOptions) return MaturityOptions[ts]();\n throw new InvalidOptionError(ts);\n }\n\n if (typeof ts === \"number\" && ts > 1e12) throw new InvalidFormatError();\n\n if (!Object.values(MaturityOptions).some((option) => option() === ts))\n throw new InvalidDateError(ts);\n\n return ts as Maturity;\n}\n\nexport declare namespace from {\n type Parameters = number | MaturityOptions;\n type ErrorType = InvalidFormatError | InvalidDateError | InvalidOptionError;\n}\n\n/** Returns the end of the current week (friday at 15:00:00 UTC) */\nconst endOfWeek = (): Maturity => fridayOfWeek(0);\n\n/** Returns the end of the next week (friday at 15:00:00 UTC) */\nconst endOfNextWeek = (): Maturity => fridayOfWeek(1);\n\n/** Returns the end of the current month (last friday of the month at 15:00:00 UTC) */\nconst endOfMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth());\n\n/** Returns the end of the next month (last friday of the next month at 15:00:00 UTC) */\nconst endOfNextMonth = (): Maturity =>\n lastFridayOfMonth(new Date().getUTCFullYear(), new Date().getUTCMonth() + 1);\n\n/** Returns the end of the current quarter (last friday of the quarter at 15:00:00 UTC) */\nconst endOfQuarter = (): Maturity => lastFridayOfQuarter(0);\n\n/** Returns the end of the next quarter (last friday of the next quarter at 15:00:00 UTC) */\nconst endOfNextQuarter = (): Maturity => lastFridayOfQuarter(1);\n\nconst fridayOfWeek = (weeksAhead = 0): Maturity => {\n const now = new Date();\n const today15H = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 15),\n );\n\n // Days until next Friday (5). Always non-negative in [0,6]\n let daysUntilFriday = (5 - today15H.getUTCDay() + 7) % 7;\n\n // If it's Friday and we're already past 15:00 UTC, roll to next Friday\n if (daysUntilFriday === 0 && now.getTime() >= today15H.getTime()) {\n daysUntilFriday = 7;\n }\n\n const friday = new Date(today15H);\n friday.setUTCDate(friday.getUTCDate() + daysUntilFriday + weeksAhead * 7);\n return (friday.getTime() / 1000) as Maturity;\n};\n\nconst lastFridayOfMonth = (year: number, month: number): Maturity => {\n const lastDayOfMonth15H = new Date(Date.UTC(year, month + 1, 0, 15));\n\n while (lastDayOfMonth15H.getUTCDay() !== 5) {\n lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate() - 1);\n }\n\n const maturity = lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate()) / 1000;\n\n return maturity as Maturity;\n};\n\nconst lastFridayOfQuarter = (quartersAhead = 0): Maturity => {\n const now = new Date();\n const quarterIndex = Math.floor(now.getUTCMonth() / 3) + quartersAhead;\n const year = now.getUTCFullYear() + Math.floor(quarterIndex / 4);\n const quarter = quarterIndex % 4;\n const lastMonth = quarter * 3 + 2; // 0-based\n return lastFridayOfMonth(year, lastMonth);\n};\n\nexport class InvalidFormatError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidFormatError\";\n constructor() {\n super(\"Invalid maturity format. Maturity should be expressed in seconds.\");\n }\n}\n\nexport class InvalidDateError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidDateError\";\n constructor(input: number) {\n super(\n `Invalid maturity date. Input: \"${input}\". Accepted values are: ${Object.values(\n MaturityOptions,\n )\n .map((option) => `\"${option()}\"`)\n .join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidOptionError\";\n constructor(input: string) {\n super(\n `Invalid maturity option. Input: \"${input}\". Accepted values are: ${Object.keys(\n MaturityOptions,\n )\n .map((option) => `\"${option}\"`)\n .join(\", \")}.`,\n );\n }\n}\n","import { type Address, encodeAbiParameters, type Hex, keccak256, maxUint256 } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport type * as Chain from \"./Chain.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as Maturity from \"./Maturity.ts\";\n\nexport type Obligation = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n collaterals: Collateral.Collateral[];\n /** The maturity of the obligation. */\n maturity: Maturity.Maturity;\n};\n\nexport const ObligationSchema = z.object({\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n maturity: Maturity.MaturitySchema,\n});\n\n/**\n * Creates an obligation from the given parameters.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created obligation. {@link Obligation}\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n *\n * @example\n * ```ts\n * const obligation = Obligation.from({\n * chainId: 1n,\n * loanToken: privateKeyToAccount(generatePrivateKey()).address,\n * collaterals: [\n * Collateral.from({\n * asset: privateKeyToAccount(generatePrivateKey()).address,\n * oracle: privateKeyToAccount(generatePrivateKey()).address,\n * lltv: 0.965\n * }),\n * ],\n * maturity: Maturity.from(\"end_of_next_quarter\"),\n * });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedObligation = ObligationSchema.parse({\n ...parameters,\n maturity: Maturity.from(parameters.maturity),\n });\n\n return {\n chainId: parsedObligation.chainId,\n loanToken: parsedObligation.loanToken.toLowerCase() as Address,\n collaterals: parsedObligation.collaterals.sort((a, b) => a.asset.localeCompare(b.asset)),\n maturity: parsedObligation.maturity,\n };\n } catch (error: unknown) {\n throw new InvalidObligationError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. Must be sorted alphabetically by address. */\n collaterals: Collateral.from.Parameters[] | readonly Collateral.from.Parameters[];\n /** The maturity of the obligation. */\n maturity: Maturity.from.Parameters;\n };\n\n type ReturnType = Obligation;\n\n export type ErrorType = InvalidObligationError;\n}\n\n/**\n * Creates an obligation from a snake case object.\n * @throws If the obligation is invalid. {@link fromSnakeCase.ErrorType}\n * @param input - {@link fromSnakeCase.Parameters}\n * @returns The created obligation. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(input: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Obligation>(input));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Obligation>;\n type ReturnType = Obligation;\n type ErrorType = InvalidObligationError;\n}\n\n/**\n * Calculates the obligation id based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals, maturity)).\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n * @param obligation - {@link id.Parameters}\n * @returns The obligation id as a 32-byte hex string. {@link id.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * const id = Obligation.id(obligation);\n * console.log(id); // 0x1234567890123456789012345678901234567890123456789012345678901234\n * ```\n */\nexport function id(obligation: id.Parameters): id.ReturnType {\n let lastAsset = \"\";\n for (const collateral of obligation.collaterals) {\n const newAsset = collateral.asset.toLowerCase();\n if (newAsset.localeCompare(lastAsset) < 0) throw new CollateralsAreNotSortedError();\n lastAsset = newAsset;\n }\n\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"uint256\" },\n { type: \"address\" },\n {\n type: \"tuple[]\",\n components: [\n { type: \"address\", name: \"token\" },\n { type: \"uint256\", name: \"lltv\" },\n { type: \"address\", name: \"oracle\" },\n ],\n },\n { type: \"uint256\" },\n ],\n [\n obligation.chainId,\n obligation.loanToken.toLowerCase() as Address,\n obligation.collaterals.map((c) => ({\n token: c.asset.toLowerCase() as Address,\n lltv: c.lltv,\n oracle: c.oracle.toLowerCase() as Address,\n })),\n BigInt(obligation.maturity),\n ],\n ),\n );\n}\n\nexport declare namespace id {\n type Parameters = Obligation;\n type ReturnType = Hex;\n type ErrorType = CollateralsAreNotSortedError;\n}\n\n/**\n * Generates a random obligation.\n * @returns A randomly generated obligation. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n chainId: 1n,\n loanToken: privateKeyToAccount(generatePrivateKey()).address,\n collaterals: [\n Collateral.from({\n asset: privateKeyToAccount(generatePrivateKey()).address,\n oracle: privateKeyToAccount(generatePrivateKey()).address,\n lltv: 0.965,\n }),\n ],\n maturity: Maturity.from(\"end_of_next_quarter\"),\n });\n}\n\nexport declare namespace random {\n type ReturnType = Obligation;\n}\n\nexport class InvalidObligationError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Obligation.InvalidObligationError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid obligation.\", { cause: error });\n }\n}\n\nexport class CollateralsAreNotSortedError extends Errors.BaseError {\n override readonly name = \"Obligation.CollateralsAreNotSortedError\";\n constructor() {\n super(\"Collaterals are not sorted alphabetically by address.\");\n }\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** The snake case representation of a type with bigint values stringified. */\nexport type Snake<T> = SnakeKeys<StringifiedBigint<T>>;\n\n/** Stringifies bigint values to strings and preserves branded primitives. */\ntype StringifiedBigint<T> =\n // non-distributive check so that `bigint & Brand<...>` is still caught here\n [T] extends [bigint]\n ? string\n : // Preserve branded primitives by matching the primitive first.\n T extends number\n ? T\n : T extends string\n ? T\n : T extends boolean\n ? T\n : T extends symbol\n ? T\n : T extends null | undefined\n ? T\n : T extends readonly (infer U)[]\n ? readonly StringifiedBigint<U>[]\n : T extends object\n ? { [K in keyof T]: StringifiedBigint<T[K]> }\n : T;\n\n/** Key remapping that also preserves branded primitives. */\ntype SnakeKeys<T> = T extends readonly (infer U)[]\n ? readonly SnakeKeys<U>[]\n : T extends number | string | boolean | symbol | null | undefined\n ? T\n : T extends object\n ? { [K in keyof T as ToSnakeCase<Extract<K, string>>]: SnakeKeys<T[K]> }\n : T;\n\ntype ToSnakeCase<S extends string> = S extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? `${Lowercase<Head>}${ToSnakeCase<Tail>}`\n : `${Lowercase<Head>}_${ToSnakeCase<Uncapitalize<Tail>>}`\n : S;\n\n/**\n * Formats object keys to snake case.\n * Preserves ethereum addresses as is.\n * Converts ethereum addresses to checksummed if used as values.\n * Stringifies bigint values to strings.\n */\nexport function toSnakeCase<T>(obj: T): Snake<T> {\n return stringifyBigint(\n processObject(\n obj,\n (s: string) => s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase())\n ? getAddress(value.toLowerCase())\n : value,\n ),\n ) as Snake<T>;\n}\n\n/**\n * Formats a snake case object to its camel case type.\n * Preserves ethereum addresses as is.\n * Converts checksummed ethereum addresses to lowercase if used as values.\n * @warning Does not unstringify bigint values.\n */\nexport function fromSnakeCase<T>(obj: Snake<T>): T {\n return processObject(\n obj,\n (s: string) =>\n isAddress(s.toLowerCase()) ? s : s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase()) ? value.toLowerCase() : value,\n ) as T;\n}\n\nfunction processObject<T>(\n obj: T,\n fnKey: (str: string) => string,\n fnValue: (value: unknown) => unknown,\n): unknown {\n if (typeof obj !== \"object\" || obj === null) return obj;\n\n if (Array.isArray(obj)) return obj.map((item) => processObject(item, fnKey, fnValue));\n\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc, [key, value]) => {\n const newKey = fnKey(key);\n acc[newKey] =\n typeof value === \"object\" && value !== null\n ? processObject(value, fnKey, fnValue)\n : fnValue(value);\n\n return acc;\n },\n {} as Record<string, unknown>,\n );\n}\n\nfunction stringifyBigint<T>(value: T): StringifiedBigint<T> {\n if (typeof value === \"bigint\") return value.toString() as StringifiedBigint<T>;\n if (Array.isArray(value)) return value.map(stringifyBigint) as StringifiedBigint<T>;\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = stringifyBigint(v);\n }\n return out as StringifiedBigint<T>;\n }\n\n return value as StringifiedBigint<T>;\n}\n","import {\n type Address,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n encodeAbiParameters,\n type Hex,\n hashTypedData,\n maxUint256,\n type WalletClient,\n zeroAddress,\n} from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { Time } from \"#utils/index.ts\";\nimport { transformAddress, transformHex } from \"#utils/zod.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as LLTV from \"./LLTV.ts\";\nimport * as Maturity from \"./Maturity.ts\";\nimport * as Obligation from \"./Obligation.ts\";\n\nexport type Offer = {\n /** The address that made the offer. */\n readonly offering: Address;\n /** The amount of assets offered. */\n readonly assets: bigint;\n /** The interest rate (with 18 decimals). */\n readonly rate: bigint;\n /** The date at which all interests will be paid. */\n readonly maturity: Maturity.Maturity;\n /** The date at which the offer will expire. */\n readonly expiry: number;\n /** The date at which the offer will start. */\n readonly start: number;\n /** The nonce. Used for OCO (One-Cancelled-Other) mechanism. */\n readonly nonce: bigint;\n /** The side of the offer. `true` for buy, `false` for sell. */\n readonly buy: boolean;\n /** The chain id where the liquidity for this offer is located. */\n readonly chainId: bigint;\n /** The token that is being borrowed. */\n readonly loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n readonly collaterals: readonly Collateral.Collateral[];\n /** The optional callback data to retrieve the maker funds. */\n readonly callback: {\n readonly address: Address;\n readonly data: Hex;\n readonly gasLimit: bigint;\n };\n /** The amount of assets consumed from the offer. */\n consumed: bigint;\n /** The hash of the offer. */\n readonly hash: Hex;\n /** The block number at which the offer was created. */\n readonly blockNumber: number;\n /** The signature of the offer. */\n signature?: Hex;\n};\n\nexport const OfferHashSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]{64}$/, {\n message: \"Hash must be a valid 32-byte hex string\",\n })\n .transform(transformHex);\n\nexport const OfferSchema = (parameters?: { omitHash?: boolean }) => {\n const { omitHash = false } = parameters || {};\n const now = Time.now();\n\n let base = z.object({\n offering: z.string().transform(transformAddress),\n assets: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n maturity: Maturity.MaturitySchema,\n expiry: z\n .number()\n .int()\n .min(now, { message: \"Expiry must be set to a future date\" })\n .max(Number.MAX_SAFE_INTEGER),\n start: z.number().int().max(Number.MAX_SAFE_INTEGER),\n nonce: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n buy: z.boolean(),\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n callback: z.object({\n address: z.string().transform(transformAddress),\n data: z.string().transform(transformHex),\n gasLimit: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n blockNumber: z.number().int().max(Number.MAX_SAFE_INTEGER),\n signature: z\n .string()\n .regex(/^0x[0-9a-fA-F]{130}$/, {\n message: \"Signature must be a valid 65-byte hex string\",\n })\n .transform(transformHex)\n .optional(),\n });\n\n if (!omitHash) base = base.extend({ hash: OfferHashSchema });\n\n return base\n .refine((data) => data.start < data.expiry, {\n message: \"Start must be before expiry\",\n path: [\"start\"],\n })\n .refine((data) => data.expiry <= data.maturity, {\n message: \"Expiry cannot be after maturity\",\n path: [\"expiry\"],\n });\n};\n\n/**\n * Creates an offer from a plain object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function from(input: Omit<Offer, \"hash\">): Offer {\n try {\n const parsedOffer = OfferSchema({ omitHash: true }).parse(input);\n const parsedHash = OfferHashSchema.parse(hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidOfferError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidOfferError;\n}\n\n/**\n * Creates an offer from a snake case object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<Offer, \"hash\">>): Offer {\n return from(Format.fromSnakeCase<Omit<Offer, \"hash\">>(input));\n}\n\n/**\n * Converts an offer to a snake case object.\n * @param offer - The offer to convert.\n * @returns The converted offer.\n */\nexport function toSnakeCase(offer: Offer): Format.Snake<Offer> {\n return Format.toSnakeCase(offer);\n}\n\n/**\n * Generates a random Offer.\n * The returned Offer contains randomly generated values for most fields, such as assets, rate, nonce, and buy flag.\n * Some fields use fixed or deterministic values (e.g., chainId, collaterals, callback).\n * @warning The generated Offer should not be used for production usage.\n * @returns {Offer} A randomly generated Offer object.\n */\nexport function random(): Offer {\n const loanToken = privateKeyToAccount(generatePrivateKey()).address;\n\n const maturity = Maturity.from(\"end_of_month\");\n const expiry = Maturity.from(\"end_of_week\") - 1;\n const lltv = LLTV.from(0.965);\n const offer = from({\n offering: privateKeyToAccount(generatePrivateKey()).address,\n assets: BigInt(Math.floor(Math.random() * 1000000)),\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n maturity,\n expiry: expiry,\n start: expiry - 10,\n nonce: BigInt(Math.floor(Math.random() * 1000000)),\n buy: Math.random() > 0.5,\n chainId: 1n,\n loanToken,\n collaterals: [\n Collateral.from({\n asset: zeroAddress,\n oracle: zeroAddress,\n lltv,\n }),\n ],\n callback: {\n address: zeroAddress,\n data: \"0x\",\n gasLimit: 0n,\n },\n consumed: 0n,\n blockNumber: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n });\n\n return offer;\n}\n\n/**\n * Creates an EIP-712 domain object.\n * @param chainId - The chain ID.\n * @returns The EIP-712 domain object.\n */\nexport const domain = (chainId: bigint) => ({\n chainId,\n verifyingContract: zeroAddress,\n});\n\n/**\n * The EIP-712 types for the offer.\n * @warning The ordering of the types should NEVER be changed. The offer hash is computed based on the order of the types.\n * @returns The EIP-712 types.\n */\nexport const types = {\n EIP712Domain: [\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Offer: [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"collaterals\", type: \"Collateral[]\" },\n { name: \"callback\", type: \"Callback\" },\n ],\n Collateral: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n Callback: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Signs an offer.\n * @throws {Error} If the wallet account is not set.\n * @param offer - The offer to sign.\n * @param wallet - The wallet to sign the offer with.\n * @returns The signed offer.\n */\nexport function sign(offer: Offer, wallet: WalletClient): Promise<Hex> {\n if (!wallet.account) throw new AccountNotSetError();\n return wallet.signTypedData({\n account: wallet.account,\n domain: domain(offer.chainId),\n types,\n primaryType: \"Offer\",\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n });\n}\n\nexport function hash(offer: Omit<Offer, \"hash\">): Hex {\n return hashTypedData({\n domain: domain(offer.chainId),\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n primaryType: \"Offer\",\n types,\n });\n}\n\n/**\n * Calculates the obligation id for an offer based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals (sorted by token address), maturity)).\n * @param offer - The offer to calculate the obligation id for.\n * @returns The obligation id as a 32-byte hex string.\n */\nexport function obligationId(offer: Offer): Hex {\n return Obligation.id(\n Obligation.from({\n chainId: offer.chainId,\n loanToken: offer.loanToken,\n collaterals: offer.collaterals as Collateral.Collateral[],\n maturity: offer.maturity,\n }),\n );\n}\n\nconst OfferAbi = [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"start\", type: \"uint256\" },\n {\n name: \"collaterals\",\n type: \"tuple[]\",\n components: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n },\n {\n name: \"callback\",\n type: \"tuple\",\n components: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n },\n { name: \"signature\", type: \"bytes\" },\n] as const;\n\nexport function encode(offer: Offer) {\n return encodeAbiParameters(OfferAbi, [\n offer.offering,\n offer.assets,\n offer.rate,\n BigInt(offer.maturity),\n BigInt(offer.expiry),\n offer.nonce,\n offer.buy,\n offer.chainId,\n offer.loanToken,\n BigInt(offer.start),\n offer.collaterals,\n offer.callback,\n offer.signature ?? \"0x\",\n ]);\n}\n\nexport function decode(data: Hex, blockNumber: number | bigint): Offer {\n let decoded: DecodeAbiParametersReturnType<typeof OfferAbi>;\n try {\n decoded = decodeAbiParameters(OfferAbi, data);\n } catch (error) {\n throw new InvalidOfferError(error as Error);\n }\n\n const offer = from({\n offering: decoded[0],\n assets: decoded[1],\n rate: decoded[2],\n maturity: Maturity.from(Number(decoded[3])),\n expiry: Number(decoded[4]),\n nonce: decoded[5],\n buy: decoded[6],\n chainId: decoded[7],\n loanToken: decoded[8],\n start: Number(decoded[9]),\n collaterals: decoded[10].map((c) => {\n return Collateral.from({\n asset: c.asset,\n oracle: c.oracle,\n lltv: c.lltv,\n });\n }),\n callback: {\n address: decoded[11].address,\n data: decoded[11].data,\n gasLimit: decoded[11].gasLimit,\n },\n consumed: 0n,\n blockNumber: Number(blockNumber),\n ...(decoded[12] === \"0x\" ? {} : { signature: decoded[12] }),\n });\n\n return offer;\n}\n\nexport type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\n blockNumber: number;\n};\n\n/**\n * ABI for the Consumed event emitted by the Obligation 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\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 blockNumber: Number(blockNumber),\n };\n}\n\nexport class InvalidOfferError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Offer.InvalidOfferError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid offer.\", { cause: error });\n }\n}\n\nexport class AccountNotSetError extends Errors.BaseError {\n override readonly name = \"Offer.AccountNotSetError\";\n constructor() {\n super(\"Account not set.\");\n }\n}\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import type { PublicActions } from \"viem\";\nimport { batch } from \"#utils/batch.ts\";\nimport { retry } from \"#utils/retry.ts\";\n\n/**\n * Helper function to execute multicall in batches with retry logic.\n * Abstracts the common pattern of batching calls, retrying, and collecting results.\n *\n * @param parameters - Configuration for batched multicall\n * @returns Promise resolving to flattened array of results\n */\nexport async function batchMulticall<TResult>(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n calls: unknown[];\n batchSize: number;\n retryAttempts: number;\n retryDelayMs: number;\n blockNumber?: bigint;\n}): Promise<TResult[]> {\n const { client, calls, batchSize, retryAttempts, retryDelayMs, blockNumber } = parameters;\n const results: TResult[] = [];\n\n for (const callsBatch of batch(calls, batchSize)) {\n const batchResults = await retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: callsBatch as any,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n results.push(...(batchResults as TResult[]));\n }\n\n return results;\n}\n","/**\n * Transform a polling function into an async generator.\n * @param fn - The polling function to transform.\n * @returns An async generator.\n */\nexport function lazy<T>(\n pollFn: (emit: (value: T) => void, { stop }: { stop: () => void }) => () => boolean,\n) {\n return () =>\n (async function* () {\n let active = true;\n let resolveNext: (() => void) | null = null;\n const queue: T[] = [];\n\n const wait = () =>\n new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n\n const emit = (item: T) => {\n queue.push(item);\n resolveNext?.();\n resolveNext = null;\n };\n\n let unpoll: (() => boolean) | null = null;\n const stop = () => {\n active = false;\n // stop the poller immediately if we already have it\n unpoll?.();\n resolveNext?.();\n resolveNext = null;\n };\n\n unpoll = pollFn(emit, { stop });\n\n try {\n while (active) {\n if (queue.length === 0) await wait();\n while (queue.length > 0 && active) yield queue.shift()!;\n }\n } finally {\n stop();\n }\n })();\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export function now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function max(): number {\n return 8640000000000000000;\n}\n","import { type Hex, maxUint256 } from \"viem\";\nimport * as z from \"zod\";\nimport { Obligation } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformHex } from \"#utils/zod.ts\";\n\nexport type Quote = {\n /** The obligation id. */\n obligationId: Hex;\n ask: {\n /** The highest interest rate the seller will accept to pay for the obligation. (18 decimals). */\n rate: bigint;\n };\n bid: {\n /** The lowest interest rate a buyer is willing to be paid for the obligation. (18 decimals). */\n rate: bigint;\n };\n};\n\nexport const QuoteSchema = z.object({\n obligationId: z.string().transform(transformHex),\n ask: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n bid: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n});\n\n/**\n * Creates a quote for a given obligation.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created quote. {@link Quote}\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n *\n * @example\n * ```ts\n * const quote = Quote.from({ obligationId: \"0x123\", ask: { assets: 100n, rate: 100n }, bid: { assets: 100n, rate: 100n } });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedQuote = QuoteSchema.parse(parameters);\n return {\n obligationId: parsedQuote.obligationId,\n ask: parsedQuote.ask,\n bid: parsedQuote.bid,\n };\n } catch (error: unknown) {\n throw new InvalidQuoteError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = Quote;\n type ReturnType = Quote;\n type ErrorType = InvalidQuoteError;\n}\n\n/**\n * Creates a quote from a snake case object.\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n * @param snake - {@link fromSnakeCase.Parameters}\n * @returns The created quote. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(snake: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Quote>(snake));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Quote>;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\n/**\n * Generates a random quote.\n * @returns A randomly generated quote. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const quote = Quote.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n obligationId: Obligation.id(Obligation.random()),\n ask: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n bid: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n });\n}\n\nexport declare namespace random {\n type Parameters = never;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\nexport class InvalidQuoteError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Quote.InvalidQuoteError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid quote.\", { cause: error });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createMemoryClient, tevmCall, tevmSetAccount } from \"tevm\";\nimport { mainnet } from \"tevm/common\";\nimport {\n type Account,\n type Address,\n concatHex,\n decodeFunctionResult,\n encodeFunctionData,\n type Hex,\n keccak256,\n pad,\n parseEther,\n toHex,\n type WalletClient,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { Chain } from \"#core\";\n\nexport const users: Account[] = [\n privateKeyToAccount(\n // first anvil account private key\n \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\",\n ),\n];\n\nexport const assetList = [\"USDC\", \"DAI\"] as const;\nexport const mockAddress = (asset: (typeof assetList)[number]) => {\n return privateKeyToAccount(keccak256(toHex(asset))).address;\n};\n\nexport const mockOracleAddress = privateKeyToAccount(keccak256(toHex(\"ORACLE\"))).address;\nexport const mockMorphoAddress = privateKeyToAccount(keccak256(toHex(\"MORPHO\"))).address;\nexport const mockFactoryAddress = privateKeyToAccount(keccak256(toHex(\"FACTORY\"))).address;\n\nexport const encodeConsumedEvent = (parameters: {\n user: Address;\n nonce: bigint;\n amount: bigint;\n}) => {\n return encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"consume\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n },\n ],\n functionName: \"consume\",\n args: [parameters.user, parameters.nonce, parameters.amount],\n });\n};\n\nexport const assetMethods = [\"balanceOf\", \"allowance\"] as const;\nexport const oracleMethods = [\"price\"] as const;\nexport const morphoMethods = [\"debtOf\", \"collateralOf\", \"market\", \"position\"] as const;\nexport const vaultMethods = [\n \"asset\",\n \"balanceOf\",\n \"totalSupply\",\n \"totalAssets\",\n \"withdrawQueue\",\n] as const;\n\nexport const factoryMethods = [\"isMetaMorpho\", \"morpho\"] as const;\n\nexport type AssetMethod = (typeof assetMethods)[number];\nexport type OracleMethod = (typeof oracleMethods)[number];\nexport type MorphoMethod = (typeof morphoMethods)[number];\nexport type VaultMethod = (typeof vaultMethods)[number];\nexport type FactoryMethod = (typeof factoryMethods)[number];\n\nexport type MethodParameters = {\n balanceOf: { address: Address; value: bigint };\n allowance: { owner: Address; spender: Address; value: bigint };\n};\n\nexport type OracleMethodParameters = {\n price: { value: bigint };\n};\n\nexport type MorphoMethodParameters = {\n debtOf: { user: Address; obligationId: Hex; value: bigint };\n collateralOf: { user: Address; obligationId: Hex; collateralAsset: Address; value: bigint };\n market: {\n marketId: Hex;\n totalSupplyAssets: bigint;\n totalSupplyShares: bigint;\n totalBorrowAssets: bigint;\n totalBorrowShares: bigint;\n lastUpdate: bigint;\n fee: bigint;\n };\n position: {\n marketId: Hex;\n user: Address;\n supplyShares: bigint;\n borrowShares: bigint;\n collateral: bigint;\n };\n};\n\nexport type VaultMethodParameters = {\n asset: { value: Address };\n balanceOf: { user: Address; value: bigint };\n totalSupply: { value: bigint };\n totalAssets: { value: bigint };\n withdrawQueue: { value: Hex[] };\n};\n\nexport type FactoryMethodParameters = {\n isMetaMorpho: { vault: Address; value: boolean };\n morpho: { value: Address };\n};\n\nexport type MockedAsset = {\n address: Address;\n set: (\n slot: Hex | AssetMethod,\n parameters: Hex | bigint | MethodParameters[AssetMethod],\n ) => Promise<void>;\n};\n\nexport type MockedOracle = {\n address: Address;\n set: (method: OracleMethod, parameters: OracleMethodParameters[OracleMethod]) => Promise<void>;\n};\n\nexport type MockedMorpho = {\n address: Address;\n set: (method: MorphoMethod, parameters: MorphoMethodParameters[MorphoMethod]) => Promise<void>;\n};\n\nexport type MockedVault = {\n address: Address;\n set: (method: VaultMethod, parameters: VaultMethodParameters[VaultMethod]) => Promise<void>;\n};\n\nexport type MockedFactory = {\n address: Address;\n set: (method: FactoryMethod, parameters: FactoryMethodParameters[FactoryMethod]) => Promise<void>;\n};\n\nexport type Mocked = {\n name: string;\n client: WalletClient;\n mempoolAddress: Address;\n termsAddress: Address;\n mine: () => Promise<void>;\n reset: () => Promise<void>;\n deployVault: () => Promise<MockedVault>;\n oracle: MockedOracle;\n morpho: MockedMorpho;\n factory: MockedFactory;\n} & Record<(typeof assetList)[number], MockedAsset>;\n\nexport async function mock(name: string): Promise<Mocked> {\n const client = createMemoryClient({\n account: users[0],\n common: mainnet,\n miningConfig: {\n // makes tests deterministic by forcing to call mine() manually\n type: \"manual\",\n },\n // makes tests faster by only waiting 50ms to fetch the current state\n pollingInterval: 50,\n });\n\n await client.tevmReady();\n\n const mine = async () => {\n await client.mine({ blocks: 1 });\n };\n\n // contract address -> slot -> value\n const globalState: Record<Address, Record<Hex, Hex>> = {};\n\n // deploy mempool contract\n const { createdAddress: mempoolAddress } = (await tevmCall(client, {\n data: fs.readFileSync(path.join(__dirname, \"bytecode\", \"mempool.txt\"), \"utf8\") as Hex,\n addToBlockchain: true,\n })) as { createdAddress?: Address };\n\n if (!mempoolAddress) throw new Error(\"Failed to deploy mempool contract\");\n\n // deploy terms contract\n const { createdAddress: termsAddress } = (await tevmCall(client, {\n data: fs.readFileSync(path.join(__dirname, \"bytecode\", \"terms.txt\"), \"utf8\") as Hex,\n addToBlockchain: true,\n })) as { createdAddress?: Address };\n\n if (!termsAddress) throw new Error(\"Failed to deploy terms contract\");\n\n await Promise.all(\n users.map((u) =>\n tevmSetAccount(client, {\n address: u.address,\n balance: parseEther(\"100\"),\n }),\n ),\n );\n\n await Promise.all(\n assetList.map((a) => {\n const bytecode = fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"erc20.txt\"),\n \"utf8\",\n ) as Hex;\n return tevmSetAccount(client, {\n address: mockAddress(a),\n deployedBytecode: bytecode,\n });\n }),\n );\n\n const setAccount = async ({ address, state }: { address: Address; state: Record<Hex, Hex> }) => {\n const previousState = globalState[address] ?? {};\n globalState[address] = { ...previousState, ...state };\n\n await tevmSetAccount(client, {\n address,\n state: globalState[address],\n });\n };\n\n const translate = (\n patch: Record<Hex | AssetMethod, Hex | bigint | MethodParameters[AssetMethod]>,\n ): Record<Hex, Hex> => {\n return Object.fromEntries(\n Object.entries(patch).map(([k, v]) => {\n if (typeof k === \"string\" && k.startsWith(\"0x\")) {\n if (typeof v !== \"bigint\" && typeof v !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n return [k, typeof v === \"bigint\" ? toHex(v) : v];\n }\n\n return stateFromAssetMethod(k as AssetMethod, v as MethodParameters[AssetMethod]);\n }),\n );\n };\n\n const stateFromAssetMethod = (\n method: AssetMethod,\n parameters: MethodParameters[AssetMethod],\n ): [Hex, Hex] => {\n if (method === \"balanceOf\") {\n const { address: key, value } = parameters as MethodParameters[\"balanceOf\"];\n const slot = 9; // erc20 balanceOf slot in usdc implementation\n return [\n keccak256(concatHex([pad(key, { size: 32 }), pad(toHex(slot), { size: 32 })])),\n toHex(value),\n ];\n }\n\n if (method === \"allowance\") {\n const { owner: key, spender: key2, value } = parameters as MethodParameters[\"allowance\"];\n const slot = 10; // erc20 allowance slot in usdc implementation\n const outer = keccak256(concatHex([pad(key, { size: 32 }), pad(toHex(slot), { size: 32 })]));\n // second hash spender + outerHash\n const inner = keccak256(concatHex([pad(key2, { size: 32 }), pad(outer, { size: 32 })]));\n\n return [inner, toHex(value)];\n }\n\n return [\"0x0\", \"0x0\"];\n };\n\n const mockedAssets = Object.fromEntries(\n assetList.map((name) => [\n name,\n {\n address: mockAddress(name),\n set: async (\n slot: Hex | AssetMethod,\n parameters: Hex | bigint | MethodParameters[AssetMethod],\n ) => {\n const patch = { [slot]: parameters };\n\n await setAccount({\n address: mockAddress(name),\n state: translate(\n patch as Record<Hex | AssetMethod, Hex | bigint | MethodParameters[AssetMethod]>,\n ),\n });\n },\n },\n ]),\n ) as Record<(typeof assetList)[number], MockedAsset>;\n\n /**\n * Smart contract structures behind the bytecode:\n *\n * Oracle Contract:\n * - Stores a single price value\n * - price(): Returns the current price (uint256)\n * - setPrice(uint256): Updates the stored price\n *\n * Morpho Contract:\n * - Manages user debt and collateral positions, markets, and vault positions\n * - debtOf[user][termId]: User's debt amount for a specific term\n * - collateralOf[user][termId][asset]: User's collateral amount for a specific term and asset\n * - markets[marketId]: Market data including supply/borrow assets and shares\n * - positions[marketId][user]: User's position in a market (supply shares, borrow shares, collateral)\n * - setDebtOf(address, bytes32, uint256): Updates user's debt position\n * - setCollateralOf(address, bytes32, address, uint256): Updates user's collateral position\n * - setMarket(bytes32, uint128, uint128, uint128, uint128, uint128, uint128): Updates market data\n * - setPosition(bytes32, address, uint256, uint128, uint128): Updates user's position in a market\n */\n await Promise.all([\n tevmSetAccount(client, {\n address: mockOracleAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"oracle.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n tevmSetAccount(client, {\n address: mockMorphoAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"morpho.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n tevmSetAccount(client, {\n address: mockFactoryAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"factory.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n ]);\n\n const mockedOracle: MockedOracle = {\n address: mockOracleAddress,\n set: async (method: OracleMethod, parameters: OracleMethodParameters[OracleMethod]) => {\n if (method === \"price\") {\n const { value } = parameters as OracleMethodParameters[\"price\"];\n await tevmCall(client, {\n to: mockOracleAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setPrice\",\n inputs: [{ name: \"newPrice\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setPrice\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n const mockedMorpho: MockedMorpho = {\n address: mockMorphoAddress,\n set: async (method: MorphoMethod, parameters: MorphoMethodParameters[MorphoMethod]) => {\n if (method === \"debtOf\") {\n const { user, obligationId, value } = parameters as MorphoMethodParameters[\"debtOf\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setDebtOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"termId\", type: \"bytes32\" },\n { name: \"debt\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setDebtOf\",\n args: [user, obligationId, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"collateralOf\") {\n const { user, obligationId, collateralAsset, value } =\n parameters as MorphoMethodParameters[\"collateralOf\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setCollateralOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"termId\", type: \"bytes32\" },\n { name: \"collateralAsset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setCollateralOf\",\n args: [user, obligationId, collateralAsset, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"market\") {\n const {\n marketId,\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n totalBorrowShares,\n lastUpdate,\n fee,\n } = parameters as MorphoMethodParameters[\"market\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setMarket\",\n inputs: [\n { name: \"id\", type: \"bytes32\" },\n { name: \"totalSupplyAssets\", type: \"uint128\" },\n { name: \"totalSupplyShares\", type: \"uint128\" },\n { name: \"totalBorrowAssets\", type: \"uint128\" },\n { name: \"totalBorrowShares\", type: \"uint128\" },\n { name: \"lastUpdate\", type: \"uint128\" },\n { name: \"fee\", type: \"uint128\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setMarket\",\n args: [\n marketId,\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n totalBorrowShares,\n lastUpdate,\n fee,\n ],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"position\") {\n const { marketId, user, supplyShares, borrowShares, collateral } =\n parameters as MorphoMethodParameters[\"position\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setPosition\",\n inputs: [\n { name: \"id\", type: \"bytes32\" },\n { name: \"user\", type: \"address\" },\n { name: \"supplyShares\", type: \"uint256\" },\n { name: \"borrowShares\", type: \"uint128\" },\n { name: \"collateral\", type: \"uint128\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setPosition\",\n args: [marketId, user, supplyShares, borrowShares, collateral],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n const mockedFactory: MockedFactory = {\n address: mockFactoryAddress,\n set: async (method: FactoryMethod, parameters: FactoryMethodParameters[FactoryMethod]) => {\n if (method === \"isMetaMorpho\") {\n const { vault, value } = parameters as FactoryMethodParameters[\"isMetaMorpho\"];\n await tevmCall(client, {\n to: mockFactoryAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setIsMetaMorpho\",\n inputs: [\n { name: \"vault\", type: \"address\" },\n { name: \"isValid\", type: \"bool\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setIsMetaMorpho\",\n args: [vault, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"morpho\") {\n const { value } = parameters as FactoryMethodParameters[\"morpho\"];\n await tevmCall(client, {\n to: mockFactoryAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setMorpho\",\n inputs: [{ name: \"morpho_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setMorpho\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n /**\n * Deploy a new MockVault instance.\n * The vault implements ERC4626 and IMetaMorphoV1_1 interfaces including:\n * - asset(): Returns the vault's underlying asset address\n * - balanceOf(address): Returns vault share balance for a user\n * - totalSupply(): Returns total vault shares\n * - totalAssets(): Returns total underlying assets\n * - withdrawQueue(uint256): Returns market ID at queue index\n * - convertToAssets(uint256): Converts shares to assets\n * - convertToShares(uint256): Converts assets to shares\n * - maxWithdraw(address): Returns maximum withdrawable assets for a user\n * - maxRedeem(address): Returns maximum redeemable shares for a user\n */\n const deployVault = async (): Promise<MockedVault> => {\n const vaultAddress = privateKeyToAccount(\n keccak256(toHex(`VAULT_${Date.now()}_${Math.random()}`)),\n ).address;\n\n await tevmSetAccount(client, {\n address: vaultAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"vault.txt\"),\n \"utf8\",\n ) as Hex,\n });\n\n if (!vaultAddress) throw new Error(\"Failed to deploy vault contract\");\n\n return {\n address: vaultAddress,\n set: async (method: VaultMethod, parameters: VaultMethodParameters[VaultMethod]) => {\n if (method === \"asset\") {\n const { value } = parameters as VaultMethodParameters[\"asset\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setAsset\",\n inputs: [{ name: \"asset_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setAsset\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"balanceOf\") {\n const { user, value } = parameters as VaultMethodParameters[\"balanceOf\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setBalanceOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setBalanceOf\",\n args: [user, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"totalSupply\") {\n const { value } = parameters as VaultMethodParameters[\"totalSupply\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setTotalSupply\",\n inputs: [{ name: \"amount\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setTotalSupply\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"totalAssets\") {\n const { value } = parameters as VaultMethodParameters[\"totalAssets\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setTotalAssets\",\n inputs: [{ name: \"amount\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setTotalAssets\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"withdrawQueue\") {\n const { value } = parameters as VaultMethodParameters[\"withdrawQueue\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setWithdrawQueue\",\n inputs: [{ name: \"queue\", type: \"bytes32[]\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setWithdrawQueue\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n };\n\n return {\n name,\n client: Object.assign(client, {\n extend: ((originalExtend) => (actions: Parameters<typeof client.extend>[0]) => {\n const extended = originalExtend(actions as any);\n const multicall = async (parameters: {\n allowFailure?: boolean;\n contracts: Array<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: unknown[];\n }>;\n blockNumber?: bigint;\n }) => {\n const results: unknown[] = [];\n for (const c of parameters.contracts) {\n const data = encodeFunctionData({\n abi: c.abi as any,\n functionName: c.functionName as any,\n args: (c.args as any[]) ?? [],\n });\n const callResult = await client.call({\n to: c.address,\n data,\n ...(parameters.blockNumber ? { blockNumber: parameters.blockNumber } : {}),\n });\n try {\n const decoded = decodeFunctionResult({\n abi: c.abi as any,\n functionName: c.functionName as any,\n data: (callResult as any).data as Hex,\n });\n if (parameters.allowFailure === true) {\n results.push({ status: \"success\", result: decoded });\n } else {\n results.push(decoded);\n }\n } catch (err) {\n if (parameters.allowFailure !== true) throw err;\n results.push({ status: \"failure\", error: err });\n }\n }\n return results as any;\n };\n return Object.assign({}, extended, { multicall });\n })(client.extend.bind(client)) as typeof client.extend,\n }),\n mempoolAddress,\n termsAddress,\n mine,\n reset: async () => await client.reset({ blockNumber: 0n }),\n deployVault,\n oracle: mockedOracle,\n morpho: mockedMorpho,\n factory: mockedFactory,\n ...mockedAssets,\n };\n}\n\n/**\n * Start a local anvil chain.\n * @example\n * ```ts\n * import { EVM } from \"@morpho-dev/router\";\n * EVM.serve(); // local chain rpc url running on http://localhost:8545\n * ```\n */\nexport async function serve(parameters: {\n port: number;\n forkUrl: string;\n blockNumber?: number;\n}): Promise<{\n rpcUrl: `http://localhost:${number}`;\n stop: () => boolean;\n}> {\n const { port, forkUrl, blockNumber } = parameters;\n let started = false;\n const args = [\n \"--chain-id\",\n Chain.ChainId.ANVIL.toString(),\n \"--fork-url\",\n forkUrl,\n \"--port\",\n String(port),\n ];\n\n if (blockNumber) args.push(\"--fork-block-number\", String(blockNumber));\n\n const stop = await new Promise<() => boolean>((resolve, reject) => {\n const subprocess = spawn(\"anvil\", args, {\n env: { ...process.env, FOUNDRY_DISABLE_NIGHTLY_WARNING: \"1\" },\n });\n\n subprocess.stdout.on(\"data\", (data) => {\n const message = `[port ${port}] ${data.toString()}`;\n\n if (message.includes(\"Listening on\")) {\n started = true;\n resolve(() => subprocess.kill(\"SIGINT\"));\n }\n });\n\n subprocess.stderr.on(\"data\", (data) => {\n const message = `[port ${port}] ${data.toString()}`;\n\n // biome-ignore lint/suspicious/noConsole: debug message\n console.warn(message);\n\n if (!started) reject(message);\n // biome-ignore lint/suspicious/noConsole: debug message\n else console.warn(message);\n });\n });\n\n return {\n rpcUrl: `http://localhost:${port}`,\n stop,\n };\n}\n","import { Command, Option } from \"commander\";\nimport { createTestClient, http, publicActions, walletActions } from \"viem\";\nimport { anvil } from \"viem/chains\";\nimport * as Chain from \"../../core/Chain.ts\";\nimport * as EVM from \"../../evm/EVM.ts\";\n\nexport const mempoolCmd = new Command(\"mempool\");\n\nmempoolCmd\n .description(\"Start a local chain with the mempool contract\")\n .addOption(new Option(\"--port <port>\").env(\"MEMPOOL_PORT\").default(8545))\n .addOption(\n new Option(\"--fork-url <url>\")\n .env(\"MEMPOOL_FORK_URL\")\n .default(\"https://ethereum-rpc.publicnode.com\"),\n )\n .addOption(new Option(\"--block-number <number>\").default(0))\n .action(async (opts: { port: number; forkUrl: string; blockNumber: number }) => {\n const { rpcUrl } = await EVM.serve({\n port: opts.port,\n forkUrl: opts.forkUrl,\n blockNumber: opts.blockNumber,\n });\n\n const client = createTestClient({\n chain: { ...anvil, id: Number(Chain.ChainId.ANVIL) },\n transport: http(rpcUrl),\n mode: \"anvil\",\n })\n .extend(publicActions)\n .extend(walletActions);\n\n // deploy mempool contract\n const mempoolHash = await client.sendTransaction({\n account: EVM.users[0]!,\n data: \"0x60808060405234601357607d908160188239f35b5f80fdfe7f758c7cf107fab3cfdc5aefab966cd9e69c3f368761f7a218a18283c1fbb5574c60808060405260208152366020820152365f60408301375f604036830101526040817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3601168101030190a100fea164736f6c634300081e000a\",\n });\n\n const { contractAddress: mempoolAddress } = await client.waitForTransactionReceipt({\n hash: mempoolHash,\n });\n\n if (!mempoolAddress) throw new Error(\"Failed to deploy mempool contract\");\n // biome-ignore lint: debug message\n console.log(`Mempool contract deployed at ${mempoolAddress}`);\n\n // deploy terms contract\n const termsHash = await client.sendTransaction({\n account: EVM.users[0]!,\n data: \"0x6080604052348015600e575f5ffd5b506101dc8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80637edab8a61461002d575b5f5ffd5b6100476004803603810190610042919061012e565b610049565b005b818373ffffffffffffffffffffffffffffffffffffffff167f1eed8a711368c40dda6427683883619012c34cf436e11e0d773b0d05169ccb8283604051610090919061018d565b60405180910390a3505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ca826100a1565b9050919050565b6100da816100c0565b81146100e4575f5ffd5b50565b5f813590506100f5816100d1565b92915050565b5f819050919050565b61010d816100fb565b8114610117575f5ffd5b50565b5f8135905061012881610104565b92915050565b5f5f5f606084860312156101455761014461009d565b5b5f610152868287016100e7565b93505060206101638682870161011a565b92505060406101748682870161011a565b9150509250925092565b610187816100fb565b82525050565b5f6020820190506101a05f83018461017e565b9291505056fea2646970667358221220cc06296395b7aafdb892cd7bfe25a87dc6b35fe29b2d5cb2dcb3aad43050396a64736f6c634300081e0033\",\n });\n\n const { contractAddress: termsAddress } = await client.waitForTransactionReceipt({\n hash: termsHash,\n });\n\n if (!termsAddress) throw new Error(\"Failed to deploy terms contract\");\n // biome-ignore lint: debug message\n console.log(`Terms contract deployed at ${termsAddress}`);\n });\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { stringify } from \"viem\";\nimport type { Compute } from \"#core\";\n\nexport const LogLevelValues = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n \"silent\",\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, pretty?: boolean): Logger {\n const threshold: LogLevel = minLevel ?? (process.env.ROUTER_LOG_LEVEL as LogLevel) ?? \"info\";\n const prettyEnabled: boolean =\n typeof pretty === \"boolean\"\n ? pretty\n : String(process.env.ROUTER_LOG_PRETTY ?? \"false\").toLowerCase() === \"true\";\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 if (!prettyEnabled) {\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](stringify({ level: methodLevel, ...entry }));\n return;\n }\n\n const { msg, ...rest } = entry;\n const stack =\n typeof (rest as Record<string, unknown>).stack === \"string\"\n ? (rest as Record<string, unknown>).stack\n : undefined;\n if (stack) delete (rest as Record<string, unknown>).stack;\n const timestamp = new Date().toISOString();\n const level = methodLevel.toUpperCase();\n\n const extras: string = Object.entries(rest)\n .map(([k, v]) => `${k}=${formatValue(v)}`)\n .join(\" \");\n\n const line =\n extras.length > 0\n ? `${timestamp} [${level}] ${msg} ${extras}`\n : `${timestamp} [${level}] ${msg}`;\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](line);\n if (stack) {\n console[consoleMethod](stack);\n }\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\nfunction formatValue(value: unknown): string {\n if (\n value === null ||\n value === undefined ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n if (typeof value === \"string\") {\n if (value.includes(\" \")) return JSON.stringify(value);\n return value;\n }\n try {\n return stringify(value as unknown as Record<string, unknown>);\n } catch {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const CollectorHealth = z.object({\n name: z.string(),\n chain_id: z.number(),\n block_number: z.number().nullable(),\n updated_at: z.string().nullable(),\n lag: z.number().nullable(),\n status: z.enum([\"live\", \"lagging\", \"unknown\"]),\n});\n\nexport const CollectorsHealthResponse = z.array(CollectorHealth);\n\nexport const ChainHealth = z.object({\n chain_id: z.number(),\n block_number: z.number(),\n updated_at: z.string(),\n});\n\nexport const ChainsHealthResponse = z.array(ChainHealth);\n\nexport const RouterStatusResponse = z.object({\n status: z.enum([\"live\", \"syncing\"]),\n});\n\nexport type CollectorsHealthResponse = z.infer<typeof CollectorsHealthResponse>;\nexport type ChainsHealthResponse = z.infer<typeof ChainsHealthResponse>;\nexport type RouterStatusResponse = z.infer<typeof RouterStatusResponse>;\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 // Optional page number to support client-side hard caps on depth\n page?: number;\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 if (c.page !== undefined) {\n if (typeof c.page !== \"number\" || !Number.isInteger(c.page) || c.page < 1) {\n throw new Error(\"Invalid page: must be a positive integer\");\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 type { Hex } from \"viem\";\nimport * as z from \"zod\";\nimport { Cursor } from \"#stores/utils/index.ts\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst PaginationQueryParams = z.object({\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\nexport const GetOffersQueryParams = z.object({\n ...PaginationQueryParams.shape,\n side: z.enum([\"buy\", \"sell\"]).meta({\n description: \"Side of the offer.\",\n example: \"buy\",\n }),\n obligation_id: z\n .string({ error: \"Obligation id is required and must be a valid 32-byte hex string\" })\n .regex(/^0x[a-fA-F0-9]{64}$/, { error: \"Obligation id must be a valid 32-byte hex string\" })\n .transform<Hex>((val) => val.toLowerCase() as Hex)\n .meta({\n description: \"Offers obligation id\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nexport const GetObligationsQueryParams = z.object({\n ...PaginationQueryParams.shape,\n cursor: z.string().optional().meta({\n description: \"Obligation id cursor\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nconst schemas = {\n get_offers: GetOffersQueryParams,\n get_obligations: GetObligationsQueryParams,\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 { Obligation, Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\nimport { ChainsHealthResponse, CollectorsHealthResponse, RouterStatusResponse } from \"./health.ts\";\nimport { GetObligationsQueryParams, GetOffersQueryParams } from \"./requests.ts\";\n\nconst timestampExample = \"2024-01-01T12:00:00.000Z\";\nconst cursorExample = \"eyJvZmZzZXQiOjEwMH0\";\n\nfunction makeSuccessResponse<T extends z.ZodTypeAny>(parameters: {\n dataSchema: T;\n dataDescription?: string;\n dataExample: unknown;\n cursor: string | null;\n}) {\n const { dataSchema, dataDescription, dataExample, cursor } = parameters;\n const withDataMeta = dataDescription\n ? dataSchema.meta({ description: dataDescription })\n : dataSchema;\n return z\n .object({\n status: z.literal(\"success\"),\n cursor: z.string().nullable(),\n data: z.any(),\n meta: z.object({\n timestamp: z.string(),\n }),\n })\n .extend({\n data: withDataMeta,\n })\n .meta({\n example: {\n status: \"success\",\n cursor,\n data: dataExample,\n meta: { timestamp: timestampExample },\n },\n });\n}\n\nconst OffersSuccessResponseSchema = makeSuccessResponse({\n dataSchema: z.array(z.any()),\n dataDescription: \"Offers matching the provided filters.\",\n dataExample: [Format.toSnakeCase(Offer.random())],\n cursor: cursorExample,\n});\n\nconst ObligationsSuccessResponseSchema = makeSuccessResponse({\n dataSchema: z.array(z.any()),\n dataDescription: \"Obligations known to the router.\",\n dataExample: [Format.toSnakeCase(Obligation.random())],\n cursor: cursorExample,\n});\n\nconst RouterStatusSuccessResponseSchema = makeSuccessResponse({\n dataSchema: RouterStatusResponse,\n dataDescription: \"Aggregated router status.\",\n dataExample: { status: \"live\" },\n cursor: null,\n});\n\nconst CollectorsHealthSuccessResponseSchema = makeSuccessResponse({\n dataSchema: CollectorsHealthResponse,\n dataDescription: \"Collectors health details and sync status.\",\n dataExample: [\n {\n name: \"mempool_offers\",\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: \"2024-01-01T12:00:00.000Z\",\n lag: 0,\n status: \"live\",\n },\n ],\n cursor: null,\n});\n\nconst ChainsHealthSuccessResponseSchema = makeSuccessResponse({\n dataSchema: ChainsHealthResponse,\n dataDescription: \"Latest processed block per chain.\",\n dataExample: [\n {\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: \"2024-01-01T12:00:00.000Z\",\n },\n ],\n cursor: null,\n});\n\nconst errorResponseSchema = z\n .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 .meta({\n description: \"Error response wrapper.\",\n example: {\n status: \"error\",\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n details: [\n {\n field: \"cursor\",\n issue: \"Invalid cursor format. Must be a valid base64url-encoded cursor object\",\n },\n ],\n },\n meta: {\n timestamp: timestampExample,\n },\n },\n });\n\nconst paths: ZodOpenApiPathsObject = {\n \"/v1/offers\": {\n get: {\n summary: \"Offers\",\n description: \"Find offers that match specific criteria\",\n tags: [\"Offers\"],\n requestParams: {\n query: GetOffersQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: OffersSuccessResponseSchema,\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/obligations\": {\n get: {\n summary: \"Obligations\",\n description: \"List obligations with pagination support\",\n tags: [\"Obligations\"],\n requestParams: {\n query: GetObligationsQueryParams,\n },\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: ObligationsSuccessResponseSchema,\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/health\": {\n get: {\n summary: \"Router status\",\n description: \"Retrieve the aggregated status of the router.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: RouterStatusSuccessResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health/collectors\": {\n get: {\n summary: \"Collectors health\",\n description: \"Retrieve the block numbers processed by collectors and their sync status.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: CollectorsHealthSuccessResponseSchema,\n },\n },\n },\n },\n },\n },\n \"/v1/health/chains\": {\n get: {\n summary: \"Chains health\",\n description: \"Retrieve the latest block processed for each chain.\",\n tags: [\"Health\"],\n responses: {\n 200: {\n description: \"Success\",\n content: {\n \"application/json\": {\n schema: ChainsHealthSuccessResponseSchema,\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 name: \"Obligations\",\n },\n {\n name: \"Health\",\n },\n ],\n servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:7891\",\n description: \"Local development server\",\n },\n ],\n paths,\n});\n","import { OpenApi } from \"../Schema/openapi.ts\";\n\nexport function getSwaggerJson(): unknown {\n return OpenApi;\n}\n\nexport function getDocsHtml(): string {\n const html = `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <title>Router API Docs (Scalar)</title>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"></script>\n <style>\n html, body { margin: 0; height: 100%; }\n api-reference { height: 100%; width: 100%; }\n </style>\n </head>\n <body>\n <div id=\"api-container\" style=\"height:100%;width:100%;\"></div>\n <script>\n window.addEventListener('load', function () {\n const spec = ${JSON.stringify(OpenApi)};\n Scalar.createApiReference('#api-container', { spec: { content: spec } });\n });\n </script>\n </body>\n</html>`;\n\n return html;\n}\n","export * from \"./Collector.ts\";\nexport * from \"./CollectorBuilder.ts\";\nexport * from \"./fetchers/index.ts\";\nexport * from \"./validations/Validation.ts\";\nexport * from \"./validations/ValidationRule.ts\";\n","import type { Block, Hex, PublicClient } from \"viem\";\nimport * as Collector from \"#collectors/Collector.ts\";\nimport type { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Services from \"#services/Services.ts\";\nimport * as Utils from \"#utils/index.ts\";\n\nexport type Admin = { syncBlock: () => Promise<void> };\n\ntype LightBlock = {\n hash: Hex;\n number: bigint;\n parentHash: Hex;\n};\n\nexport function create(parameters: {\n client: PublicClient;\n chain: Chain.Chain;\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n options?: {\n maxBatchSize?: number;\n maxBlockNumber?: number;\n };\n}): Admin {\n const collector = \"admin\";\n const {\n client,\n chain,\n withTransaction,\n options: { maxBatchSize = 25, maxBlockNumber } = {},\n } = parameters;\n\n const maxBlockNumberBI = maxBlockNumber !== undefined ? BigInt(maxBlockNumber) : undefined;\n\n let finalizedBlock: LightBlock | null = null;\n let unfinalizedBlocks: LightBlock[] = [];\n\n const logger = Logger.getLogger();\n let isMaxBlockNumberReached = false;\n let tick = 0;\n return {\n syncBlock: async () => {\n if (isMaxBlockNumberReached) return;\n\n const head = await client.getBlock({\n blockTag: \"latest\",\n includeTransactions: false,\n });\n\n await withTransaction(async ({ chainStore, collectorStore }) => {\n const { epoch, blockNumber: latestSavedBlockNumber } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (maxBlockNumberBI !== undefined && head.number! >= maxBlockNumberBI) {\n logger.info({\n msg: `Head is greater than max block number`,\n collector,\n chainId: chain.id,\n block_number: head.number,\n max_block_number: maxBlockNumber,\n });\n\n isMaxBlockNumberReached = true;\n\n await chainStore.saveBlockNumber({\n chainId: chain.id,\n blockNumber: maxBlockNumber!,\n epoch: epoch + 1n,\n });\n\n await Promise.all(\n Collector.names.map(async (collectorName) =>\n collectorStore.saveBlockNumber({\n collectorName,\n chainId: chain.id,\n blockNumber: maxBlockNumber!,\n epoch: epoch + 1n,\n }),\n ),\n );\n\n return;\n }\n\n finalizedBlock = await fetchFinalizedBlock({\n tick,\n client,\n chain,\n logger,\n collector,\n unfinalizedBlocks,\n previousFinalizedBlock: finalizedBlock,\n });\n tick++;\n\n let {\n block: returnedBlock,\n didReorgHappened,\n unfinalizedBlocks: newUnfinalizedBlocks,\n } = await reconcile({\n client,\n block: head,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n\n unfinalizedBlocks = newUnfinalizedBlocks;\n const blockNumber = Number(returnedBlock.number);\n\n didReorgHappened = didReorgHappened || blockNumber < latestSavedBlockNumber;\n\n await chainStore.saveBlockNumber({\n chainId: chain.id,\n blockNumber,\n epoch: didReorgHappened ? epoch + 1n : epoch,\n });\n\n if (didReorgHappened) {\n await Promise.all(\n Collector.names.map(async (collectorName) =>\n collectorStore.saveBlockNumber({\n collectorName,\n chainId: chain.id,\n blockNumber,\n epoch: epoch + 1n,\n }),\n ),\n );\n }\n });\n },\n };\n}\n\nconst commonAncestor = (block: Block, unfinalizedBlocks: LightBlock[]): LightBlock | null => {\n const parent = unfinalizedBlocks.find((b) => b.hash === block.parentHash);\n if (parent) return parent;\n return null;\n};\n\nconst fetchFinalizedBlock = async (parameters: {\n tick: number;\n client: PublicClient;\n chain: Chain.Chain;\n logger: Logger.Logger;\n collector: string;\n unfinalizedBlocks: LightBlock[];\n previousFinalizedBlock: LightBlock | null;\n}): Promise<LightBlock> => {\n let { tick, client, chain, logger, collector, unfinalizedBlocks, previousFinalizedBlock } =\n parameters;\n let finalizedBlock: LightBlock | null = previousFinalizedBlock;\n if (tick % 20 === 0 || previousFinalizedBlock === null) {\n finalizedBlock = await client.getBlock({\n blockTag: \"finalized\",\n includeTransactions: false,\n });\n\n if (finalizedBlock === null || finalizedBlock.number === null) {\n const msg = \"Failed to get finalized block\";\n logger.fatal({ collector, chainId: chain.id, msg });\n throw new Error(msg);\n }\n\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number >= finalizedBlock!.number!);\n }\n\n if (\n finalizedBlock!.number === null ||\n finalizedBlock!.hash === null ||\n finalizedBlock!.parentHash === null\n ) {\n const msg = \"Failed to get finalized block\";\n logger.fatal({ collector, chainId: chain.id, msg });\n throw new Error(msg);\n }\n\n return {\n hash: finalizedBlock!.hash,\n number: finalizedBlock!.number,\n parentHash: finalizedBlock!.parentHash,\n };\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\nconst reconcile = async (parameters: {\n block: Block;\n client: PublicClient;\n chain: Chain.Chain;\n collector: string;\n unfinalizedBlocks: LightBlock[];\n finalizedBlock: LightBlock;\n logger: Logger.Logger;\n maxBatchSize: number;\n}): Promise<{ block: LightBlock; didReorgHappened: boolean; unfinalizedBlocks: LightBlock[] }> => {\n let { client, block, unfinalizedBlocks, finalizedBlock, logger, collector, chain, maxBatchSize } =\n parameters;\n\n if (block.hash === null || block.number === null || block.parentHash === null)\n throw new Error(\"Failed to get block\");\n\n const latestBlock = unfinalizedBlocks[unfinalizedBlocks.length - 1];\n\n if (latestBlock === undefined) {\n const newBlock = {\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n };\n unfinalizedBlocks.push(newBlock);\n return { block: newBlock, didReorgHappened: false, unfinalizedBlocks };\n }\n\n if (latestBlock.hash === block.hash)\n return { block: latestBlock, didReorgHappened: false, unfinalizedBlocks };\n\n if (latestBlock.number >= block.number) {\n const ancestor = commonAncestor(block, unfinalizedBlocks) || finalizedBlock;\n logger.info({\n msg: `Reorg detected`,\n collector,\n chain_id: chain.id,\n ancestor: ancestor.number,\n block_range: [latestBlock.number, block.number],\n });\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number <= ancestor.number);\n return { block: ancestor, didReorgHappened: true, unfinalizedBlocks };\n }\n\n if (latestBlock.number + 1n < block.number) {\n logger.debug({\n collector,\n chain_id: chain.id,\n block_range: [latestBlock.number, block.number],\n msg: `Missing blocks`,\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 Utils.retry(async () => await client.getBlock({ blockNumber, includeTransactions: false })),\n ),\n );\n\n for (const missingBlock of missingBlocks) {\n const { block: returnedBlock, didReorgHappened } = await reconcile({\n client,\n block: missingBlock,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n // if returned block is different from the missing block, return the block and stop the loop\n // this means that max block number was reached\n if (returnedBlock.number !== missingBlock.number)\n return { block: returnedBlock, didReorgHappened, unfinalizedBlocks };\n }\n return reconcile({\n client,\n block,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n }\n\n if (block.parentHash !== latestBlock.hash) {\n const ancestor = commonAncestor(block, unfinalizedBlocks) || finalizedBlock;\n logger.info({\n msg: `Reorg detected`,\n collector,\n chain_id: chain.id,\n ancestor: ancestor.number,\n block_range: [latestBlock.number, block.number],\n });\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number <= ancestor.number);\n return { block: ancestor, didReorgHappened: true, unfinalizedBlocks };\n }\n\n const newBlock = {\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n };\n\n unfinalizedBlocks.push(newBlock);\n return { block: newBlock, didReorgHappened: false, unfinalizedBlocks };\n};\n","import type { PublicClient } from \"viem\";\nimport type { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport * as RouterAdmin from \"#services/RouterAdmin.ts\";\nimport type * as Services from \"#services/Services.ts\";\nimport type * as CollectorStore from \"#stores/CollectorStore.ts\";\nimport * as Utils from \"#utils/index.ts\";\n\nexport const names = [\n \"mempool_offers\",\n \"consumed_events\",\n \"buy_with_empty_callback_liquidity\",\n \"buy_vault_v1_callback_liquidity\",\n \"sell_erc20_callback_liquidity\",\n] as const;\n\nexport type Name = (typeof names)[number];\n\n/** A general collector interface. */\nexport type Collector<name extends Name = Name, chain extends Chain.Chain = Chain.Chain> = {\n /** The name of the collector. */\n readonly name: name;\n\n /** The chain the collector is running on. */\n readonly chain: chain;\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\n/** A collector’s collect function signature */\nexport type CollectFn<chain extends Chain.Chain, collector extends Name> = (\n parameters: CollectParameters<chain, collector>,\n) => Promise<number>;\n\n/** Core parameters every collector gets at runtime */\nexport type CollectParameters<chain extends Chain.Chain, collector extends Name> = {\n /** The chain the collector is running on. */\n chain: chain;\n /** A public viem client. */\n client: PublicClient;\n /** The collector name. */\n collector: collector;\n /** The epoch the collector is running on. */\n epoch: bigint;\n /** The last block number processed by the collector. */\n lastBlockNumber: number;\n /** A function to execute database operations in a transaction. */\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n};\n\nexport function create<name extends Name, chain extends Chain.Chain>({\n name,\n collect,\n client,\n chain,\n withTransaction,\n collectorStore,\n options,\n}: {\n name: name;\n collect: CollectFn<chain, name>;\n chain: chain;\n client: PublicClient;\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n collectorStore: CollectorStore.CollectorStore;\n options: { interval: number; maxBlockNumber?: number };\n}): Collector<name, chain> {\n const admin = RouterAdmin.create({\n client,\n chain,\n withTransaction,\n options,\n });\n\n return {\n name,\n chain,\n collect: Utils.lazy((emit) => {\n const collector = name;\n const logger = Logger.getLogger();\n\n logger.info({\n msg: `Collector started`,\n collector,\n chain_id: chain.id,\n interval: options.interval,\n });\n\n return Utils.poll(\n async () => {\n try {\n let { blockNumber: lastBlockNumber, epoch } = await collectorStore.getBlockNumber({\n collectorName: name,\n chainId: chain.id,\n });\n\n // important to sync block before collecting in case of reorg\n // epoch will be updated by syncBlock and the collector will be blocked when trying to save block number\n await admin.syncBlock();\n\n lastBlockNumber = await collect({\n chain,\n client,\n collector: name,\n epoch,\n lastBlockNumber,\n withTransaction,\n });\n\n emit(lastBlockNumber);\n } catch (err) {\n const isError = err instanceof Error;\n logger.error({\n msg: \"Collector error\",\n collector,\n chain_id: chain.id,\n error: isError ? err.message : String(err),\n stack: isError ? err.stack : undefined,\n });\n }\n },\n { interval: options.interval },\n );\n }),\n };\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 {\n type Address,\n decodeAbiParameters,\n type Hex,\n type PublicClient,\n publicActions,\n type WalletClient as ViemClient,\n} from \"viem\";\nimport type { Compute } from \"#core\";\nimport { Chain, Offer } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport { poll } from \"#utils/index.ts\";\nimport type * as Client from \"./MempoolClient.ts\";\n\nconst DEFAULT_BATCH_SIZE = 100;\nconst DEFAULT_BLOCK_WINDOW = 100;\n\ntype MempoolEVMClientConfig = {\n readonly client: ViemClient;\n readonly mempoolAddress: Address;\n readonly blockWindow: number;\n};\n\nexport function from(parameters: from.Parameters): from.ReturnType {\n const config: MempoolEVMClientConfig = {\n client: parameters.client,\n mempoolAddress: parameters.mempoolAddress,\n blockWindow: parameters.blockWindow || DEFAULT_BLOCK_WINDOW,\n };\n\n return {\n add: (parameters) => add(config, parameters),\n get: (parameters) => get(config, parameters),\n watch: (parameters) => watch(config, parameters),\n stream: (parameters) => streamOffers(config, parameters),\n };\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The viem client to use. */\n client: ViemClient;\n /** The mempool address. */\n mempoolAddress: Address;\n /** The block window to use for the mempool. Defaults to 100. */\n blockWindow?: number;\n };\n\n type ReturnType = Client.Client;\n\n type ErrorType = null;\n}\n\n/**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n * @throws WalletAccountNotSetError if the wallet account is not set.\n * @throws ViemClientError if the viem client throws an error.\n * @throws Offer.InvalidOfferError if the offer is invalid.\n */\nexport async function add(\n config: MempoolEVMClientConfig,\n parameters: Client.AddParameters,\n): Promise<{ offer: Offer.Offer; txHash: Hex }> {\n const offer = Offer.from(parameters.offer);\n if (!config.client.account) throw new WalletAccountNotSetError();\n\n const chainId = await getChainId(config.client);\n if (BigInt(chainId) !== offer.chainId)\n throw new ChainIdMismatchError(offer.chainId, BigInt(chainId));\n\n try {\n const tx = await config.client.sendTransaction({\n chain: config.client.chain,\n account: config.client.account!,\n to: config.mempoolAddress,\n data: Offer.encode(offer),\n });\n\n return { offer, txHash: tx };\n } catch (error) {\n throw new ViemClientError(error instanceof Error ? error.message : \"Unknown error\");\n }\n}\n\nexport declare namespace add {\n export type ErrorType =\n | WalletAccountNotSetError\n | ViemClientError\n | Offer.InvalidOfferError\n | ChainIdMismatchError;\n}\n\nexport async function* get(\n config: MempoolEVMClientConfig,\n parameters?: Client.GetParameters,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n } = parameters || {};\n\n yield* streamOffers(config, {\n loanToken,\n order,\n blockNumberGte,\n blockNumberLte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n}\n\nexport declare namespace get {\n export type ErrorType = streamOffersReturnType;\n}\n\n/**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\nexport function watch(config: MempoolEVMClientConfig, parameters: Client.WatchParameters) {\n const {\n loanToken,\n lastSyncedBlock,\n polling: { interval = 30_000, maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n onOffers,\n } = parameters;\n\n return poll(\n async () => {\n const blockNumberGte = await lastSyncedBlock();\n\n const stream = streamOffers(config, {\n loanToken,\n order: \"asc\",\n blockNumberGte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n\n for await (const { offers, blockNumber } of stream) {\n await onOffers(offers, blockNumber);\n }\n },\n { interval },\n );\n}\n\nexport declare namespace watch {\n export type ErrorType = streamOffersReturnType;\n}\n\nconst chainIdCache = new Map<string, number>();\n/**\n * Caches the chain id of a viem client.\n * @param client - The viem client.\n * @returns The chain id.\n */\nconst getChainId = async (client: ViemClient): Promise<number> => {\n if (chainIdCache.has(client.uid)) return chainIdCache.get(client.uid)!;\n const chainId = await client.getChainId();\n chainIdCache.set(client.uid, chainId);\n return chainId;\n};\n\ntype streamOffersReturnType = WalletAccountNotSetError | ChainIdMismatchError;\n\nasync function* streamOffers(\n config: MempoolEVMClientConfig,\n parameters: Compute<\n Omit<Client.GetParameters, \"options\"> & {\n options: Client.GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = config.blockWindow } = {},\n } = parameters;\n\n const stream = Chain.streamLogs({\n client: config.client.extend(publicActions) as PublicClient,\n contractAddress: config.mempoolAddress,\n event: {\n type: \"event\",\n name: \"Event\",\n inputs: [{ name: \"data\", type: \"bytes\", indexed: false, internalType: \"bytes\" }],\n anonymous: false,\n } as const,\n blockNumberGte,\n blockNumberLte,\n order,\n options: { maxBatchSize, blockWindow },\n });\n\n let blockNumber = order === \"asc\" ? blockNumberGte : blockNumberLte;\n for await (const { logs, blockNumber: newBlockNumber } of stream) {\n blockNumber = newBlockNumber;\n if (logs.length === 0) break;\n let offersAndBlockNumbers = logs\n .map((log) => {\n const [payload] = decodeAbiParameters([{ type: \"bytes\" }], log.data);\n try {\n return { offer: Offer.decode(payload, log.blockNumber), blockNumber: log.blockNumber };\n } catch (_) {\n return null;\n }\n })\n .filter((item) => item !== null);\n\n if (loanToken)\n offersAndBlockNumbers = offersAndBlockNumbers.filter(\n (o) => o.offer.loanToken.toLowerCase() === loanToken.toLowerCase(),\n );\n\n if (offersAndBlockNumbers.length === 0) continue;\n\n yield {\n offers: offersAndBlockNumbers.map((item) => item.offer),\n blockNumber,\n };\n }\n\n yield { offers: [], blockNumber: blockNumber! };\n return;\n}\n\nexport class WalletAccountNotSetError extends Errors.BaseError {\n override name = \"Mempool.WalletAccountNotSetError\";\n constructor() {\n super(\"Wallet account is not set.\");\n }\n}\n\nexport class ViemClientError extends Errors.BaseError {\n override name = \"Mempool.ViemClientError\";\n}\n\nexport class ChainIdMismatchError extends Errors.BaseError {\n override name = \"Mempool.ChainIdMismatchError\";\n constructor(expected: bigint, actual: bigint) {\n super(`Chain ID mismatch. Offer chain ID is ${expected}, network chain ID is ${actual}.`);\n }\n}\n","import type { Hex } from \"viem\";\nimport type { Compute, Offer } from \"#core\";\nimport * as EVMClient from \"./MempoolEVMClient.ts\";\n\nexport type AddParameters = {\n offer: Compute<Omit<Offer.Offer, \"hash\" | \"createdAt\">>;\n};\n\nexport type GetParameters = {\n /** The block number to get offers from. */\n blockNumberGte?: number;\n /** The block number to get offers to. */\n blockNumberLte?: number;\n /** The loan asset to get offers from. */\n loanToken?: string;\n /** The order to get offers. Defaults to \"desc\". */\n order?: \"asc\" | \"desc\";\n /** The options to get offers from. */\n options?: {\n /** The maximum number of offers to return. Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\nexport type WatchParameters = {\n /** The async function to get the last synced block number from which to start watching.\n * This function will be called periodically on each poll. It should be updated by the caller (e.g. using `onOffers` callback) to track the last synced block number.\n */\n lastSyncedBlock: () => Promise<number>;\n /** The loan asset to watch. */\n loanToken?: string;\n /** The callback to call when a new batch of offers is found in the mempool.\n * @param offers The offers found in the mempool.\n * @param blockNumber The block number of the last processed offer. Block numbers will always ascend.\n */\n onOffers: (offers: Offer.Offer[], blockNumber: number) => Promise<void>;\n /** The polling configuration. */\n polling?: {\n /** The interval in milliseconds to poll for new offers. Defaults to 30000. */\n interval?: number;\n /** The maximum number of offers that can be returned in a single batch.\n * Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\n/**\n * Mempool client interface.\n */\nexport type Client = {\n /**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n */\n add: (parameters: AddParameters) => Promise<{ offer: Offer.Offer; txHash: Hex }>;\n /** Get offers from the mempool. */\n get: (parameters?: GetParameters) => AsyncGenerator<{\n offers: Offer.Offer[];\n /** The block number of the last processed offer. Depends on the `order` parameter, block numbers will ascend or descend. */\n blockNumber: number;\n }>;\n /**\n * Watch for new offers on a specific chain.\n * @returns A function to stop watching for new offers.\n */\n watch: (parameters: WatchParameters) => () => boolean;\n\n /**\n * Stream offers from the mempool.\n * @returns A generator of offers alongside the last block number processed.\n */\n stream: (\n parameters: Compute<\n Omit<GetParameters, \"options\"> & {\n options: GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n ) => AsyncGenerator<{\n offers: Offer.Offer[];\n blockNumber: number;\n }>;\n};\n\n/**\n * Client to interact with the Mempool contract on a specific chain.\n */\nexport function connect(parameters: EVMClient.from.Parameters): Client {\n return EVMClient.from(parameters);\n}\n\nexport declare namespace connect {\n export type ErrorType = EVMClient.from.ErrorType;\n}\n","import { and, asc, eq, gt, gte, lte, sql } from \"drizzle-orm\";\nimport type * as Collector from \"#collectors/index.ts\";\nimport { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport { chains, collectors } from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type CollectorStore = {\n /** Get the latest block number processed by a collector for a given chain alongside the epoch. */\n getBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n }) => Promise<{ blockNumber: number; epoch: bigint }>;\n\n /**\n * Get the latest block number processed by all collectors.\n * When a chainId is provided the result is filtered, otherwise all records are returned.\n */\n getBlockNumbers: (parameters?: { chainId?: Chain.Id }) => Promise<\n Array<{\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n updatedAt: Date;\n }>\n >;\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 epoch: bigint;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): CollectorStore => {\n const db = config.db;\n const logger = Logger.getLogger();\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n const res = await db\n .select({\n epoch: collectors.epoch,\n blockNumber: collectors.blockNumber,\n })\n .from(collectors)\n .where(and(eq(collectors.chainId, parameters.chainId), eq(collectors.name, name)));\n\n if (res.length === 0) {\n logger.debug({\n service: \"collector_block_store\",\n collector: name,\n chain_id: parameters.chainId,\n msg: `No block number found`,\n });\n\n await db\n .insert(collectors)\n .values({\n chainId: parameters.chainId,\n name,\n blockNumber: Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0,\n epoch: \"0\",\n })\n .onConflictDoNothing();\n\n return {\n blockNumber: Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0,\n epoch: 0n,\n };\n }\n\n return { blockNumber: Number(res[0]!.blockNumber), epoch: BigInt(res[0]!.epoch) };\n },\n\n getBlockNumbers: async (parameters?: { chainId?: Chain.Id }) => {\n const rows = await db\n .select({\n collectorName: collectors.name,\n chainId: collectors.chainId,\n blockNumber: collectors.blockNumber,\n epoch: collectors.epoch,\n updatedAt: collectors.updatedAt,\n })\n .from(collectors)\n .where(\n parameters?.chainId !== undefined\n ? eq(collectors.chainId, parameters.chainId)\n : sql`TRUE`,\n )\n .orderBy(asc(collectors.chainId), asc(collectors.name));\n\n return rows.map((row) => ({\n collectorName: row.collectorName.toLowerCase() as Collector.Name,\n chainId: row.chainId,\n blockNumber: Number(row.blockNumber),\n epoch: BigInt(row.epoch),\n updatedAt: row.updatedAt,\n }));\n },\n\n /** Save the latest block number processed by a collector for a given chain.\n * @throws {Error} if a chain reorg has happened and the collector tries to update with an outdated `epoch`\n */\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n const chain = db\n .select({\n chainId: chains.chainId,\n currentEpoch: chains.epoch,\n currentBlockNumber: chains.blockNumber,\n })\n .from(chains)\n .where(and(eq(chains.chainId, parameters.chainId)))\n .as(\"chain\");\n\n const hasReorgHappened =\n (\n await db\n .select()\n .from(collectors)\n .leftJoin(chain, eq(collectors.chainId, chain.chainId))\n .where(\n and(\n eq(collectors.chainId, parameters.chainId),\n eq(collectors.name, name),\n gt(chain.currentEpoch, collectors.epoch),\n eq(chain.currentEpoch, parameters.epoch.toString()),\n gte(collectors.blockNumber, parameters.blockNumber),\n ),\n )\n .limit(1)\n ).length > 0;\n\n const rows = await db\n .update(collectors)\n .set({\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n updatedAt: sql`now()`,\n })\n .from(chain)\n .where(\n and(\n eq(collectors.chainId, parameters.chainId),\n eq(collectors.name, name),\n eq(chain.currentEpoch, parameters.epoch.toString()),\n gte(chain.currentBlockNumber, parameters.blockNumber),\n // ensures that block numbers are strictly increasing\n // except when a reorg has happened\n ...(hasReorgHappened ? [] : [lte(collectors.blockNumber, parameters.blockNumber)]),\n ),\n )\n .returning();\n\n // compare and swap operation warns that the `epoch` has been updated\n // two cases:\n // 1. row does not exist in db, safe to create it\n // 2. row exists in db, but the epoch is different, throw error to revert db transaction => chain reorg has been detected\n if (rows.length === 0) {\n const existing = await db\n .select({ chainId: collectors.chainId })\n .from(collectors)\n .where(and(eq(collectors.chainId, parameters.chainId), eq(collectors.name, name)))\n .limit(1);\n\n if (existing.length === 0) {\n await db\n .insert(collectors)\n .values({\n name,\n chainId: parameters.chainId,\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n })\n .onConflictDoNothing();\n\n return;\n }\n\n throw new Error(\n `A chain reorg has happened on chain ${parameters.chainId}, update of the collector ${name} is aborted`,\n );\n }\n },\n };\n};\n","import { asc, desc } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n index,\n integer,\n numeric,\n pgSchema,\n primaryKey,\n text,\n timestamp,\n uniqueIndex,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport type * as Collector from \"#collectors/index.ts\";\n\n// Should be updated when the data should need to be re-synced from scratch\nexport const VERSION = \"router_v1.4\";\nconst s = pgSchema(VERSION);\n\nexport const obligations = s.table(\"obligations\", {\n obligationId: varchar(\"obligation_id\", { length: 66 }).primaryKey(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n loanToken: varchar(\"loan_token\", { length: 42 }).notNull(),\n maturity: integer(\"maturity\").notNull(),\n});\n\nexport const offers = s.table(\n \"offers\",\n {\n hash: varchar(\"hash\", { length: 66 }).primaryKey(),\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { onDelete: \"cascade\" }),\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 createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n },\n (table) => [\n index(\"offers_obligation_id_idx\").on(table.obligationId),\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 index(\"offers_created_at_idx\").on(table.createdAt),\n index(\"offers_block_number_idx\").on(table.blockNumber),\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 // Compound index for multi-level sorting optimization (rate, createdAt, assets, hash)\n index(\"offers_rate_created_at_assets_hash_idx\").on(\n table.rate,\n asc(table.createdAt),\n desc(table.assets),\n asc(table.hash),\n ),\n ],\n);\n\nexport const obligationCollaterals = s.table(\n \"obligation_collaterals\",\n {\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { 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 primaryKey({\n columns: [table.obligationId, table.asset],\n name: \"obligation_collaterals_pk\",\n }),\n index(\"obligation_collaterals_obligation_id_idx\").on(table.obligationId),\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 blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"consumed_per_user_and_nonce_chain_id_offering_nonce_block_number_idx\").on(\n table.chainId,\n table.offering,\n table.nonce,\n desc(table.blockNumber),\n ),\n ],\n);\n\nexport const collectors = s.table(\n \"collectors\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n name: text(\"name\").$type<Collector.Name>().notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n // epoch is used as a fencing token to avoid race conditions when updating the block number\n epoch: numeric(\"epoch\", { precision: 78, scale: 0 }).default(\"0\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n uniqueIndex(\"collectors_chain_name_epoch_idx\").on(table.chainId, table.name, table.epoch),\n ],\n);\n\nexport const chains = s.table(\n \"chains\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n epoch: numeric(\"epoch\", { precision: 78, scale: 0 }).default(\"0\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [uniqueIndex(\"chains_id_epoch_idx\").on(table.chainId, table.epoch)],\n);\n\nexport const offerLiquidityPools = s.table(\n \"offer_liquidity_pools\",\n {\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n poolId: varchar(\"pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.offerHash, table.poolId],\n name: \"offer_liquidity_pools_pk\",\n }),\n index(\"offer_liquidity_pools_pool_id_idx\").on(table.poolId),\n ],\n);\n\nexport const liquidityPools = s.table(\"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 liquidityLinks = s.table(\n \"liquidity_links\",\n {\n parentPoolId: varchar(\"parent_pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n childPoolId: varchar(\"child_pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n priority: integer(\"priority\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.parentPoolId, table.priority],\n name: \"liquidity_links_pk\",\n }),\n index(\"liquidity_links_parent_pool_id_idx\").on(table.parentPoolId),\n index(\"liquidity_links_child_pool_id_idx\").on(table.childPoolId),\n ],\n);\n","import { type Address, erc20Abi, type PublicActions } from \"viem\";\nimport { Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches ERC20 token balances and allowances using multicall.\n * Returns liquidity pools and links.\n *\n * @param parameters - Configuration for the fetch operation including user-token pairs\n * @returns Promise resolving to pools and links arrays\n */\nexport async function fetchBalancesAndAllowances(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\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 pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n}> {\n const { client, chainId, spender, pairs, options } = parameters;\n if (pairs.length === 0) return { pools: [], links: [] };\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 const balanceCalls: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"balanceOf\";\n args: [Address];\n }> = [];\n const allowanceCalls: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"allowance\";\n args: [Address, Address];\n }> = [];\n\n for (const { user, token } of pairs) {\n balanceCalls.push({\n address: token,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n });\n allowanceCalls.push({\n address: token,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n });\n }\n\n const [allBalances, allAllowances] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: balanceCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: allowanceCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const pools: Liquidity.LiquidityPool[] = [];\n const links: Liquidity.LiquidityLink[] = [];\n\n for (let i = 0; i < pairs.length; i++) {\n const { user, token } = pairs[i]!;\n const balance = allBalances[i]!;\n const allowance = allAllowances[i]!;\n\n const balancePoolId = Liquidity.generateBalancePoolId({\n user,\n chainId,\n token,\n });\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user,\n chainId,\n token,\n });\n\n pools.push({ id: balancePoolId, amount: balance }, { id: allowancePoolId, amount: allowance });\n\n links.push({\n parentPoolId: allowancePoolId,\n childPoolId: balancePoolId,\n priority: 0,\n });\n }\n\n return { pools, links };\n}\n","import type { Address, Hex, PublicActions } from \"viem\";\nimport { Abi, Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches existing collateral and debt data from Morpho protocol for user-term-collateral combinations.\n * Returns liquidity pools for obligation collateral and debt.\n *\n * @param parameters - Configuration for the fetch operation\n * @returns Promise resolving to pools array (no links for obligation collateral/debt pools)\n */\nexport async function fetchCollateralAndDebt(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\n morphoAddress: Address;\n queries: Array<{\n user: Address;\n obligationId: Hex;\n collateralAssets: Address[];\n }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<{\n pools: Liquidity.LiquidityPool[];\n}> {\n const { client, chainId, morphoAddress, queries, options } = parameters;\n if (queries.length === 0) return { pools: [] };\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 const collateralCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"collateralOf\";\n args: [Address, Hex, Address];\n }> = [];\n const debtCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"debtOf\";\n args: [Address, Hex];\n }> = [];\n\n type CollateralQueryInfo = { user: Address; obligationId: Hex; collateralAsset: Address };\n type DebtQueryInfo = { user: Address; obligationId: Hex };\n const collateralQueryInfos: CollateralQueryInfo[] = [];\n const debtQueryInfos: DebtQueryInfo[] = [];\n\n for (const { user, obligationId, collateralAssets } of queries) {\n debtCalls.push({\n address: morphoAddress,\n abi: Abi.Morpho,\n functionName: \"debtOf\",\n args: [user, obligationId],\n });\n debtQueryInfos.push({ user, obligationId });\n\n for (const collateralAsset of collateralAssets) {\n collateralCalls.push({\n address: morphoAddress,\n abi: Abi.Morpho,\n functionName: \"collateralOf\",\n args: [user, obligationId, collateralAsset],\n });\n collateralQueryInfos.push({ user, obligationId, collateralAsset });\n }\n }\n\n const [allCollaterals, allDebts] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: collateralCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: debtCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const pools: Liquidity.LiquidityPool[] = [];\n\n for (let i = 0; i < collateralQueryInfos.length; i++) {\n const { user, obligationId, collateralAsset } = collateralQueryInfos[i]!;\n const amount = allCollaterals[i]!;\n\n if (amount > 0n) {\n const poolId = Liquidity.generateObligationCollateralPoolId({\n user,\n chainId,\n obligationId,\n token: collateralAsset,\n });\n\n pools.push({\n id: poolId,\n amount,\n });\n }\n }\n\n for (let i = 0; i < debtQueryInfos.length; i++) {\n const { user, obligationId } = debtQueryInfos[i]!;\n const debt = allDebts[i]!;\n\n if (debt > 0n) {\n const poolId = Liquidity.generateDebtPoolId({\n user,\n chainId,\n obligationId,\n });\n\n pools.push({\n id: poolId,\n amount: -debt,\n });\n }\n }\n\n return { pools };\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { Abi } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches prices from multiple oracle contracts using multicall.\n *\n * @param parameters - Configuration for the fetch operation\n * @returns Promise resolving to a Map: oracle address -> price\n */\nexport async function fetchOraclePrices(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n oracles: Address[];\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<Map<Address, bigint>> {\n const { client, oracles, options } = parameters;\n if (oracles.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 const out: Map<Address, bigint> = new Map();\n\n for (const oraclesBatch of Utils.batch(oracles, batchSize)) {\n const priceCalls: Array<{\n address: Address;\n abi: typeof Abi.Oracle;\n functionName: \"price\";\n args: [];\n }> = [];\n\n for (const oracle of oraclesBatch) {\n priceCalls.push({\n address: oracle,\n abi: Abi.Oracle,\n functionName: \"price\",\n args: [],\n });\n }\n\n const prices = await Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: priceCalls,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n\n for (let i = 0; i < oraclesBatch.length; i++) {\n const oracle = oraclesBatch[i]!;\n const price = prices[i]! as bigint;\n out.set(oracle, price);\n }\n }\n\n return out;\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { Abi, type Chain, Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches user positions in MetaMorpho vaults, vault positions in Morpho Blue markets, and total market liquidity.\n * Returns liquidity pools for user vault positions, vault positions, and market liquidity, along with hierarchical links.\n *\n * @param parameters - Configuration for the fetch operation\n * @param parameters.chain - The chain configuration containing chainId and Morpho Blue address\n * @param parameters.userVaults - Array of user-vault pairs to query (markets are determined from vault's withdrawQueue)\n * @returns Promise resolving to pools and links arrays\n */\nexport async function fetchUserVaultMarketLiquidity(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chain: Chain.Chain;\n userVaults: Array<{\n user: Address; // ← User address\n vault: Address; // ← MetaMorpho vault contract address\n }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<{\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n}> {\n const { client, chain, userVaults, options } = parameters;\n const chainId = chain.id;\n const morphoBlueAddress = chain.morphoBlue;\n if (userVaults.length === 0) return { pools: [], links: [] };\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 const userMaxWithdrawCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"maxWithdraw\";\n args: [Address];\n }> = [];\n\n const withdrawQueueLengthCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"withdrawQueueLength\";\n args: [];\n }> = [];\n\n const seenVaults = new Set<Address>();\n const uniqueVaults: Address[] = [];\n\n for (const { user, vault } of userVaults) {\n userMaxWithdrawCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"maxWithdraw\",\n args: [user],\n });\n\n if (!seenVaults.has(vault)) {\n seenVaults.add(vault);\n uniqueVaults.push(vault);\n withdrawQueueLengthCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"withdrawQueueLength\",\n args: [],\n });\n }\n }\n\n const [allUserMaxWithdrawAmounts, allWithdrawQueueLengths] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: userMaxWithdrawCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: withdrawQueueLengthCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const withdrawQueueItemCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"withdrawQueue\";\n args: [bigint];\n }> = [];\n\n type VaultQueue = { vault: Address; startIndex: number; length: number };\n const vaultQueues: VaultQueue[] = [];\n\n for (let i = 0; i < uniqueVaults.length; i++) {\n const vault = uniqueVaults[i]!;\n const length = Number(allWithdrawQueueLengths[i]!);\n const startIndex = withdrawQueueItemCalls.length;\n\n for (let j = 0; j < length; j++) {\n withdrawQueueItemCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"withdrawQueue\",\n args: [BigInt(j)],\n });\n }\n\n vaultQueues.push({ vault, startIndex, length });\n }\n\n const allWithdrawQueueItems = await Utils.batchMulticall<string>({\n client,\n calls: withdrawQueueItemCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n });\n\n // Build vault -> marketIds mapping from withdraw queue items\n const vaultToMarketIds = new Map<Address, string[]>();\n for (const { vault, startIndex, length } of vaultQueues) {\n const marketIds = allWithdrawQueueItems.slice(startIndex, startIndex + length);\n vaultToMarketIds.set(vault, marketIds);\n }\n\n const positionCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"position\";\n args: [string, Address];\n }> = [];\n const marketCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"market\";\n args: [string];\n }> = [];\n\n type VaultMarketPair = { vault: Address; marketId: string; priority: number };\n type VaultPosition = readonly [supplyShares: bigint, borrowShares: bigint, collateral: bigint];\n type MarketState = readonly [\n totalSupplyAssets: bigint,\n totalSupplyShares: bigint,\n totalBorrowAssets: bigint,\n totalBorrowShares: bigint,\n lastUpdate: bigint,\n fee: bigint,\n ];\n\n const vaultMarketPairs: VaultMarketPair[] = [];\n const uniqueMarketIds = new Set<string>();\n\n for (const vault of uniqueVaults) {\n const marketIds = vaultToMarketIds.get(vault) ?? [];\n for (let priority = 0; priority < marketIds.length; priority++) {\n const marketId = marketIds[priority]!;\n vaultMarketPairs.push({ vault, marketId, priority });\n\n positionCalls.push({\n address: morphoBlueAddress,\n abi: Abi.Morpho,\n functionName: \"position\",\n args: [marketId, vault],\n });\n\n uniqueMarketIds.add(marketId);\n }\n }\n\n for (const marketId of uniqueMarketIds) {\n marketCalls.push({\n address: morphoBlueAddress,\n abi: Abi.Morpho,\n functionName: \"market\",\n args: [marketId],\n });\n }\n\n const [allVaultPositions, allMarketStates] = await Promise.all([\n Utils.batchMulticall<VaultPosition>({\n client,\n calls: positionCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<MarketState>({\n client,\n calls: marketCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const markets = new Map<\n string,\n { totalSupplyAssets: bigint; totalSupplyShares: bigint; totalBorrowAssets: bigint }\n >();\n const uniqueMarketIdsArray = Array.from(uniqueMarketIds);\n for (let i = 0; i < uniqueMarketIdsArray.length; i++) {\n const marketId = uniqueMarketIdsArray[i]!;\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets] = allMarketStates[i]!;\n markets.set(marketId, {\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n });\n }\n\n const pools: Liquidity.LiquidityPool[] = [];\n const links: Liquidity.LiquidityLink[] = [];\n const processedMarkets = new Set<string>();\n\n const vaultToUserPoolIds = new Map<string, string[]>();\n\n for (let i = 0; i < userVaults.length; i++) {\n const { user, vault } = userVaults[i]!;\n const userMaxWithdrawAmount = allUserMaxWithdrawAmounts[i]!;\n\n const userVaultPositionPoolId = Liquidity.generateUserVaultPositionPoolId({\n user,\n chainId,\n vault,\n });\n\n pools.push({\n id: userVaultPositionPoolId,\n amount: userMaxWithdrawAmount,\n });\n\n const vaultKey = vault.toLowerCase();\n if (!vaultToUserPoolIds.has(vaultKey)) {\n vaultToUserPoolIds.set(vaultKey, []);\n }\n vaultToUserPoolIds.get(vaultKey)!.push(userVaultPositionPoolId);\n }\n\n for (let i = 0; i < vaultMarketPairs.length; i++) {\n const { vault, marketId, priority } = vaultMarketPairs[i]!;\n const [supplyShares] = allVaultPositions[i]!;\n const market = markets.get(marketId);\n\n if (!market) continue;\n\n const { totalSupplyAssets, totalSupplyShares, totalBorrowAssets } = market;\n\n /**\n * Convert vault's supply shares to actual asset amount.\n * Formula: vaultAssets = (vaultShares * totalSupplyAssets) / totalSupplyShares\n *\n * This calculates the vault's proportional ownership of the market's total supplied assets.\n * For example, if a vault owns 25% of supply shares (25,000 out of 100,000 total shares)\n * and the market has 100,000 total supplied assets, the vault owns 25,000 assets.\n */\n let vaultPositionAssets = 0n;\n if (supplyShares > 0n && totalSupplyShares > 0n) {\n vaultPositionAssets = (supplyShares * totalSupplyAssets) / totalSupplyShares;\n }\n\n const vaultPositionPoolId = Liquidity.generateVaultPositionPoolId({\n vault,\n chainId,\n marketId,\n });\n\n pools.push({\n id: vaultPositionPoolId,\n amount: vaultPositionAssets,\n });\n\n const marketLiquidityPoolId = Liquidity.generateMarketLiquidityPoolId({\n chainId,\n marketId,\n });\n\n /**\n * Create market liquidity pool (only once per market).\n * Market liquidity represents the available (unborrowed) assets in the market.\n *\n * Formula: availableLiquidity = totalSupplyAssets - totalBorrowAssets\n *\n * For example, if a market has 100,000 assets supplied and 80,000 borrowed,\n * the available liquidity is 20,000 assets.\n */\n if (!processedMarkets.has(marketId)) {\n const availableLiquidity = totalSupplyAssets - totalBorrowAssets;\n\n pools.push({\n id: marketLiquidityPoolId,\n amount: availableLiquidity,\n });\n\n processedMarkets.add(marketId);\n }\n\n // Link: vault position → market liquidity (priority 0)\n links.push({\n parentPoolId: vaultPositionPoolId,\n childPoolId: marketLiquidityPoolId,\n priority: 0,\n });\n\n // Link: user vault position → vault position (priority based on withdrawQueue)\n const vaultKey = vault.toLowerCase();\n const userPoolIds = vaultToUserPoolIds.get(vaultKey);\n if (userPoolIds) {\n for (const userVaultPositionPoolId of userPoolIds) {\n links.push({\n parentPoolId: userVaultPositionPoolId,\n childPoolId: vaultPositionPoolId,\n priority,\n });\n }\n }\n }\n\n return { pools, links };\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { fetchUserVaultMarketLiquidity } from \"#collectors/fetchers/index.ts\";\nimport { Callback, type Chain, Liquidity } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectBuyVaultV1CallbackLiquidity<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n collector,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n callbackAddresses: [\n ...Callback.WhitelistedCallbackAddresses[Callback.CallbackType.BuyVaultV1Callback],\n ],\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const userVaults: Array<{ user: Address; vault: Address }> = [];\n const seenUserVaultPairs = new Set<string>();\n\n for (const offer of offers) {\n const callbackData = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n\n for (const { vault } of callbackData) {\n const key = `${offer.offering}-${vault}`.toLowerCase();\n if (seenUserVaultPairs.has(key)) continue;\n seenUserVaultPairs.add(key);\n userVaults.push({\n user: offer.offering,\n vault,\n });\n }\n }\n\n const { pools: vaultPools, links: vaultLinks } = await fetchUserVaultMarketLiquidity({\n client,\n chain,\n userVaults,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n });\n\n const allPools: Liquidity.LiquidityPool[] = [];\n const allLinks: Liquidity.LiquidityLink[] = [];\n const allOfferPools: Liquidity.OfferLiquidityPool[] = [];\n\n allPools.push(...vaultPools);\n allLinks.push(...vaultLinks);\n\n for (const offer of offers) {\n const user = offer.offering;\n const callbackData = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n\n for (const { vault, amount: callbackAmount } of callbackData) {\n const callbackPoolId = Liquidity.generateBuyVaultCallbackPoolId({\n user,\n chainId: chain.id,\n vault,\n offerHash: offer.hash,\n });\n\n const userVaultPositionPoolId = Liquidity.generateUserVaultPositionPoolId({\n user,\n chainId: chain.id,\n vault,\n });\n\n allPools.push({\n id: callbackPoolId,\n amount: callbackAmount,\n });\n\n allLinks.push({\n parentPoolId: callbackPoolId,\n childPoolId: userVaultPositionPoolId,\n priority: 0,\n });\n\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: callbackPoolId,\n amount: callbackAmount,\n });\n }\n }\n\n await liquidityStore.save({\n pools: allPools,\n links: allLinks,\n offerPools: allOfferPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n\n return latestBlockNumber;\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { fetchBalancesAndAllowances } from \"#collectors/fetchers/index.ts\";\nimport { type Chain, Liquidity } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectBuyWithEmptyCallbackLiquidity<\n chain extends Chain.Chain,\n collector extends Collector.Name = \"consumed_events\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options?: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n collector,\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const pairs: Array<{ user: Address; token: Address }> = [];\n const seenUserTokenPairs = new Set<string>();\n\n for (const offer of offers) {\n const key = `${offer.offering}-${offer.loanToken}`.toLowerCase();\n if (seenUserTokenPairs.has(key)) continue;\n seenUserTokenPairs.add(key);\n pairs.push({\n user: offer.offering as Address,\n token: offer.loanToken as Address,\n });\n }\n\n const { pools, links } = await fetchBalancesAndAllowances({\n client,\n chainId: chain.id,\n spender: chain.morpho,\n pairs,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n });\n\n const poolsMap = new Map(pools.map((p) => [p.id, p]));\n\n // each offer points to its allowance pool with allowance amount\n const offerPools: Liquidity.OfferLiquidityPool[] = [];\n for (const offer of offers) {\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user: offer.offering,\n chainId: chain.id,\n token: offer.loanToken,\n });\n\n const allowancePool = poolsMap.get(allowancePoolId);\n if (allowancePool) {\n offerPools.push({\n offerHash: offer.hash,\n poolId: allowancePoolId,\n amount: allowancePool.amount,\n });\n }\n }\n\n await liquidityStore.save({\n pools,\n links,\n offerPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n\n return latestBlockNumber;\n}\n","import { parseEventLogs } from \"viem\";\nimport { Chain, Offer } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectConsumedEvents<\n chain extends Chain.Chain,\n collector extends Collector.Name = \"consumed_events\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n options?: {\n maxBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n collector,\n withTransaction,\n client,\n chain,\n lastBlockNumber: blockNumber,\n epoch,\n options: { maxBatchSize = 1_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n const startBlock = blockNumber;\n let totalConsumedEvents = 0;\n\n const stream = Chain.streamLogs({\n client,\n contractAddress: chain.morpho,\n event: Offer.consumedEvent,\n blockNumberGte: blockNumber,\n order: \"asc\",\n options: { maxBatchSize },\n });\n\n for await (const { logs, blockNumber: lastStreamBlockNumber } of stream) {\n const parsedLogs = parseEventLogs({ abi: [Offer.consumedEvent], logs });\n\n await withTransaction(async ({ collectorStore, offerStore }) => {\n for (const log of parsedLogs) {\n try {\n if (log.blockNumber === null || log.logIndex === null || log.transactionHash === null) {\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"Skipping log because it is missing required fields\",\n });\n continue;\n }\n\n const offer = Offer.fromConsumedLog({\n blockNumber: log.blockNumber,\n logIndex: log.logIndex,\n chainId: Number(chain.id),\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 blockNumber: offer.blockNumber,\n });\n\n totalConsumedEvents++;\n } catch (err) {\n logger.error({ err, msg: \"Failed to process offer_consumed events\" });\n }\n }\n\n blockNumber = lastStreamBlockNumber;\n\n try {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch,\n });\n } catch (_) {\n try {\n const ancestor = await collectorStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n\n blockNumber = ancestor.blockNumber;\n\n const deleted = await offerStore.deleteManyConsumedAmountsByBlockNumberGte(blockNumber);\n\n logger.info({\n collector,\n chain_id: chain.id,\n msg: `Reorg detected, events deleted`,\n count: deleted,\n block_number: blockNumber,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch: ancestor.epoch,\n });\n } catch (err) {\n const msg = \"Failed to delete consumed events when handling reorg.\";\n logger.error({\n collector,\n chainId: chain.id,\n msg,\n err,\n });\n\n throw new Error(msg);\n }\n\n return blockNumber;\n }\n });\n }\n\n if (totalConsumedEvents > 0) {\n logger.info({\n msg: `Events indexed`,\n collector,\n count: totalConsumedEvents,\n chain_id: chain.id,\n block_range: [startBlock, blockNumber],\n });\n }\n\n return blockNumber;\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 { Address, PublicClient } from \"viem\";\nimport { Abi, Callback, type Chain, Maturity, type Offer } from \"#core\";\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 client: PublicClient;\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 const allowed = new Set(\n Callback.WhitelistedCallbackAddresses[Callback.CallbackType.BuyVaultV1Callback].map((a) =>\n a.toLowerCase(),\n ),\n );\n\n const callbackAddress = offer.callback.address?.toLowerCase();\n if (!callbackAddress || !allowed.has(callbackAddress)) {\n return {\n message:\n \"Buy offers with non-empty callback must use a whitelisted BuyVaultV1Callback.\",\n };\n }\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.SellERC20Callback].map((a) =>\n 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.decodeSellERC20Callback(offer.callback.data);\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.decodeSellERC20Callback(offer.callback.data);\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 const buyCallbackDataInvalid = single(\n \"buy_offers_callback_data_invalid\",\n (offer: Offer.Offer, _: MorphoContext) => {\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const decoded = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Buy offer callback data must include at least one vault.\" };\n }\n } catch (_) {\n return { message: \"Buy offer callback data cannot be decoded.\" };\n }\n }\n },\n );\n\n const buyCallbackVaultInvalid = batch(\n \"buy_offers_callback_vault_invalid\",\n async (offers: Offer.Offer[], { client, chain }: MorphoContext) => {\n const validationIssues = new Map<\n number,\n | Omit<\n Validation.Issue<Offer.Offer, \"buy_offers_callback_vault_invalid\">,\n \"ruleName\" | \"item\"\n >\n | undefined\n >();\n\n const offersByVaultAddress = new Map<string, Array<{ index: number; offer: Offer.Offer }>>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n if (offer.buy && offer.callback.data !== \"0x\") {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n if (!offersByVaultAddress.has(normalizedVaultAddress)) {\n offersByVaultAddress.set(normalizedVaultAddress, []);\n }\n offersByVaultAddress.get(normalizedVaultAddress)!.push({ index: i, offer });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n }\n\n const uniqueVaultAddresses = Array.from(offersByVaultAddress.keys());\n if (uniqueVaultAddresses.length === 0) return validationIssues;\n\n const whitelistedFactories = Object.values(chain.vaultV1Factory);\n\n const multicallContracts = [];\n for (const vaultAddress of uniqueVaultAddresses) {\n multicallContracts.push({\n address: vaultAddress as Address,\n abi: Abi.ERC4626,\n functionName: \"asset\",\n } as const);\n\n for (const factoryAddress of whitelistedFactories) {\n multicallContracts.push({\n address: factoryAddress as Address,\n abi: Abi.MetaMorphoFactory,\n functionName: \"isMetaMorpho\",\n args: [vaultAddress as Address],\n } as const);\n }\n }\n\n const multicallResults = await client.multicall({\n contracts: multicallContracts,\n allowFailure: true,\n });\n\n const vaultAssetByAddress = new Map<string, Address | null>();\n const registeredVaults = new Set<string>();\n\n const numberOfFactories = whitelistedFactories.length;\n\n let resultIndex = 0;\n for (const vaultAddress of uniqueVaultAddresses) {\n const assetCallResult = multicallResults[resultIndex++]!;\n const assetAddress =\n assetCallResult.status === \"success\" ? (assetCallResult.result as Address) : null;\n\n vaultAssetByAddress.set(vaultAddress, assetAddress);\n\n let isRegisteredInFactory = false;\n for (let factoryIndex = 0; factoryIndex < numberOfFactories; factoryIndex++) {\n const factoryCallResult = multicallResults[resultIndex++]!;\n\n if (factoryCallResult.status === \"success\" && factoryCallResult.result === true) {\n isRegisteredInFactory = true;\n }\n }\n\n if (isRegisteredInFactory) {\n registeredVaults.add(vaultAddress);\n }\n }\n\n const uniqueOffers = new Map<number, Offer.Offer>();\n for (const offersArray of offersByVaultAddress.values()) {\n for (const { index, offer } of offersArray) {\n uniqueOffers.set(index, offer);\n }\n }\n\n for (const [index, offer] of uniqueOffers) {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n const vaultsWithIssues: Array<{ vaultAddress: Address; failureReasons: string }> = [];\n\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n const assetAddress = vaultAssetByAddress.get(normalizedVaultAddress);\n const isRegistered = registeredVaults.has(normalizedVaultAddress);\n\n const failureReasons: string[] = [];\n\n if (assetAddress === null) {\n failureReasons.push(\"asset call failed\");\n } else if (\n assetAddress &&\n assetAddress.toLowerCase() !== offer.loanToken.toLowerCase()\n ) {\n failureReasons.push(\"asset mismatch\");\n }\n\n if (!isRegistered) {\n failureReasons.push(\"not registered in factory\");\n }\n\n if (failureReasons.length > 0) {\n vaultsWithIssues.push({\n vaultAddress: vault,\n failureReasons: failureReasons.join(\", \"),\n });\n }\n }\n\n if (vaultsWithIssues.length > 0) {\n const failureDetails = vaultsWithIssues\n .map((v) => `${v.vaultAddress} (${v.failureReasons})`)\n .join(\"; \");\n validationIssues.set(index, {\n message: `Buy offer callback vaults are invalid: ${failureDetails}`,\n });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n\n return validationIssues;\n },\n );\n\n const maturity = single(\"maturity\", (offer: Offer.Offer, _: MorphoContext) => {\n const allowedMaturities = [Maturity.from(\"end_of_month\"), Maturity.from(\"end_of_next_month\")];\n\n if (!allowedMaturities.includes(offer.maturity)) {\n return {\n message: `Maturity must be end of current month (${allowedMaturities[0]}) or end of next month (${allowedMaturities[1]}). Got: ${offer.maturity}`,\n };\n }\n });\n\n return [\n chainId,\n loanToken,\n expiry,\n maturity,\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 buyCallbackDataInvalid,\n buyCallbackVaultInvalid,\n ];\n}\n","import type { PublicClient } from \"viem\";\nimport * as Validation from \"#collectors/validations/Validation.ts\";\nimport * as ValidationRule from \"#collectors/validations/ValidationRule.ts\";\nimport type { Chain, Offer } from \"#core\";\nimport type * as Mempool from \"#mempool/index.ts\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectOffers<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n mempool: Mempool.Client;\n client: PublicClient;\n options: {\n maxBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: blockNumber,\n collector,\n mempool,\n client,\n options: { maxBatchSize = 1_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n const startBlock = blockNumber;\n const offersIndexed = 0;\n\n const stream = mempool.stream({\n order: \"asc\",\n blockNumberGte: blockNumber,\n options: { maxBatchSize },\n });\n\n for await (const { offers, blockNumber: blockNumberWatched } of stream) {\n await withTransaction(async ({ chainStore, collectorStore, offerStore }) => {\n const { epoch, blockNumber: latestBlockNumber } = await chainStore.getBlockNumber(chain.id);\n\n let validOffers: Offer.Offer[] = [];\n\n try {\n const result = await Validation.run({\n items: offers,\n rules: ValidationRule.morpho(),\n ctx: { chain, client },\n });\n\n validOffers = result.valid.filter((offer) => offer.blockNumber <= latestBlockNumber);\n } catch (err) {\n logger.error({ err, msg: \"Failed to validate offers\" });\n }\n\n await offerStore.createMany(validOffers.map((offer) => ({ offer })));\n\n blockNumber = blockNumberWatched;\n\n try {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch,\n });\n } catch (_) {\n try {\n const ancestor = await collectorStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n\n blockNumber = ancestor.blockNumber;\n\n const deleted = await offerStore.deleteManyByBlockNumberGte(blockNumber);\n\n logger.info({\n collector,\n chain_id: chain.id,\n msg: `Reorg detected, offers deleted`,\n count: deleted,\n block_number: blockNumber,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch: ancestor.epoch,\n });\n } catch (err) {\n const msg = \"Failed to delete offers when handling reorg.\";\n logger.error({\n collector,\n chainId: chain.id,\n msg,\n err,\n });\n\n throw new Error(msg);\n }\n\n return blockNumber;\n }\n });\n }\n\n if (offersIndexed > 0) {\n logger.info({\n msg: `Events indexed`,\n collector,\n count: offersIndexed,\n chain_id: chain.id,\n block_range: [startBlock, blockNumber],\n });\n }\n\n return blockNumber;\n}\n","import type { Address, Hex, PublicActions } from \"viem\";\nimport {\n fetchBalancesAndAllowances,\n fetchCollateralAndDebt,\n fetchOraclePrices,\n} from \"#collectors/fetchers/index.ts\";\nimport { Callback, type Chain, Liquidity, Offer } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectSellERC20CallbackLiquidity<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n collector,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"sell\",\n chains: [Number(chain.id)],\n callbackAddresses: [\n ...Callback.WhitelistedCallbackAddresses[Callback.CallbackType.SellERC20Callback],\n ],\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const pairs: Array<{ user: Address; token: Address }> = [];\n const seenUserTokenPairs = new Set<string>();\n const collateralDebtQueries: Array<{\n user: Address;\n obligationId: Hex;\n collateralAssets: Address[];\n }> = [];\n\n for (const offer of offers) {\n const callbackData = Callback.decodeSellERC20Callback(offer.callback.data);\n\n for (const { collateral } of callbackData) {\n const key = `${offer.offering}-${collateral}`.toLowerCase();\n if (seenUserTokenPairs.has(key)) continue;\n seenUserTokenPairs.add(key);\n pairs.push({\n user: offer.offering,\n token: collateral,\n });\n }\n\n const collateralAssets = offer.collaterals.map((collateral) => collateral.asset);\n collateralDebtQueries.push({\n user: offer.offering,\n obligationId: Offer.obligationId(offer),\n collateralAssets,\n });\n }\n\n const [balanceAllowanceLiquidity, obligationCollateralDebtLiquidity, oraclePrices] =\n await Promise.all([\n fetchBalancesAndAllowances({\n client,\n chainId: chain.id,\n spender: chain.morpho,\n pairs,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n fetchCollateralAndDebt({\n client,\n chainId: chain.id,\n morphoAddress: chain.morpho,\n queries: collateralDebtQueries,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n fetchOraclePrices({\n client,\n oracles: [...new Set(offers.flatMap((o) => o.collaterals.map((c) => c.oracle)))],\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n ]);\n\n const allPools: Liquidity.LiquidityPool[] = [];\n const allLinks: Liquidity.LiquidityLink[] = [];\n const allOfferPools: Liquidity.OfferLiquidityPool[] = [];\n\n allPools.push(...balanceAllowanceLiquidity.pools);\n allLinks.push(...balanceAllowanceLiquidity.links);\n allPools.push(...obligationCollateralDebtLiquidity.pools);\n\n const poolsMap = new Map(allPools.map((p) => [p.id, p]));\n\n for (const offer of offers) {\n const user = offer.offering;\n const obligationId = Offer.obligationId(offer);\n\n const callbackData = Callback.decodeSellERC20Callback(offer.callback.data);\n const callbackAmountsByCollateral = new Map<string, bigint>();\n for (const callbackItem of callbackData) {\n callbackAmountsByCollateral.set(\n callbackItem.collateral.toLowerCase(),\n callbackItem.amount,\n );\n }\n\n for (const offerCollateral of offer.collaterals) {\n const token = offerCollateral.asset;\n const oraclePrice = oraclePrices.get(offerCollateral.oracle);\n if (!oraclePrice) continue;\n\n const lltv = offerCollateral.lltv;\n const callbackAmount = callbackAmountsByCollateral.get(token.toLowerCase()) ?? 0n;\n\n const obligationCollateralPoolId = Liquidity.generateObligationCollateralPoolId({\n user,\n chainId: chain.id,\n obligationId,\n token,\n });\n const obligationCollateralPool = poolsMap.get(obligationCollateralPoolId);\n const obligationCollateralAmount = obligationCollateralPool\n ? obligationCollateralPool.amount\n : 0n;\n\n if (callbackAmount > 0n) {\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user,\n chainId: chain.id,\n token,\n });\n const callbackPoolId = Liquidity.generateSellERC20CallbackPoolId({\n user,\n chainId: chain.id,\n obligationId,\n token,\n offerHash: offer.hash,\n });\n\n allPools.push({\n id: callbackPoolId,\n amount: callbackAmount,\n });\n\n allLinks.push({\n parentPoolId: callbackPoolId,\n childPoolId: allowancePoolId,\n priority: 0,\n });\n\n const maxDebt = Liquidity.calculateMaxDebt(callbackAmount, oraclePrice, lltv);\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: callbackPoolId,\n amount: maxDebt,\n });\n }\n\n if (obligationCollateralAmount > 0n) {\n const maxDebt = Liquidity.calculateMaxDebt(\n obligationCollateralAmount,\n oraclePrice,\n lltv,\n );\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: obligationCollateralPoolId,\n amount: maxDebt,\n });\n }\n }\n\n const debtPoolId = Liquidity.generateDebtPoolId({\n user,\n chainId: chain.id,\n obligationId,\n });\n const debtPool = poolsMap.get(debtPoolId);\n if (debtPool) {\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: debtPoolId,\n amount: debtPool.amount,\n });\n }\n }\n\n await liquidityStore.save({\n pools: allPools,\n links: allLinks,\n offerPools: allOfferPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n return latestBlockNumber;\n}\n","import type { PublicClient } from \"viem\";\nimport type { Chain } from \"#core\";\nimport * as Mempool from \"#mempool/index.ts\";\nimport * as Services from \"#services/Services.ts\";\nimport * as CollectorStore from \"#stores/CollectorStore.ts\";\nimport type { PG } from \"#stores/index.ts\";\nimport * as CollectFunctions from \"./CollectFunctions/index.ts\";\nimport * as Collector from \"./Collector.ts\";\n\nexport type Builder<chain extends Chain.Chain = Chain.Chain> = {\n buildMempoolCollector: (parameters: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"mempool_offers\", chain>;\n\n buildConsumedEventsCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"consumed_events\", chain>;\n\n buildBuyWithEmptyCallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"buy_with_empty_callback_liquidity\", chain>;\n\n buildSellERC20CallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"sell_erc20_callback_liquidity\", chain>;\n\n buildBuyVaultV1CallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"buy_vault_v1_callback_liquidity\", chain>;\n};\n\nexport function createBuilder<chain extends Chain.Chain = Chain.Chain>(parameters: {\n client: PublicClient;\n chain: chain;\n db: PG.PG;\n options: { interval: number; maxBlockNumber?: number };\n}): Builder<chain> {\n const { client, chain, db, options } = parameters;\n const collectorStore = CollectorStore.create({ db });\n const withTransaction = <T>() => Services.createWithTransaction<T>(db);\n\n const createCollector = <name extends Collector.Name>(\n name: name,\n collect: Collector.CollectFn<chain, name>,\n ): Collector.Collector<name, chain> =>\n Collector.create<name, chain>({\n name,\n collect,\n client,\n chain,\n withTransaction: withTransaction(),\n collectorStore,\n options,\n });\n\n return {\n buildMempoolCollector: ({ options: { maxBatchSize = 1_000 } = {} }) => {\n return createCollector(\"mempool_offers\", (p) =>\n CollectFunctions.collectOffers<chain, \"mempool_offers\">({\n ...p,\n collector: \"mempool_offers\",\n mempool: Mempool.connect({\n // @ts-ignore - ok to use public client for watching\n client,\n mempoolAddress: chain.mempool!.address,\n }),\n client,\n options: { maxBatchSize },\n }),\n );\n },\n\n buildConsumedEventsCollector: ({ options: { maxBatchSize = 1_000 } = {} } = {}) => {\n return createCollector(\"consumed_events\", (p) =>\n CollectFunctions.collectConsumedEvents<chain, \"consumed_events\">({\n ...p,\n collector: \"consumed_events\",\n options: { maxBatchSize },\n }),\n );\n },\n\n buildBuyWithEmptyCallbackLiquidityCollector: ({\n options: { maxBatchSize = 1_000 } = {},\n } = {}) => {\n return createCollector(\"buy_with_empty_callback_liquidity\", (p) =>\n CollectFunctions.collectBuyWithEmptyCallbackLiquidity<\n chain,\n \"buy_with_empty_callback_liquidity\"\n >({\n ...p,\n collector: \"buy_with_empty_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n\n buildSellERC20CallbackLiquidityCollector: ({ options: { maxBatchSize = 1_000 } = {} } = {}) => {\n return createCollector(\"sell_erc20_callback_liquidity\", (p) =>\n CollectFunctions.collectSellERC20CallbackLiquidity<chain, \"sell_erc20_callback_liquidity\">({\n ...p,\n collector: \"sell_erc20_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n\n buildBuyVaultV1CallbackLiquidityCollector: ({\n options: { maxBatchSize = 1_000 } = {},\n } = {}) => {\n return createCollector(\"buy_vault_v1_callback_liquidity\", (p) =>\n CollectFunctions.collectBuyVaultV1CallbackLiquidity<\n chain,\n \"buy_vault_v1_callback_liquidity\"\n >({\n ...p,\n collector: \"buy_vault_v1_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n };\n}\n","import * as Collector from \"#collectors/index.ts\";\nimport type { Chain } from \"#core\";\nimport type { ChainStore, CollectorStore } from \"#stores/index.ts\";\n\nexport type CollectorHealthStatus = \"live\" | \"lagging\" | \"unknown\";\nexport type RouterStatus = \"live\" | \"syncing\";\n\nexport type CollectorHealth = {\n name: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number | null;\n updatedAt: string | null;\n lag: number | null;\n status: CollectorHealthStatus;\n};\n\nexport type ChainHealth = {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: string;\n updatedAt: string;\n};\n\nexport type HealthService = {\n getStatus: () => Promise<RouterStatus>;\n getCollectors: () => Promise<CollectorHealth[]>;\n getChains: () => Promise<ChainHealth[]>;\n};\n\nexport type HealthServiceParameters = {\n collectorStore: CollectorStore.CollectorStore;\n chainStore: ChainStore.ChainStore;\n /** Maximum number of blocks a collector can lag behind its chain before being considered lagging. */\n maxAllowedLag?: number;\n};\n\nconst DEFAULT_MAX_ALLOWED_LAG = 5;\n\ntype Snapshot = {\n status: RouterStatus;\n collectors: CollectorHealth[];\n chains: ChainHealth[];\n};\n\n/**\n * Create a health service that exposes collector and chain block numbers.\n */\nexport function create(parameters: HealthServiceParameters): HealthService {\n const { collectorStore, chainStore, maxAllowedLag = DEFAULT_MAX_ALLOWED_LAG } = parameters;\n\n const loadSnapshot = async (): Promise<Snapshot> => {\n const [collectorRows, chainRows] = await Promise.all([\n collectorStore.getBlockNumbers(),\n chainStore.getBlockNumbers(),\n ]);\n\n const chainById = new Map<bigint, { blockNumber: number; epoch: bigint; updatedAt: Date }>();\n for (const chain of chainRows) {\n chainById.set(chain.chainId, {\n blockNumber: chain.blockNumber,\n epoch: chain.epoch,\n updatedAt: chain.updatedAt,\n });\n }\n\n const collectorKey = (chainId: bigint, name: Collector.Name) => `${chainId}:${name}`;\n const collectorsByKey = new Map<\n string,\n {\n name: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n updatedAt: Date;\n }\n >();\n\n for (const row of collectorRows) {\n collectorsByKey.set(collectorKey(row.chainId, row.collectorName), {\n name: row.collectorName,\n chainId: row.chainId,\n blockNumber: row.blockNumber,\n updatedAt: row.updatedAt,\n });\n }\n\n const chainIds = new Set<bigint>();\n for (const chain of chainRows) chainIds.add(chain.chainId);\n for (const row of collectorRows) chainIds.add(row.chainId);\n\n const collectors: CollectorHealth[] = Array.from(chainIds)\n .sort((a, b) => (a - b > 0 ? 1 : -1))\n .flatMap((chainId) =>\n [...Collector.names].sort().map((name) => {\n const row = collectorsByKey.get(collectorKey(chainId, name));\n const chain = chainById.get(chainId);\n\n const blockNumber = row?.blockNumber ?? null;\n const chainBlockNumber = chain?.blockNumber ?? null;\n const lag =\n blockNumber !== null && chainBlockNumber !== null\n ? Math.max(chainBlockNumber - blockNumber, 0)\n : null;\n\n let status: CollectorHealthStatus = \"unknown\";\n if (lag !== null) {\n status = lag <= maxAllowedLag ? \"live\" : \"lagging\";\n } else if (chainBlockNumber !== null) {\n status = \"lagging\";\n }\n\n return {\n name,\n chainId: chainId as Chain.Id,\n blockNumber,\n updatedAt: row ? row.updatedAt.toISOString() : null,\n lag,\n status,\n } satisfies CollectorHealth;\n }),\n );\n\n const chains: ChainHealth[] = chainRows\n .map((chain) => ({\n chainId: chain.chainId,\n blockNumber: chain.blockNumber,\n epoch: chain.epoch.toString(),\n updatedAt: chain.updatedAt.toISOString(),\n }))\n .sort((a, b) => (a.chainId - b.chainId > 0 ? 1 : -1));\n\n const status: RouterStatus =\n collectors.length > 0 && collectors.every((collector) => collector.status === \"live\")\n ? \"live\"\n : \"syncing\";\n\n return {\n status,\n collectors,\n chains,\n };\n };\n\n return {\n async getStatus(): Promise<RouterStatus> {\n const snapshot = await loadSnapshot();\n return snapshot.status;\n },\n\n async getCollectors(): Promise<CollectorHealth[]> {\n const snapshot = await loadSnapshot();\n return snapshot.collectors;\n },\n\n async getChains(): Promise<ChainHealth[]> {\n const snapshot = await loadSnapshot();\n return snapshot.chains;\n },\n };\n}\n","import * as z from \"zod\";\nimport type { Compute } from \"#core\";\n\nexport type Payload<T> = Compute<{\n statusCode: STATUS_CODE;\n body: {\n status: \"success\" | \"error\";\n meta: {\n timestamp: string;\n };\n } & (\n | {\n cursor?: string | null;\n data: T;\n }\n | {\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n }\n );\n}>;\n\nexport function success<T>({ data, cursor }: { data: T; cursor?: string | null }): Payload<T> {\n return {\n statusCode: STATUS_CODE.SUCCESS,\n body: {\n status: \"success\",\n cursor,\n data,\n meta: {\n timestamp: new Date().toISOString(),\n },\n },\n };\n}\n\nexport function error<T>(error: unknown): Payload<T> {\n if (error instanceof APIError) {\n return handleAPIError(error);\n }\n\n if (error instanceof SyntaxError) {\n return handleAPIError(new BadRequestError(error.message));\n }\n\n if (error instanceof z.ZodError) {\n return handleAPIError(handleZodError(error));\n }\n\n return handleAPIError(new InternalServerError());\n}\n\nfunction handleAPIError<T>(error: APIError): Payload<T> {\n return {\n statusCode: error.statusCode,\n body: {\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\nexport enum STATUS_CODE {\n SUCCESS = 200,\n BAD_REQUEST = 400,\n NOT_FOUND = 404,\n INTERNAL_SERVER_ERROR = 500,\n}\n\nexport class APIError extends Error {\n constructor(\n public statusCode: STATUS_CODE,\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(STATUS_CODE.BAD_REQUEST, message, \"VALIDATION_ERROR\", details);\n }\n}\n\nexport class NotFoundError extends APIError {\n constructor(message: string) {\n super(STATUS_CODE.NOT_FOUND, message, \"NOT_FOUND\");\n }\n}\n\nexport class InternalServerError extends APIError {\n constructor(message = \"Internal server error\") {\n super(STATUS_CODE.INTERNAL_SERVER_ERROR, message, \"INTERNAL_SERVER_ERROR\");\n }\n}\n\nexport class BadRequestError extends APIError {\n constructor(message = \"Invalid JSON format\", details?: unknown) {\n super(STATUS_CODE.BAD_REQUEST, 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\" && err.format === \"regex\") {\n issue = err.message;\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","import { type Health, Logger } from \"#services/index.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport * as ApiPayload from \"../Payload.ts\";\n\nexport async function getHealth(healthService: Health.HealthService) {\n const logger = Logger.getLogger();\n try {\n const status = await healthService.getStatus();\n return ApiPayload.success({ data: Format.toSnakeCase({ status }) });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.error(err);\n }\n}\n\nexport async function getHealthChains(healthService: Health.HealthService) {\n const logger = Logger.getLogger();\n try {\n const chains = await healthService.getChains();\n return ApiPayload.success({\n data: chains.map(({ chainId, blockNumber, updatedAt }) =>\n Format.toSnakeCase({\n chainId,\n blockNumber,\n updatedAt,\n }),\n ),\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status for chains\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.error(err);\n }\n}\n\nexport async function getHealthCollectors(healthService: Health.HealthService) {\n const logger = Logger.getLogger();\n try {\n const collectors = await healthService.getCollectors();\n return ApiPayload.success({\n data: collectors.map(({ name, chainId, blockNumber, updatedAt, lag, status }) =>\n Format.toSnakeCase({\n name,\n chainId,\n blockNumber,\n updatedAt,\n lag,\n status,\n }),\n ),\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status for collectors\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.error(err);\n }\n}\n","import type { Hex } from \"viem\";\nimport type { Compute, Obligation, Quote } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type ObligationResponse = Format.Snake<\n Compute<\n {\n /** The obligation id. */\n id: Hex;\n } & Obligation.Obligation & {\n ask: Quote.Quote[\"ask\"];\n bid: Quote.Quote[\"bid\"];\n }\n >\n>;\n\n/**\n * Creates an `ObligationResponse` from a `Obligation`.\n * @constructor\n * @param obligation - {@link Obligation}\n * @returns The created `ObligationResponse`. {@link ObligationResponse}\n */\nexport function from(obligation: Obligation.Obligation, quote: Quote.Quote): ObligationResponse {\n return Format.toSnakeCase({\n id: quote.obligationId,\n ...obligation,\n ask: quote.ask,\n bid: quote.bid,\n });\n}\n","import type { Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\n\nexport type OfferResponse = Format.Snake<Offer.Offer>;\n\n/**\n * Creates an `OfferResponse` from an `Offer`.\n * @constructor\n * @param offer - {@link Offer}\n * @returns The created `OfferResponse`. {@link OfferResponse}\n */\nexport function from(offer: Offer.Offer): OfferResponse {\n return Format.toSnakeCase(offer);\n}\n","import { Obligation } from \"#core\";\nimport { Logger } from \"#services/index.ts\";\nimport type { OfferStore } from \"#stores/index.ts\";\nimport * as ApiPayload from \"../Payload.ts\";\nimport * as ApiSchema from \"../Schema/index.ts\";\n\nexport async function getObligations(queryParameters: object, store: OfferStore.OfferStore) {\n const logger = Logger.getLogger();\n const result = ApiSchema.safeParse(\"get_obligations\", queryParameters, (issue) => issue.message);\n\n if (!result.success) return ApiPayload.error(result.error);\n const query = result.data;\n\n try {\n const { obligations, nextCursor } = await store.getAllObligations({\n cursor: query.cursor,\n limit: query.limit,\n });\n\n const quotes = await store.getQuotes({\n obligationIds: obligations.map((o) => Obligation.id(o)),\n });\n\n return ApiPayload.success({\n data: obligations.map((o) =>\n ApiSchema.ObligationResponse.from(\n o,\n quotes.find((q) => q.obligationId === Obligation.id(o)) ?? {\n obligationId: Obligation.id(o),\n ask: { rate: 0n },\n bid: { rate: 0n },\n },\n ),\n ),\n cursor: nextCursor ?? null,\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error get obligations\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n\n return ApiPayload.error(err);\n }\n}\n","import { Logger } from \"#services/index.ts\";\nimport type { OfferStore } from \"#stores/index.ts\";\nimport * as ApiPayload from \"../Payload.ts\";\nimport * as ApiSchema from \"../Schema/index.ts\";\n\nexport async function getOffers(queryParameters: object, store: OfferStore.OfferStore) {\n const logger = Logger.getLogger();\n\n const result = ApiSchema.safeParse(\"get_offers\", queryParameters, (issue) => issue.message);\n\n if (!result.success) return ApiPayload.error(result.error);\n const query = result.data;\n\n try {\n const offers = await store.findMatchingOffers({\n side: query.side,\n obligationId: query.obligation_id,\n cursor: query.cursor,\n limit: query.limit,\n });\n\n return ApiPayload.success({\n data: offers.offers.map(ApiSchema.OfferResponse.from),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error get offers\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n\n return ApiPayload.error(err);\n }\n}\n","import { serve as serveHono } from \"@hono/node-server\";\nimport { type Context, Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type * as Health from \"#services/Health.ts\";\nimport type { OfferStore } from \"#stores/index.ts\";\nimport * as Controllers from \"./Controllers/index.ts\";\n\nexport type RouterApiConfig = {\n store: OfferStore.OfferStore;\n healthService: Health.HealthService;\n};\n\nexport type RouterApi = {\n serve: (parameters: { port: number }) => void;\n};\n\nexport function create(config: RouterApiConfig): RouterApi {\n return {\n serve: ({ port }) => {\n serve({ ...config, port });\n },\n };\n}\n\n/**\n * Start a local router server.\n * @example\n * ```ts\n * import { RouterApi } from \"@morpho-dev/router\";\n * RouterApi.serve({ port: 8081 }); // local router API server running on http://localhost:8081\n * ```\n */\nfunction serve(parameters: RouterApiConfig & { port: number }) {\n const app = new Hono();\n const { store, healthService } = parameters;\n\n app.use(\"*\", cors());\n\n app.get(\"/v1/offers\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getOffers(c.req.query(), store);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/obligations\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getObligations(c.req.query(), store);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealth(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health/collectors\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealthCollectors(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health/chains\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealthChains(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/docs/swagger.json\", (c: Context) =>\n c.text(JSON.stringify(Controllers.getSwaggerJson()), 200, {\n \"Content-Type\": \"application/json; charset=utf-8\",\n }),\n );\n app.get(\"/docs\", (c: Context) => c.html(Controllers.getDocsHtml(), 200));\n\n serveHono({\n fetch: app.fetch,\n port: parameters.port,\n });\n}\n","import { and, asc, eq, sql } from \"drizzle-orm\";\nimport { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport { chains } from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type ChainStore = {\n /** Get the latest block number processed by a given chain alongside its epoch. */\n getBlockNumber: (chainId: Chain.Id) => Promise<{ blockNumber: number; epoch: bigint }>;\n\n /** Get the latest block number processed for all chains, optionally filtered by chain id. */\n getBlockNumbers: (parameters?: { chainId?: Chain.Id }) => Promise<\n Array<{\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n updatedAt: Date;\n }>\n >;\n\n /** Save the latest block number processed for a given chain alongside its epoch.*/\n saveBlockNumber: (parameters: {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): ChainStore => {\n const db = config.db;\n const logger = Logger.getLogger();\n\n return {\n getBlockNumber: async (chainId: Chain.Id) => {\n const res = await db\n .select({\n blockNumber: chains.blockNumber,\n epoch: chains.epoch,\n })\n .from(chains)\n .where(eq(chains.chainId, chainId));\n\n if (res.length === 0) {\n const msg = `No block number found for chain ${chainId}`;\n logger.debug({ service: \"chain_store\", msg });\n\n const deploymentBlock = Chain.getChain(chainId)?.mempool.deploymentBlock || 0;\n\n await db\n .insert(chains)\n .values({\n chainId,\n blockNumber: deploymentBlock,\n })\n .onConflictDoNothing();\n\n return {\n blockNumber: deploymentBlock,\n epoch: 0n,\n };\n }\n\n return { blockNumber: Number(res[0]!.blockNumber), epoch: BigInt(res[0]!.epoch) };\n },\n\n getBlockNumbers: async (parameters?: { chainId?: Chain.Id }) => {\n const rows = await db\n .select({\n chainId: chains.chainId,\n blockNumber: chains.blockNumber,\n epoch: chains.epoch,\n updatedAt: chains.updatedAt,\n })\n .from(chains)\n .where(\n parameters?.chainId !== undefined ? eq(chains.chainId, parameters.chainId) : sql`TRUE`,\n )\n .orderBy(asc(chains.chainId));\n\n return rows.map((row) => ({\n chainId: row.chainId,\n blockNumber: Number(row.blockNumber),\n epoch: BigInt(row.epoch),\n updatedAt: row.updatedAt,\n }));\n },\n\n saveBlockNumber: async (parameters: {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => {\n await db\n .update(chains)\n .set({\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n updatedAt: sql`now()`,\n })\n .where(and(eq(chains.chainId, parameters.chainId)));\n },\n };\n};\n","import { sql } from \"drizzle-orm\";\nimport type { Liquidity, Offer } from \"#core\";\nimport { liquidityLinks, liquidityPools, offerLiquidityPools } from \"#stores/drizzle/schema.ts\";\nimport type * as PG from \"#stores/PG.ts\";\n\nexport type LiquidityStore = {\n /**\n * Get all liquidity pools.\n * @returns Array of all liquidity pools\n */\n getAllPools: () => Promise<Liquidity.LiquidityPool[]>;\n\n /**\n * Get all liquidity links.\n * @returns Array of all liquidity links\n */\n getAllLinks: () => Promise<Liquidity.LiquidityLink[]>;\n\n /**\n * Get all offer-pool mappings.\n * @returns Array of all offer liquidity pools\n */\n getAllOfferPools: () => Promise<Liquidity.OfferLiquidityPool[]>;\n\n /**\n * Save or update liquidity data.\n * Accepts flat arrays of pools, links, and offer-pool mappings.\n *\n * Automatically cleans up stale links: for each parent pool being updated,\n * deletes any existing links with priority greater than the maximum priority\n * in the new links. This ensures that when priority-ordered relationships\n * shrink, old links are removed.\n *\n * @param parameters - Object containing arrays of pools, links, and offerPools\n */\n save: (parameters: {\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n offerPools: Liquidity.OfferLiquidityPool[];\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): LiquidityStore => {\n const db = config.db;\n\n return {\n getAllPools: async () => {\n const result = await db.select().from(liquidityPools);\n return result.map((row) => ({\n id: row.id,\n amount: BigInt(row.amount),\n }));\n },\n\n getAllLinks: async () => {\n const result = await db.select().from(liquidityLinks);\n return result.map((row) => ({\n parentPoolId: row.parentPoolId,\n childPoolId: row.childPoolId,\n priority: row.priority,\n }));\n },\n\n getAllOfferPools: async () => {\n const result = await db.select().from(offerLiquidityPools);\n return result.map((row) => ({\n offerHash: row.offerHash as Offer.Offer[\"hash\"],\n poolId: row.poolId,\n amount: BigInt(row.amount),\n }));\n },\n\n save: async (parameters: {\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n offerPools: Liquidity.OfferLiquidityPool[];\n }) => {\n const { pools: poolsToSave, links: linksToSave, offerPools: offerPoolsToSave } = parameters;\n\n await db.transaction(async (tx) => {\n for (const pool of poolsToSave) {\n await tx\n .insert(liquidityPools)\n .values({\n id: pool.id,\n amount: pool.amount.toString(),\n })\n .onConflictDoUpdate({\n target: liquidityPools.id,\n set: {\n amount: pool.amount.toString(),\n updatedAt: sql`now()`,\n },\n where: sql`${liquidityPools.amount} IS DISTINCT FROM excluded.amount`,\n });\n }\n\n const maxPriorityByParent = new Map<string, number>();\n for (const link of linksToSave) {\n const currentMax = maxPriorityByParent.get(link.parentPoolId) ?? -1;\n if (link.priority > currentMax) {\n maxPriorityByParent.set(link.parentPoolId, link.priority);\n }\n }\n\n for (const [parentPoolId, maxPriority] of maxPriorityByParent.entries()) {\n await tx\n .delete(liquidityLinks)\n .where(\n sql`${liquidityLinks.parentPoolId} = ${parentPoolId} AND ${liquidityLinks.priority} > ${maxPriority}`,\n );\n }\n\n for (const link of linksToSave) {\n await tx\n .insert(liquidityLinks)\n .values({\n parentPoolId: link.parentPoolId,\n childPoolId: link.childPoolId,\n priority: link.priority,\n })\n .onConflictDoUpdate({\n target: [liquidityLinks.parentPoolId, liquidityLinks.priority],\n set: {\n childPoolId: link.childPoolId,\n updatedAt: sql`now()`,\n },\n where: sql`${liquidityLinks.childPoolId} IS DISTINCT FROM excluded.child_pool_id`,\n });\n }\n\n for (const offerPool of offerPoolsToSave) {\n await tx\n .insert(offerLiquidityPools)\n .values({\n offerHash: offerPool.offerHash,\n poolId: offerPool.poolId,\n amount: offerPool.amount.toString(),\n })\n .onConflictDoUpdate({\n target: [offerLiquidityPools.offerHash, offerLiquidityPools.poolId],\n set: {\n amount: offerPool.amount.toString(),\n updatedAt: sql`now()`,\n },\n where: sql`${offerLiquidityPools.amount} IS DISTINCT FROM excluded.amount`,\n });\n }\n });\n },\n };\n};\n","import { and, asc, desc, eq, gt, gte, inArray, lte, sql } from \"drizzle-orm\";\nimport { type Address, type Hex, parseUnits } from \"viem\";\nimport { Collateral, LLTV, Maturity, Obligation, Offer, Quote } from \"#core\";\nimport { Time } from \"#utils/index.ts\";\nimport {\n consumed as consumedTable,\n liquidityLinks,\n liquidityPools,\n obligationCollaterals,\n obligations,\n offerLiquidityPools,\n offers,\n} from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\nimport { Cursor } from \"./utils/index.ts\";\n\n/**\n * The `OfferStore` is responsible for managing offer-related data.\n */\nexport type OfferStore = {\n /** Create a single offer. */\n create: (parameters: { offer: Offer.Offer }) => Promise<string>;\n\n /** Create multiple offers. */\n createMany: (parameters: { offer: Offer.Offer }[]) => Promise<string[]>;\n\n /** Get all offers with optional filtering, sorting, and pagination. */\n getAll: (params?: GetAllParams) => Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n }>;\n\n /** Find offers that match the specified parameters, with cursor pagination. */\n findMatchingOffers: (\n params: FindMatchingOffersParams & { implementation?: \"nodejs\" | \"sql\" },\n ) => Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n implementation?: \"nodejs\" | \"sql\";\n }>;\n\n /** Delete an offer by hash. */\n delete: (hash: Offer.Offer[\"hash\"]) => Promise<boolean>;\n\n /** Delete multiple offers by hashes. */\n deleteMany: (hashes: Offer.Offer[\"hash\"][]) => Promise<number>;\n\n /** Delete multiple offers by block number greater than or equal to the given value. */\n deleteManyByBlockNumberGte: (blockNumberGte: number) => Promise<number>;\n\n /** Update the consumed amount for a set of offers with the same chainId, offering, and nonce. */\n updateConsumedAmount: (parameters: {\n id: string;\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n blockNumber: number;\n }) => Promise<void>;\n\n /** Delete multiple consumed amounts by block number greater than or equal to the given value. */\n deleteManyConsumedAmountsByBlockNumberGte: (blockNumberGte: number) => Promise<number>;\n\n /** Get all obligations */\n getAllObligations: (parameters?: { cursor?: string; limit?: number }) => Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }>;\n\n /** Get quotes for given obligations. */\n getQuotes: (parameters: { obligationIds: Hex[] }) => Promise<Quote.Quote[]>;\n};\n\nexport type GetOffersFilters = {\n creators?: string[];\n side?: \"buy\" | \"sell\";\n chains?: number[];\n loanTokens?: string[];\n callbackAddresses?: string[];\n minAmount?: bigint;\n maxAmount?: bigint;\n minRate?: bigint;\n maxRate?: bigint;\n minMaturity?: number;\n maxMaturity?: number;\n minExpiry?: number;\n maxExpiry?: number;\n collateralAssets?: string[];\n collateralOracles?: string[];\n collateralTuple?: Array<{\n asset: string;\n oracle?: string;\n lltv?: LLTV.LLTV;\n }>;\n minLltv?: number; // 0-100 scale\n maxLltv?: number; // 0-100 scale\n sortBy?: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n sortOrder?: \"asc\" | \"desc\";\n cursor?: string;\n limit?: number;\n};\n\nexport type FindMatchingOffersParams = {\n /** The side of the offer. */\n side: \"buy\" | \"sell\";\n /** The obligationId of the offer. */\n obligationId: Hex;\n /** Cursor string returned by a previous call, for pagination */\n cursor?: string;\n /** Page size; defaults to 20 */\n limit?: number;\n};\n\nexport type GetAllParams = {\n query?: GetOffersFilters;\n};\n\nexport type PgConfig = {\n /** The database instance to use for operations. */\n db: PG.PG;\n};\n\nexport function create(config: PgConfig): OfferStore {\n const db = config.db;\n\n return {\n create: async (parameters: { offer: Offer.Offer }): Promise<string> => {\n const { offer } = parameters;\n\n return await db.transaction(async (tx) => {\n const obligationId = Offer.obligationId(offer);\n\n await tx\n .insert(obligations)\n .values({\n obligationId,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n maturity: offer.maturity,\n })\n .onConflictDoNothing();\n\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n obligationId,\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 blockNumber: offer.blockNumber,\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\n .insert(obligationCollaterals)\n .values({\n obligationId,\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n })\n .onConflictDoNothing();\n }\n\n return offer.hash;\n });\n },\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n }[],\n ): Promise<string[]> => {\n return await db.transaction(async (tx) => {\n const hashes: string[] = [];\n\n for (const { offer } of parameters) {\n const obligationId = Offer.obligationId(offer);\n await tx\n .insert(obligations)\n .values({\n obligationId,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n maturity: offer.maturity,\n })\n .onConflictDoNothing();\n\n const result = await tx\n .insert(offers)\n .values({\n obligationId,\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 blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing()\n .returning();\n\n // early return to avoid inserting collaterals if the offer already exists\n if (result.length === 0) continue;\n\n for (const collateral of offer.collaterals) {\n await tx\n .insert(obligationCollaterals)\n .values({\n obligationId,\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n })\n .onConflictDoNothing();\n }\n\n hashes.push(offer.hash);\n }\n\n return hashes;\n });\n },\n\n getAll: async (\n params?: GetAllParams,\n ): Promise<{\n offers: Offer.Offer[];\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 obligationCollaterals.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 obligationCollaterals.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`${obligationCollaterals.asset} = ${tuple.asset.toLowerCase()}`,\n ];\n if (tuple.oracle) {\n parts.push(sql`${obligationCollaterals.oracle} = ${tuple.oracle.toLowerCase()}`);\n }\n if (tuple.lltv !== undefined) {\n parts.push(sql`${obligationCollaterals.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(obligationCollaterals.lltv, parseUnits(query.minLltv.toString(), 16)));\n }\n if (query?.maxLltv !== undefined) {\n conditions.push(lte(obligationCollaterals.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 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 collateralAsset: obligationCollaterals.asset,\n collateralOracle: obligationCollaterals.oracle,\n collateralLltv: obligationCollaterals.lltv,\n blockNumber: offers.blockNumber,\n })\n .from(offers)\n .leftJoin(\n obligationCollaterals,\n eq(offers.obligationId, obligationCollaterals.obligationId),\n )\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n conditions.length > 0 ? and(...conditions) : sql`true`,\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 collaterals: Array<Collateral.Collateral>;\n blockNumber: number;\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 collaterals: [],\n blockNumber: row.blockNumber,\n };\n\n if (row.collateralAsset && row.collateralOracle && row.collateralLltv) {\n offer.collaterals.push(\n Collateral.from({\n asset: row.collateralAsset as Address,\n oracle: row.collateralOracle as Address,\n lltv: LLTV.from(row.collateralLltv),\n }),\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 returnedOffers: Offer.Offer[] = [];\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.sort((a, b) =>\n a.asset.toLowerCase().localeCompare(b.asset.toLowerCase()),\n ),\n callback: {\n address: offerData.callbackAddress,\n data: offerData.callbackData,\n gasLimit: offerData.callbackGasLimit,\n },\n consumed: offerData.consumed,\n blockNumber: offerData.blockNumber,\n ...(offerData.signature !== null ? { signature: offerData.signature } : undefined),\n });\n\n returnedOffers.push(offer);\n }\n\n return { offers: returnedOffers, nextCursor };\n },\n\n /**\n * Find takable offers that satisfy user filters and remain executable when\n * competing over shared liquidity.\n *\n * The query addresses:\n * - Effective liquidity: compute usable capacity per pool by propagating\n * bottlenecks bottom-up across the offer’s reachable subgraph.\n * - Cross-validation: simulate sequential execution (by priority) so that\n * later offers see capacity reduced by earlier selections.\n *\n * Filtering guarantees:\n * - Side, chain, non-expired, non-matured\n * - Optional exact maturity or [min, max] window\n * - Optional loanToken and creator\n * - Optional rate threshold: buy → rate <= threshold, sell → rate >= threshold\n * - Optional exact collateral set match ((asset, oracle, lltv) tuples)\n *\n * Ordering:\n * - Buy: ascending rate; Sell: descending rate. Cursor resumes on (rate, hash).\n */\n findMatchingOffers: async (\n params: FindMatchingOffersParams & { implementation?: \"nodejs\" | \"sql\" },\n ): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n implementation?: \"nodejs\" | \"sql\";\n }> => {\n if (params.implementation === \"sql\") {\n return sqlFindMatchingOffers(db, params);\n }\n return nodeJsFindMatchingOffers(db, params);\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 deleteManyByBlockNumberGte: async (blockNumberGte: number): Promise<number> => {\n const result = await db.delete(offers).where(sql`${offers.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\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 blockNumber: number;\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 blockNumber: parameters.blockNumber,\n })\n .onConflictDoNothing();\n },\n\n deleteManyConsumedAmountsByBlockNumberGte: async (blockNumberGte: number): Promise<number> => {\n const result = await db\n .delete(consumedTable)\n .where(sql`${consumedTable.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\n },\n\n getAllObligations: async (parameters?: {\n cursor?: string;\n limit?: number;\n }): Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }> => {\n const { cursor, limit = 100 } = parameters ?? {};\n\n const result = await db\n .select({\n obligationId: obligations.obligationId,\n chainId: obligations.chainId,\n loanToken: obligations.loanToken,\n collaterals: sql<\n { asset: Address; oracle: Address; lltv: string }[]\n >`ARRAY_AGG(jsonb_build_object('asset', ${obligationCollaterals.asset}, 'oracle', ${obligationCollaterals.oracle}, 'lltv', ${obligationCollaterals.lltv}))`.as(\n \"collaterals\",\n ),\n maturity: obligations.maturity,\n })\n .from(obligations)\n .leftJoin(\n obligationCollaterals,\n eq(obligations.obligationId, obligationCollaterals.obligationId),\n )\n .groupBy(obligations.obligationId)\n .where(\n cursor !== null && cursor !== undefined\n ? gt(obligations.obligationId, cursor)\n : sql`true`,\n )\n .orderBy(asc(obligations.obligationId))\n .limit(limit);\n\n const items: Obligation.Obligation[] = [];\n for (const row of result) {\n items.push(\n Obligation.from({\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n collaterals: row.collaterals\n .sort((a, b) => a.asset.localeCompare(b.asset))\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n ),\n maturity: row.maturity,\n }),\n );\n }\n\n const returnedItems = Array.from(items.values());\n const nextCursor =\n returnedItems.length === limit && returnedItems.length > 0\n ? result[result.length - 1]!.obligationId\n : null;\n\n return { obligations: returnedItems, nextCursor };\n },\n\n getQuotes: async (parameters: { obligationIds: Hex[] }): Promise<Quote.Quote[]> => {\n const { obligationIds } = parameters;\n if (obligationIds.length === 0) return [];\n\n const now = Time.now();\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 remaining = sql<string>`(${offers.assets} - COALESCE(${sumConsumed.consumed}, 0))`;\n\n const query = ({ side }: { side: \"buy\" | \"sell\" }) =>\n db\n .selectDistinctOn([offers.obligationId], {\n obligationId: offers.obligationId,\n rate: offers.rate,\n })\n .from(offers)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n inArray(offers.obligationId, obligationIds),\n gte(offers.expiry, now),\n gte(offers.maturity, now),\n eq(offers.buy, side === \"buy\"),\n sql`${remaining} > 0`,\n ),\n )\n .orderBy(\n offers.obligationId,\n // lower rates first for buy, higher rates first for sell\n side === \"buy\" ? asc(offers.rate) : desc(offers.rate),\n );\n\n const [bestBuys, bestSells] = await Promise.all([\n query({ side: \"buy\" }),\n query({ side: \"sell\" }),\n ]);\n\n const quotes = new Map<string, { ask: Quote.Quote[\"ask\"]; bid: Quote.Quote[\"bid\"] }>();\n\n for (const row of bestSells) {\n quotes.set(row.obligationId, {\n ask: { rate: row.rate },\n bid: { rate: 0n },\n });\n }\n\n for (const row of bestBuys) {\n const quote = quotes.get(row.obligationId);\n\n if (!quote) {\n quotes.set(row.obligationId, {\n ask: { rate: 0n },\n bid: { rate: row.rate },\n });\n continue;\n }\n\n quote.bid = { rate: row.rate };\n }\n\n return Array.from(quotes.entries())\n .map(([id, quote]) => {\n return Quote.from({ obligationId: id as Hex, ask: quote.ask, bid: quote.bid });\n })\n .sort((a, b) => {\n return a.obligationId.localeCompare(b.obligationId);\n });\n },\n };\n}\n\nasync function nodeJsFindMatchingOffers(\n db: PG.PG,\n params: FindMatchingOffersParams,\n): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n}> {\n const { side, obligationId, cursor, limit = 20 } = params;\n // hard cap for pagination\n // A user can request maximum 5 pages of results\n const HARD_CAP: number = 5;\n\n const nowEpochSeconds = Math.floor(Date.now() / 1000);\n const rateSortDirection: \"asc\" | \"desc\" = side === \"sell\" ? \"desc\" : \"asc\";\n\n const baseWhereClauses: ReturnType<typeof sql>[] = [];\n baseWhereClauses.push(eq(offers.buy, side === \"buy\"));\n baseWhereClauses.push(eq(offers.obligationId, obligationId));\n baseWhereClauses.push(gte(offers.expiry, nowEpochSeconds));\n baseWhereClauses.push(gte(offers.maturity, nowEpochSeconds));\n\n // Cursor decode/validation (windowing handled later to support pre-consumption)\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor && (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection)) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\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 bestOffers = db\n .selectDistinctOn(\n // bucket offers for same maker and nonce\n // allow to only keep the best offer for each bucket\n [offers.offering, offers.nonce],\n {\n hash: offers.hash,\n obligationId: offers.obligationId,\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 blockNumber: offers.blockNumber,\n },\n )\n .from(offers)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n and(...baseWhereClauses),\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n // (0) bucket offers for same maker and nonce\n offers.offering,\n offers.nonce,\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 )\n .as(\"best_offers\");\n\n const cursorTuple = parsedCursor\n ? {\n rate: BigInt(parsedCursor.rate!),\n hash: parsedCursor.hash!,\n }\n : null;\n\n type PathRow = {\n offer_hash: string;\n root_id: string;\n leaf_id: string;\n path_key: string;\n path: string[];\n pools: { ord: number; pool_id: string; amount: number }[];\n };\n\n async function* iteratePathChunks({\n maxNbOfOffers,\n batchSize,\n }: {\n maxNbOfOffers: number;\n batchSize: number;\n }): AsyncGenerator<PathRow[]> {\n for (let offset = 0; ; offset += batchSize) {\n const upperBound = Math.min(offset + batchSize, maxNbOfOffers);\n const query = sql`\n WITH RECURSIVE\n -- get offers exactly as in final bestOffers ordering\n ordered_offers AS (\n SELECT\n ranked.hash,\n ranked.rate,\n ranked.offer_order\n FROM (\n SELECT\n ${bestOffers.hash} AS hash,\n ${bestOffers.rate} AS rate,\n ROW_NUMBER() OVER (\n ORDER BY\n ${rateSortDirection === \"asc\" ? sql`(${bestOffers.rate}) ASC` : sql`(${bestOffers.rate}) DESC`},\n ${bestOffers.blockNumber} ASC,\n (${bestOffers.assets}) DESC,\n ${bestOffers.hash} ASC\n ) AS offer_order\n FROM ${bestOffers} WHERE ${\n cursorTuple\n ? sql`(${bestOffers.rate}, ${bestOffers.hash}) ${rateSortDirection === \"asc\" ? sql`>` : sql`<`} (${cursorTuple.rate}, ${cursorTuple.hash})`\n : sql`true`\n }\n ) ranked\n WHERE ranked.offer_order > ${offset}\n AND ranked.offer_order <= ${upperBound}\n ),\n\n -- roots for those offers (per-root cap not needed to list paths)\n roots AS (\n SELECT\n ${offerLiquidityPools.poolId} AS pool_id,\n ${offerLiquidityPools.offerHash} AS offer_hash,\n ${offerLiquidityPools.amount} AS amount,\n oo.offer_order AS offer_order\n FROM ${offerLiquidityPools}\n JOIN ordered_offers oo ON oo.hash = ${offerLiquidityPools.offerHash}\n ),\n\n -- walk the DAG, carrying the whole path, priority key and offer order\n walk AS (\n SELECT\n r.offer_hash,\n ARRAY[r.pool_id]::text[] AS path,\n r.pool_id AS last,\n r.amount AS root_amount,\n ''::text AS key,\n r.offer_order AS offer_order\n FROM roots r\n\n UNION ALL\n\n SELECT\n w.offer_hash,\n w.path || ${liquidityLinks.childPoolId},\n ${liquidityLinks.childPoolId},\n w.root_amount,\n w.key || LPAD(${liquidityLinks.priority}::text, 10, '0') || '/',\n w.offer_order\n FROM walk w\n JOIN ${liquidityLinks} ON ${liquidityLinks.parentPoolId} = w.last\n WHERE NOT (${liquidityLinks.childPoolId} = ANY (w.path))\n )\n\n SELECT\n w.offer_hash,\n w.path[1] AS root_id,\n w.path[array_length(w.path, 1)] AS leaf_id,\n w.key AS path_key,\n w.path,\n jsonb_agg(\n jsonb_build_object(\n 'ord', n.ord,\n 'pool_id', n.pool_id,\n 'amount', lp.amount::numeric\n ) ORDER BY n.ord\n ) AS pools\n FROM walk w\n CROSS JOIN LATERAL unnest(w.path) WITH ORDINALITY AS n(pool_id, ord)\n JOIN ${liquidityPools} lp ON lp.id = n.pool_id\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} WHERE ${liquidityLinks.parentPoolId} = w.last\n )\n GROUP BY w.offer_hash, w.key, w.path, w.offer_order\n ORDER BY w.offer_order ASC, w.key ASC;\n `;\n\n const { rows } = await db.execute<PathRow>(query);\n if (rows.length === 0) break;\n yield rows;\n }\n }\n\n const offerHashValid = new Set<string>();\n const offerHashInvalid = new Set<string>();\n\n // global state of the pools, updated once an offer is valid\n // poolId -> amount\n const globalState = new Map<string, bigint>();\n // intermediate state of the pools when processing all the paths for each offer\n // poolId -> amount\n const intermediateState = new Map<string, bigint>();\n\n for await (const pathsChunk of iteratePathChunks({\n maxNbOfOffers: limit * HARD_CAP,\n batchSize: limit,\n })) {\n if (pathsChunk.length === 0) continue;\n\n for (let i = 0; i < pathsChunk.length; i++) {\n const path = pathsChunk[i]!;\n const offerHash = path.offer_hash;\n if (offerHashInvalid.has(offerHash) || offerHashValid.has(offerHash)) continue;\n\n for (const poolId of path.path) {\n if (intermediateState.has(poolId)) continue;\n\n const poolAmount = globalState.has(poolId)\n ? globalState.get(poolId)!\n : BigInt(path.pools.find((p) => p.pool_id === poolId)?.amount || 0);\n\n intermediateState.set(poolId, poolAmount);\n }\n\n const bottleneck = Array.from(intermediateState.entries()).reduce((acc, [id, curr]) => {\n // not considering the root pool amount since it is the first value of the accumulator\n if (!path.path.includes(id) || id === path.root_id) return acc;\n return acc < curr ? acc : curr;\n }, intermediateState.get(path.root_id)!);\n\n for (const [poolId, amount] of intermediateState.entries()) {\n if (!path.path.includes(poolId)) continue;\n intermediateState.set(poolId, amount - bottleneck);\n }\n\n // A root should never be totally consumed by two offers at the same time\n const isPoolRootUsedBeforeByAnotherOffer =\n globalState.has(path.root_id) && globalState.get(path.root_id)! === 0n;\n if (isPoolRootUsedBeforeByAnotherOffer) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n // All pools of a path should have enough liquidity for the root\n const isOnePoolBelowZero = Array.from(intermediateState.values()).some(\n (amount) => amount < 0n,\n );\n if (isOnePoolBelowZero) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n // Each roots of an offer should have enough liquidity\n const isNextPathUsingSameRoot = path.root_id === pathsChunk[i + 1]?.root_id;\n const isPoolRootTotallyConsumed = intermediateState.get(path.root_id)! === 0n;\n if (!isNextPathUsingSameRoot && !isPoolRootTotallyConsumed) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n const isNextPathUsingSameOffer = offerHash === pathsChunk[i + 1]?.offer_hash;\n if (!isNextPathUsingSameOffer) {\n if (!isPoolRootTotallyConsumed) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n offerHashValid.add(offerHash);\n for (const [poolId, amount] of intermediateState.entries()) globalState.set(poolId, amount);\n intermediateState.clear();\n if (offerHashValid.size > limit) break;\n }\n }\n if (offerHashValid.size > limit) break;\n }\n\n if (offerHashValid.size === 0) return { offers: [], nextCursor: null };\n\n const collateralsLateral = db\n .select({\n collaterals: sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE(\n jsonb_agg(\n jsonb_build_object(\n 'asset', ${obligationCollaterals.asset},\n 'oracle', ${obligationCollaterals.oracle},\n 'lltv', ${obligationCollaterals.lltv}\n )\n ),\n '[]'::jsonb\n )`.as(\"collaterals\"),\n })\n .from(obligationCollaterals)\n .where(eq(obligationCollaterals.obligationId, bestOffers.obligationId))\n .as(\"collaterals_lateral\");\n\n const callbacksSum = db\n .select({\n total: sql<string>`COALESCE(SUM(${offerLiquidityPools.amount}), 0)`.as(\"roots_total\"),\n })\n .from(offerLiquidityPools)\n .where(eq(offerLiquidityPools.offerHash, bestOffers.hash))\n .as(\"roots_sum\");\n\n const results = await db\n .select({\n // base fields\n hash: sql<Hex>`${bestOffers.hash}`,\n offering: sql<Address>`${bestOffers.offering}`,\n assets: bestOffers.assets,\n consumed: bestOffers.consumed,\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: sql<Address>`${bestOffers.loanToken}`,\n callbackAddress: sql<Address>`${bestOffers.callbackAddress}`,\n callbackData: sql<Hex>`${bestOffers.callbackData}`,\n callbackGasLimit: bestOffers.callbackGasLimit,\n signature: sql<Hex | undefined>`${bestOffers.signature}`,\n blockNumber: bestOffers.blockNumber,\n // aggregated collaterals via lateral join\n collaterals: collateralsLateral.collaterals,\n })\n .from(bestOffers)\n .leftJoinLateral(collateralsLateral, sql`true`)\n .leftJoinLateral(callbacksSum, sql`true`)\n .where(\n and(\n sql`(${callbacksSum.total})::numeric >= (${bestOffers.assets})::numeric`,\n inArray(bestOffers.hash, Array.from(offerHashValid)),\n ),\n )\n .orderBy(\n rateSortDirection === \"asc\" ? asc(bestOffers.rate) : desc(bestOffers.rate), // best rate first\n asc(bestOffers.blockNumber), // earlier blockNumber first\n desc(bestOffers.assets), // higher assets first\n asc(bestOffers.hash),\n );\n\n let nextCursor: string | null = null;\n const hasNextPage = results.length > limit;\n if (hasNextPage) {\n const currentPage = parsedCursor?.page ?? 1;\n if (currentPage >= HARD_CAP) {\n // Hard cap reached\n nextCursor = null;\n } else {\n const last = results[limit - 1]!;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n page: currentPage + 1,\n });\n }\n }\n\n const data = results.slice(0, limit).map((row) =>\n Offer.from({\n offering: row.offering,\n assets: BigInt(row.assets),\n rate: row.rate,\n maturity: Maturity.from(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,\n collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress,\n data: row.callbackData,\n gasLimit: row.callbackGasLimit,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n ...(row.signature !== null ? { signature: row.signature as Hex } : undefined),\n }),\n );\n\n return { offers: data, nextCursor };\n}\n\nasync function sqlFindMatchingOffers(\n db: PG.PG,\n params: FindMatchingOffersParams,\n): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n}> {\n const { side, obligationId, cursor, limit = 20 } = params;\n const HARD_CAP: number = 5; // Maximum pages allowed for rate-sorted pagination\n\n const nowEpochSeconds = Time.now();\n const isBuy = side === \"buy\";\n const rateSortDirection: \"asc\" | \"desc\" = isBuy ? \"asc\" : \"desc\";\n\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor && (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection)) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n\n const cursorPredicate = parsedCursor\n ? sql`AND (rate, hash) ${sql.raw(rateSortDirection === \"asc\" ? \">\" : \"<\")} (${BigInt(parsedCursor.rate!)}, ${parsedCursor.hash!})`\n : sql``;\n\n const rateDir = sql.raw(rateSortDirection === \"asc\" ? \"ASC\" : \"DESC\"); // Side-aware rate ordering\n\n /**\n * The query below resolves effective liquidity per offer and simulates\n * sequential consumption to ensure returned offers remain takable.\n */\n const raw = await db.execute<{\n hash: string;\n offering: string;\n assets: string;\n consumed: string;\n rate: bigint;\n maturity: number;\n expiry: number;\n start: number;\n nonce: bigint;\n buy: boolean;\n chainId: bigint;\n loanToken: string;\n callbackAddress: string;\n callbackData: string;\n callbackGasLimit: bigint;\n signature: string | null;\n blockNumber: number;\n collaterals: Array<{ asset: string; oracle: string; lltv: string }>;\n }>(sql`\n WITH RECURSIVE\n\n -- ================================================================\n -- CANDIDATE SELECTION\n -- Filtering, deduplication, deterministic ordering\n -- ================================================================\n\n -- Precompute total consumed per (offering, nonce, chain) once\n consumed_totals AS (\n SELECT c.offering, c.nonce, c.chain_id, SUM(c.consumed)::numeric AS total\n FROM ${consumedTable} c\n GROUP BY c.offering, c.nonce, c.chain_id\n ),\n\n -- Apply user filters (side, chain, maturity/expiry, rate, loanToken, creator, exact collaterals).\n -- Join consumed totals once and derive remaining (assets - consumed) as numeric.\n -- Exclude expired/matured.\n base AS (\n SELECT\n o.*,\n COALESCE(ct.total, 0)::numeric AS consumed,\n (o.assets - COALESCE(ct.total, 0))::numeric AS remaining\n FROM ${offers} o\n LEFT JOIN consumed_totals ct\n ON ct.offering = o.offering AND ct.nonce = o.nonce AND ct.chain_id = o.chain_id\n WHERE o.buy = ${isBuy}\n AND o.obligation_id = ${obligationId}\n AND o.expiry >= ${nowEpochSeconds}\n AND o.maturity >= ${nowEpochSeconds}\n ),\n\n -- Deduplicate by (offering, nonce), keeping the best one:\n best_offers AS (\n SELECT DISTINCT ON (offering, nonce)\n hash, obligation_id, offering, assets, consumed, rate, maturity, expiry, start, nonce, buy, chain_id,\n loan_token, callback_address, callback_data, callback_gas_limit, signature, created_at, block_number\n FROM base\n WHERE remaining > 0\n ORDER BY offering, nonce,\n CASE WHEN buy THEN rate ELSE -rate END,\n maturity DESC\n ),\n\n -- Establish deterministic execution order and apply cursor pagination.\n -- ROW_NUMBER over (rate ASC/DESC, created_at ASC, assets DESC, hash ASC).\n -- Cursor resumes from (rate, hash).\n candidates AS (\n SELECT *\n FROM (\n SELECT *, ROW_NUMBER() OVER (ORDER BY rate ${rateDir}, created_at ASC, assets DESC, hash ASC) AS ord\n FROM best_offers\n WHERE 1=1 ${cursorPredicate}\n ) ranked\n WHERE ranked.ord <= ${limit * HARD_CAP}\n ),\n\n -- Entry requirements at root pools: required amount and pool capacity.\n offer_requirements AS (\n SELECT olp.offer_hash, olp.pool_id AS node_id,\n (olp.amount)::numeric AS required_amount,\n (lp.amount)::numeric AS pool_amount\n FROM ${offerLiquidityPools} olp\n JOIN candidates c ON c.hash = olp.offer_hash\n JOIN ${liquidityPools} lp ON lp.id = olp.pool_id\n ),\n\n -- ================================================================\n -- CROSS-VALIDATION\n -- Simulate sequential offer execution to prevent conflicts over shared liquidity.\n --\n -- Strategy: For each candidate offer (in priority order), compute what it would\n -- consume from each pool. Track cumulative consumption so later offers see\n -- reduced availability. Finally, verify each offer has sufficient liquidity.\n -- ================================================================\n\n -- STEP 1: Build top-down LiquidityPaths with path_bottleneck tracking\n liquidity_paths AS (\n SELECT er.offer_hash, er.node_id AS current_node_id, er.node_id AS root_node_id,\n (lp.amount)::numeric AS path_bottleneck, 0::bigint AS traversal_order,\n ARRAY[er.node_id]::varchar[] AS liquidity_path\n FROM offer_requirements er\n JOIN ${liquidityPools} lp ON lp.id = er.node_id\n UNION ALL\n SELECT pf.offer_hash, e.child_pool_id AS current_node_id, pf.root_node_id,\n LEAST(pf.path_bottleneck, (cp.amount)::numeric) AS path_bottleneck,\n (pf.traversal_order * 1000 + e.priority)::bigint AS traversal_order,\n pf.liquidity_path || e.child_pool_id\n FROM liquidity_paths pf\n JOIN ${liquidityLinks} e ON e.parent_pool_id = pf.current_node_id\n JOIN ${liquidityPools} cp ON cp.id = e.child_pool_id\n ),\n\n -- Nodes present in the reachable subgraph\n graph_nodes AS (\n SELECT DISTINCT offer_hash, current_node_id AS node_id\n FROM liquidity_paths\n ),\n\n -- Leaves from top-down traversal\n leaf_paths AS (\n SELECT pf.*\n FROM liquidity_paths pf\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l WHERE l.parent_pool_id = pf.current_node_id\n )\n ),\n\n -- Effective liquidity per node = sum of leaf path minima that include the node\n node_effective_liquidity AS (\n SELECT lp.offer_hash, n.node_id, SUM(lp.path_bottleneck) AS effective_amount\n FROM leaf_paths lp\n CROSS JOIN LATERAL unnest(lp.liquidity_path) AS n(node_id)\n GROUP BY lp.offer_hash, n.node_id\n ),\n\n -- STEP 2: Allocate per-node path bottlenecks\n liquidity_path_node_consumption AS (\n SELECT\n pf.offer_hash,\n unnest(pf.liquidity_path) AS node_id,\n GREATEST(\n LEAST(\n pf.path_bottleneck,\n (ep.amount)::numeric - COALESCE(\n SUM(pf.path_bottleneck) OVER (\n PARTITION BY pf.offer_hash, pf.root_node_id\n ORDER BY pf.traversal_order\n ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING\n ),\n 0\n )\n ),\n 0\n ) AS consumed\n FROM liquidity_paths pf\n JOIN ${liquidityPools} ep ON ep.id = pf.root_node_id\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l WHERE l.parent_pool_id = pf.current_node_id\n )\n ),\n\n node_effective_consumption AS (\n SELECT offer_hash, node_id, SUM(consumed) AS effective_amount\n FROM liquidity_path_node_consumption\n GROUP BY offer_hash, node_id\n ),\n\n selected_offers AS (\n SELECT 0::bigint AS ord, ARRAY[]::varchar[] AS selected\n UNION ALL\n -- Step: consider next candidate and include it iff all entry nodes\n -- remain satisfiable given prior consumption from 'selected'\n SELECT c.ord,\n CASE WHEN NOT EXISTS (\n SELECT 1\n FROM offer_requirements er\n LEFT JOIN node_effective_liquidity el_entry\n ON el_entry.offer_hash = er.offer_hash AND el_entry.node_id = er.node_id\n LEFT JOIN ${liquidityPools} ep ON ep.id = er.node_id\n WHERE er.offer_hash = c.hash\n AND er.pool_amount > (\n -- Available at entry node after prior selected consumption\n CASE\n -- If no children in the current offer graph, use node effective minus prior at entry\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} e\n WHERE e.parent_pool_id = er.node_id\n AND EXISTS (\n SELECT 1 FROM graph_nodes g2\n WHERE g2.offer_hash = er.offer_hash AND g2.node_id = e.child_pool_id\n )\n ) THEN GREATEST(\n COALESCE(el_entry.effective_amount, 0) - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc\n WHERE lpc.node_id = er.node_id AND lpc.offer_hash = ANY(selected)\n ), 0),\n 0\n )\n -- Otherwise, sum priority-capped child availability after prior\n ELSE COALESCE((\n SELECT SUM(LEAST(\n -- child's remaining capacity after prior selected consumption\n GREATEST(\n CASE\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l2\n JOIN graph_nodes g2 ON g2.offer_hash = er.offer_hash AND g2.node_id = l2.child_pool_id\n WHERE l2.parent_pool_id = e.child_pool_id\n )\n THEN (cp.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc2\n WHERE lpc2.node_id = e.child_pool_id AND lpc2.offer_hash = ANY(selected)\n ), 0)\n ELSE LEAST(\n (cp.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc2\n WHERE lpc2.node_id = e.child_pool_id AND lpc2.offer_hash = ANY(selected)\n ), 0),\n COALESCE(el_child_consumption.effective_amount, (cp.amount)::numeric)\n )\n END,\n 0\n ),\n -- root capacity remaining after allocating higher-priority children\n GREATEST(\n LEAST(COALESCE(el_entry.effective_amount, (ep.amount)::numeric), (ep.amount)::numeric)\n - COALESCE((\n SELECT SUM(\n GREATEST(\n CASE\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l3\n JOIN graph_nodes g3 ON g3.offer_hash = er.offer_hash AND g3.node_id = l3.child_pool_id\n WHERE l3.parent_pool_id = e_prev.child_pool_id\n )\n THEN (cp_prev.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc3\n WHERE lpc3.node_id = e_prev.child_pool_id AND lpc3.offer_hash = ANY(selected)\n ), 0)\n ELSE LEAST(\n (cp_prev.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc3\n WHERE lpc3.node_id = e_prev.child_pool_id AND lpc3.offer_hash = ANY(selected)\n ), 0),\n COALESCE(el_child_prev_consumption.effective_amount, (cp_prev.amount)::numeric)\n )\n END,\n 0\n )\n )\n FROM ${liquidityLinks} e_prev\n JOIN ${liquidityPools} cp_prev ON cp_prev.id = e_prev.child_pool_id\n LEFT JOIN node_effective_liquidity el_child_prev\n ON el_child_prev.offer_hash = er.offer_hash AND el_child_prev.node_id = e_prev.child_pool_id\n LEFT JOIN node_effective_consumption el_child_prev_consumption\n ON el_child_prev_consumption.offer_hash = er.offer_hash AND el_child_prev_consumption.node_id = e_prev.child_pool_id\n WHERE e_prev.parent_pool_id = er.node_id\n AND (e_prev.priority < e.priority OR (e_prev.priority = e.priority AND e_prev.child_pool_id < e.child_pool_id))\n AND EXISTS (\n SELECT 1 FROM graph_nodes g4\n WHERE g4.offer_hash = er.offer_hash AND g4.node_id = e_prev.child_pool_id\n )\n ), 0\n ),\n 0\n )\n ))\n FROM ${liquidityLinks} e\n JOIN ${liquidityPools} cp ON cp.id = e.child_pool_id\n LEFT JOIN node_effective_liquidity el_child\n ON el_child.offer_hash = er.offer_hash AND el_child.node_id = e.child_pool_id\n LEFT JOIN node_effective_consumption el_child_consumption\n ON el_child_consumption.offer_hash = er.offer_hash AND el_child_consumption.node_id = e.child_pool_id\n WHERE e.parent_pool_id = er.node_id\n AND EXISTS (\n SELECT 1 FROM graph_nodes g4\n WHERE g4.offer_hash = er.offer_hash AND g4.node_id = e.child_pool_id\n )\n ), 0)\n END\n )\n ) THEN selected || c.hash ELSE selected END AS selected\n FROM selected_offers so\n JOIN candidates c ON c.ord = so.ord + 1\n ),\n\n selected_final AS (\n SELECT unnest(selected) AS offer_hash\n FROM selected_offers\n WHERE ord = (SELECT MAX(ord) FROM selected_offers)\n ),\n\n final AS (\n SELECT c.hash, c.obligation_id, c.offering, c.assets, c.consumed, c.rate, c.maturity, c.expiry, c.start,\n c.nonce, c.buy, c.chain_id AS \"chainId\", c.loan_token AS \"loanToken\",\n c.callback_address AS \"callbackAddress\", c.callback_data AS \"callbackData\",\n c.callback_gas_limit AS \"callbackGasLimit\", c.signature,\n c.created_at AS \"createdAt\", c.block_number AS \"blockNumber\"\n FROM candidates c\n JOIN selected_final sf ON sf.offer_hash = c.hash\n ORDER BY c.rate ${rateDir}, c.created_at ASC, c.assets DESC, c.hash ASC\n LIMIT ${limit + 1}\n )\n\n -- Attach collateral details and enforce assets <= sum(roots)\n SELECT\n fin.hash, fin.offering, fin.assets, fin.consumed, fin.rate, fin.maturity,\n fin.expiry, fin.start, fin.nonce, fin.buy, fin.\"chainId\", fin.\"loanToken\",\n fin.\"callbackAddress\", fin.\"callbackData\", fin.\"callbackGasLimit\",\n fin.signature, fin.\"createdAt\", fin.\"blockNumber\",\n ${sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE((\n SELECT jsonb_agg(jsonb_build_object('asset', oc.asset, 'oracle', oc.oracle, 'lltv', oc.lltv))\n FROM ${obligationCollaterals} oc WHERE oc.obligation_id = fin.obligation_id\n ), '[]'::jsonb)`} AS collaterals\n FROM final fin\n LEFT JOIN LATERAL (\n SELECT COALESCE(SUM(olp.amount), 0)::numeric AS roots_total\n FROM ${offerLiquidityPools} olp\n WHERE olp.offer_hash = fin.hash\n ) roots_sum ON true\n WHERE roots_sum.roots_total >= fin.assets\n `);\n\n const results = raw.rows;\n\n let nextCursor: string | null = null;\n const hasNextPage = results.length > limit;\n if (hasNextPage) {\n const currentPage = parsedCursor?.page ?? 1;\n if (currentPage >= HARD_CAP) {\n // Hard cap reached\n nextCursor = null;\n } else {\n const last = results[limit - 1]!;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n page: currentPage + 1,\n });\n }\n }\n\n const data = results.slice(0, limit).map((row) =>\n Offer.from({\n offering: row.offering as Address,\n assets: BigInt(row.assets),\n rate: row.rate,\n maturity: Maturity.from(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 collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress as Address,\n data: row.callbackData as Hex,\n gasLimit: row.callbackGasLimit,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n ...(row.signature !== null ? { signature: row.signature as Hex } : undefined),\n }),\n );\n\n return { offers: data, nextCursor };\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","import { Collector } from \"../index.node.ts\";\n\nexport type Indexer = {\n start: () => () => void;\n};\n\nexport function create(params: { collectors: Collector.Collector[] }): Indexer {\n const { collectors } = params;\n return {\n start: () => {\n const stops: (() => void)[] = [];\n for (const collector of collectors) {\n stops.push(Collector.start(collector));\n }\n return () => stops.forEach((stop) => stop());\n },\n };\n}\n","import { createWalletClient, http, publicActions, type Chain as ViemChain } from \"viem\";\nimport * as RouterApi from \"#api/Api.ts\";\nimport * as Collector from \"#collectors/index.ts\";\nimport type { Chain } from \"#core\";\nimport * as RouterIndexer from \"#indexer/RouterIndexer.ts\";\nimport * as Health from \"#services/Health.ts\";\nimport { ChainStore, CollectorStore, LiquidityStore, OfferStore, PG } from \"#stores/index.ts\";\n\nexport type ServicesConfig = {\n chain: Chain.Chain;\n rpcUrl: string;\n dbConfig: {\n type: \"pg\" | \"pglite\";\n endpoint?: string;\n };\n collectorConfig?: {\n interval?: number;\n maxBatchSize?: number;\n maxBlockNumber?: number;\n };\n};\n\nexport type Services = {\n indexer: RouterIndexer.Indexer;\n offerStore: OfferStore.OfferStore;\n collectorStore: CollectorStore.CollectorStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n chainStore: ChainStore.ChainStore;\n healthService: Health.HealthService;\n mempoolOffersCollector: Collector.Collector<\"mempool_offers\">;\n consumedEventsCollector: Collector.Collector<\"consumed_events\">;\n buyWithEmptyCallbackLiquidityCollector: Collector.Collector<\"buy_with_empty_callback_liquidity\">;\n buyVaultV1CallbackLiquidityCollector: Collector.Collector<\"buy_vault_v1_callback_liquidity\">;\n sellERC20CallbackLiquidityCollector: Collector.Collector<\"sell_erc20_callback_liquidity\">;\n DB: PG.PG;\n routerApi: RouterApi.RouterApi;\n};\n\nexport function from(config: ServicesConfig): Services {\n const {\n chain,\n rpcUrl,\n dbConfig,\n collectorConfig: { interval = 10_000, maxBatchSize = 1000, maxBlockNumber } = {},\n } = 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, collectorStore, liquidityStore, chainStore } = createStores(DB);\n const healthService = Health.create({ collectorStore, chainStore });\n const routerApi = RouterApi.create({ store: offerStore, healthService });\n\n const collectorBuilder = Collector.createBuilder({\n client: walletClient.extend(publicActions),\n chain,\n db: DB,\n options: { interval, maxBlockNumber },\n });\n\n const mempoolOffersCollector = collectorBuilder.buildMempoolCollector({\n options: { maxBatchSize },\n });\n\n const consumedEventsCollector = collectorBuilder.buildConsumedEventsCollector({\n options: { maxBatchSize },\n });\n\n const buyWithEmptyCallbackLiquidityCollector =\n collectorBuilder.buildBuyWithEmptyCallbackLiquidityCollector({\n options: {\n maxBatchSize,\n },\n });\n\n const buyVaultV1CallbackLiquidityCollector =\n collectorBuilder.buildBuyVaultV1CallbackLiquidityCollector({\n options: {\n maxBatchSize,\n },\n });\n\n const sellERC20CallbackLiquidityCollector =\n collectorBuilder.buildSellERC20CallbackLiquidityCollector({\n options: {\n maxBatchSize,\n },\n });\n\n // @TODO: add sell and buy vault v1 callback liquidity collectors once callbacks are implemented\n const indexer = RouterIndexer.create({\n collectors: [\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n ],\n });\n\n return {\n offerStore,\n collectorStore,\n liquidityStore,\n indexer,\n chainStore,\n healthService,\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n buyVaultV1CallbackLiquidityCollector,\n sellERC20CallbackLiquidityCollector,\n DB,\n routerApi,\n };\n}\n\nexport type Stores = ReturnType<typeof createStores>;\nexport function createStores(db: PG.PG) {\n return {\n collectorStore: CollectorStore.create({ db }),\n offerStore: OfferStore.create({ db }),\n liquidityStore: LiquidityStore.create({ db }),\n chainStore: ChainStore.create({ db }),\n };\n}\n\nexport function createWithTransaction<T>(db: PG.PG) {\n // it is safe to cast the transaction to the PG type because the SQL interface is interchangeable with drizzle\n return (fn: (s: ReturnType<typeof createStores>) => Promise<T>) =>\n db.transaction(async (tx) => fn(createStores(tx as unknown as PG.PG)));\n}\n","import { Command, Option } from \"commander\";\nimport dotenv from \"dotenv\";\nimport * as Chain from \"../../core/Chain.ts\";\nimport * as Logger from \"../../services/Logger.ts\";\nimport * as Services from \"../../services/Services.ts\";\nimport * as PG from \"../../stores/PG.ts\";\n\ndotenv.config();\n\nexport enum StorageType {\n PGLITE = \"pglite\",\n PG = \"pg\",\n}\n\ntype RawOptions = {\n port: number;\n chain: Chain.ChainName;\n rpcUrl?: string;\n routerUrl: string;\n store: StorageType;\n dbEndpoint?: string;\n logLevel: Logger.LogLevel;\n logPretty?: boolean;\n maxBlockNumber?: number;\n};\n\nexport type GlobalOptions = {\n port: number;\n remoteRouterUrl: string;\n rpcUrl: string;\n routerServices: Services.Services;\n logger: Logger.Logger;\n};\n\nexport class RouterCmd extends Command {\n constructor(name?: string) {\n super(name);\n this.addOption(\n new Option(\"--port <n>\")\n .env(\"ROUTER_PORT\")\n .default(7891)\n .argParser((v) => Number(v)),\n );\n this.addOption(\n new Option(\"--chain <chain>\")\n .env(\"ROUTER_CHAIN\")\n .choices(Chain.chainNames)\n .default(\"ethereum\"),\n );\n this.addOption(new Option(\"--rpc-url <url>\").env(\"ROUTER_RPC_URL\"));\n this.addOption(\n new Option(\"--router-url <url>\")\n .env(\"ROUTER_REMOTE_URL\")\n .default(\"https://router.morpho.dev\"),\n );\n this.addOption(\n new Option(\"--store <type>\")\n .choices([StorageType.PGLITE, StorageType.PG])\n .env(\"ROUTER_STORE\")\n .default(StorageType.PGLITE),\n );\n this.addOption(new Option(\"--db-endpoint <url>\").env(\"ROUTER_DB_ENDPOINT\"));\n this.addOption(\n new Option(\"--log-level <level>\")\n .env(\"ROUTER_LOG_LEVEL\")\n .choices(Logger.LogLevelValues)\n .default(\"info\"),\n );\n this.addOption(\n new Option(\"--log-pretty\", \"Enable pretty logs\").env(\"ROUTER_LOG_PRETTY\").default(true),\n );\n this.hook(\"preAction\", async (_: Command, actionCommand: Command) => {\n const options = actionCommand.opts<RawOptions>();\n const { routerServices } = RouterCmd.setup(actionCommand, options);\n\n const logger = actionCommand.getOptionValue(\"logger\") as Logger.Logger;\n await Logger.runWithLogger(logger, async () => {\n await PG.applyMigrations(routerServices.DB);\n });\n });\n }\n\n protected static setup(\n command: Command,\n options: RawOptions,\n ): { routerServices: Services.Services } {\n const logger = Logger.defaultLogger(options.logLevel, options.logPretty);\n\n if (options.store === StorageType.PG && !options.dbEndpoint) {\n throw new Error(\n \"Postgres connection string is required when store is 'pg', please set the ROUTER_DB_ENDPOINT environment variable or use --db-endpoint <url> option.\",\n );\n }\n\n const chain = Chain.chains[options.chain]!;\n const rpcUrl = options.rpcUrl ?? chain.rpcUrls.default.http[0];\n if (!rpcUrl) {\n throw new Error(\n \"RPC URL is required, please set the ROUTER_RPC_URL environment variable or use --rpc-url <url> option.\",\n );\n }\n\n const routerServices = Services.from({\n chain,\n rpcUrl,\n dbConfig: {\n type: options.store,\n ...(options.store === StorageType.PG ? { endpoint: options.dbEndpoint } : {}),\n },\n collectorConfig: { maxBlockNumber: options.maxBlockNumber },\n });\n\n command.setOptionValue(\"port\", options.port);\n command.setOptionValue(\"remoteRouterUrl\", options.routerUrl);\n command.setOptionValue(\"rpcUrl\", rpcUrl);\n command.setOptionValue(\"routerServices\", routerServices);\n command.setOptionValue(\"logger\", logger);\n\n return { routerServices: routerServices };\n }\n\n // allows to use the logger defined in the setup function for the action of the command\n // biome-ignore lint/suspicious/noExplicitAny: any is mandatory for the action function signature\n action(fn: (...args: any[]) => any): this {\n // biome-ignore lint/suspicious/noExplicitAny: any is mandatory for the action function signature\n const wrapped = async (...args: any[]) => {\n const cmd = args[args.length - 1] as Command;\n const logger = (cmd.getOptionValue(\"logger\") as Logger.Logger) ?? Logger.defaultLogger();\n return Logger.runWithLogger(logger, async () => fn(...args));\n };\n return super.action(wrapped);\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { type Command, Option } from \"commander\";\nimport { Offer } from \"#core\";\nimport { type GlobalOptions, RouterCmd } from \"./RouterCmd.ts\";\n\nexport const startCmd: Command = new RouterCmd(\"start\");\nstartCmd\n .description(\"Start Router services.\")\n .addOption(\n new Option(\"--block-window <n>\", \"Block window to get logs from\")\n .argParser((v) => Number(v))\n .default(100),\n )\n .addOption(\n new Option(\"--seed <n>\", \"Seed random offers to router\").argParser((v) => Number(v)).default(0),\n )\n .addOption(new Option(\"--file <path>\", \"Seed offers from a JSON file\"))\n .addOption(\n new Option(\"--max-block-number <n>\", \"Block number at which to stop indexing\").argParser((v) =>\n Number(v),\n ),\n )\n .addOption(\n new Option(\"--services <list>\", \"Comma-separated services to run. Default: api,indexer\")\n .env(\"ROUTER_SERVICES\")\n .default([\"indexer\", \"api\"])\n .argParser((v) =>\n v\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter((s) => s.length > 0),\n ),\n )\n .action(\n async (\n opts: {\n blockWindow: number;\n seed: number;\n file?: string;\n services?: string[];\n } & GlobalOptions,\n ) => {\n const {\n port,\n routerServices: { offerStore, indexer, routerApi },\n logger,\n } = opts;\n\n const stops: (() => void)[] = [];\n\n if (opts.seed > 0) {\n await offerStore.createMany(\n Array.from(Array(opts.seed ?? 0).keys()).map((_i) => ({\n offer: Offer.random(),\n status: \"valid\",\n })),\n );\n logger.info({ msg: `Offers seeded`, count: opts.seed });\n }\n\n if (opts.file) {\n const offers: Offer.Offer[] = await getOffersFromFile(opts.file);\n await offerStore.createMany(offers.map((ro) => ({ offer: ro })));\n logger.info({ msg: `Offers seeded from file`, count: offers.length, file: opts.file });\n }\n\n const selectedServices = new Set<string>(opts.services!);\n\n if (selectedServices.has(\"indexer\")) {\n stops.push(await indexer.start());\n logger.info({ msg: `Indexer started` });\n }\n\n if (selectedServices.has(\"api\")) {\n await routerApi.serve({ port });\n logger.info({ msg: `API started`, url: `http://localhost:${port}` });\n }\n\n const shutdown = async (signal: string) => {\n logger.warn({ msg: `Shutdown signal`, signal });\n try {\n stops.forEach((stop) => stop());\n } catch {}\n process.exit(0);\n };\n\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n process.stdin.resume();\n },\n );\n\nasync function getOffersFromFile(file: string) {\n const raw = await readFile(file, \"utf8\");\n const json = JSON.parse(raw);\n const items: Omit<Offer.Offer, \"hash\">[] = Array.isArray(json) ? json : (json.offers ?? []);\n\n if (!Array.isArray(items) || items.length === 0) {\n // biome-ignore lint: useful\n console.log(\"No offers found in file\");\n return [];\n }\n\n return items.map((o) => Offer.from(o));\n}\n\nexport type StartUiParams = {\n routerUrl: string;\n port?: number;\n mainnetRpcUrl?: string;\n};\n","import * as ngrok from \"@ngrok/ngrok\";\nimport { Command, Option } from \"commander\";\n\nexport const tunnelCmd = new Command(\"tunnel\");\n\ntunnelCmd\n .description(\"Expose the local Router via ngrok\")\n .addOption(\n new Option(\"--port <n>\")\n .env(\"ROUTER_PORT\")\n .default(7891)\n .argParser((v) => Number(v)),\n )\n .addOption(new Option(\"--ngrok-authtoken <token>\").env(\"NGROK_AUTHTOKEN\"))\n .action(async (opts: { ngrokAuthtoken: string; port: number }) => {\n try {\n const listener = await ngrok.forward({ addr: opts.port, authtoken: opts.ngrokAuthtoken });\n // biome-ignore lint: useful\n console.log(`Ngrok tunnel: ${listener.url()}`);\n\n const shutdown = async (signal: string) => {\n // biome-ignore lint: useful\n console.log(`Shutdown signal ${signal} received`);\n try {\n await listener.close();\n await ngrok.disconnect();\n await ngrok.kill();\n } catch {}\n process.exit(0);\n };\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n } catch (e) {\n // biome-ignore lint: useful\n console.error(\"Failed to start ngrok\", e);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { mempoolCmd } from \"./commands/mempool.ts\";\nimport { startCmd } from \"./commands/start.ts\";\nimport { tunnelCmd } from \"./commands/tunnel.ts\";\n\nconst cli = new Command();\n\ncli\n .name(pkg.name.split(\"/\")[1] || \"cli\")\n .description(pkg.description)\n .version(pkg.version);\n\ncli.addCommand(startCmd);\ncli.addCommand(tunnelCmd);\ncli.addCommand(mempoolCmd);\n\ncli\n .command(\"__commands\", { hidden: true })\n .description(\"internal: list commands\")\n .action(() => {\n const names = cli.commands.map((c) => c.name());\n // biome-ignore lint: useful\n console.log(JSON.stringify(names));\n });\n\ncli.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/core/Chain.ts","../src/utils/BigMath.ts","../src/utils/batch.ts","../src/utils/Errors.ts","../src/core/Abi.ts","../src/core/Callback.ts","../src/core/Collateral.ts","../src/utils/zod.ts","../src/core/LLTV.ts","../src/core/Liquidity.ts","../src/core/Maturity.ts","../src/core/Obligation.ts","../src/utils/Format.ts","../src/core/Offer.ts","../src/core/Tree.ts","../src/core/Quote.ts","../src/evm/EVM.ts","../src/cli/commands/mempool.ts","../src/collectors/index.ts","../src/services/Logger.ts","../src/utils/retry.ts","../src/utils/batchMulticall.ts","../src/utils/lazy.ts","../src/utils/wait.ts","../src/utils/poll.ts","../src/utils/time.ts","../src/collectors/Admin.ts","../src/collectors/Collector.ts","../src/database/CollectorStore.ts","../src/database/drizzle/schema.ts","../src/database/drizzle/VERSION.ts","../src/mempool/MempoolEVMClient.ts","../src/mempool/MempoolClient.ts","../src/collectors/fetchers/fetchBalancesAndAllowances.ts","../src/collectors/fetchers/fetchCollateralAndDebt.ts","../src/collectors/fetchers/fetchOraclePrices.ts","../src/collectors/fetchers/fetchUserVaultMarketLiquidity.ts","../src/gatekeeper/GateConfig.ts","../src/collectors/CollectFunctions/collectBuyVaultV1CallbackLiquidity.ts","../src/collectors/CollectFunctions/collectBuyWithEmptyCallbackLiquidity.ts","../src/collectors/CollectFunctions/collectConsumedEvents.ts","../src/collectors/CollectFunctions/collectOffers.ts","../src/collectors/CollectFunctions/collectSellERC20CallbackLiquidity.ts","../src/collectors/CollectorBuilder.ts","../src/database/ChainStore.ts","../src/database/LiquidityStore.ts","../src/database/OfferStore.ts","../src/database/utils/Cursor.ts","../src/database/PG.ts","../src/services/Health.ts","../src/database/OfferStoreV2.ts","../src/services/Services.ts","../src/api/Controllers/Payload.ts","../src/api/Schema/openapi.ts","../src/api/Controllers/getDocs.ts","../src/api/Controllers/getHealth.ts","../src/api/Schema/health.ts","../src/api/Schema/ObligationResponse.ts","../src/api/Schema/OfferResponse.ts","../src/api/Schema/requests.ts","../src/api/Controllers/getObligation.ts","../src/api/Controllers/getObligations.ts","../src/api/Controllers/getOffers.ts","../src/api/Api.ts","../src/cli/commands/RouterCmd.ts","../src/cli/commands/mock.ts","../src/gatekeeper/Gate.ts","../src/gatekeeper/Gatekeeper.ts","../src/gatekeeper/Rules.ts","../src/indexer/Indexer.ts","../src/cli/commands/start.ts","../src/cli/cli.ts"],"names":["array","viemEthereum","viemBase","viemAnvil","order","CallbackType","from","z","z2","z3","token","obligationId","InvalidOptionError","z4","maturity","MaturityType","now","endOfMonth","fromSnakeCase","random","s","isAddress","z5","encodeAbiParameters","privateKeyToAccount","generatePrivateKey","decode","encode","toSnakeCase","offers","StatusCode","maxUint256","chain","consumed","decodeAbiParameters","z7","keccak256","create","timestamp","wait","poll","max","newBlock","missingBlockNumbers","start","chains","VERSION","bigint","boolean","asc","DEFAULT_BATCH_SIZE","DEFAULT_BLOCK_WINDOW","parameters","publicActions","oracles","eq","sql","and","gte","lte","desc","hash","gt","id","path","connect","pool","client","drizzleLite","migratePostgres","migratePGLite","chainIds","collectors","status","isHex","inArray","http","statusCode","z8","DEFAULT_LIMIT","z10","obligations","serve","serveHono","Command","Option","run","assets","names"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"@morpho-dev/router\",\n \"version\": \"0.2.0\",\n \"description\": \"Router package for Morpho protocol\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"access\": \"public\",\n \"publishConfig\": {\n \"@morpho-dev:registry\": \"https://registry.npmjs.org\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git@github.com:morpho-org/router.git\"\n },\n \"files\": [\n \"dist/*\"\n ],\n \"main\": \"./dist/index.node.js\",\n \"module\": \"./dist/index.node.mjs\",\n \"types\": \"./dist/index.node.d.ts\",\n \"bin\": {\n \"router\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"node\": {\n \"types\": \"./dist/index.node.d.ts\",\n \"import\": \"./dist/index.node.mjs\",\n \"require\": \"./dist/index.node.js\"\n },\n \"default\": {\n \"types\": \"./dist/index.browser.d.ts\",\n \"import\": \"./dist/index.browser.mjs\",\n \"require\": \"./dist/index.browser.js\"\n }\n }\n },\n \"imports\": {\n \"#core\": \"./src/core/index.ts\",\n \"#*\": \"./src/*\"\n },\n \"scripts\": {\n \"bench\": \"vitest bench\",\n \"build\": \"pnpm openapi:generate && tsup --config tsup.config.ts\",\n \"container:build\": \"docker build -f Dockerfile -t morpho-router ../../\",\n \"container:run\": \"docker run --rm -it morpho-router\",\n \"cli\": \"pnpm build && node dist/cli.js\",\n \"dev\": \"tsup --config tsup.config.ts --watch --onSuccess 'echo \\\"Router package rebuilt\\\"'\",\n \"docs:cli\": \"node ./scripts/generate-readme.mjs\",\n \"format\": \"biome format --write src/\",\n \"lint\": \"biome check src/\",\n \"lint:ci\": \"biome ci src/\",\n \"migrations:create\": \"drizzle-kit generate --config src/database/drizzle/drizzle.config.ts --name\",\n \"migrations:run\": \"drizzle-kit migrate --config src/database/drizzle/drizzle.config.ts\",\n \"openapi:generate\": \"tsx src/cli/dump-swagger.ts && pnpm openapi-typescript src/api/Schema/generated/swagger.json -o src/api/Schema/generated/swagger.d.ts && biome check --write src/api/Schema/generated\",\n \"test\": \"vitest\",\n \"test:api\": \"vitest --config vitest.api.config.ts run\",\n \"test:ui\": \"vitest --ui\",\n \"test:watch\": \"vitest watch\",\n \"typecheck\": \"pnpm openapi:generate && tsc --project tsconfig.json --noEmit --incremental\"\n },\n \"devDependencies\": {\n \"@repo/config\": \"workspace:*\",\n \"@types/pako\": \"^2.0.4\",\n \"@types/pg\": \"^8.15.5\",\n \"drizzle-kit\": \"^0.31.1\",\n \"prool\": \"^0.0.24\",\n \"tevm\": \"1.0.0-next.149\",\n \"tsup\": \"^8.3.5\"\n },\n \"dependencies\": {\n \"@electric-sql/pglite\": \"^0.3.1\",\n \"@hono/node-server\": \"^1.17.1\",\n \"@openzeppelin/merkle-tree\": \"^1.0.8\",\n \"commander\": \"^13.1.0\",\n \"dotenv\": \"^17.2.1\",\n \"drizzle-orm\": \"^0.43.1\",\n \"hono\": \"^4.9.7\",\n \"js-base64\": \"^3.7.8\",\n \"openapi-fetch\": \"^0.15.0\",\n \"openapi-metadata\": \"^0.2.2\",\n \"pako\": \"^2.1.0\",\n \"pg\": \"^8.16.0\",\n \"reflect-metadata\": \"^0.2.2\",\n \"viem\": \"^2.37.13\",\n \"zod\": \"^4.1.12\",\n \"zod-openapi\": \"^5.4.3\"\n }\n}\n","import type { AbiEvent, Address, GetLogsReturnType, PublicClient } from \"viem\";\nimport { getBlock, getLogs } from \"viem/actions\";\nimport {\n type Chain as ViemChain,\n anvil as viemAnvil,\n base as viemBase,\n mainnet as viemEthereum,\n} from \"viem/chains\";\nimport * as BigMath from \"#utils/BigMath.ts\";\nimport { batch } from \"#utils/batch.ts\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Compute } from \"./types.ts\";\n\nexport const chainNames = [\"ethereum\", \"base\", \"ethereum-virtual-testnet\", \"anvil\"] as const;\nexport type ChainName = (typeof chainNames)[number];\n\nexport const ChainId = {\n ETHEREUM: BigInt(viemEthereum.id),\n BASE: BigInt(viemBase.id),\n \"ETHEREUM-VIRTUAL-TESTNET\": 109111114n,\n ANVIL: 505050505n, // random id to not clash with other chains\n};\nexport type Id = (typeof ChainId)[keyof typeof ChainId];\nexport const chainIds = new Set(Object.values(ChainId));\n\nexport type Chain = Compute<\n Omit<ViemChain, \"id\" | \"name\"> & {\n id: Id;\n name: ChainName;\n morpho: Address;\n morphoBlue: Address;\n mempool: {\n address: Address;\n deploymentBlock: number;\n reindexBuffer: number;\n };\n }\n>;\n\nconst chainNameLookup = new Map(Object.entries(ChainId).map(([key, value]) => [value, key]));\n\nexport function getChain(chainId: Id): Chain | undefined {\n const chainName = chainNameLookup.get(chainId)?.toLowerCase() as ChainName;\n if (!chainName) {\n return undefined;\n }\n return chains[chainName];\n}\n\nexport const getWhitelistedChains = (): Chain[] => {\n return [chains.ethereum, chains.base, chains[\"ethereum-virtual-testnet\"], chains.anvil];\n};\n\nexport const chains: Record<ChainName, Chain> = {\n ethereum: {\n ...viemEthereum,\n id: ChainId.ETHEREUM,\n name: \"ethereum\",\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 23347674,\n reindexBuffer: 10,\n },\n },\n base: {\n ...viemBase,\n id: ChainId.BASE,\n name: \"base\",\n morpho: \"0x0000000000000000000000000000000000000000\",\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x0000000000000000000000000000000000000000\",\n deploymentBlock: 35449942,\n reindexBuffer: 10,\n },\n },\n \"ethereum-virtual-testnet\": {\n ...viemEthereum,\n id: ChainId[\"ETHEREUM-VIRTUAL-TESTNET\"],\n name: \"ethereum-virtual-testnet\",\n morpho: \"0x11a002d45db720ed47a80d2f3489cba5b833eaf5\", // @TODO: This is mock Consumed contract, update with Terms once stable\n morphoBlue: \"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb\",\n mempool: {\n address: \"0x5b06224f736a57635b5bcb50b8ef178b189107cb\",\n deploymentBlock: 23224302,\n reindexBuffer: 10,\n },\n },\n anvil: {\n ...viemAnvil,\n id: ChainId.ANVIL,\n name: \"anvil\",\n morpho: \"0x23DFBc4B8B80C14CC5e25011B8491f268395BAd6\",\n morphoBlue: \"0x0000000000000000000000000000000000000000\", // Set dynamically in tests\n mempool: {\n address: \"0xD946246695A9259F3B33a78629026F61B3Ab40aF\",\n deploymentBlock: 23223727,\n reindexBuffer: 10,\n },\n },\n};\n\n// thresholds are set to align with Alchemy's thresholds\n//https://www.alchemy.com/docs/deep-dive-into-eth_getlogs#making-a-request-to-eth_getlogs\nconst MAX_BATCH_SIZE = 10_000;\nconst DEFAULT_BATCH_SIZE = 2_500;\nconst MAX_BLOCK_WINDOW = 2_000;\nconst DEFAULT_BLOCK_WINDOW = 500;\n\nexport async function* streamLogs<abiEvent extends AbiEvent | undefined = undefined>(parameters: {\n client: PublicClient;\n contractAddress: Address;\n event?: abiEvent;\n blockNumberGte?: number;\n blockNumberLte?: number;\n order: \"asc\" | \"desc\";\n options: {\n maxBatchSize?: number;\n blockWindow?: number;\n };\n}): AsyncGenerator<\n { logs: GetLogsReturnType<abiEvent | undefined>; blockNumber: number },\n void,\n void\n> {\n const {\n client,\n contractAddress,\n event,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = DEFAULT_BLOCK_WINDOW } = {},\n } = parameters;\n if (maxBatchSize > MAX_BATCH_SIZE) throw new InvalidBatchSizeError(maxBatchSize);\n if (blockWindow > MAX_BLOCK_WINDOW) throw new InvalidBlockWindowError(blockWindow);\n if (order === \"asc\" && blockNumberGte === undefined) throw new MissingBlockNumberError();\n\n const latestBlock = (await getBlock(client, { blockTag: \"latest\", includeTransactions: false }))\n .number;\n\n let toBlock = 0n;\n if (order === \"asc\")\n toBlock = BigMath.min(BigInt(blockNumberGte!) + BigInt(blockWindow), latestBlock);\n if (order === \"desc\")\n toBlock =\n blockNumberLte === undefined\n ? latestBlock\n : BigMath.min(BigInt(blockNumberLte!), latestBlock);\n\n let fromBlock = 0n;\n if (order === \"asc\") fromBlock = BigMath.min(BigInt(blockNumberGte!), latestBlock);\n if (order === \"desc\")\n fromBlock = BigMath.max(BigInt(blockNumberGte || toBlock - BigInt(blockWindow)), 0n);\n\n if (order === \"asc\") toBlock = BigMath.min(toBlock, fromBlock + BigInt(blockWindow));\n if (order === \"desc\") fromBlock = BigMath.max(fromBlock, toBlock - BigInt(blockWindow));\n if (fromBlock > toBlock) throw new InvalidBlockRangeError(fromBlock, toBlock);\n\n let streaming = true;\n while (streaming) {\n const logs = await getLogs(client, {\n address: contractAddress,\n event,\n fromBlock,\n toBlock,\n });\n\n logs.sort((a, b) => {\n if (a.blockNumber !== b.blockNumber)\n return order === \"asc\"\n ? Number(a.blockNumber - b.blockNumber)\n : Number(b.blockNumber - a.blockNumber);\n if (a.transactionIndex !== b.transactionIndex)\n return order === \"asc\"\n ? a.transactionIndex - b.transactionIndex\n : b.transactionIndex - a.transactionIndex;\n return order === \"asc\" ? a.logIndex - b.logIndex : b.logIndex - a.logIndex;\n });\n\n for (const logBatch of batch(logs, maxBatchSize)) {\n if (logBatch.length === 0) break;\n yield {\n logs: logBatch,\n blockNumber:\n logBatch.length === maxBatchSize\n ? // if the batch is full, return the last block number, block numbers are always sorted\n Number(logBatch[logBatch.length - 1]?.blockNumber)\n : // if the batch is not full, return `toBlock` or `fromBlock` to indicate until which block the logs were fetched\n order === \"asc\"\n ? Number(toBlock)\n : Number(fromBlock),\n };\n }\n\n streaming =\n order === \"asc\"\n ? toBlock < (blockNumberLte || latestBlock)\n : fromBlock > (blockNumberGte || 0n);\n\n if (order === \"asc\") {\n fromBlock = BigMath.min(BigInt(toBlock) + 1n, latestBlock);\n toBlock = BigMath.min(fromBlock + BigInt(blockWindow), latestBlock);\n }\n\n if (order === \"desc\") {\n const lowerBound = BigInt(blockNumberGte || 0);\n const windowSize = BigInt(blockWindow);\n const nextToBlock = BigMath.max(fromBlock - 1n, lowerBound);\n const nextFromBlock = BigMath.max(nextToBlock - windowSize, lowerBound);\n toBlock = nextToBlock;\n fromBlock = nextFromBlock;\n }\n }\n\n yield { logs: [], blockNumber: order === \"asc\" ? Number(toBlock) : Number(fromBlock) };\n return;\n}\n\nexport class InvalidBlockRangeError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockRangeError\";\n constructor(fromBlock: bigint, toBlock: bigint) {\n super(\n `Invalid block range while streaming data from chain. From block ${fromBlock} to block ${toBlock}.`,\n );\n }\n}\n\nexport class InvalidBlockWindowError extends Errors.BaseError {\n override name = \"Chain.InvalidBlockWindowError\";\n constructor(blockWindow: number) {\n super(\n `Invalid block window while streaming data from chain. Maximum is ${MAX_BLOCK_WINDOW}. Got ${blockWindow}.`,\n );\n }\n}\n\nexport class InvalidBatchSizeError extends Errors.BaseError {\n override name = \"Chain.InvalidBatchSizeError\";\n constructor(maxBatchSize: number) {\n super(\n `Invalid batch size while streaming data from chain. Maximum is ${MAX_BATCH_SIZE}. Got ${maxBatchSize}.`,\n );\n }\n}\n\nexport class MissingBlockNumberError extends Errors.BaseError {\n override name = \"Chain.MissingBlockNumberError\";\n constructor() {\n super(\"Missing block number when streaming data from chain in ascending order.\");\n }\n}\n","export function max(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\nexport function min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n","/**\n * Splits an array into batches of a specified size.\n * @param array The array to split.\n * @param batchSize The size of each batch.\n * @returns An iterator that yields each batch.\n * @example\n * ```typescript\n * const array = [1, 2, 3, 4, 5];\n * for (const batch of batch(array, 2)) {\n * console.log(batch);\n * }\n * // Output:\n * // [1, 2]\n * // [3, 4]\n * // [5]\n * ```\n */\nexport function* batch<T>(array: Array<T>, batchSize: number) {\n for (let i = 0; i < array.length; i += batchSize) {\n yield array.slice(i, i + batchSize);\n }\n}\n","export type GlobalErrorType<name extends string = \"Error\"> = Error & {\n name: name;\n};\n\n/**\n * Base error class inherited by all errors thrown by mempool.\n *\n * @example\n * ```ts\n * import { Errors } from 'mempool'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError<cause extends Error | undefined = undefined> extends Error {\n details: string;\n shortMessage: string;\n\n override cause: cause;\n override name = \"BaseError\";\n\n constructor(\n shortMessage: string,\n options: {\n cause?: cause | undefined;\n details?: string | undefined;\n metaMessages?: (string | undefined)[] | undefined;\n } = {},\n ) {\n const details = (() => {\n if (options.cause instanceof BaseError) {\n if (options.cause.details) return options.cause.details;\n if (options.cause.shortMessage) return options.cause.shortMessage;\n }\n if (options.cause && \"details\" in options.cause && typeof options.cause.details === \"string\")\n return options.cause.details;\n if (options.cause?.message) return options.cause.message;\n return options.details!;\n })();\n\n const message = [\n shortMessage || \"An error occurred.\",\n ...(options.metaMessages ? [\"\", ...options.metaMessages] : []),\n ...(details ? [\"\", details ? `Details: ${details}` : undefined] : []),\n ]\n .filter((x) => typeof x === \"string\")\n .join(\"\\n\");\n\n super(message, options.cause ? { cause: options.cause } : undefined);\n\n this.cause = options.cause as cause;\n this.details = details;\n this.shortMessage = shortMessage;\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n walk(fn?: ((err: unknown) => boolean) | undefined): unknown {\n return walk(this, fn);\n }\n}\n\n/** @internal */\nfunction walk(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown {\n if (fn?.(err)) return err;\n if (err && typeof err === \"object\" && \"cause\" in err && err.cause) return walk(err.cause, fn);\n return fn ? null : err;\n}\n","export const Oracle = [\n {\n type: \"function\",\n name: \"price\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC4626 = [\n {\n type: \"function\",\n name: \"asset\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorphoFactory = [\n {\n type: \"function\",\n name: \"isMetaMorpho\",\n inputs: [{ name: \"target\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const MetaMorpho = [\n {\n type: \"function\",\n name: \"withdrawQueue\",\n inputs: [{ name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"withdrawQueueLength\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxWithdraw\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const Morpho = [\n {\n type: \"function\",\n name: \"collateralOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"debtOf\",\n inputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"market\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n ],\n outputs: [\n {\n name: \"totalSupplyAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalSupplyShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowAssets\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"totalBorrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"lastUpdate\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"fee\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"position\",\n inputs: [\n {\n name: \"id\",\n type: \"bytes32\",\n internalType: \"Id\",\n },\n {\n name: \"user\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"supplyShares\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"borrowShares\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n {\n name: \"collateral\",\n type: \"uint128\",\n internalType: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import type { Address, Hex } from \"viem\";\nimport { decodeAbiParameters, encodeAbiParameters } from \"viem\";\nimport type { Offer } from \"./index.ts\";\n\nexport enum CallbackType {\n BuyWithEmptyCallback = \"buy_with_empty_callback\",\n BuyVaultV1Callback = \"buy_vault_v1_callback\",\n SellERC20Callback = \"sell_erc20_callback\",\n}\n\nexport const isEmptyCallback = (offer: Offer.Offer): boolean => offer.callback.data === \"0x\";\n\nexport function decode(type: CallbackType, data: Hex) {\n switch (type) {\n case CallbackType.BuyVaultV1Callback:\n return decodeBuyVaultV1Callback(data);\n case CallbackType.SellERC20Callback:\n return decodeSellERC20Callback(data);\n default:\n throw new Error(\"Invalid callback type\");\n }\n}\n\nexport function encode(type: CallbackType, data: any): Hex {\n switch (type) {\n case CallbackType.BuyVaultV1Callback:\n return encodeBuyVaultV1Callback(data);\n case CallbackType.SellERC20Callback:\n return encodeSellERC20Callback(data);\n default:\n throw new Error(\"Invalid callback type\");\n }\n}\n\nexport function decodeBuyVaultV1Callback(data: Hex): Array<{\n vault: Address;\n amount: bigint;\n}> {\n if (!data || data === \"0x\") throw new Error(\"Empty callback data\");\n try {\n const [vaults, amounts] = decodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n data,\n ) as [Address[], bigint[]];\n if (vaults.length !== amounts.length) {\n throw new Error(\"Mismatched array lengths\");\n }\n return vaults.map((v, i) => ({ vault: v, amount: amounts[i]! }));\n } catch (_) {\n throw new Error(\"Invalid BuyVaultV1Callback callback data\");\n }\n}\n\nexport function decodeSellERC20Callback(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 SellERC20Callback callback data\");\n }\n}\n\nexport function encodeBuyVaultV1Callback(parameters: {\n vaults: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.vaults, parameters.amounts],\n );\n}\n\nexport function encodeSellERC20Callback(parameters: {\n collaterals: Address[];\n amounts: bigint[];\n}): Hex {\n return encodeAbiParameters(\n [{ type: \"address[]\" }, { type: \"uint256[]\" }],\n [parameters.collaterals, parameters.amounts],\n );\n}\n","import type { Address } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport * as LLTV from \"./LLTV.ts\";\n\nexport type Collateral = {\n /** Asset being used as collateral. */\n asset: Address;\n /** Liquidation Loan-to-Value of the collateral. */\n lltv: LLTV.LLTV;\n /** Oracle contract used to price the collateral. */\n oracle: Address;\n};\n\nexport const CollateralSchema = z.object({\n asset: z.string().transform(transformAddress),\n oracle: z.string().transform(transformAddress),\n lltv: LLTV.LLTVSchema,\n});\n\nexport const CollateralsSchema = z\n .array(CollateralSchema)\n .min(1, { message: \"At least one collateral is required\" })\n .refine(\n (collaterals) => {\n for (let i = 1; i < collaterals.length; i++) {\n if (collaterals[i - 1]!.asset.toLowerCase() > collaterals[i]!.asset.toLowerCase()) {\n return false;\n }\n }\n return true;\n },\n {\n message: \"Collaterals must be sorted alphabetically by address\",\n },\n )\n .refine(\n (collaterals) => {\n const uniqueAssets = new Set<string>();\n for (const collateral of collaterals) {\n const assetAddress = collateral.asset.toLowerCase();\n if (uniqueAssets.has(assetAddress)) {\n return false;\n }\n uniqueAssets.add(assetAddress);\n }\n return true;\n },\n {\n message: \"Collaterals must not contain duplicate assets\",\n },\n );\n\nexport const from = (parameters: from.Parameters): from.ReturnType => {\n return {\n asset: parameters.asset.toLowerCase() as Address,\n lltv: LLTV.from(parameters.lltv),\n oracle: parameters.oracle.toLowerCase() as Address,\n };\n};\n\nexport declare namespace from {\n type Parameters = {\n asset: Address;\n lltv: LLTV.Options | bigint;\n oracle: Address;\n };\n type ReturnType = Collateral;\n}\n\n/**\n * Generates a random collateral.\n * @returns A randomly generated collateral. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const collateral = Collateral.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n asset: privateKeyToAccount(generatePrivateKey()).address,\n oracle: privateKeyToAccount(generatePrivateKey()).address,\n lltv: 0.965,\n });\n}\n\nexport declare namespace random {\n type ReturnType = Collateral;\n}\n","import { type Address, isAddress, isHex } from \"viem\";\nimport * as z from \"zod\";\n\nexport const transformHex = (val: string, ctx: z.RefinementCtx) => {\n if (isHex(val)) return val;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"hex\",\n error: \"not a hex\",\n });\n\n return z.NEVER;\n};\n\nexport const transformAddress = (val: string, ctx: z.RefinementCtx) => {\n if (isAddress(val.toLowerCase())) return val.toLowerCase() as Address;\n\n ctx.addIssue({\n code: \"invalid_format\",\n input: val,\n format: \"address\",\n error: \"not a valid address\",\n });\n\n return z.NEVER;\n};\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\nexport type LLTV = bigint & Brand<\"LLTV\">;\n\nexport const Options = [0.385, 0.5, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965, 0.98] as const;\nexport type Options = (typeof Options)[number];\nconst LLTV_SCALED = Options.map((lltv) => BigInt(lltv * 10 ** 18));\n\n/**\n * Convert a LLTV option or a scaled LLTV to a LLTV.\n * @param lltv - The LLTV option or the scaled LLTV.\n * @returns The LLTV.\n */\nexport function from(lltv: Options | bigint): LLTV {\n if (typeof lltv === \"bigint\" && !LLTV_SCALED.includes(lltv)) throw new InvalidLLTVError(lltv);\n if (typeof lltv === \"bigint\") return lltv as LLTV;\n if (typeof lltv === \"number\" && !Options.includes(lltv)) throw new InvalidOptionError(lltv);\n return BigInt(lltv * 10 ** 18) as LLTV;\n}\n\nexport declare namespace from {\n type ErrorType = InvalidOptionError | InvalidLLTVError;\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidOptionError\";\n constructor(input: number) {\n super(\n `Invalid LLTV option. Input: \"${input}\". Accepted values are: ${Options.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidLLTVError extends Errors.BaseError {\n override readonly name = \"LLTV.InvalidLLTVError\";\n constructor(input: bigint) {\n super(\n `Invalid LLTV. Input: \"${input}\". Accepted values are: ${LLTV_SCALED.map(\n (option) => `\"${option}\"`,\n ).join(\", \")}.`,\n );\n }\n}\n\nexport const LLTVSchema = z\n .bigint({ coerce: true })\n .refine(\n (lltv) => {\n try {\n from(lltv);\n return true;\n } catch (_) {\n return false;\n }\n },\n {\n error: () => {\n return \"Invalid LLTV: must be one of 0.385, 0.625, 0.77, 0.86, 0.915, 0.945, 0.965 or 0.98 (scaled by 1e18)\";\n },\n },\n )\n .transform((lltv) => from(lltv));\n","import type { Address, Hex } from \"viem\";\nimport { CallbackType } from \"./Callback.ts\";\nimport type * as Offer from \"./Offer.ts\";\n\n/**\n * Represents a liquidity pool with a unique ID and amount.\n */\nexport type LiquidityPool = {\n id: string;\n amount: bigint;\n};\n\n/**\n * Represents a hierarchical relationship between two liquidity pools.\n */\nexport type LiquidityLink = {\n parentPoolId: string;\n childPoolId: string;\n priority: number;\n};\n\n/**\n * Represents the connection between an offer and its liquidity pools.\n */\nexport type OfferLiquidityPool = {\n offerHash: Offer.Offer[\"hash\"];\n poolId: string;\n /**\n * The available capacity/liquidity from this pool for this offer.\n * Meaning varies by pool type:\n * - BuyWithEmptyCallback: Matches allowance amount from pool bellow\n * - SellERC20Callback: Sell Callback/Predeposited -> Maximum debt capacity calculated from collateral (collateralAmount * oraclePrice * lltv)\n * - SellERC20Callback: Existing debt as negative value (reduces available capacity)\n */\n amount: bigint;\n};\n\n/**\n * Calculate maximum debt capacity from collateral amount.\n * @param amount - Collateral amount\n * @param oraclePrice - Oracle price (scaled to 36 decimals)\n * @param lltv - Loan-to-value ratio (scaled to 18 decimals)\n * @returns Maximum debt capacity\n */\nexport function calculateMaxDebt(amount: bigint, oraclePrice: bigint, lltv: bigint): bigint {\n const ORACLE_PRICE_SCALE = 10n ** 36n; // Oracle prices are scaled to 36 decimals\n const PRECISION = 10n ** 18n; // LLTV ratios are scaled to 18 decimals (1e18 = 100%)\n\n const collateralQuoted = (amount * oraclePrice) / ORACLE_PRICE_SCALE;\n const maxDebt = (collateralQuoted * lltv) / PRECISION;\n\n return maxDebt;\n}\n\n/**\n * Generate pool ID for balance pools.\n */\nexport function generateBalancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-balance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for allowance pools.\n */\nexport function generateAllowancePoolId(parameters: {\n user: Address;\n chainId: bigint;\n token: Address;\n}): string {\n const { user, chainId, token } = parameters;\n return `${user}-${chainId.toString()}-${token}-allowance`.toLowerCase();\n}\n\n/**\n * Generate pool ID for sell ERC20 callback pools.\n * Each offer has its own callback pool to prevent liquidity conflicts.\n */\nexport function generateSellERC20CallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, obligationId, token, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-${offerHash}-sell_erc20_callback`.toLowerCase();\n}\n\n/**\n * Generate pool ID for obligation collateral pools.\n * Obligation collateral pools represent collateral already deposited in the obligation.\n * These pools are shared across all offers with the same obligation.\n */\nexport function generateObligationCollateralPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n token: Address;\n}): string {\n const { user, chainId, obligationId, token } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-${token}-obligation-collateral`.toLowerCase();\n}\n\n/**\n * Generate pool ID for buy vault callback pools.\n */\nexport function generateBuyVaultCallbackPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n offerHash: Hex;\n}): string {\n const { user, chainId, vault, offerHash } = parameters;\n return `${user}-${chainId.toString()}-${vault}-${offerHash}-${CallbackType.BuyVaultV1Callback}`.toLowerCase();\n}\n\n/**\n * Generate pool ID for debt pools.\n */\nexport function generateDebtPoolId(parameters: {\n user: Address;\n chainId: bigint;\n obligationId: Hex;\n}): string {\n const { user, chainId, obligationId } = parameters;\n return `${user}-${chainId.toString()}-${obligationId}-debt`.toLowerCase();\n}\n\n/**\n * Generate pool ID for user position in a vault.\n */\nexport function generateUserVaultPositionPoolId(parameters: {\n user: Address;\n chainId: bigint;\n vault: Address;\n}): string {\n const { user, chainId, vault } = parameters;\n return `${user}-${chainId.toString()}-${vault}-user-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for vault position in a market.\n */\nexport function generateVaultPositionPoolId(parameters: {\n vault: Address;\n chainId: bigint;\n marketId: string;\n}): string {\n const { vault, chainId, marketId } = parameters;\n return `${vault}-${chainId.toString()}-${marketId}-vault-position`.toLowerCase();\n}\n\n/**\n * Generate pool ID for market total liquidity.\n */\nexport function generateMarketLiquidityPoolId(parameters: {\n chainId: bigint;\n marketId: string;\n}): string {\n const { chainId, marketId } = parameters;\n return `${chainId.toString()}-${marketId}-market-liquidity`.toLowerCase();\n}\n","import * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type { Brand } from \"./types.ts\";\n\n/**\n * Maturity is a number that represents a date in seconds.\n */\nexport type Maturity = number & Brand<\"Maturity\">;\n\nexport const MaturitySchema = z\n .number()\n .int()\n .refine(\n (maturity) => {\n try {\n from(maturity);\n return true;\n } catch (_e) {\n return false;\n }\n },\n {\n error: (issue) => {\n try {\n const maturityDate = new Date((issue.input as number) * 1000);\n return `The maturity is set to ${maturityDate}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n } catch (_) {\n return `The maturity is set to ${issue.input}. It must fall on the allowed settlement cycles (Friday 15:00 UTC at the end of week/month/quarter).`;\n }\n },\n },\n )\n .transform((maturity) => maturity as Maturity);\n\nexport enum MaturityType {\n EndOfWeek = \"end_of_week\",\n EndOfNextWeek = \"end_of_next_week\",\n EndOfMonth = \"end_of_month\",\n EndOfNextMonth = \"end_of_next_month\",\n EndOfQuarter = \"end_of_quarter\",\n EndOfNextQuarter = \"end_of_next_quarter\",\n}\n\nconst MaturityOptions = {\n end_of_week: () => endOfWeek(),\n end_of_next_week: () => endOfNextWeek(),\n end_of_month: () => endOfMonth(),\n end_of_next_month: () => endOfNextMonth(),\n end_of_quarter: () => endOfQuarter(),\n end_of_next_quarter: () => endOfNextQuarter(),\n} as const;\n\nexport type MaturityOptions = keyof typeof MaturityOptions;\n\n/**\n * Creates a maturity from a timestamp in seconds or a maturity option.\n * @throws {InvalidFormatError} If the maturity is in milliseconds.\n * @throws {InvalidDateError} If the maturity is in seconds but not a valid date.\n * @throws {InvalidOptionError} If the maturity is not a valid option.\n */\nexport function from(ts: from.Parameters): Maturity {\n if (typeof ts === \"string\") {\n if (ts in MaturityOptions) return MaturityOptions[ts]();\n throw new InvalidOptionError(ts);\n }\n\n if (typeof ts === \"number\" && ts > 1e12) throw new InvalidFormatError();\n\n if (!Object.values(MaturityOptions).some((option) => option() === ts))\n throw new InvalidDateError(ts);\n\n return ts as Maturity;\n}\n\nexport declare namespace from {\n type Parameters = number | MaturityOptions;\n type ErrorType = InvalidFormatError | InvalidDateError | InvalidOptionError;\n}\n\n/** Returns the end of the current week (friday at 15:00:00 UTC) */\nconst endOfWeek = (): Maturity => fridayOfWeek(0);\n\n/** Returns the end of the next week (friday at 15:00:00 UTC) */\nconst endOfNextWeek = (): Maturity => fridayOfWeek(1);\n\n/** Returns the end of the current month (last friday of the month at 15:00:00 UTC)\n * Business rule: if we are after the last Friday of the month (strictly after 15:00 UTC\n * on that Friday), roll to the next month's last Friday.\n */\nconst endOfMonth = (): Maturity => {\n const now = new Date();\n const year = now.getUTCFullYear();\n const month = now.getUTCMonth();\n\n const endOfMonth = lastFridayOfMonth(year, month);\n\n // If strictly after 15:00 UTC on the last Friday, roll to next month's last Friday\n if (now.getTime() > endOfMonth * 1000) {\n return lastFridayOfMonth(year, month + 1);\n }\n\n return endOfMonth;\n};\n\n/** Returns the end of the next month (last friday of the next month at 15:00:00 UTC)\n * Business rule: if we are after the last Friday of the current month (strictly after 15:00 UTC\n * on that Friday), we consider being in the next month already, so \"next month\" becomes month+2.\n */\nconst endOfNextMonth = (): Maturity => {\n const now = new Date();\n const year = now.getUTCFullYear();\n const month = now.getUTCMonth();\n\n const endOfMonth = lastFridayOfMonth(year, month);\n\n if (now.getTime() > endOfMonth * 1000) {\n return lastFridayOfMonth(year, month + 2);\n }\n\n return lastFridayOfMonth(year, month + 1);\n};\n\n/** Returns the end of the current quarter (last friday of the quarter at 15:00:00 UTC) */\nconst endOfQuarter = (): Maturity => lastFridayOfQuarter(0);\n\n/** Returns the end of the next quarter (last friday of the next quarter at 15:00:00 UTC) */\nconst endOfNextQuarter = (): Maturity => lastFridayOfQuarter(1);\n\nconst fridayOfWeek = (weeksAhead = 0): Maturity => {\n const now = new Date();\n const today15H = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 15),\n );\n\n // Days until next Friday (5). Always non-negative in [0,6]\n let daysUntilFriday = (5 - today15H.getUTCDay() + 7) % 7;\n\n // If it's Friday and we're already past 15:00 UTC, roll to next Friday\n if (daysUntilFriday === 0 && now.getTime() >= today15H.getTime()) {\n daysUntilFriday = 7;\n }\n\n const friday = new Date(today15H);\n friday.setUTCDate(friday.getUTCDate() + daysUntilFriday + weeksAhead * 7);\n return (friday.getTime() / 1000) as Maturity;\n};\n\nconst lastFridayOfMonth = (year: number, month: number): Maturity => {\n const lastDayOfMonth15H = new Date(Date.UTC(year, month + 1, 0, 15));\n\n while (lastDayOfMonth15H.getUTCDay() !== 5) {\n lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate() - 1);\n }\n\n const maturity = lastDayOfMonth15H.setUTCDate(lastDayOfMonth15H.getUTCDate()) / 1000;\n\n return maturity as Maturity;\n};\n\nconst lastFridayOfQuarter = (quartersAhead = 0): Maturity => {\n const now = new Date();\n const quarterIndex = Math.floor(now.getUTCMonth() / 3) + quartersAhead;\n const year = now.getUTCFullYear() + Math.floor(quarterIndex / 4);\n const quarter = quarterIndex % 4;\n const lastMonth = quarter * 3 + 2; // 0-based\n return lastFridayOfMonth(year, lastMonth);\n};\n\nexport class InvalidFormatError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidFormatError\";\n constructor() {\n super(\"Invalid maturity format. Maturity should be expressed in seconds.\");\n }\n}\n\nexport class InvalidDateError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidDateError\";\n constructor(input: number) {\n super(\n `Invalid maturity date. Input: \"${input}\". Accepted values are: ${Object.values(\n MaturityOptions,\n )\n .map((option) => `\"${option()}\"`)\n .join(\", \")}.`,\n );\n }\n}\n\nexport class InvalidOptionError extends Errors.BaseError {\n override readonly name = \"Maturity.InvalidOptionError\";\n constructor(input: string) {\n super(\n `Invalid maturity option. Input: \"${input}\". Accepted values are: ${Object.keys(\n MaturityOptions,\n )\n .map((option) => `\"${option}\"`)\n .join(\", \")}.`,\n );\n }\n}\n","import { type Address, encodeAbiParameters, type Hex, keccak256, maxUint256 } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformAddress } from \"#utils/zod.ts\";\nimport type * as Chain from \"./Chain.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as Maturity from \"./Maturity.ts\";\n\nexport type Obligation = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n collaterals: Collateral.Collateral[];\n /** The maturity of the obligation. */\n maturity: Maturity.Maturity;\n};\n\nexport const ObligationSchema = z.object({\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n maturity: Maturity.MaturitySchema,\n});\n\n/**\n * Creates an obligation from the given parameters.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created obligation. {@link Obligation}\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n *\n * @example\n * ```ts\n * const obligation = Obligation.from({\n * chainId: 1n,\n * loanToken: privateKeyToAccount(generatePrivateKey()).address,\n * collaterals: [\n * Collateral.from({\n * asset: privateKeyToAccount(generatePrivateKey()).address,\n * oracle: privateKeyToAccount(generatePrivateKey()).address,\n * lltv: 0.965\n * }),\n * ],\n * maturity: Maturity.from(\"end_of_next_quarter\"),\n * });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedObligation = ObligationSchema.parse({\n ...parameters,\n maturity: Maturity.from(parameters.maturity),\n });\n\n return {\n chainId: parsedObligation.chainId,\n loanToken: parsedObligation.loanToken.toLowerCase() as Address,\n collaterals: parsedObligation.collaterals.sort((a, b) => a.asset.localeCompare(b.asset)),\n maturity: parsedObligation.maturity,\n };\n } catch (error: unknown) {\n throw new InvalidObligationError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The chain id where the liquidity for this obligation is located. */\n chainId: Chain.Id;\n /** The token that is being borrowed for this obligation. */\n loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. Must be sorted alphabetically by address. */\n collaterals: Collateral.from.Parameters[] | readonly Collateral.from.Parameters[];\n /** The maturity of the obligation. */\n maturity: Maturity.from.Parameters;\n };\n\n type ReturnType = Obligation;\n\n export type ErrorType = InvalidObligationError;\n}\n\n/**\n * Creates an obligation from a snake case object.\n * @throws If the obligation is invalid. {@link fromSnakeCase.ErrorType}\n * @param input - {@link fromSnakeCase.Parameters}\n * @returns The created obligation. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(input: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Obligation>(input));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Obligation>;\n type ReturnType = Obligation;\n type ErrorType = InvalidObligationError;\n}\n\n/**\n * Calculates the obligation id based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals, maturity)).\n * @throws If the collaterals are not sorted alphabetically by address. {@link CollateralsAreNotSortedError}\n * @param obligation - {@link id.Parameters}\n * @returns The obligation id as a 32-byte hex string. {@link id.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * const id = Obligation.id(obligation);\n * console.log(id); // 0x1234567890123456789012345678901234567890123456789012345678901234\n * ```\n */\nexport function id(obligation: id.Parameters): id.ReturnType {\n let lastAsset = \"\";\n for (const collateral of obligation.collaterals) {\n const newAsset = collateral.asset.toLowerCase();\n if (newAsset.localeCompare(lastAsset) < 0) throw new CollateralsAreNotSortedError();\n lastAsset = newAsset;\n }\n\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"uint256\" },\n { type: \"address\" },\n {\n type: \"tuple[]\",\n components: [\n { type: \"address\", name: \"token\" },\n { type: \"uint256\", name: \"lltv\" },\n { type: \"address\", name: \"oracle\" },\n ],\n },\n { type: \"uint256\" },\n ],\n [\n obligation.chainId,\n obligation.loanToken.toLowerCase() as Address,\n obligation.collaterals.map((c) => ({\n token: c.asset.toLowerCase() as Address,\n lltv: c.lltv,\n oracle: c.oracle.toLowerCase() as Address,\n })),\n BigInt(obligation.maturity),\n ],\n ),\n );\n}\n\nexport declare namespace id {\n type Parameters = Obligation;\n type ReturnType = Hex;\n type ErrorType = CollateralsAreNotSortedError;\n}\n\n/**\n * Generates a random obligation.\n * @returns A randomly generated obligation. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const obligation = Obligation.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n chainId: 1n,\n loanToken: privateKeyToAccount(generatePrivateKey()).address,\n collaterals: [\n Collateral.from({\n asset: privateKeyToAccount(generatePrivateKey()).address,\n oracle: privateKeyToAccount(generatePrivateKey()).address,\n lltv: 0.965,\n }),\n ],\n maturity: Maturity.from(\"end_of_next_quarter\"),\n });\n}\n\nexport declare namespace random {\n type ReturnType = Obligation;\n}\n\nexport class InvalidObligationError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Obligation.InvalidObligationError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid obligation.\", { cause: error });\n }\n}\n\nexport class CollateralsAreNotSortedError extends Errors.BaseError {\n override readonly name = \"Obligation.CollateralsAreNotSortedError\";\n constructor() {\n super(\"Collaterals are not sorted alphabetically by address.\");\n }\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** The snake case representation of a type with bigint values stringified. */\nexport type Snake<T> = DeepMutable<SnakeKeys<StringifiedBigint<T>>>;\n\n/** Make arrays/tuples and object props mutable, deeply. */\ntype DeepMutable<T> =\n // leave functions/primitives as-is\n T extends (...args: unknown[]) => unknown\n ? T\n : T extends number | string | boolean | symbol | bigint | null | undefined\n ? T\n : // handle tuples first (preserve length/element types)\n T extends readonly [...infer R]\n ? { -readonly [K in keyof R]: DeepMutable<R[K]> }\n : // then general readonly arrays\n T extends ReadonlyArray<infer U>\n ? Array<DeepMutable<U>>\n : // then objects: strip readonly from props and recurse\n T extends object\n ? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n : T;\n\n/** Stringifies bigint values to strings and preserves branded primitives. */\ntype StringifiedBigint<T> =\n // non-distributive check so that `bigint & Brand<...>` is still caught here\n [T] extends [bigint]\n ? string\n : [T] extends [`0x${string}`]\n ? string\n : // Preserve branded primitives by matching the primitive first.\n T extends number\n ? T\n : T extends string\n ? T\n : T extends boolean\n ? T\n : T extends symbol\n ? T\n : T extends null | undefined\n ? T\n : T extends readonly (infer U)[]\n ? readonly StringifiedBigint<U>[]\n : T extends object\n ? { [K in keyof T]: StringifiedBigint<T[K]> }\n : T;\n\n/** Key remapping that also preserves branded primitives. */\ntype SnakeKeys<T> = T extends readonly (infer U)[]\n ? readonly SnakeKeys<U>[]\n : T extends number | string | boolean | symbol | null | undefined\n ? T\n : T extends object\n ? { [K in keyof T as ToSnakeCase<Extract<K, string>>]: SnakeKeys<T[K]> }\n : T;\n\ntype ToSnakeCase<S extends string> = S extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? `${Lowercase<Head>}${ToSnakeCase<Tail>}`\n : `${Lowercase<Head>}_${ToSnakeCase<Uncapitalize<Tail>>}`\n : S;\n\n/**\n * Formats object keys to snake case.\n * Preserves ethereum addresses as is.\n * Converts ethereum addresses to checksummed if used as values.\n * Stringifies bigint values to strings.\n */\nexport function toSnakeCase<T>(obj: T): Snake<T> {\n return stringifyBigint(\n processObject(\n obj,\n (s: string) => s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase())\n ? getAddress(value.toLowerCase())\n : value,\n ),\n ) as Snake<T>;\n}\n\n/**\n * Formats a snake case object to its camel case type.\n * Preserves ethereum addresses as is.\n * Converts checksummed ethereum addresses to lowercase if used as values.\n * @warning Does not unstringify bigint values.\n */\nexport function fromSnakeCase<T>(obj: Snake<T>): T {\n return processObject(\n obj,\n (s: string) =>\n isAddress(s.toLowerCase()) ? s : s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()),\n (value: unknown) =>\n typeof value === \"string\" && isAddress(value.toLowerCase()) ? value.toLowerCase() : value,\n ) as T;\n}\n\nfunction processObject<T>(\n obj: T,\n fnKey: (str: string) => string,\n fnValue: (value: unknown) => unknown,\n): unknown {\n if (typeof obj !== \"object\" || obj === null) return obj;\n\n if (Array.isArray(obj)) return obj.map((item) => processObject(item, fnKey, fnValue));\n\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc, [key, value]) => {\n const newKey = fnKey(key);\n acc[newKey] =\n typeof value === \"object\" && value !== null\n ? processObject(value, fnKey, fnValue)\n : fnValue(value);\n\n return acc;\n },\n {} as Record<string, unknown>,\n );\n}\n\nexport function stringifyBigint<T>(value: T): StringifiedBigint<T> {\n if (typeof value === \"bigint\") return value.toString() as StringifiedBigint<T>;\n if (Array.isArray(value)) return value.map(stringifyBigint) as StringifiedBigint<T>;\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = stringifyBigint(v);\n }\n return out as StringifiedBigint<T>;\n }\n\n return value as StringifiedBigint<T>;\n}\n","import {\n type Address,\n type DecodeAbiParametersReturnType,\n decodeAbiParameters,\n encodeAbiParameters,\n type Hex,\n hashTypedData,\n maxUint256,\n type WalletClient,\n zeroAddress,\n} from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport * as z from \"zod\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformAddress, transformHex } from \"#utils/zod.ts\";\nimport * as Callback from \"./Callback.ts\";\nimport * as Chain from \"./Chain.ts\";\nimport * as Collateral from \"./Collateral.ts\";\nimport * as LLTV from \"./LLTV.ts\";\nimport * as Maturity from \"./Maturity.ts\";\nimport * as Obligation from \"./Obligation.ts\";\nimport * as Tree from \"./Tree.ts\";\n\nexport type Offer = {\n /** The address that made the offer. */\n readonly offering: Address;\n /** The amount of assets offered. */\n readonly assets: bigint;\n /** The interest rate (with 18 decimals). */\n readonly rate: bigint;\n /** The date at which all interests will be paid. */\n readonly maturity: Maturity.Maturity;\n /** The date at which the offer will expire. */\n readonly expiry: number;\n /** The date at which the offer will start. */\n readonly start: number;\n /** The nonce. Used for OCO (One-Cancelled-Other) mechanism. */\n readonly nonce: bigint;\n /** The side of the offer. `true` for buy, `false` for sell. */\n readonly buy: boolean;\n /** The chain id where the liquidity for this offer is located. */\n readonly chainId: bigint;\n /** The token that is being borrowed. */\n readonly loanToken: Address;\n /** The exact set of collaterals required to borrow the loan token. */\n readonly collaterals: readonly Collateral.Collateral[];\n /** The optional callback data to retrieve the maker funds. */\n readonly callback: {\n readonly address: Address;\n readonly data: Hex;\n readonly gasLimit: bigint;\n };\n /** The amount of assets consumed from the offer. */\n consumed: bigint;\n /** The hash of the offer. */\n readonly hash: Hex;\n /** The block number at which the offer was created. */\n readonly blockNumber: number;\n /** The signature of the offer. */\n signature?: Hex;\n};\n\nexport enum StatusCode {\n VALID = \"VALID\",\n NOT_ENOUGH_LIQUIDITY = \"NOT_ENOUGH_LIQUIDITY\",\n}\n\nexport const OfferHashSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]{64}$/, {\n message: \"Hash must be a valid 32-byte hex string\",\n })\n .transform(transformHex);\n\nexport const OfferSchema = (parameters?: {\n omitHash?: boolean;\n omitConsumed?: boolean;\n omitBlockNumber?: boolean;\n}) => {\n const { omitHash = false, omitConsumed = false, omitBlockNumber = false } = parameters || {};\n\n let base = z.object({\n offering: z.string().transform(transformAddress),\n assets: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n maturity: Maturity.MaturitySchema,\n expiry: z.number().int().max(Number.MAX_SAFE_INTEGER),\n start: z.number().int().max(Number.MAX_SAFE_INTEGER),\n nonce: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n buy: z.boolean(),\n chainId: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n loanToken: z.string().transform(transformAddress),\n collaterals: Collateral.CollateralsSchema,\n callback: z.object({\n address: z.string().transform(transformAddress),\n data: z.string().transform(transformHex),\n gasLimit: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n signature: z\n .string()\n .regex(/^0x[0-9a-fA-F]{130}$/, {\n message: \"Signature must be a valid 65-byte hex string\",\n })\n .transform(transformHex)\n .optional(),\n });\n\n if (!omitConsumed)\n base = base.extend({ consumed: z.bigint({ coerce: true }).min(0n).max(maxUint256) });\n if (!omitBlockNumber)\n base = base.extend({ blockNumber: z.number().int().max(Number.MAX_SAFE_INTEGER) });\n if (!omitHash) base = base.extend({ hash: OfferHashSchema });\n\n return base\n .refine((data) => data.start < data.expiry, {\n message: \"Start must be before expiry\",\n path: [\"start\"],\n })\n .refine((data) => data.expiry <= data.maturity, {\n message: \"Expiry cannot be after maturity\",\n path: [\"expiry\"],\n });\n};\n\n/**\n * Creates an offer from a plain object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function from(input: Omit<Offer, \"hash\">): Offer {\n try {\n const parsedOffer = OfferSchema({ omitHash: true }).parse(input) as unknown as Omit<\n Offer,\n \"hash\"\n >;\n const parsedHash = OfferHashSchema.parse(hash(parsedOffer));\n\n return {\n ...parsedOffer,\n hash: parsedHash,\n };\n } catch (error: unknown) {\n throw new InvalidOfferError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n export type ErrorType = InvalidOfferError;\n}\n\n/**\n * Creates an offer from a snake case object.\n * @throws {InvalidOfferError} If the offer is invalid.\n * @param input - The offer to create.\n * @returns The created offer with its hash.\n */\nexport function fromSnakeCase(input: Format.Snake<Omit<Offer, \"hash\">>): Offer {\n return from(Format.fromSnakeCase<Omit<Offer, \"hash\">>(input));\n}\n\n/**\n * Converts an offer to a snake case object.\n * @param offer - The offer to convert.\n * @returns The converted offer.\n */\nexport function toSnakeCase(offer: Offer): Format.Snake<Offer> {\n return Format.toSnakeCase(offer);\n}\n\nexport type RandomConfig = {\n chains?: Chain.Chain[];\n loanTokens?: Address[];\n collateralTokens?: Address[];\n assetsDecimals?: Record<Address, number>;\n buy?: boolean;\n assets?: bigint;\n consumed?: bigint;\n offering?: Address;\n maturity?: Maturity.Maturity;\n start?: number;\n expiry?: number;\n nonce?: bigint;\n rate?: bigint;\n callback?: {\n address: Address;\n data: Hex;\n gasLimit: bigint;\n };\n collaterals?: readonly Collateral.Collateral[];\n signature?: Hex;\n};\n\n/**\n * Generates a random Offer.\n * The returned Offer contains randomly generated values.\n * @warning The generated Offer should not be used for production usage.\n * @returns {Offer} A randomly generated Offer object.\n */\nexport function random(config?: RandomConfig): Offer {\n const chain = config?.chains\n ? config.chains[Math.floor(Math.random() * config.chains.length)]!\n : Chain.chains.ethereum;\n\n const loanToken = config?.loanTokens\n ? config.loanTokens[Math.floor(Math.random() * config.loanTokens.length)]!\n : privateKeyToAccount(generatePrivateKey()).address;\n\n const collateralCandidates = config?.collateralTokens\n ? config.collateralTokens.filter((a) => a !== loanToken)\n : [privateKeyToAccount(generatePrivateKey()).address];\n\n const collateralAsset =\n collateralCandidates[Math.floor(Math.random() * collateralCandidates.length)]!;\n\n const maturityOption = weightedChoice<Maturity.MaturityOptions>([\n [\"end_of_month\", 1],\n [\"end_of_next_month\", 1],\n ]);\n\n const maturity = config?.maturity ?? Maturity.from(maturityOption);\n\n const lltv = LLTV.from(\n weightedChoice<(typeof LLTV.Options)[number]>([\n [0.385, 1],\n [0.5, 1],\n [0.625, 2],\n [0.77, 8],\n [0.86, 10],\n [0.915, 8],\n [0.945, 6],\n [0.965, 4],\n [0.98, 2],\n ]),\n );\n\n const buy = config?.buy !== undefined ? config.buy : Math.random() > 0.5;\n\n // Rate spread grid with step 0.25, ranges by side:\n // - Buy: [4.00, 8.00]\n // - Sell: [1.00, 4.00]\n const ONE = 1000000000000000000n; // 1e18\n const qMin = buy ? 16 : 4; // quarters (4.00 => 16, 8.00 => 32, 1.00 => 4)\n const qMax = buy ? 32 : 16;\n const len = qMax - qMin + 1;\n const ratePairs: ReadonlyArray<readonly [bigint, number]> = Array.from(\n { length: len },\n (_, idx) => {\n const q = qMin + idx; // number of quarters (0.25)\n const scaledRate = BigInt(q) * (ONE / 4n);\n // Make best rates rarer and worse rates more common (by side):\n // - Buy best is lower rate => weight increases with idx (higher rate)\n // - Sell best is higher rate => weight decreases with idx\n const weight = buy ? 1 + idx : 1 + (len - 1 - idx);\n return [scaledRate, weight] as const;\n },\n );\n const rate = config?.rate ?? weightedChoice<bigint>(ratePairs);\n\n const loanTokenDecimals = config?.assetsDecimals?.[loanToken] ?? 18;\n const unit = BigInt(10) ** BigInt(loanTokenDecimals);\n const amountBase = BigInt(100 + Math.floor(Math.random() * (1_000_000 - 100 + 1)));\n const assetsScaled = config?.assets ?? amountBase * unit;\n\n // 20% of offers are partially consumed up to 90%\n const consumed =\n config?.consumed !== undefined\n ? config.consumed\n : Math.random() < 0.8\n ? 0n\n : (assetsScaled * BigInt(1 + Math.floor(Math.random() * 900))) / 1000n;\n\n const callbackBySide = (() => {\n if (buy) return { address: zeroAddress, data: \"0x\" as Hex, gasLimit: 0n } as const;\n const sellCallbackAddress = \"0x3333333333333333333333333333333333333333\" as Address;\n const amount = assetsScaled * 1000000000000000000000n;\n const data = Callback.encodeSellERC20Callback({\n collaterals: [collateralAsset],\n amounts: [amount],\n });\n return { address: sellCallbackAddress, data, gasLimit: 0n } as const;\n })();\n\n const offer = from({\n offering: config?.offering ?? privateKeyToAccount(generatePrivateKey()).address,\n assets: assetsScaled,\n rate,\n maturity: maturity,\n expiry: config?.expiry ?? maturity - 1,\n start: config?.start ?? maturity - 10,\n nonce: BigInt(Math.floor(Math.random() * 1000000)),\n buy,\n chainId: chain.id,\n loanToken,\n collaterals:\n config?.collaterals ??\n Array.from({ length: Math.floor(Math.random() * 3) + 1 }, () => ({\n ...Collateral.random(),\n lltv,\n })).sort((a, b) => a.asset.localeCompare(b.asset)),\n callback: config?.callback ?? callbackBySide,\n consumed,\n blockNumber: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER),\n });\n\n return offer;\n}\n\nconst weightedChoice = <T>(pairs: ReadonlyArray<readonly [T, number]>): T => {\n const total = pairs.reduce((sum, [, weight]) => sum + weight, 0);\n let roll = Math.random() * total;\n for (const [value, weight] of pairs) {\n roll -= weight;\n if (roll < 0) return value;\n }\n return pairs[0]![0];\n};\n\n/**\n * Creates an EIP-712 domain object.\n * @param chainId - The chain ID.\n * @returns The EIP-712 domain object.\n */\nexport const domain = (chainId: bigint) => ({\n chainId,\n verifyingContract: zeroAddress,\n});\n\n/**\n * The EIP-712 types for the offer.\n * @warning The ordering of the types should NEVER be changed. The offer hash is computed based on the order of the types.\n * @returns The EIP-712 types.\n */\nexport const types = {\n EIP712Domain: [\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Offer: [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"collaterals\", type: \"Collateral[]\" },\n { name: \"callback\", type: \"Callback\" },\n ],\n Collateral: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n Callback: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Signs an array of offers.\n * @throws {Error} If the wallet account is not set.\n * @param offers - The offers to sign.\n * @param wallet - The wallet to sign the offers with.\n * @returns The signed offers.\n */\nexport async function sign(offers: Offer[], wallet: WalletClient): Promise<Hex> {\n if (!wallet.account) throw new AccountNotSetError();\n return wallet.signMessage({\n account: wallet.account,\n message: { raw: signatureMsg(offers) },\n });\n}\n\nexport function signatureMsg(offers: Offer[]): Hex {\n return Tree.from(offers).root;\n}\n\nexport function hash(offer: Omit<Offer, \"hash\">): Hex {\n return hashTypedData({\n domain: domain(offer.chainId),\n message: {\n offering: offer.offering.toLowerCase() as Address,\n assets: offer.assets,\n rate: offer.rate,\n maturity: BigInt(offer.maturity),\n expiry: BigInt(offer.expiry),\n nonce: offer.nonce,\n buy: offer.buy,\n loanToken: offer.loanToken.toLowerCase() as Address,\n collaterals: offer.collaterals,\n callback: {\n address: offer.callback.address.toLowerCase() as Address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit,\n },\n },\n primaryType: \"Offer\",\n types,\n });\n}\n\n/**\n * Calculates the obligation id for an offer based on the smart contract's Obligation struct.\n * The id is computed as keccak256(abi.encode(chainId, loanToken, collaterals (sorted by token address), maturity)).\n * @param offer - The offer to calculate the obligation id for.\n * @returns The obligation id as a 32-byte hex string.\n */\nexport function obligationId(offer: Offer): Hex {\n return Obligation.id(\n Obligation.from({\n chainId: offer.chainId,\n loanToken: offer.loanToken,\n collaterals: offer.collaterals as Collateral.Collateral[],\n maturity: offer.maturity,\n }),\n );\n}\n\nconst OfferAbi = [\n { name: \"offering\", type: \"address\" },\n { name: \"assets\", type: \"uint256\" },\n { name: \"rate\", type: \"uint256\" },\n { name: \"maturity\", type: \"uint256\" },\n { name: \"expiry\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"buy\", type: \"bool\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"loanToken\", type: \"address\" },\n { name: \"start\", type: \"uint256\" },\n {\n name: \"collaterals\",\n type: \"tuple[]\",\n components: [\n { name: \"asset\", type: \"address\" },\n { name: \"oracle\", type: \"address\" },\n { name: \"lltv\", type: \"uint256\" },\n ],\n },\n {\n name: \"callback\",\n type: \"tuple\",\n components: [\n { name: \"address\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"gasLimit\", type: \"uint256\" },\n ],\n },\n { name: \"signature\", type: \"bytes\" },\n] as const;\n\nexport function encode(offer: Offer) {\n return encodeAbiParameters(OfferAbi, [\n offer.offering,\n offer.assets,\n offer.rate,\n BigInt(offer.maturity),\n BigInt(offer.expiry),\n offer.nonce,\n offer.buy,\n offer.chainId,\n offer.loanToken,\n BigInt(offer.start),\n offer.collaterals,\n offer.callback,\n offer.signature ?? \"0x\",\n ]);\n}\n\nexport function decode(data: Hex, blockNumber: number | bigint): Offer {\n let decoded: DecodeAbiParametersReturnType<typeof OfferAbi>;\n try {\n decoded = decodeAbiParameters(OfferAbi, data);\n } catch (error) {\n throw new InvalidOfferError(error as Error);\n }\n\n const offer = from({\n offering: decoded[0],\n assets: decoded[1],\n rate: decoded[2],\n maturity: Maturity.from(Number(decoded[3])),\n expiry: Number(decoded[4]),\n nonce: decoded[5],\n buy: decoded[6],\n chainId: decoded[7],\n loanToken: decoded[8],\n start: Number(decoded[9]),\n collaterals: decoded[10].map((c) => {\n return Collateral.from({\n asset: c.asset,\n oracle: c.oracle,\n lltv: c.lltv,\n });\n }),\n callback: {\n address: decoded[11].address,\n data: decoded[11].data,\n gasLimit: decoded[11].gasLimit,\n },\n consumed: 0n,\n blockNumber: Number(blockNumber),\n ...(decoded[12] === \"0x\" ? {} : { signature: decoded[12] }),\n });\n\n return offer;\n}\n\nexport type OfferConsumed = {\n id: string;\n chainId: bigint;\n offering: Address;\n nonce: bigint;\n amount: bigint;\n blockNumber: number;\n};\n\n/**\n * ABI for the Consumed event emitted by the Obligation 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\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 blockNumber: Number(blockNumber),\n };\n}\n\nexport class InvalidOfferError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Offer.InvalidOfferError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid offer.\", { cause: error });\n }\n}\n\nexport class AccountNotSetError extends Errors.BaseError {\n override readonly name = \"Offer.AccountNotSetError\";\n constructor() {\n super(\"Account not set.\");\n }\n}\n","import { StandardMerkleTree } from \"@openzeppelin/merkle-tree\";\nimport { gzip, ungzip } from \"pako\";\nimport { bytesToHex, type Hex, hexToBytes } from \"viem\";\nimport * as Offer from \"./Offer.ts\";\nimport type { Compute } from \"./types.ts\";\n\nexport type Tree = Compute<StandardMerkleTree<[Hex]> & { offers: Offer.Offer[]; root: Hex }>;\n\nexport const VERSION = 1;\n\n/**\n * Builds a Merkle tree from a list of offers.\n *\n * Leaves are the offer `hash` values as `bytes32` and are deterministically\n * ordered in ascending lexicographic order so that the resulting root is stable\n * regardless of the input order.\n *\n * @param offers - Offers to include in the tree.\n * @returns A `StandardMerkleTree` of `bytes32` leaves representing the offers.\n */\nexport const from = (offers: Offer.Offer[]): Tree => {\n const leaves = order(offers).map<[Hex]>((offer) => {\n return [offer.hash];\n });\n const tree = StandardMerkleTree.of<[Hex]>(leaves, [\"bytes32\"]);\n return Object.assign(tree, { offers }) as Tree;\n};\n\nconst byHashAsc = (a: string, b: string) => a.localeCompare(b);\n\nconst order = (offers: Offer.Offer[]): Offer.Offer[] => {\n return offers.sort((a, b) => byHashAsc(a.hash, b.hash));\n};\n\n/**\n * Encodes an `Tree` into a Hex string with a version byte prefix and gzipped payload.\n *\n * - Layout: `0x{vv}{zip...}` where `{vv}` is one-byte version as two hex chars.\n * - Payload is gzip(JSON.stringify([root, ...offers])) with bigint stringified.\n *\n * @param tree - The offer Merkle tree to encode.\n * @returns Hex string starting with `0x{vv}` followed by gzipped payload bytes.\n * @throws Error if the given `root` does not match the offers.\n */\nexport const encode = (tree: Tree): Hex => {\n assertRoot(tree.root, tree.offers);\n const offersPayload = tree.offers.map((offer) => ({\n offering: offer.offering,\n assets: offer.assets.toString(),\n rate: offer.rate.toString(),\n maturity: Number(offer.maturity),\n expiry: Number(offer.expiry),\n start: Number(offer.start),\n nonce: offer.nonce.toString(),\n buy: offer.buy,\n chainId: offer.chainId.toString(),\n loanToken: offer.loanToken,\n collaterals: offer.collaterals.map((c) => ({\n asset: c.asset,\n oracle: c.oracle,\n lltv: c.lltv.toString(),\n })),\n callback: {\n address: offer.callback.address,\n data: offer.callback.data,\n gasLimit: offer.callback.gasLimit.toString(),\n },\n signature: offer.signature,\n hash: offer.hash,\n }));\n const compressed = gzip(JSON.stringify([tree.root, ...offersPayload]));\n const encoded = new Uint8Array(1 + compressed.length);\n if (VERSION > 0xff) {\n throw new Error(`Version overflow: ${VERSION}`);\n }\n encoded[0] = VERSION;\n encoded.set(compressed, 1);\n return bytesToHex(encoded);\n};\n\nconst assertRoot = (root: Hex, offers: Offer.Offer[]): void => {\n const tree = from(offers);\n if (root !== tree.root) {\n throw new Error(`Invalid root: expected ${tree.root}, got ${root}`);\n }\n};\n\n/**\n * Decodes a Hex string produced by {@link encode} back into an `Tree`.\n *\n * - Ensures the first byte version matches {@link VERSION}.\n * - Decompresses with gunzip, parses JSON, validates offers, and re-checks the root.\n *\n * @param encoded - Hex string in the form `0x{vv}{zip...}`.\n * @returns A validated `Tree` rebuilt from the offers.\n * @throws Error if the version is invalid or the root does not match the offers.\n */\nexport const decode = (encoded: Hex): Tree => {\n const bytes = hexToBytes(encoded);\n if (bytes.length < 2) {\n throw new Error(\"Invalid payload: too short\");\n }\n const version = bytes[0];\n if (version !== (VERSION & 0xff)) {\n throw new Error(`Invalid version: expected ${VERSION}, got ${version}`);\n }\n const payload = bytes.slice(1);\n const decoded = ungzip(payload, { to: \"string\" });\n const data = JSON.parse(decoded);\n const root = data[0] as Hex;\n const offers = data\n .slice(1)\n .map((o: unknown) => Offer.OfferSchema({ omitConsumed: true, omitBlockNumber: true }).parse(o));\n const tree = from(offers);\n if (root !== tree.root) {\n throw new Error(`Invalid root: expected ${tree.root}, got ${root}`);\n }\n return tree;\n};\n","import { type Hex, maxUint256 } from \"viem\";\nimport * as z from \"zod\";\nimport { Obligation } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport { transformHex } from \"#utils/zod.ts\";\n\nexport type Quote = {\n /** The obligation id. */\n obligationId: Hex;\n ask: {\n /** The highest interest rate the seller will accept to pay for the obligation. (18 decimals). */\n rate: bigint;\n };\n bid: {\n /** The lowest interest rate a buyer is willing to be paid for the obligation. (18 decimals). */\n rate: bigint;\n };\n};\n\nexport const QuoteSchema = z.object({\n obligationId: z.string().transform(transformHex),\n ask: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n bid: z.object({\n rate: z.bigint({ coerce: true }).min(0n).max(maxUint256),\n }),\n});\n\n/**\n * Creates a quote for a given obligation.\n * @constructor\n * @param parameters - {@link from.Parameters}\n * @returns The created quote. {@link Quote}\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n *\n * @example\n * ```ts\n * const quote = Quote.from({ obligationId: \"0x123\", ask: { assets: 100n, rate: 100n }, bid: { assets: 100n, rate: 100n } });\n * ```\n */\nexport function from(parameters: from.Parameters): from.ReturnType {\n try {\n const parsedQuote = QuoteSchema.parse(parameters);\n return {\n obligationId: parsedQuote.obligationId,\n ask: parsedQuote.ask,\n bid: parsedQuote.bid,\n };\n } catch (error: unknown) {\n throw new InvalidQuoteError(error as z.ZodError | Error);\n }\n}\n\nexport declare namespace from {\n type Parameters = Quote;\n type ReturnType = Quote;\n type ErrorType = InvalidQuoteError;\n}\n\n/**\n * Creates a quote from a snake case object.\n * @throws If the quote is invalid. {@link InvalidQuoteError}\n * @param snake - {@link fromSnakeCase.Parameters}\n * @returns The created quote. {@link fromSnakeCase.ReturnType}\n */\nexport function fromSnakeCase(snake: fromSnakeCase.Parameters): fromSnakeCase.ReturnType {\n return from(Format.fromSnakeCase<Quote>(snake));\n}\n\nexport declare namespace fromSnakeCase {\n type Parameters = Format.Snake<Quote>;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\n/**\n * Generates a random quote.\n * @returns A randomly generated quote. {@link random.ReturnType}\n *\n * @example\n * ```ts\n * const quote = Quote.random();\n * ```\n */\nexport function random(): random.ReturnType {\n return from({\n obligationId: Obligation.id(Obligation.random()),\n ask: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n bid: {\n rate: BigInt(Math.floor(Math.random() * 1000000)),\n },\n });\n}\n\nexport declare namespace random {\n type Parameters = never;\n type ReturnType = Quote;\n type ErrorType = from.ErrorType;\n}\n\nexport class InvalidQuoteError extends Errors.BaseError<z.ZodError | Error> {\n override readonly name = \"Quote.InvalidQuoteError\";\n constructor(error: z.ZodError | Error) {\n super(\"Invalid quote.\", { cause: error });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createMemoryClient, tevmCall, tevmSetAccount } from \"tevm\";\nimport { mainnet } from \"tevm/common\";\nimport {\n type Account,\n type Address,\n concatHex,\n decodeFunctionResult,\n encodeFunctionData,\n type Hex,\n keccak256,\n pad,\n parseEther,\n toHex,\n type WalletClient,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { Chain } from \"#core\";\n\nexport const users: Account[] = [\n privateKeyToAccount(\n // first anvil account private key\n \"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\",\n ),\n];\n\nexport const assetList = [\"USDC\", \"DAI\"] as const;\nexport const mockAddress = (asset: (typeof assetList)[number]) => {\n return privateKeyToAccount(keccak256(toHex(asset))).address;\n};\n\nexport const mockOracleAddress = privateKeyToAccount(keccak256(toHex(\"ORACLE\"))).address;\nexport const mockMorphoAddress = privateKeyToAccount(keccak256(toHex(\"MORPHO\"))).address;\nexport const mockFactoryAddress = privateKeyToAccount(keccak256(toHex(\"FACTORY\"))).address;\n\nexport const encodeConsumedEvent = (parameters: {\n user: Address;\n nonce: bigint;\n amount: bigint;\n}) => {\n return encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"consume\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n },\n ],\n functionName: \"consume\",\n args: [parameters.user, parameters.nonce, parameters.amount],\n });\n};\n\nexport const assetMethods = [\"balanceOf\", \"allowance\"] as const;\nexport const oracleMethods = [\"price\"] as const;\nexport const morphoMethods = [\"debtOf\", \"collateralOf\", \"market\", \"position\"] as const;\nexport const vaultMethods = [\n \"asset\",\n \"balanceOf\",\n \"totalSupply\",\n \"totalAssets\",\n \"withdrawQueue\",\n] as const;\n\nexport const factoryMethods = [\"isMetaMorpho\", \"morpho\"] as const;\n\nexport type AssetMethod = (typeof assetMethods)[number];\nexport type OracleMethod = (typeof oracleMethods)[number];\nexport type MorphoMethod = (typeof morphoMethods)[number];\nexport type VaultMethod = (typeof vaultMethods)[number];\nexport type FactoryMethod = (typeof factoryMethods)[number];\n\nexport type MethodParameters = {\n balanceOf: { address: Address; value: bigint };\n allowance: { owner: Address; spender: Address; value: bigint };\n};\n\nexport type OracleMethodParameters = {\n price: { value: bigint };\n};\n\nexport type MorphoMethodParameters = {\n debtOf: { user: Address; obligationId: Hex; value: bigint };\n collateralOf: { user: Address; obligationId: Hex; collateralAsset: Address; value: bigint };\n market: {\n marketId: Hex;\n totalSupplyAssets: bigint;\n totalSupplyShares: bigint;\n totalBorrowAssets: bigint;\n totalBorrowShares: bigint;\n lastUpdate: bigint;\n fee: bigint;\n };\n position: {\n marketId: Hex;\n user: Address;\n supplyShares: bigint;\n borrowShares: bigint;\n collateral: bigint;\n };\n};\n\nexport type VaultMethodParameters = {\n asset: { value: Address };\n balanceOf: { user: Address; value: bigint };\n totalSupply: { value: bigint };\n totalAssets: { value: bigint };\n withdrawQueue: { value: Hex[] };\n};\n\nexport type FactoryMethodParameters = {\n isMetaMorpho: { vault: Address; value: boolean };\n morpho: { value: Address };\n};\n\nexport type MockedAsset = {\n address: Address;\n set: (\n slot: Hex | AssetMethod,\n parameters: Hex | bigint | MethodParameters[AssetMethod],\n ) => Promise<void>;\n};\n\nexport type MockedOracle = {\n address: Address;\n set: (method: OracleMethod, parameters: OracleMethodParameters[OracleMethod]) => Promise<void>;\n};\n\nexport type MockedMorpho = {\n address: Address;\n set: (method: MorphoMethod, parameters: MorphoMethodParameters[MorphoMethod]) => Promise<void>;\n};\n\nexport type MockedVault = {\n address: Address;\n set: (method: VaultMethod, parameters: VaultMethodParameters[VaultMethod]) => Promise<void>;\n};\n\nexport type MockedFactory = {\n address: Address;\n set: (method: FactoryMethod, parameters: FactoryMethodParameters[FactoryMethod]) => Promise<void>;\n};\n\nexport type Mocked = {\n name: string;\n client: WalletClient;\n mempoolAddress: Address;\n termsAddress: Address;\n mine: () => Promise<void>;\n reset: () => Promise<void>;\n deployVault: () => Promise<MockedVault>;\n oracle: MockedOracle;\n morpho: MockedMorpho;\n factory: MockedFactory;\n} & Record<(typeof assetList)[number], MockedAsset>;\n\nexport async function mock(name: string): Promise<Mocked> {\n const client = createMemoryClient({\n account: users[0],\n common: mainnet,\n miningConfig: {\n // makes tests deterministic by forcing to call mine() manually\n type: \"manual\",\n },\n // makes tests faster by only waiting 50ms to fetch the current state\n pollingInterval: 50,\n });\n\n await client.tevmReady();\n\n const mine = async () => {\n await client.mine({ blocks: 1 });\n };\n\n // contract address -> slot -> value\n const globalState: Record<Address, Record<Hex, Hex>> = {};\n\n // deploy mempool contract\n const { createdAddress: mempoolAddress } = (await tevmCall(client, {\n data: fs.readFileSync(path.join(__dirname, \"bytecode\", \"mempool.txt\"), \"utf8\") as Hex,\n addToBlockchain: true,\n })) as { createdAddress?: Address };\n\n if (!mempoolAddress) throw new Error(\"Failed to deploy mempool contract\");\n\n // deploy terms contract\n const { createdAddress: termsAddress } = (await tevmCall(client, {\n data: fs.readFileSync(path.join(__dirname, \"bytecode\", \"terms.txt\"), \"utf8\") as Hex,\n addToBlockchain: true,\n })) as { createdAddress?: Address };\n\n if (!termsAddress) throw new Error(\"Failed to deploy terms contract\");\n\n await Promise.all(\n users.map((u) =>\n tevmSetAccount(client, {\n address: u.address,\n balance: parseEther(\"100\"),\n }),\n ),\n );\n\n await Promise.all(\n assetList.map((a) => {\n const bytecode = fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"erc20.txt\"),\n \"utf8\",\n ) as Hex;\n return tevmSetAccount(client, {\n address: mockAddress(a),\n deployedBytecode: bytecode,\n });\n }),\n );\n\n const setAccount = async ({ address, state }: { address: Address; state: Record<Hex, Hex> }) => {\n const previousState = globalState[address] ?? {};\n globalState[address] = { ...previousState, ...state };\n\n await tevmSetAccount(client, {\n address,\n state: globalState[address],\n });\n };\n\n const translate = (\n patch: Record<Hex | AssetMethod, Hex | bigint | MethodParameters[AssetMethod]>,\n ): Record<Hex, Hex> => {\n return Object.fromEntries(\n Object.entries(patch).map(([k, v]) => {\n if (typeof k === \"string\" && k.startsWith(\"0x\")) {\n if (typeof v !== \"bigint\" && typeof v !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n return [k, typeof v === \"bigint\" ? toHex(v) : v];\n }\n\n return stateFromAssetMethod(k as AssetMethod, v as MethodParameters[AssetMethod]);\n }),\n );\n };\n\n const stateFromAssetMethod = (\n method: AssetMethod,\n parameters: MethodParameters[AssetMethod],\n ): [Hex, Hex] => {\n if (method === \"balanceOf\") {\n const { address: key, value } = parameters as MethodParameters[\"balanceOf\"];\n const slot = 9; // erc20 balanceOf slot in usdc implementation\n return [\n keccak256(concatHex([pad(key, { size: 32 }), pad(toHex(slot), { size: 32 })])),\n toHex(value),\n ];\n }\n\n if (method === \"allowance\") {\n const { owner: key, spender: key2, value } = parameters as MethodParameters[\"allowance\"];\n const slot = 10; // erc20 allowance slot in usdc implementation\n const outer = keccak256(concatHex([pad(key, { size: 32 }), pad(toHex(slot), { size: 32 })]));\n // second hash spender + outerHash\n const inner = keccak256(concatHex([pad(key2, { size: 32 }), pad(outer, { size: 32 })]));\n\n return [inner, toHex(value)];\n }\n\n return [\"0x0\", \"0x0\"];\n };\n\n const mockedAssets = Object.fromEntries(\n assetList.map((name) => [\n name,\n {\n address: mockAddress(name),\n set: async (\n slot: Hex | AssetMethod,\n parameters: Hex | bigint | MethodParameters[AssetMethod],\n ) => {\n const patch = { [slot]: parameters };\n\n await setAccount({\n address: mockAddress(name),\n state: translate(\n patch as Record<Hex | AssetMethod, Hex | bigint | MethodParameters[AssetMethod]>,\n ),\n });\n },\n },\n ]),\n ) as Record<(typeof assetList)[number], MockedAsset>;\n\n /**\n * Smart contract structures behind the bytecode:\n *\n * Oracle Contract:\n * - Stores a single price value\n * - price(): Returns the current price (uint256)\n * - setPrice(uint256): Updates the stored price\n *\n * Morpho Contract:\n * - Manages user debt and collateral positions, markets, and vault positions\n * - debtOf[user][termId]: User's debt amount for a specific term\n * - collateralOf[user][termId][asset]: User's collateral amount for a specific term and asset\n * - markets[marketId]: Market data including supply/borrow assets and shares\n * - positions[marketId][user]: User's position in a market (supply shares, borrow shares, collateral)\n * - setDebtOf(address, bytes32, uint256): Updates user's debt position\n * - setCollateralOf(address, bytes32, address, uint256): Updates user's collateral position\n * - setMarket(bytes32, uint128, uint128, uint128, uint128, uint128, uint128): Updates market data\n * - setPosition(bytes32, address, uint256, uint128, uint128): Updates user's position in a market\n */\n await Promise.all([\n tevmSetAccount(client, {\n address: mockOracleAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"oracle.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n tevmSetAccount(client, {\n address: mockMorphoAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"morpho.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n tevmSetAccount(client, {\n address: mockFactoryAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"factory.txt\"),\n \"utf8\",\n ) as Hex,\n }),\n ]);\n\n const mockedOracle: MockedOracle = {\n address: mockOracleAddress,\n set: async (method: OracleMethod, parameters: OracleMethodParameters[OracleMethod]) => {\n if (method === \"price\") {\n const { value } = parameters as OracleMethodParameters[\"price\"];\n await tevmCall(client, {\n to: mockOracleAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setPrice\",\n inputs: [{ name: \"newPrice\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setPrice\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n const mockedMorpho: MockedMorpho = {\n address: mockMorphoAddress,\n set: async (method: MorphoMethod, parameters: MorphoMethodParameters[MorphoMethod]) => {\n if (method === \"debtOf\") {\n const { user, obligationId, value } = parameters as MorphoMethodParameters[\"debtOf\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setDebtOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"termId\", type: \"bytes32\" },\n { name: \"debt\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setDebtOf\",\n args: [user, obligationId, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"collateralOf\") {\n const { user, obligationId, collateralAsset, value } =\n parameters as MorphoMethodParameters[\"collateralOf\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setCollateralOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"termId\", type: \"bytes32\" },\n { name: \"collateralAsset\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setCollateralOf\",\n args: [user, obligationId, collateralAsset, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"market\") {\n const {\n marketId,\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n totalBorrowShares,\n lastUpdate,\n fee,\n } = parameters as MorphoMethodParameters[\"market\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setMarket\",\n inputs: [\n { name: \"id\", type: \"bytes32\" },\n { name: \"totalSupplyAssets\", type: \"uint128\" },\n { name: \"totalSupplyShares\", type: \"uint128\" },\n { name: \"totalBorrowAssets\", type: \"uint128\" },\n { name: \"totalBorrowShares\", type: \"uint128\" },\n { name: \"lastUpdate\", type: \"uint128\" },\n { name: \"fee\", type: \"uint128\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setMarket\",\n args: [\n marketId,\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n totalBorrowShares,\n lastUpdate,\n fee,\n ],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"position\") {\n const { marketId, user, supplyShares, borrowShares, collateral } =\n parameters as MorphoMethodParameters[\"position\"];\n await tevmCall(client, {\n to: mockMorphoAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setPosition\",\n inputs: [\n { name: \"id\", type: \"bytes32\" },\n { name: \"user\", type: \"address\" },\n { name: \"supplyShares\", type: \"uint256\" },\n { name: \"borrowShares\", type: \"uint128\" },\n { name: \"collateral\", type: \"uint128\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setPosition\",\n args: [marketId, user, supplyShares, borrowShares, collateral],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n const mockedFactory: MockedFactory = {\n address: mockFactoryAddress,\n set: async (method: FactoryMethod, parameters: FactoryMethodParameters[FactoryMethod]) => {\n if (method === \"isMetaMorpho\") {\n const { vault, value } = parameters as FactoryMethodParameters[\"isMetaMorpho\"];\n await tevmCall(client, {\n to: mockFactoryAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setIsMetaMorpho\",\n inputs: [\n { name: \"vault\", type: \"address\" },\n { name: \"isValid\", type: \"bool\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setIsMetaMorpho\",\n args: [vault, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"morpho\") {\n const { value } = parameters as FactoryMethodParameters[\"morpho\"];\n await tevmCall(client, {\n to: mockFactoryAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setMorpho\",\n inputs: [{ name: \"morpho_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setMorpho\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n\n /**\n * Deploy a new MockVault instance.\n * The vault implements ERC4626 and IMetaMorphoV1_1 interfaces including:\n * - asset(): Returns the vault's underlying asset address\n * - balanceOf(address): Returns vault share balance for a user\n * - totalSupply(): Returns total vault shares\n * - totalAssets(): Returns total underlying assets\n * - withdrawQueue(uint256): Returns market ID at queue index\n * - convertToAssets(uint256): Converts shares to assets\n * - convertToShares(uint256): Converts assets to shares\n * - maxWithdraw(address): Returns maximum withdrawable assets for a user\n * - maxRedeem(address): Returns maximum redeemable shares for a user\n */\n const deployVault = async (): Promise<MockedVault> => {\n const vaultAddress = privateKeyToAccount(\n keccak256(toHex(`VAULT_${Date.now()}_${Math.random()}`)),\n ).address;\n\n await tevmSetAccount(client, {\n address: vaultAddress,\n deployedBytecode: fs.readFileSync(\n path.join(__dirname, \"bytecode\", \"vault.txt\"),\n \"utf8\",\n ) as Hex,\n });\n\n if (!vaultAddress) throw new Error(\"Failed to deploy vault contract\");\n\n return {\n address: vaultAddress,\n set: async (method: VaultMethod, parameters: VaultMethodParameters[VaultMethod]) => {\n if (method === \"asset\") {\n const { value } = parameters as VaultMethodParameters[\"asset\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setAsset\",\n inputs: [{ name: \"asset_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setAsset\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"balanceOf\") {\n const { user, value } = parameters as VaultMethodParameters[\"balanceOf\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setBalanceOf\",\n inputs: [\n { name: \"user\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setBalanceOf\",\n args: [user, value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"totalSupply\") {\n const { value } = parameters as VaultMethodParameters[\"totalSupply\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setTotalSupply\",\n inputs: [{ name: \"amount\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setTotalSupply\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"totalAssets\") {\n const { value } = parameters as VaultMethodParameters[\"totalAssets\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setTotalAssets\",\n inputs: [{ name: \"amount\", type: \"uint256\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setTotalAssets\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n } else if (method === \"withdrawQueue\") {\n const { value } = parameters as VaultMethodParameters[\"withdrawQueue\"];\n await tevmCall(client, {\n to: vaultAddress,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"setWithdrawQueue\",\n inputs: [{ name: \"queue\", type: \"bytes32[]\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"setWithdrawQueue\",\n args: [value],\n }),\n addToBlockchain: true,\n });\n }\n },\n };\n };\n\n return {\n name,\n client: Object.assign(client, {\n extend: ((originalExtend) => (actions: Parameters<typeof client.extend>[0]) => {\n const extended = originalExtend(actions as any);\n const multicall = async (parameters: {\n allowFailure?: boolean;\n contracts: Array<{\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: unknown[];\n }>;\n blockNumber?: bigint;\n }) => {\n const results: unknown[] = [];\n for (const c of parameters.contracts) {\n const data = encodeFunctionData({\n abi: c.abi as any,\n functionName: c.functionName as any,\n args: (c.args as any[]) ?? [],\n });\n const callResult = await client.call({\n to: c.address,\n data,\n ...(parameters.blockNumber ? { blockNumber: parameters.blockNumber } : {}),\n });\n try {\n const decoded = decodeFunctionResult({\n abi: c.abi as any,\n functionName: c.functionName as any,\n data: (callResult as any).data as Hex,\n });\n if (parameters.allowFailure === true) {\n results.push({ status: \"success\", result: decoded });\n } else {\n results.push(decoded);\n }\n } catch (err) {\n if (parameters.allowFailure !== true) throw err;\n results.push({ status: \"failure\", error: err });\n }\n }\n return results as any;\n };\n return Object.assign({}, extended, { multicall });\n })(client.extend.bind(client)) as typeof client.extend,\n }),\n mempoolAddress,\n termsAddress,\n mine,\n reset: async () => await client.reset({ blockNumber: 0n }),\n deployVault,\n oracle: mockedOracle,\n morpho: mockedMorpho,\n factory: mockedFactory,\n ...mockedAssets,\n };\n}\n\n/**\n * Start a local anvil chain.\n * @example\n * ```ts\n * import { EVM } from \"@morpho-dev/router\";\n * EVM.serve(); // local chain rpc url running on http://localhost:8545\n * ```\n */\nexport async function serve(parameters: {\n port: number;\n forkUrl: string;\n blockNumber?: number;\n}): Promise<{\n rpcUrl: `http://localhost:${number}`;\n stop: () => boolean;\n}> {\n const { port, forkUrl, blockNumber } = parameters;\n let started = false;\n const args = [\n \"--chain-id\",\n Chain.ChainId.ANVIL.toString(),\n \"--fork-url\",\n forkUrl,\n \"--port\",\n String(port),\n ];\n\n if (blockNumber) args.push(\"--fork-block-number\", String(blockNumber));\n\n const stop = await new Promise<() => boolean>((resolve, reject) => {\n const subprocess = spawn(\"anvil\", args, {\n env: { ...process.env, FOUNDRY_DISABLE_NIGHTLY_WARNING: \"1\" },\n });\n\n subprocess.stdout.on(\"data\", (data) => {\n const message = `[port ${port}] ${data.toString()}`;\n\n if (message.includes(\"Listening on\")) {\n started = true;\n resolve(() => subprocess.kill(\"SIGINT\"));\n }\n });\n\n subprocess.stderr.on(\"data\", (data) => {\n const message = `[port ${port}] ${data.toString()}`;\n\n // biome-ignore lint/suspicious/noConsole: debug message\n console.warn(message);\n\n if (!started) reject(message);\n // biome-ignore lint/suspicious/noConsole: debug message\n else console.warn(message);\n });\n });\n\n return {\n rpcUrl: `http://localhost:${port}`,\n stop,\n };\n}\n","import { Command, Option } from \"commander\";\nimport { createTestClient, http, publicActions, walletActions } from \"viem\";\nimport { anvil } from \"viem/chains\";\nimport * as Chain from \"../../core/Chain.ts\";\nimport * as EVM from \"../../evm/EVM.ts\";\n\nexport const mempoolCmd = new Command(\"mempool\");\n\nmempoolCmd\n .description(\"Start a local chain with the mempool contract\")\n .addOption(new Option(\"--port <port>\").env(\"MEMPOOL_PORT\").default(8545))\n .addOption(\n new Option(\"--fork-url <url>\")\n .env(\"MEMPOOL_FORK_URL\")\n .default(\"https://ethereum-rpc.publicnode.com\"),\n )\n .addOption(new Option(\"--block-number <number>\").default(0))\n .action(async (opts: { port: number; forkUrl: string; blockNumber: number }) => {\n const { rpcUrl } = await EVM.serve({\n port: opts.port,\n forkUrl: opts.forkUrl,\n blockNumber: opts.blockNumber,\n });\n\n const client = createTestClient({\n chain: { ...anvil, id: Number(Chain.ChainId.ANVIL) },\n transport: http(rpcUrl),\n mode: \"anvil\",\n })\n .extend(publicActions)\n .extend(walletActions);\n\n // deploy mempool contract\n const mempoolHash = await client.sendTransaction({\n account: EVM.users[0]!,\n data: \"0x60808060405234601357607d908160188239f35b5f80fdfe7f758c7cf107fab3cfdc5aefab966cd9e69c3f368761f7a218a18283c1fbb5574c60808060405260208152366020820152365f60408301375f604036830101526040817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3601168101030190a100fea164736f6c634300081e000a\",\n });\n\n const { contractAddress: mempoolAddress } = await client.waitForTransactionReceipt({\n hash: mempoolHash,\n });\n\n if (!mempoolAddress) throw new Error(\"Failed to deploy mempool contract\");\n // biome-ignore lint: debug message\n console.log(`Mempool contract deployed at ${mempoolAddress}`);\n\n // deploy terms contract\n const termsHash = await client.sendTransaction({\n account: EVM.users[0]!,\n data: \"0x6080604052348015600e575f5ffd5b506101dc8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80637edab8a61461002d575b5f5ffd5b6100476004803603810190610042919061012e565b610049565b005b818373ffffffffffffffffffffffffffffffffffffffff167f1eed8a711368c40dda6427683883619012c34cf436e11e0d773b0d05169ccb8283604051610090919061018d565b60405180910390a3505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ca826100a1565b9050919050565b6100da816100c0565b81146100e4575f5ffd5b50565b5f813590506100f5816100d1565b92915050565b5f819050919050565b61010d816100fb565b8114610117575f5ffd5b50565b5f8135905061012881610104565b92915050565b5f5f5f606084860312156101455761014461009d565b5b5f610152868287016100e7565b93505060206101638682870161011a565b92505060406101748682870161011a565b9150509250925092565b610187816100fb565b82525050565b5f6020820190506101a05f83018461017e565b9291505056fea2646970667358221220cc06296395b7aafdb892cd7bfe25a87dc6b35fe29b2d5cb2dcb3aad43050396a64736f6c634300081e0033\",\n });\n\n const { contractAddress: termsAddress } = await client.waitForTransactionReceipt({\n hash: termsHash,\n });\n\n if (!termsAddress) throw new Error(\"Failed to deploy terms contract\");\n // biome-ignore lint: debug message\n console.log(`Terms contract deployed at ${termsAddress}`);\n });\n","export * from \"./Collector.ts\";\nexport * from \"./CollectorBuilder.ts\";\nexport * from \"./fetchers/index.ts\";\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { stringify } from \"viem\";\nimport type { Compute } from \"#core\";\n\nexport const LogLevelValues = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n \"silent\",\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, pretty?: boolean): Logger {\n const threshold: LogLevel = minLevel ?? (process.env.ROUTER_LOG_LEVEL as LogLevel) ?? \"info\";\n const prettyEnabled: boolean =\n typeof pretty === \"boolean\"\n ? pretty\n : String(process.env.ROUTER_LOG_PRETTY ?? \"false\").toLowerCase() === \"true\";\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 if (!prettyEnabled) {\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](stringify({ level: methodLevel, ...entry }));\n return;\n }\n\n const { msg, ...rest } = entry;\n const stack =\n typeof (rest as Record<string, unknown>).stack === \"string\"\n ? (rest as Record<string, unknown>).stack\n : undefined;\n if (stack) delete (rest as Record<string, unknown>).stack;\n const timestamp = new Date().toISOString();\n const level = methodLevel.toUpperCase();\n\n const extras: string = Object.entries(rest)\n .map(([k, v]) => `${k}=${formatValue(v)}`)\n .join(\" \");\n\n const line =\n extras.length > 0\n ? `${timestamp} [${level}] ${msg} ${extras}`\n : `${timestamp} [${level}] ${msg}`;\n // biome-ignore lint/suspicious/noConsole: console is used for logging\n console[consoleMethod](line);\n if (stack) {\n console[consoleMethod](stack);\n }\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\nfunction formatValue(value: unknown): string {\n if (\n value === null ||\n value === undefined ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n if (typeof value === \"string\") {\n if (value.includes(\" \")) return JSON.stringify(value);\n return value;\n }\n try {\n return stringify(value as unknown as Record<string, unknown>);\n } catch {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n}\n","export const retry = async <T>(fn: () => Promise<T>, attempts = 3, delayMs = 50): Promise<T> => {\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n throw lastErr;\n};\n","import type { PublicActions } from \"viem\";\nimport { batch } from \"#utils/batch.ts\";\nimport { retry } from \"#utils/retry.ts\";\n\n/**\n * Helper function to execute multicall in batches with retry logic.\n * Abstracts the common pattern of batching calls, retrying, and collecting results.\n *\n * @param parameters - Configuration for batched multicall\n * @returns Promise resolving to flattened array of results\n */\nexport async function batchMulticall<TResult>(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n calls: unknown[];\n batchSize: number;\n retryAttempts: number;\n retryDelayMs: number;\n blockNumber?: bigint;\n}): Promise<TResult[]> {\n const { client, calls, batchSize, retryAttempts, retryDelayMs, blockNumber } = parameters;\n const results: TResult[] = [];\n\n for (const callsBatch of batch(calls, batchSize)) {\n const batchResults = await retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: callsBatch as any,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n results.push(...(batchResults as TResult[]));\n }\n\n return results;\n}\n","/**\n * Transform a polling function into an async generator.\n * @param fn - The polling function to transform.\n * @returns An async generator.\n */\nexport function lazy<T>(\n pollFn: (emit: (value: T) => void, { stop }: { stop: () => void }) => () => boolean,\n) {\n return () =>\n (async function* () {\n let active = true;\n let resolveNext: (() => void) | null = null;\n const queue: T[] = [];\n\n const wait = () =>\n new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n\n const emit = (item: T) => {\n queue.push(item);\n resolveNext?.();\n resolveNext = null;\n };\n\n let unpoll: (() => boolean) | null = null;\n const stop = () => {\n active = false;\n // stop the poller immediately if we already have it\n unpoll?.();\n resolveNext?.();\n resolveNext = null;\n };\n\n unpoll = pollFn(emit, { stop });\n\n try {\n while (active) {\n if (queue.length === 0) await wait();\n while (queue.length > 0 && active) yield queue.shift()!;\n }\n } finally {\n stop();\n }\n })();\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time));\n}\n","import { wait } from \"./wait.ts\";\n/**\n * Polls a function at a specified interval.\n * Inspired by https://github.com/wevm/viem/blob/845994d20275d08ff892018e237a4b599eeefb6a/src/utils/poll.ts\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | undefined>,\n { interval }: { interval: number },\n) {\n let active = true;\n const unwatch = () => (active = false);\n\n const watch = async () => {\n await wait(interval);\n\n const poll = async () => {\n if (!active) return;\n await fn({ unpoll: unwatch });\n await wait(interval);\n poll();\n };\n\n poll();\n };\n\n watch();\n\n return unwatch;\n}\n","export function now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function max(): number {\n return 8640000000000000000;\n}\n","import type { Block, Hex, PublicClient } from \"viem\";\nimport * as Collector from \"#collectors/Collector.ts\";\nimport type { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Services from \"#services/Services.ts\";\nimport * as Utils from \"#utils/index.ts\";\n\nexport type Admin = { syncBlock: () => Promise<void> };\n\ntype LightBlock = {\n hash: Hex;\n number: bigint;\n parentHash: Hex;\n};\n\nexport function create(parameters: {\n client: PublicClient;\n chain: Chain.Chain;\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n options?: {\n maxBatchSize?: number;\n maxBlockNumber?: number;\n };\n}): Admin {\n const collector = \"admin\";\n const {\n client,\n chain,\n withTransaction,\n options: { maxBatchSize = 25, maxBlockNumber } = {},\n } = parameters;\n\n const maxBlockNumberBI = maxBlockNumber !== undefined ? BigInt(maxBlockNumber) : undefined;\n\n let finalizedBlock: LightBlock | null = null;\n let unfinalizedBlocks: LightBlock[] = [];\n\n const logger = Logger.getLogger();\n let isMaxBlockNumberReached = false;\n let tick = 0;\n return {\n syncBlock: async () => {\n if (isMaxBlockNumberReached) return;\n\n const head = await client.getBlock({\n blockTag: \"latest\",\n includeTransactions: false,\n });\n\n await withTransaction(async ({ chainStore, collectorStore }) => {\n const { epoch, blockNumber: latestSavedBlockNumber } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (maxBlockNumberBI !== undefined && head.number! >= maxBlockNumberBI) {\n logger.info({\n msg: `Head is greater than max block number`,\n collector,\n chainId: chain.id,\n block_number: head.number,\n max_block_number: maxBlockNumber,\n });\n\n isMaxBlockNumberReached = true;\n\n await chainStore.saveBlockNumber({\n chainId: chain.id,\n blockNumber: maxBlockNumber!,\n epoch: epoch + 1n,\n });\n\n await Promise.all(\n Collector.names.map(async (collectorName) =>\n collectorStore.saveBlockNumber({\n collectorName,\n chainId: chain.id,\n blockNumber: maxBlockNumber!,\n epoch: epoch + 1n,\n }),\n ),\n );\n\n return;\n }\n\n finalizedBlock = await fetchFinalizedBlock({\n tick,\n client,\n chain,\n logger,\n collector,\n unfinalizedBlocks,\n previousFinalizedBlock: finalizedBlock,\n });\n tick++;\n\n let {\n block: returnedBlock,\n didReorgHappened,\n unfinalizedBlocks: newUnfinalizedBlocks,\n } = await reconcile({\n client,\n block: head,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n\n unfinalizedBlocks = newUnfinalizedBlocks;\n const blockNumber = Number(returnedBlock.number);\n\n didReorgHappened = didReorgHappened || blockNumber < latestSavedBlockNumber;\n\n await chainStore.saveBlockNumber({\n chainId: chain.id,\n blockNumber,\n epoch: didReorgHappened ? epoch + 1n : epoch,\n });\n\n if (didReorgHappened) {\n await Promise.all(\n Collector.names.map(async (collectorName) =>\n collectorStore.saveBlockNumber({\n collectorName,\n chainId: chain.id,\n blockNumber,\n epoch: epoch + 1n,\n }),\n ),\n );\n }\n });\n },\n };\n}\n\nconst commonAncestor = (block: Block, unfinalizedBlocks: LightBlock[]): LightBlock | null => {\n const parent = unfinalizedBlocks.find((b) => b.hash === block.parentHash);\n if (parent) return parent;\n return null;\n};\n\nconst fetchFinalizedBlock = async (parameters: {\n tick: number;\n client: PublicClient;\n chain: Chain.Chain;\n logger: Logger.Logger;\n collector: string;\n unfinalizedBlocks: LightBlock[];\n previousFinalizedBlock: LightBlock | null;\n}): Promise<LightBlock> => {\n let { tick, client, chain, logger, collector, unfinalizedBlocks, previousFinalizedBlock } =\n parameters;\n let finalizedBlock: LightBlock | null = previousFinalizedBlock;\n if (tick % 20 === 0 || previousFinalizedBlock === null) {\n finalizedBlock = await client.getBlock({\n blockTag: \"finalized\",\n includeTransactions: false,\n });\n\n if (finalizedBlock === null || finalizedBlock.number === null) {\n const msg = \"Failed to get finalized block\";\n logger.fatal({ collector, chainId: chain.id, msg });\n throw new Error(msg);\n }\n\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number >= finalizedBlock!.number!);\n }\n\n if (\n finalizedBlock!.number === null ||\n finalizedBlock!.hash === null ||\n finalizedBlock!.parentHash === null\n ) {\n const msg = \"Failed to get finalized block\";\n logger.fatal({ collector, chainId: chain.id, msg });\n throw new Error(msg);\n }\n\n return {\n hash: finalizedBlock!.hash,\n number: finalizedBlock!.number,\n parentHash: finalizedBlock!.parentHash,\n };\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\nconst reconcile = async (parameters: {\n block: Block;\n client: PublicClient;\n chain: Chain.Chain;\n collector: string;\n unfinalizedBlocks: LightBlock[];\n finalizedBlock: LightBlock;\n logger: Logger.Logger;\n maxBatchSize: number;\n}): Promise<{ block: LightBlock; didReorgHappened: boolean; unfinalizedBlocks: LightBlock[] }> => {\n let { client, block, unfinalizedBlocks, finalizedBlock, logger, collector, chain, maxBatchSize } =\n parameters;\n\n if (block.hash === null || block.number === null || block.parentHash === null)\n throw new Error(\"Failed to get block\");\n\n const latestBlock = unfinalizedBlocks[unfinalizedBlocks.length - 1];\n\n if (latestBlock === undefined) {\n const newBlock = {\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n };\n unfinalizedBlocks.push(newBlock);\n return { block: newBlock, didReorgHappened: false, unfinalizedBlocks };\n }\n\n if (latestBlock.hash === block.hash)\n return { block: latestBlock, didReorgHappened: false, unfinalizedBlocks };\n\n if (latestBlock.number >= block.number) {\n const ancestor = commonAncestor(block, unfinalizedBlocks) || finalizedBlock;\n logger.info({\n msg: `Reorg detected`,\n collector,\n chain_id: chain.id,\n ancestor: ancestor.number,\n block_range: [latestBlock.number, block.number],\n });\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number <= ancestor.number);\n return { block: ancestor, didReorgHappened: true, unfinalizedBlocks };\n }\n\n if (latestBlock.number + 1n < block.number) {\n logger.debug({\n collector,\n chain_id: chain.id,\n block_range: [latestBlock.number, block.number],\n msg: `Missing blocks`,\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 Utils.retry(async () => await client.getBlock({ blockNumber, includeTransactions: false })),\n ),\n );\n\n for (const missingBlock of missingBlocks) {\n const { block: returnedBlock, didReorgHappened } = await reconcile({\n client,\n block: missingBlock,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n // if returned block is different from the missing block, return the block and stop the loop\n // this means that max block number was reached\n if (returnedBlock.number !== missingBlock.number)\n return { block: returnedBlock, didReorgHappened, unfinalizedBlocks };\n }\n return reconcile({\n client,\n block,\n unfinalizedBlocks,\n finalizedBlock,\n logger,\n collector,\n chain,\n maxBatchSize,\n });\n }\n\n if (block.parentHash !== latestBlock.hash) {\n const ancestor = commonAncestor(block, unfinalizedBlocks) || finalizedBlock;\n logger.info({\n msg: `Reorg detected`,\n collector,\n chain_id: chain.id,\n ancestor: ancestor.number,\n block_range: [latestBlock.number, block.number],\n });\n unfinalizedBlocks = unfinalizedBlocks.filter((b) => b.number <= ancestor.number);\n return { block: ancestor, didReorgHappened: true, unfinalizedBlocks };\n }\n\n const newBlock = {\n hash: block.hash,\n number: block.number,\n parentHash: block.parentHash,\n };\n\n unfinalizedBlocks.push(newBlock);\n return { block: newBlock, didReorgHappened: false, unfinalizedBlocks };\n};\n","import type { PublicClient } from \"viem\";\nimport * as Admin from \"#collectors/Admin.ts\";\nimport type { Chain } from \"#core\";\nimport type * as CollectorStore from \"#database/CollectorStore.ts\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Services from \"#services/Services.ts\";\nimport * as Utils from \"#utils/index.ts\";\n\nexport const names = [\n \"mempool_offers\",\n \"consumed_events\",\n \"buy_with_empty_callback_liquidity\",\n \"buy_vault_v1_callback_liquidity\",\n \"sell_erc20_callback_liquidity\",\n] as const;\n\nexport type Name = (typeof names)[number];\n\n/** A general collector interface. */\nexport type Collector<name extends Name = Name, chain extends Chain.Chain = Chain.Chain> = {\n /** The name of the collector. */\n readonly name: name;\n\n /** The chain the collector is running on. */\n readonly chain: chain;\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\n/** A collector’s collect function signature */\nexport type CollectFn<chain extends Chain.Chain, collector extends Name> = (\n parameters: CollectParameters<chain, collector>,\n) => Promise<number>;\n\n/** Core parameters every collector gets at runtime */\nexport type CollectParameters<chain extends Chain.Chain, collector extends Name> = {\n /** The chain the collector is running on. */\n chain: chain;\n /** A public viem client. */\n client: PublicClient;\n /** The collector name. */\n collector: collector;\n /** The epoch the collector is running on. */\n epoch: bigint;\n /** The last block number processed by the collector. */\n lastBlockNumber: number;\n /** A function to execute database operations in a transaction. */\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n};\n\nexport function create<name extends Name, chain extends Chain.Chain>({\n name,\n collect,\n client,\n chain,\n withTransaction,\n collectorStore,\n options,\n}: {\n name: name;\n collect: CollectFn<chain, name>;\n chain: chain;\n client: PublicClient;\n withTransaction: <T>(fn: (s: Services.Stores) => Promise<T>) => Promise<T>;\n collectorStore: CollectorStore.CollectorStore;\n options: { interval: number; maxBlockNumber?: number };\n}): Collector<name, chain> {\n const admin = Admin.create({\n client,\n chain,\n withTransaction,\n options,\n });\n\n return {\n name,\n chain,\n collect: Utils.lazy((emit) => {\n const collector = name;\n const logger = Logger.getLogger();\n\n logger.info({\n msg: `Collector started`,\n collector,\n chain_id: chain.id,\n interval: options.interval,\n });\n\n return Utils.poll(\n async () => {\n try {\n let { blockNumber: lastBlockNumber, epoch } = await collectorStore.getBlockNumber({\n collectorName: name,\n chainId: chain.id,\n });\n\n // important to sync block before collecting in case of reorg\n // epoch will be updated by syncBlock and the collector will be blocked when trying to save block number\n await admin.syncBlock();\n\n lastBlockNumber = await collect({\n chain,\n client,\n collector: name,\n epoch,\n lastBlockNumber,\n withTransaction,\n });\n\n emit(lastBlockNumber);\n } catch (err) {\n const isError = err instanceof Error;\n logger.error({\n msg: \"Collector error\",\n collector,\n chain_id: chain.id,\n error: isError ? err.message : String(err),\n stack: isError ? err.stack : undefined,\n });\n }\n },\n { interval: options.interval },\n );\n }),\n };\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 { and, asc, eq, gt, gte, lte, sql } from \"drizzle-orm\";\nimport type * as Collector from \"#collectors/index.ts\";\nimport { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport { chains, collectors } from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type CollectorStore = {\n /** Get the latest block number processed by a collector for a given chain alongside the epoch. */\n getBlockNumber: (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n }) => Promise<{ blockNumber: number; epoch: bigint }>;\n\n /**\n * Get the latest block number processed by all collectors.\n * When a chainId is provided the result is filtered, otherwise all records are returned.\n */\n getBlockNumbers: (parameters?: { chainId?: Chain.Id }) => Promise<\n Array<{\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n updatedAt: Date;\n }>\n >;\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 epoch: bigint;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): CollectorStore => {\n const db = config.db;\n const logger = Logger.getLogger();\n\n return {\n getBlockNumber: async (parameters: { collectorName: Collector.Name; chainId: Chain.Id }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n const res = await db\n .select({\n epoch: collectors.epoch,\n blockNumber: collectors.blockNumber,\n })\n .from(collectors)\n .where(and(eq(collectors.chainId, parameters.chainId), eq(collectors.name, name)));\n\n if (res.length === 0) {\n logger.debug({\n service: \"collector_block_store\",\n collector: name,\n chain_id: parameters.chainId,\n msg: `No block number found`,\n });\n\n await db\n .insert(collectors)\n .values({\n chainId: parameters.chainId,\n name,\n blockNumber: Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0,\n epoch: \"0\",\n })\n .onConflictDoNothing();\n\n return {\n blockNumber: Chain.getChain(parameters.chainId)?.mempool.deploymentBlock || 0,\n epoch: 0n,\n };\n }\n\n return { blockNumber: Number(res[0]!.blockNumber), epoch: BigInt(res[0]!.epoch) };\n },\n\n getBlockNumbers: async (parameters?: { chainId?: Chain.Id }) => {\n const rows = await db\n .select({\n collectorName: collectors.name,\n chainId: collectors.chainId,\n blockNumber: collectors.blockNumber,\n epoch: collectors.epoch,\n updatedAt: collectors.updatedAt,\n })\n .from(collectors)\n .where(\n parameters?.chainId !== undefined\n ? eq(collectors.chainId, parameters.chainId)\n : sql`TRUE`,\n )\n .orderBy(asc(collectors.chainId), asc(collectors.name));\n\n return rows.map((row) => ({\n collectorName: row.collectorName.toLowerCase() as Collector.Name,\n chainId: row.chainId,\n blockNumber: Number(row.blockNumber),\n epoch: BigInt(row.epoch),\n updatedAt: row.updatedAt,\n }));\n },\n\n /** Save the latest block number processed by a collector for a given chain.\n * @throws {Error} if a chain reorg has happened and the collector tries to update with an outdated `epoch`\n */\n saveBlockNumber: async (parameters: {\n collectorName: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => {\n const name = parameters.collectorName.toLowerCase() as Collector.Name;\n\n const chain = db\n .select({\n chainId: chains.chainId,\n currentEpoch: chains.epoch,\n currentBlockNumber: chains.blockNumber,\n })\n .from(chains)\n .where(and(eq(chains.chainId, parameters.chainId)))\n .as(\"chain\");\n\n const hasReorgHappened =\n (\n await db\n .select()\n .from(collectors)\n .leftJoin(chain, eq(collectors.chainId, chain.chainId))\n .where(\n and(\n eq(collectors.chainId, parameters.chainId),\n eq(collectors.name, name),\n gt(chain.currentEpoch, collectors.epoch),\n eq(chain.currentEpoch, parameters.epoch.toString()),\n gte(collectors.blockNumber, parameters.blockNumber),\n ),\n )\n .limit(1)\n ).length > 0;\n\n const rows = await db\n .update(collectors)\n .set({\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n updatedAt: sql`now()`,\n })\n .from(chain)\n .where(\n and(\n eq(collectors.chainId, parameters.chainId),\n eq(collectors.name, name),\n eq(chain.currentEpoch, parameters.epoch.toString()),\n gte(chain.currentBlockNumber, parameters.blockNumber),\n // ensures that block numbers are strictly increasing\n // except when a reorg has happened\n ...(hasReorgHappened ? [] : [lte(collectors.blockNumber, parameters.blockNumber)]),\n ),\n )\n .returning();\n\n // compare and swap operation warns that the `epoch` has been updated\n // two cases:\n // 1. row does not exist in db, safe to create it\n // 2. row exists in db, but the epoch is different, throw error to revert db transaction => chain reorg has been detected\n if (rows.length === 0) {\n const existing = await db\n .select({ chainId: collectors.chainId })\n .from(collectors)\n .where(and(eq(collectors.chainId, parameters.chainId), eq(collectors.name, name)))\n .limit(1);\n\n if (existing.length === 0) {\n await db\n .insert(collectors)\n .values({\n name,\n chainId: parameters.chainId,\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n })\n .onConflictDoNothing();\n\n return;\n }\n\n throw new Error(\n `A chain reorg has happened on chain ${parameters.chainId}, update of the collector ${name} is aborted`,\n );\n }\n },\n };\n};\n","import { asc, desc } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n foreignKey,\n index,\n integer,\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 Collector from \"#collectors/index.ts\";\nimport { Offer } from \"#core/index.ts\";\nimport { VERSION } from \"./VERSION.ts\";\n\nconst s = pgSchema(VERSION);\n\nexport const obligations = s.table(\"obligations\", {\n obligationId: varchar(\"obligation_id\", { length: 66 }).primaryKey(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n loanToken: varchar(\"loan_token\", { length: 42 }).notNull(),\n maturity: integer(\"maturity\").notNull(),\n});\n\nexport const groups = s.table(\n \"groups\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n maker: varchar(\"maker\", { length: 42 }).notNull(),\n group: varchar(\"group\", { length: 66 }).notNull(),\n consumed: numeric(\"consumed\", { precision: 78, scale: 0 }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({ columns: [table.chainId, table.maker, table.group], name: \"groups_pk\" }),\n index(\"groups_chain_id_maker_group_consumed_idx\").on(\n table.chainId,\n table.maker,\n table.group,\n table.consumed,\n ),\n ],\n);\n\nexport const consumedEvents = s.table(\n \"consumed_events\",\n {\n eventId: varchar(\"event_id\", { length: 128 }).primaryKey(),\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n maker: varchar(\"maker\", { length: 42 }).notNull(),\n group: varchar(\"group\", { length: 66 }).notNull(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (t) => [\n foreignKey({\n columns: [t.chainId, t.maker, t.group],\n foreignColumns: [groups.chainId, groups.maker, groups.group],\n name: \"consumed_events_groups_fk\",\n }).onDelete(\"cascade\"),\n index(\"consumed_events_group_idx\").on(t.chainId, t.maker, t.group),\n index(\"consumed_events_block_number_idx\").on(t.blockNumber),\n ],\n);\n\nexport const obligationCollateralsV2 = s.table(\n \"obligation_collaterals_v2\",\n {\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { onDelete: \"cascade\" }),\n asset: varchar(\"asset\", { length: 42 }).notNull(),\n oracleChainId: bigint(\"oracle_chain_id\", { mode: \"bigint\" }).notNull(),\n oracleAddress: varchar(\"oracle_address\", { length: 42 }).notNull(),\n lltv: bigint(\"lltv\", { mode: \"bigint\" }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.obligationId, table.asset],\n name: \"obligation_collaterals_v2_pk\",\n }),\n foreignKey({\n columns: [table.oracleChainId, table.oracleAddress],\n foreignColumns: [oracles.chainId, oracles.address],\n name: \"obligation_collaterals_v2_oracles_fk\",\n }),\n index(\"obligation_collaterals_v2_obligation_id_idx\").on(table.obligationId),\n index(\"obligation_collaterals_v2_oracle_fk_idx\").on(table.oracleChainId, table.oracleAddress),\n ],\n);\n\nexport const oracles = s.table(\n \"oracles\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n address: varchar(\"address\", { length: 42 }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [primaryKey({ columns: [table.chainId, table.address], name: \"oracles_pk\" })],\n);\n\nexport const statusCode = s.enum<Offer.StatusCode, [Offer.StatusCode, ...Offer.StatusCode[]]>(\n \"status_code\",\n Object.values(Offer.StatusCode) as [Offer.StatusCode, ...Offer.StatusCode[]],\n);\n\nexport const status = s.table(\"status\", {\n id: serial(\"id\").primaryKey(),\n code: statusCode(\"code\").unique(),\n});\n\nexport const offersV2 = s.table(\n \"offers_v2\",\n {\n hash: varchar(\"hash\", { length: 66 }).primaryKey(),\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { onDelete: \"cascade\" }),\n assets: numeric(\"assets\", { precision: 78, scale: 0 }).notNull(),\n rate: numeric(\"rate\", { precision: 78, scale: 0 }).notNull(),\n maturity: integer(\"maturity\").notNull(),\n expiry: integer(\"expiry\").notNull(),\n start: integer(\"start\").notNull(),\n groupChainId: bigint(\"group_chain_id\", { mode: \"bigint\" }).notNull(),\n groupMaker: varchar(\"group_maker\", { length: 42 }).notNull(),\n group: varchar(\"group_group\", { length: 66 }).notNull(),\n nonce: varchar(\"nonce\", { length: 66 }).notNull(),\n buy: boolean(\"buy\").notNull(),\n callbackAddress: varchar(\"callback_address\", { length: 42 }).notNull(),\n callbackData: text(\"callback_data\").notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n foreignKey({\n columns: [table.groupChainId, table.groupMaker, table.group],\n foreignColumns: [groups.chainId, groups.maker, groups.group],\n name: \"offers_v2_groups_fk\",\n }).onDelete(\"cascade\"),\n\n index(\"offers_v2_group_fk_idx\").on(table.groupChainId, table.groupMaker, table.group),\n\n // most important indexes allowing fast lookup of best offers per group\n // order should be respected in ORDER BY clauses to avoid full table scans\n index(\"offers_v2_group_winner_sell_side_idx\").on(\n table.groupChainId,\n table.groupMaker,\n table.group,\n desc(table.rate),\n asc(table.blockNumber),\n desc(table.assets),\n asc(table.hash),\n ),\n\n index(\"offers_v2_group_winner_buy_side_idx\").on(\n table.groupChainId,\n table.groupMaker,\n table.group,\n asc(table.rate),\n asc(table.blockNumber),\n desc(table.assets),\n asc(table.hash),\n ),\n\n index(\"offers_v2_obligation_id_side_idx\").on(table.obligationId, table.buy),\n ],\n);\n\nexport const offerStatus = s.table(\n \"offer_status\",\n {\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .primaryKey()\n .references(() => offersV2.hash, { onDelete: \"cascade\" }),\n statusId: serial(\"status_id\")\n .notNull()\n .references(() => status.id, { onDelete: \"cascade\" }),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [index(\"offer_status_status_hash_idx\").on(table.statusId, table.offerHash)],\n);\n\nexport const collectors = s.table(\n \"collectors\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n name: text(\"name\").$type<Collector.Name>().notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n // epoch is used as a fencing token to avoid race conditions when updating the block number\n epoch: numeric(\"epoch\", { precision: 78, scale: 0 }).default(\"0\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n uniqueIndex(\"collectors_chain_name_epoch_idx\").on(table.chainId, table.name, table.epoch),\n ],\n);\n\nexport const chains = s.table(\n \"chains\",\n {\n chainId: bigint(\"chain_id\", { mode: \"bigint\" }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n epoch: numeric(\"epoch\", { precision: 78, scale: 0 }).default(\"0\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [uniqueIndex(\"chains_id_epoch_idx\").on(table.chainId, table.epoch)],\n);\n\n// DEPRECATED\n\nexport const offers = s.table(\n \"offers\",\n {\n hash: varchar(\"hash\", { length: 66 }).primaryKey(),\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { onDelete: \"cascade\" }),\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 createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n },\n (table) => [\n index(\"offers_obligation_id_idx\").on(table.obligationId),\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 index(\"offers_created_at_idx\").on(table.createdAt),\n index(\"offers_block_number_idx\").on(table.blockNumber),\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 // Compound index for multi-level sorting optimization (rate, createdAt, assets, hash)\n index(\"offers_rate_created_at_assets_hash_idx\").on(\n table.rate,\n asc(table.createdAt),\n desc(table.assets),\n asc(table.hash),\n ),\n ],\n);\n\nexport const obligationCollaterals = s.table(\n \"obligation_collaterals\",\n {\n obligationId: varchar(\"obligation_id\", { length: 66 })\n .notNull()\n .references(() => obligations.obligationId, { 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 primaryKey({\n columns: [table.obligationId, table.asset],\n name: \"obligation_collaterals_pk\",\n }),\n index(\"obligation_collaterals_obligation_id_idx\").on(table.obligationId),\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 blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"consumed_per_user_and_nonce_chain_id_offering_nonce_block_number_idx\").on(\n table.chainId,\n table.offering,\n table.nonce,\n desc(table.blockNumber),\n ),\n ],\n);\n\nexport const offerLiquidityPools = s.table(\n \"offer_liquidity_pools\",\n {\n offerHash: varchar(\"offer_hash\", { length: 66 })\n .notNull()\n .references(() => offers.hash, { onDelete: \"cascade\" }),\n poolId: varchar(\"pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.offerHash, table.poolId],\n name: \"offer_liquidity_pools_pk\",\n }),\n index(\"offer_liquidity_pools_pool_id_idx\").on(table.poolId),\n ],\n);\n\nexport const liquidityPools = s.table(\"liquidity_pools\", {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n amount: numeric(\"amount\", { precision: 78, scale: 0 }).notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n});\n\nexport const liquidityLinks = s.table(\n \"liquidity_links\",\n {\n parentPoolId: varchar(\"parent_pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n childPoolId: varchar(\"child_pool_id\", { length: 255 })\n .notNull()\n .references(() => liquidityPools.id, { onDelete: \"cascade\" }),\n priority: integer(\"priority\").notNull(),\n blockNumber: bigint(\"block_number\", { mode: \"number\" }).notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n primaryKey({\n columns: [table.parentPoolId, table.priority],\n name: \"liquidity_links_pk\",\n }),\n index(\"liquidity_links_parent_pool_id_idx\").on(table.parentPoolId),\n index(\"liquidity_links_child_pool_id_idx\").on(table.childPoolId),\n ],\n);\n","// Should be updated when the data should need to be re-synced from scratch\n// keep this version file isolated to reference it in tsup config\nexport const VERSION = \"router_v1.5\" as const;\n","import {\n type Address,\n decodeAbiParameters,\n type Hex,\n type PublicClient,\n publicActions,\n type WalletClient as ViemClient,\n} from \"viem\";\nimport type { Compute } from \"#core\";\nimport { Chain, Offer, Tree } from \"#core\";\nimport * as Errors from \"#utils/Errors.ts\";\nimport type * as Client from \"./MempoolClient.ts\";\n\nconst DEFAULT_BATCH_SIZE = 100;\nconst DEFAULT_BLOCK_WINDOW = 100;\n\ntype MempoolEVMClientConfig = {\n readonly client: ViemClient;\n readonly mempoolAddress: Address;\n readonly blockWindow: number;\n};\n\nexport function from(parameters: from.Parameters): from.ReturnType {\n const config: MempoolEVMClientConfig = {\n client: parameters.client,\n mempoolAddress: parameters.mempoolAddress,\n blockWindow: parameters.blockWindow || DEFAULT_BLOCK_WINDOW,\n };\n\n return {\n add: (parameters) => add(config, parameters),\n get: (parameters) => get(config, parameters),\n stream: (parameters) => streamOffers(config, parameters),\n };\n}\n\nexport declare namespace from {\n type Parameters = {\n /** The viem client to use. */\n client: ViemClient;\n /** The mempool address. */\n mempoolAddress: Address;\n /** The block window to use for the mempool. Defaults to 100. */\n blockWindow?: number;\n };\n\n type ReturnType = Client.Client;\n\n type ErrorType = null;\n}\n\n/**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n * @throws WalletAccountNotSetError if the wallet account is not set.\n * @throws ViemClientError if the viem client throws an error.\n * @throws Offer.InvalidOfferError if the offer is invalid.\n */\nexport async function add(\n config: MempoolEVMClientConfig,\n offers: Client.AddParameters,\n): Promise<Hex> {\n if (!config.client.account) throw new WalletAccountNotSetError();\n\n const tree = Tree.from(offers.map((o) => Offer.from(o)));\n const chainId = await getChainId(config.client);\n for (const offer of tree.offers) {\n if (BigInt(chainId) !== offer.chainId)\n throw new ChainIdMismatchError(offer.chainId, BigInt(chainId));\n }\n\n try {\n return await config.client.sendTransaction({\n chain: config.client.chain,\n account: config.client.account!,\n to: config.mempoolAddress,\n data: Tree.encode(tree),\n });\n } catch (error) {\n throw new ViemClientError(error instanceof Error ? error.message : \"Unknown error\");\n }\n}\n\nexport declare namespace add {\n export type ErrorType =\n | WalletAccountNotSetError\n | ViemClientError\n | Offer.InvalidOfferError\n | ChainIdMismatchError;\n}\n\nexport async function* get(\n config: MempoolEVMClientConfig,\n parameters?: Client.GetParameters,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE } = {},\n } = parameters || {};\n\n yield* streamOffers(config, {\n loanToken,\n order,\n blockNumberGte,\n blockNumberLte,\n options: { maxBatchSize, blockWindow: config.blockWindow },\n });\n}\n\nexport declare namespace get {\n export type ErrorType = streamOffersReturnType;\n}\n\nconst chainIdCache = new Map<string, number>();\n/**\n * Caches the chain id of a viem client.\n * @param client - The viem client.\n * @returns The chain id.\n */\nconst getChainId = async (client: ViemClient): Promise<number> => {\n if (chainIdCache.has(client.uid)) return chainIdCache.get(client.uid)!;\n const chainId = await client.getChainId();\n chainIdCache.set(client.uid, chainId);\n return chainId;\n};\n\ntype streamOffersReturnType = WalletAccountNotSetError | ChainIdMismatchError;\n\nasync function* streamOffers(\n config: MempoolEVMClientConfig,\n parameters: Compute<\n Omit<Client.GetParameters, \"options\"> & {\n options: Client.GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n): AsyncGenerator<{ offers: Offer.Offer[]; blockNumber: number }, void, void> {\n const {\n loanToken,\n blockNumberGte,\n blockNumberLte,\n order = \"desc\",\n options: { maxBatchSize = DEFAULT_BATCH_SIZE, blockWindow = config.blockWindow } = {},\n } = parameters;\n\n const stream = Chain.streamLogs({\n client: config.client.extend(publicActions) as PublicClient,\n contractAddress: config.mempoolAddress,\n event: {\n type: \"event\",\n name: \"Event\",\n inputs: [{ name: \"data\", type: \"bytes\", indexed: false, internalType: \"bytes\" }],\n anonymous: false,\n } as const,\n blockNumberGte,\n blockNumberLte,\n order,\n options: { maxBatchSize, blockWindow },\n });\n\n let blockNumber = order === \"asc\" ? blockNumberGte : blockNumberLte;\n for await (const { logs, blockNumber: newBlockNumber } of stream) {\n blockNumber = newBlockNumber;\n if (logs.length === 0) break;\n const offers: Offer.Offer[] = [];\n for (const log of logs) {\n if (!log) continue;\n const [payload] = decodeAbiParameters([{ type: \"bytes\" }], log.data);\n try {\n const tree = Tree.decode(payload);\n for (const offer of tree.offers) {\n if (loanToken && offer.loanToken.toLowerCase() !== loanToken.toLowerCase()) continue;\n offers.push({ ...offer, blockNumber: Number(log.blockNumber) });\n }\n } catch (_) {}\n }\n if (offers.length === 0) continue;\n yield {\n offers,\n blockNumber,\n };\n }\n\n yield { offers: [], blockNumber: blockNumber! };\n return;\n}\n\nexport class WalletAccountNotSetError extends Errors.BaseError {\n override name = \"Mempool.WalletAccountNotSetError\";\n constructor() {\n super(\"Wallet account is not set.\");\n }\n}\n\nexport class ViemClientError extends Errors.BaseError {\n override name = \"Mempool.ViemClientError\";\n}\n\nexport class ChainIdMismatchError extends Errors.BaseError {\n override name = \"Mempool.ChainIdMismatchError\";\n constructor(expected: bigint, actual: bigint) {\n super(`Chain ID mismatch. Offer chain ID is ${expected}, network chain ID is ${actual}.`);\n }\n}\n","import type { Hex } from \"viem\";\nimport type { Compute, Offer } from \"#core\";\nimport * as EVMClient from \"./MempoolEVMClient.ts\";\n\nexport type AddParameters = Compute<Omit<Offer.Offer, \"hash\" | \"createdAt\">[]>;\n\nexport type GetParameters = {\n /** The block number to get offers from. */\n blockNumberGte?: number;\n /** The block number to get offers to. */\n blockNumberLte?: number;\n /** The loan asset to get offers from. */\n loanToken?: string;\n /** The order to get offers. Defaults to \"desc\". */\n order?: \"asc\" | \"desc\";\n /** The options to get offers from. */\n options?: {\n /** The maximum number of offers to return. Defaults to 100. Maximum is 1000. */\n maxBatchSize?: number;\n };\n};\n\n/**\n * Mempool client interface.\n */\nexport type Client = {\n /**\n * Add an offer to the mempool.\n * @returns The created offer with its hash.\n */\n add: (parameters: AddParameters) => Promise<Hex>;\n /** Get offers from the mempool. */\n get: (parameters?: GetParameters) => AsyncGenerator<{\n offers: Offer.Offer[];\n /** The block number of the last processed offer. Depends on the `order` parameter, block numbers will ascend or descend. */\n blockNumber: number;\n }>;\n\n /**\n * Stream offers from the mempool.\n * @returns A generator of offers alongside the last block number processed.\n */\n stream: (\n parameters: Compute<\n Omit<GetParameters, \"options\"> & {\n options: GetParameters[\"options\"] & { blockWindow?: number };\n }\n >,\n ) => AsyncGenerator<{\n offers: Offer.Offer[];\n blockNumber: number;\n }>;\n};\n\n/**\n * Client to interact with the Mempool contract on a specific chain.\n */\nexport function connect(parameters: EVMClient.from.Parameters): Client {\n return EVMClient.from(parameters);\n}\n\nexport declare namespace connect {\n export type ErrorType = EVMClient.from.ErrorType;\n}\n","import { type Address, erc20Abi, type PublicActions } from \"viem\";\nimport { Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches ERC20 token balances and allowances using multicall.\n * Returns liquidity pools and links.\n *\n * @param parameters - Configuration for the fetch operation including user-token pairs\n * @returns Promise resolving to pools and links arrays\n */\nexport async function fetchBalancesAndAllowances(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\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 pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n}> {\n const { client, chainId, spender, pairs, options } = parameters;\n if (pairs.length === 0) return { pools: [], links: [] };\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 const balanceCalls: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"balanceOf\";\n args: [Address];\n }> = [];\n const allowanceCalls: Array<{\n address: Address;\n abi: typeof erc20Abi;\n functionName: \"allowance\";\n args: [Address, Address];\n }> = [];\n\n for (const { user, token } of pairs) {\n balanceCalls.push({\n address: token,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [user],\n });\n allowanceCalls.push({\n address: token,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [user, spender],\n });\n }\n\n const [allBalances, allAllowances] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: balanceCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: allowanceCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const pools: Liquidity.LiquidityPool[] = [];\n const links: Liquidity.LiquidityLink[] = [];\n\n for (let i = 0; i < pairs.length; i++) {\n const { user, token } = pairs[i]!;\n const balance = allBalances[i]!;\n const allowance = allAllowances[i]!;\n\n const balancePoolId = Liquidity.generateBalancePoolId({\n user,\n chainId,\n token,\n });\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user,\n chainId,\n token,\n });\n\n pools.push({ id: balancePoolId, amount: balance }, { id: allowancePoolId, amount: allowance });\n\n links.push({\n parentPoolId: allowancePoolId,\n childPoolId: balancePoolId,\n priority: 0,\n });\n }\n\n return { pools, links };\n}\n","import type { Address, Hex, PublicActions } from \"viem\";\nimport { Abi, Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches existing collateral and debt data from Morpho protocol for user-term-collateral combinations.\n * Returns liquidity pools for obligation collateral and debt.\n *\n * @param parameters - Configuration for the fetch operation\n * @returns Promise resolving to pools array (no links for obligation collateral/debt pools)\n */\nexport async function fetchCollateralAndDebt(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chainId: bigint;\n morphoAddress: Address;\n queries: Array<{\n user: Address;\n obligationId: Hex;\n collateralAssets: Address[];\n }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<{\n pools: Liquidity.LiquidityPool[];\n}> {\n const { client, chainId, morphoAddress, queries, options } = parameters;\n if (queries.length === 0) return { pools: [] };\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 const collateralCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"collateralOf\";\n args: [Address, Hex, Address];\n }> = [];\n const debtCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"debtOf\";\n args: [Address, Hex];\n }> = [];\n\n type CollateralQueryInfo = { user: Address; obligationId: Hex; collateralAsset: Address };\n type DebtQueryInfo = { user: Address; obligationId: Hex };\n const collateralQueryInfos: CollateralQueryInfo[] = [];\n const debtQueryInfos: DebtQueryInfo[] = [];\n\n for (const { user, obligationId, collateralAssets } of queries) {\n debtCalls.push({\n address: morphoAddress,\n abi: Abi.Morpho,\n functionName: \"debtOf\",\n args: [user, obligationId],\n });\n debtQueryInfos.push({ user, obligationId });\n\n for (const collateralAsset of collateralAssets) {\n collateralCalls.push({\n address: morphoAddress,\n abi: Abi.Morpho,\n functionName: \"collateralOf\",\n args: [user, obligationId, collateralAsset],\n });\n collateralQueryInfos.push({ user, obligationId, collateralAsset });\n }\n }\n\n const [allCollaterals, allDebts] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: collateralCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: debtCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const pools: Liquidity.LiquidityPool[] = [];\n\n for (let i = 0; i < collateralQueryInfos.length; i++) {\n const { user, obligationId, collateralAsset } = collateralQueryInfos[i]!;\n const amount = allCollaterals[i]!;\n\n if (amount > 0n) {\n const poolId = Liquidity.generateObligationCollateralPoolId({\n user,\n chainId,\n obligationId,\n token: collateralAsset,\n });\n\n pools.push({\n id: poolId,\n amount,\n });\n }\n }\n\n for (let i = 0; i < debtQueryInfos.length; i++) {\n const { user, obligationId } = debtQueryInfos[i]!;\n const debt = allDebts[i]!;\n\n if (debt > 0n) {\n const poolId = Liquidity.generateDebtPoolId({\n user,\n chainId,\n obligationId,\n });\n\n pools.push({\n id: poolId,\n amount: -debt,\n });\n }\n }\n\n return { pools };\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { Abi } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches prices from multiple oracle contracts using multicall.\n *\n * @param parameters - Configuration for the fetch operation\n * @returns Promise resolving to a Map: oracle address -> price\n */\nexport async function fetchOraclePrices(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n oracles: Address[];\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<Map<Address, bigint>> {\n const { client, oracles, options } = parameters;\n if (oracles.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 const out: Map<Address, bigint> = new Map();\n\n for (const oraclesBatch of Utils.batch(oracles, batchSize)) {\n const priceCalls: Array<{\n address: Address;\n abi: typeof Abi.Oracle;\n functionName: \"price\";\n args: [];\n }> = [];\n\n for (const oracle of oraclesBatch) {\n priceCalls.push({\n address: oracle,\n abi: Abi.Oracle,\n functionName: \"price\",\n args: [],\n });\n }\n\n const prices = await Utils.retry(\n () =>\n client.multicall({\n allowFailure: false,\n contracts: priceCalls,\n ...(blockNumber ? { blockNumber } : {}),\n }),\n retryAttempts,\n retryDelayMs,\n );\n\n for (let i = 0; i < oraclesBatch.length; i++) {\n const oracle = oraclesBatch[i]!;\n const price = prices[i]! as bigint;\n out.set(oracle, price);\n }\n }\n\n return out;\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { Abi, type Chain, Liquidity } from \"#core\";\nimport * as Utils from \"#utils/index.ts\";\n\n/**\n * Fetches user positions in MetaMorpho vaults, vault positions in Morpho Blue markets, and total market liquidity.\n * Returns liquidity pools for user vault positions, vault positions, and market liquidity, along with hierarchical links.\n *\n * @param parameters - Configuration for the fetch operation\n * @param parameters.chain - The chain configuration containing chainId and Morpho Blue address\n * @param parameters.userVaults - Array of user-vault pairs to query (markets are determined from vault's withdrawQueue)\n * @returns Promise resolving to pools and links arrays\n */\nexport async function fetchUserVaultMarketLiquidity(parameters: {\n client: Pick<PublicActions, \"multicall\">;\n chain: Chain.Chain;\n userVaults: Array<{\n user: Address; // ← User address\n vault: Address; // ← MetaMorpho vault contract address\n }>;\n options?: {\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n blockNumber?: number;\n };\n}): Promise<{\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n}> {\n const { client, chain, userVaults, options } = parameters;\n const chainId = chain.id;\n const morphoBlueAddress = chain.morphoBlue;\n if (userVaults.length === 0) return { pools: [], links: [] };\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 const userMaxWithdrawCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"maxWithdraw\";\n args: [Address];\n }> = [];\n\n const withdrawQueueLengthCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"withdrawQueueLength\";\n args: [];\n }> = [];\n\n const seenVaults = new Set<Address>();\n const uniqueVaults: Address[] = [];\n\n for (const { user, vault } of userVaults) {\n userMaxWithdrawCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"maxWithdraw\",\n args: [user],\n });\n\n if (!seenVaults.has(vault)) {\n seenVaults.add(vault);\n uniqueVaults.push(vault);\n withdrawQueueLengthCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"withdrawQueueLength\",\n args: [],\n });\n }\n }\n\n const [allUserMaxWithdrawAmounts, allWithdrawQueueLengths] = await Promise.all([\n Utils.batchMulticall<bigint>({\n client,\n calls: userMaxWithdrawCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<bigint>({\n client,\n calls: withdrawQueueLengthCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const withdrawQueueItemCalls: Array<{\n address: Address;\n abi: typeof Abi.MetaMorpho;\n functionName: \"withdrawQueue\";\n args: [bigint];\n }> = [];\n\n type VaultQueue = { vault: Address; startIndex: number; length: number };\n const vaultQueues: VaultQueue[] = [];\n\n for (let i = 0; i < uniqueVaults.length; i++) {\n const vault = uniqueVaults[i]!;\n const length = Number(allWithdrawQueueLengths[i]!);\n const startIndex = withdrawQueueItemCalls.length;\n\n for (let j = 0; j < length; j++) {\n withdrawQueueItemCalls.push({\n address: vault,\n abi: Abi.MetaMorpho,\n functionName: \"withdrawQueue\",\n args: [BigInt(j)],\n });\n }\n\n vaultQueues.push({ vault, startIndex, length });\n }\n\n const allWithdrawQueueItems = await Utils.batchMulticall<string>({\n client,\n calls: withdrawQueueItemCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n });\n\n // Build vault -> marketIds mapping from withdraw queue items\n const vaultToMarketIds = new Map<Address, string[]>();\n for (const { vault, startIndex, length } of vaultQueues) {\n const marketIds = allWithdrawQueueItems.slice(startIndex, startIndex + length);\n vaultToMarketIds.set(vault, marketIds);\n }\n\n const positionCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"position\";\n args: [string, Address];\n }> = [];\n const marketCalls: Array<{\n address: Address;\n abi: typeof Abi.Morpho;\n functionName: \"market\";\n args: [string];\n }> = [];\n\n type VaultMarketPair = { vault: Address; marketId: string; priority: number };\n type VaultPosition = readonly [supplyShares: bigint, borrowShares: bigint, collateral: bigint];\n type MarketState = readonly [\n totalSupplyAssets: bigint,\n totalSupplyShares: bigint,\n totalBorrowAssets: bigint,\n totalBorrowShares: bigint,\n lastUpdate: bigint,\n fee: bigint,\n ];\n\n const vaultMarketPairs: VaultMarketPair[] = [];\n const uniqueMarketIds = new Set<string>();\n\n for (const vault of uniqueVaults) {\n const marketIds = vaultToMarketIds.get(vault) ?? [];\n for (let priority = 0; priority < marketIds.length; priority++) {\n const marketId = marketIds[priority]!;\n vaultMarketPairs.push({ vault, marketId, priority });\n\n positionCalls.push({\n address: morphoBlueAddress,\n abi: Abi.Morpho,\n functionName: \"position\",\n args: [marketId, vault],\n });\n\n uniqueMarketIds.add(marketId);\n }\n }\n\n for (const marketId of uniqueMarketIds) {\n marketCalls.push({\n address: morphoBlueAddress,\n abi: Abi.Morpho,\n functionName: \"market\",\n args: [marketId],\n });\n }\n\n const [allVaultPositions, allMarketStates] = await Promise.all([\n Utils.batchMulticall<VaultPosition>({\n client,\n calls: positionCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n Utils.batchMulticall<MarketState>({\n client,\n calls: marketCalls,\n batchSize,\n retryAttempts,\n retryDelayMs,\n blockNumber,\n }),\n ]);\n\n const markets = new Map<\n string,\n { totalSupplyAssets: bigint; totalSupplyShares: bigint; totalBorrowAssets: bigint }\n >();\n const uniqueMarketIdsArray = Array.from(uniqueMarketIds);\n for (let i = 0; i < uniqueMarketIdsArray.length; i++) {\n const marketId = uniqueMarketIdsArray[i]!;\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets] = allMarketStates[i]!;\n markets.set(marketId, {\n totalSupplyAssets,\n totalSupplyShares,\n totalBorrowAssets,\n });\n }\n\n const pools: Liquidity.LiquidityPool[] = [];\n const links: Liquidity.LiquidityLink[] = [];\n const processedMarkets = new Set<string>();\n\n const vaultToUserPoolIds = new Map<string, string[]>();\n\n for (let i = 0; i < userVaults.length; i++) {\n const { user, vault } = userVaults[i]!;\n const userMaxWithdrawAmount = allUserMaxWithdrawAmounts[i]!;\n\n const userVaultPositionPoolId = Liquidity.generateUserVaultPositionPoolId({\n user,\n chainId,\n vault,\n });\n\n pools.push({\n id: userVaultPositionPoolId,\n amount: userMaxWithdrawAmount,\n });\n\n const vaultKey = vault.toLowerCase();\n if (!vaultToUserPoolIds.has(vaultKey)) {\n vaultToUserPoolIds.set(vaultKey, []);\n }\n vaultToUserPoolIds.get(vaultKey)!.push(userVaultPositionPoolId);\n }\n\n for (let i = 0; i < vaultMarketPairs.length; i++) {\n const { vault, marketId, priority } = vaultMarketPairs[i]!;\n const [supplyShares] = allVaultPositions[i]!;\n const market = markets.get(marketId);\n\n if (!market) continue;\n\n const { totalSupplyAssets, totalSupplyShares, totalBorrowAssets } = market;\n\n /**\n * Convert vault's supply shares to actual asset amount.\n * Formula: vaultAssets = (vaultShares * totalSupplyAssets) / totalSupplyShares\n *\n * This calculates the vault's proportional ownership of the market's total supplied assets.\n * For example, if a vault owns 25% of supply shares (25,000 out of 100,000 total shares)\n * and the market has 100,000 total supplied assets, the vault owns 25,000 assets.\n */\n let vaultPositionAssets = 0n;\n if (supplyShares > 0n && totalSupplyShares > 0n) {\n vaultPositionAssets = (supplyShares * totalSupplyAssets) / totalSupplyShares;\n }\n\n const vaultPositionPoolId = Liquidity.generateVaultPositionPoolId({\n vault,\n chainId,\n marketId,\n });\n\n pools.push({\n id: vaultPositionPoolId,\n amount: vaultPositionAssets,\n });\n\n const marketLiquidityPoolId = Liquidity.generateMarketLiquidityPoolId({\n chainId,\n marketId,\n });\n\n /**\n * Create market liquidity pool (only once per market).\n * Market liquidity represents the available (unborrowed) assets in the market.\n *\n * Formula: availableLiquidity = totalSupplyAssets - totalBorrowAssets\n *\n * For example, if a market has 100,000 assets supplied and 80,000 borrowed,\n * the available liquidity is 20,000 assets.\n */\n if (!processedMarkets.has(marketId)) {\n const availableLiquidity = totalSupplyAssets - totalBorrowAssets;\n\n pools.push({\n id: marketLiquidityPoolId,\n amount: availableLiquidity,\n });\n\n processedMarkets.add(marketId);\n }\n\n // Link: vault position → market liquidity (priority 0)\n links.push({\n parentPoolId: vaultPositionPoolId,\n childPoolId: marketLiquidityPoolId,\n priority: 0,\n });\n\n // Link: user vault position → vault position (priority based on withdrawQueue)\n const vaultKey = vault.toLowerCase();\n const userPoolIds = vaultToUserPoolIds.get(vaultKey);\n if (userPoolIds) {\n for (const userVaultPositionPoolId of userPoolIds) {\n links.push({\n parentPoolId: userVaultPositionPoolId,\n childPoolId: vaultPositionPoolId,\n priority,\n });\n }\n }\n }\n\n return { pools, links };\n}\n","import type { Address } from \"viem\";\nimport * as Callback from \"../core/Callback.ts\";\nimport * as Chain from \"../core/Chain.ts\";\nimport * as Maturity from \"../core/Maturity.ts\";\n\nexport type GateConfig = {\n callbacks?: CallbackConfig[];\n maturities?: Maturity.MaturityType[];\n};\n\nexport type CallbackConfig =\n | {\n type: Callback.CallbackType.BuyVaultV1Callback;\n addresses: Address[];\n vaultFactories: Address[];\n }\n | {\n type: Callback.CallbackType.SellERC20Callback;\n addresses: Address[];\n }\n | {\n type: Callback.CallbackType.BuyWithEmptyCallback;\n };\n\nexport function getCallback(\n chain: Chain.ChainName,\n type: Callback.CallbackType.BuyVaultV1Callback,\n): Extract<CallbackConfig, { type: Callback.CallbackType.BuyVaultV1Callback }> | undefined;\nexport function getCallback(\n chain: Chain.ChainName,\n type: Callback.CallbackType.SellERC20Callback,\n): Extract<CallbackConfig, { type: Callback.CallbackType.SellERC20Callback }> | undefined;\nexport function getCallback(\n chain: Chain.ChainName,\n type: Callback.CallbackType.BuyWithEmptyCallback,\n): Extract<CallbackConfig, { type: Callback.CallbackType.BuyWithEmptyCallback }> | undefined;\nexport function getCallback(\n chain: Chain.ChainName,\n type: Callback.CallbackType,\n): CallbackConfig | undefined;\n/**\n * Returns the callback configuration for a given chain and callback type, if it exists.\n *\n * @param chain - Chain name for which to read the validation configuration\n * @param type - Callback type to retrieve\n * @returns The matching callback configuration or undefined if not configured\n */\nexport function getCallback(\n chain: Chain.ChainName,\n type: Callback.CallbackType,\n): CallbackConfig | undefined {\n return configs[chain].callbacks?.find((c) => c.type === type);\n}\n\n/**\n * Attempts to infer the configured callback type from a callback address on a chain.\n * Skips the empty callback type as it does not carry addresses.\n *\n * @param chain - Chain name for which to infer the callback type\n * @param address - Callback contract address\n * @returns The callback type when found, otherwise undefined\n */\nexport function getCallbackType(chain: Chain.ChainName, address: Address) {\n return configs[chain].callbacks?.find(\n (c) =>\n c.type !== Callback.CallbackType.BuyWithEmptyCallback &&\n c.addresses.includes(address?.toLowerCase() as Address),\n )?.type;\n}\n\n/**\n * Returns the callback addresses for a given chain and callback type, if it exists.\n * @param chain - Chain name for which to read the validation configuration\n * @param type - Callback type to retrieve\n * @returns The matching callback addresses or an empty array if not configured\n */\nexport function getCallbackTypeAddresses(\n chain: Chain.ChainName,\n type: Callback.CallbackType,\n): Address[] {\n if (type === Callback.CallbackType.BuyWithEmptyCallback) {\n return [];\n }\n const match = configs[chain].callbacks?.find((c) => c.type === type);\n return match && \"addresses\" in match ? match.addresses : [];\n}\n\n/**\n * Returns the list of allowed non-empty callback addresses for a chain.\n *\n * @param chain - Chain name\n * @returns Array of allowed callback addresses (lowercased). Empty when none configured\n */\nexport const getCallbackAddresses = (chain: Chain.ChainName): Address[] => {\n return (\n configs[chain].callbacks\n ?.filter((c) => c.type !== Callback.CallbackType.BuyWithEmptyCallback)\n .flatMap((c) => c.addresses) ?? []\n );\n};\n\nexport const assets: Record<string, Address[]> = {\n [Chain.ChainId.ETHEREUM.toString()]: [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", // WETH\n \"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599\", // WBTC\n ],\n [Chain.ChainId.BASE.toString()]: [\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\", // DAI\n \"0x4200000000000000000000000000000000000006\", // WETH\n \"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599\", // WBTC\n ],\n [Chain.ChainId[\"ETHEREUM-VIRTUAL-TESTNET\"].toString()]: [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", // WETH\n \"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599\", // WBTC\n ],\n [Chain.ChainId.ANVIL.toString()]: [\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\", // DAI\n \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", // WETH\n \"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599\", // WBTC\n ],\n};\n\nexport const configs: Record<Chain.ChainName, GateConfig> = {\n ethereum: {\n callbacks: [\n {\n type: Callback.CallbackType.BuyVaultV1Callback,\n addresses: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\",\n ],\n vaultFactories: [\n \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\", //v1.0\n \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\", //v1.1\n ],\n },\n {\n type: Callback.CallbackType.SellERC20Callback,\n addresses: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\",\n ],\n },\n { type: Callback.CallbackType.BuyWithEmptyCallback },\n ],\n maturities: [Maturity.MaturityType.EndOfMonth, Maturity.MaturityType.EndOfNextMonth],\n },\n base: {\n callbacks: [\n {\n type: Callback.CallbackType.BuyVaultV1Callback,\n addresses: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\",\n ],\n vaultFactories: [\n \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\", //v1.0\n \"0xFf62A7c278C62eD665133147129245053Bbf5918\", //v1.1\n ],\n },\n {\n type: Callback.CallbackType.SellERC20Callback,\n addresses: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\",\n ],\n },\n { type: Callback.CallbackType.BuyWithEmptyCallback },\n ],\n maturities: [Maturity.MaturityType.EndOfMonth, Maturity.MaturityType.EndOfNextMonth],\n },\n \"ethereum-virtual-testnet\": {\n callbacks: [\n {\n type: Callback.CallbackType.BuyVaultV1Callback,\n addresses: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\",\n ],\n vaultFactories: [\n \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\", //v1.0\n \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\", //v1.1\n ],\n },\n {\n type: Callback.CallbackType.SellERC20Callback,\n addresses: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\",\n ],\n },\n { type: Callback.CallbackType.BuyWithEmptyCallback },\n ],\n maturities: [Maturity.MaturityType.EndOfMonth, Maturity.MaturityType.EndOfNextMonth],\n },\n anvil: {\n callbacks: [\n {\n type: Callback.CallbackType.BuyVaultV1Callback,\n addresses: [\n \"0x3333333333333333333333333333333333333333\",\n \"0x4444444444444444444444444444444444444444\",\n ],\n vaultFactories: [\n \"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101\", //v1.0\n \"0x1897A8997241C1cD4bD0698647e4EB7213535c24\", //v1.1\n ],\n },\n {\n type: Callback.CallbackType.SellERC20Callback,\n addresses: [\n \"0x1111111111111111111111111111111111111111\",\n \"0x2222222222222222222222222222222222222222\",\n ],\n },\n { type: Callback.CallbackType.BuyWithEmptyCallback },\n ],\n maturities: [Maturity.MaturityType.EndOfMonth, Maturity.MaturityType.EndOfNextMonth],\n },\n};\n","import type { Address, PublicActions } from \"viem\";\nimport { fetchUserVaultMarketLiquidity } from \"#collectors/fetchers/index.ts\";\nimport { Callback, type Chain, Liquidity } from \"#core\";\nimport * as GateConfig from \"#gatekeeper/GateConfig.ts\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectBuyVaultV1CallbackLiquidity<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n collector,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n callbackAddresses: GateConfig.getCallbackTypeAddresses(\n chain.name,\n Callback.CallbackType.BuyVaultV1Callback,\n ),\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const userVaults: Array<{ user: Address; vault: Address }> = [];\n const seenUserVaultPairs = new Set<string>();\n\n for (const offer of offers) {\n const callbackData = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n\n for (const { vault } of callbackData) {\n const key = `${offer.offering}-${vault}`.toLowerCase();\n if (seenUserVaultPairs.has(key)) continue;\n seenUserVaultPairs.add(key);\n userVaults.push({\n user: offer.offering,\n vault,\n });\n }\n }\n\n const { pools: vaultPools, links: vaultLinks } = await fetchUserVaultMarketLiquidity({\n client,\n chain,\n userVaults,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n });\n\n const allPools: Liquidity.LiquidityPool[] = [];\n const allLinks: Liquidity.LiquidityLink[] = [];\n const allOfferPools: Liquidity.OfferLiquidityPool[] = [];\n\n allPools.push(...vaultPools);\n allLinks.push(...vaultLinks);\n\n for (const offer of offers) {\n const user = offer.offering;\n const callbackData = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n\n for (const { vault, amount: callbackAmount } of callbackData) {\n const callbackPoolId = Liquidity.generateBuyVaultCallbackPoolId({\n user,\n chainId: chain.id,\n vault,\n offerHash: offer.hash,\n });\n\n const userVaultPositionPoolId = Liquidity.generateUserVaultPositionPoolId({\n user,\n chainId: chain.id,\n vault,\n });\n\n allPools.push({\n id: callbackPoolId,\n amount: callbackAmount,\n });\n\n allLinks.push({\n parentPoolId: callbackPoolId,\n childPoolId: userVaultPositionPoolId,\n priority: 0,\n });\n\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: callbackPoolId,\n amount: callbackAmount,\n });\n }\n }\n\n await liquidityStore.save({\n blockNumber: latestBlockNumberChain,\n pools: allPools,\n links: allLinks,\n offerPools: allOfferPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n\n return latestBlockNumber;\n}\n","import type { Address, PublicActions } from \"viem\";\nimport { fetchBalancesAndAllowances } from \"#collectors/fetchers/index.ts\";\nimport { type Chain, Liquidity } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectBuyWithEmptyCallbackLiquidity<\n chain extends Chain.Chain,\n collector extends Collector.Name = \"consumed_events\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options?: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n collector,\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"buy\",\n chains: [Number(chain.id)],\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const pairs: Array<{ user: Address; token: Address }> = [];\n const seenUserTokenPairs = new Set<string>();\n\n for (const offer of offers) {\n const key = `${offer.offering}-${offer.loanToken}`.toLowerCase();\n if (seenUserTokenPairs.has(key)) continue;\n seenUserTokenPairs.add(key);\n pairs.push({\n user: offer.offering as Address,\n token: offer.loanToken as Address,\n });\n }\n\n const { pools, links } = await fetchBalancesAndAllowances({\n client,\n chainId: chain.id,\n spender: chain.morpho,\n pairs,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n });\n\n const poolsMap = new Map(pools.map((p) => [p.id, p]));\n\n // each offer points to its allowance pool with allowance amount\n const offerPools: Liquidity.OfferLiquidityPool[] = [];\n for (const offer of offers) {\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user: offer.offering,\n chainId: chain.id,\n token: offer.loanToken,\n });\n\n const allowancePool = poolsMap.get(allowancePoolId);\n if (allowancePool) {\n offerPools.push({\n offerHash: offer.hash,\n poolId: allowancePoolId,\n amount: allowancePool.amount,\n });\n }\n }\n\n await liquidityStore.save({\n blockNumber: latestBlockNumberChain,\n pools,\n links,\n offerPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n\n return latestBlockNumber;\n}\n","import { parseEventLogs } from \"viem\";\nimport { Chain, Offer } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectConsumedEvents<\n chain extends Chain.Chain,\n collector extends Collector.Name = \"consumed_events\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n options?: {\n maxBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n collector,\n withTransaction,\n client,\n chain,\n lastBlockNumber: blockNumber,\n epoch,\n options: { maxBatchSize = 1_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n const startBlock = blockNumber;\n let totalConsumedEvents = 0;\n\n const stream = Chain.streamLogs({\n client,\n contractAddress: chain.morpho,\n event: Offer.consumedEvent,\n blockNumberGte: blockNumber,\n order: \"asc\",\n options: { maxBatchSize },\n });\n\n for await (const { logs, blockNumber: lastStreamBlockNumber } of stream) {\n const parsedLogs = parseEventLogs({ abi: [Offer.consumedEvent], logs });\n\n await withTransaction(async ({ collectorStore, offerStore }) => {\n for (const log of parsedLogs) {\n try {\n if (log.blockNumber === null || log.logIndex === null || log.transactionHash === null) {\n logger.debug({\n collector,\n chainId: chain.id,\n msg: \"Skipping log because it is missing required fields\",\n });\n continue;\n }\n\n const offer = Offer.fromConsumedLog({\n blockNumber: log.blockNumber,\n logIndex: log.logIndex,\n chainId: Number(chain.id),\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 blockNumber: offer.blockNumber,\n });\n\n totalConsumedEvents++;\n } catch (err) {\n logger.error({ err, msg: \"Failed to process offer_consumed events\" });\n }\n }\n\n blockNumber = lastStreamBlockNumber;\n\n try {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch,\n });\n } catch (_) {\n try {\n const ancestor = await collectorStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n\n blockNumber = ancestor.blockNumber;\n\n const deleted = await offerStore.deleteManyConsumedAmountsByBlockNumberGte(blockNumber);\n\n logger.info({\n collector,\n chain_id: chain.id,\n msg: `Reorg detected, events deleted`,\n count: deleted,\n block_number: blockNumber,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch: ancestor.epoch,\n });\n } catch (err) {\n const msg = \"Failed to delete consumed events when handling reorg.\";\n logger.error({\n collector,\n chainId: chain.id,\n msg,\n err,\n });\n\n throw new Error(msg);\n }\n\n return blockNumber;\n }\n });\n }\n\n if (totalConsumedEvents > 0) {\n logger.info({\n msg: `Events indexed`,\n collector,\n count: totalConsumedEvents,\n chain_id: chain.id,\n block_range: [startBlock, blockNumber],\n });\n }\n\n return blockNumber;\n}\n","import type { Chain, Offer } from \"#core\";\nimport type * as Gatekeeper from \"#gatekeeper/Gatekeeper.ts\";\nimport type * as Mempool from \"#mempool/index.ts\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectOffers<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n mempool: Mempool.Client;\n gatekeeper: Gatekeeper.Gatekeeper;\n options: {\n maxBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: blockNumber,\n collector,\n mempool,\n gatekeeper,\n options: { maxBatchSize = 1_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n const startBlock = blockNumber;\n const offersIndexed = 0;\n\n const stream = mempool.stream({\n order: \"asc\",\n blockNumberGte: blockNumber,\n options: { maxBatchSize },\n });\n\n for await (const { offers, blockNumber: blockNumberWatched } of stream) {\n await withTransaction(async ({ chainStore, collectorStore, offerStore }) => {\n const { epoch, blockNumber: latestBlockNumber } = await chainStore.getBlockNumber(chain.id);\n\n let validOffers: Offer.Offer[] = [];\n\n try {\n const allowedResults = await gatekeeper.isAllowed(offers);\n validOffers = allowedResults.valid.filter(\n (offer) => offer.blockNumber <= latestBlockNumber,\n );\n } catch (err) {\n logger.error({ err, msg: \"Failed to validate offers\" });\n }\n\n await offerStore.createMany(validOffers.map((offer) => ({ offer })));\n\n blockNumber = blockNumberWatched;\n\n try {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch,\n });\n } catch (_) {\n try {\n const ancestor = await collectorStore.getBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n });\n\n blockNumber = ancestor.blockNumber;\n\n const deleted = await offerStore.deleteManyByBlockNumberGte(blockNumber);\n\n logger.info({\n collector,\n chain_id: chain.id,\n msg: `Reorg detected, offers deleted`,\n count: deleted,\n block_number: blockNumber,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber,\n epoch: ancestor.epoch,\n });\n } catch (err) {\n const msg = \"Failed to delete offers when handling reorg.\";\n logger.error({\n collector,\n chainId: chain.id,\n msg,\n err,\n });\n\n throw new Error(msg);\n }\n\n return blockNumber;\n }\n });\n }\n\n if (offersIndexed > 0) {\n logger.info({\n msg: `Events indexed`,\n collector,\n count: offersIndexed,\n chain_id: chain.id,\n block_range: [startBlock, blockNumber],\n });\n }\n\n return blockNumber;\n}\n","import type { Address, Hex, PublicActions } from \"viem\";\nimport {\n fetchBalancesAndAllowances,\n fetchCollateralAndDebt,\n fetchOraclePrices,\n} from \"#collectors/fetchers/index.ts\";\nimport { Callback, type Chain, Liquidity, Offer } from \"#core\";\nimport * as GateConfig from \"#gatekeeper/GateConfig.ts\";\nimport * as Logger from \"#services/Logger.ts\";\nimport type * as Collector from \"../Collector.ts\";\n\nexport async function collectSellERC20CallbackLiquidity<\n chain extends Chain.Chain = Chain.Chain,\n collector extends Collector.Name = \"mempool_offers\",\n>(\n parameters: Collector.CollectParameters<chain, collector> & {\n client: Pick<PublicActions, \"multicall\">;\n options: {\n maxBatchSize?: number;\n offerBatchSize?: number;\n };\n },\n): Promise<number> {\n let {\n withTransaction,\n chain,\n lastBlockNumber: latestBlockNumber,\n collector,\n client,\n options: { maxBatchSize = 1_000, offerBatchSize = 5_000 } = {},\n } = parameters;\n\n const logger = Logger.getLogger();\n\n let cursor: string | undefined;\n let totalOffersProcessed = 0;\n\n do {\n await withTransaction(async ({ collectorStore, liquidityStore, chainStore, offerStore }) => {\n const { offers, nextCursor } = await offerStore.getAll({\n query: {\n side: \"sell\",\n chains: [Number(chain.id)],\n callbackAddresses: GateConfig.getCallbackTypeAddresses(\n chain.name,\n Callback.CallbackType.SellERC20Callback,\n ),\n cursor,\n limit: offerBatchSize,\n },\n });\n\n const { blockNumber: latestBlockNumberChain, epoch } = await chainStore.getBlockNumber(\n chain.id,\n );\n\n if (offers.length === 0) {\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n cursor = nextCursor ?? undefined;\n return;\n }\n\n const pairs: Array<{ user: Address; token: Address }> = [];\n const seenUserTokenPairs = new Set<string>();\n const collateralDebtQueries: Array<{\n user: Address;\n obligationId: Hex;\n collateralAssets: Address[];\n }> = [];\n\n for (const offer of offers) {\n const callbackData = Callback.decodeSellERC20Callback(offer.callback.data);\n\n for (const { collateral } of callbackData) {\n const key = `${offer.offering}-${collateral}`.toLowerCase();\n if (seenUserTokenPairs.has(key)) continue;\n seenUserTokenPairs.add(key);\n pairs.push({\n user: offer.offering,\n token: collateral,\n });\n }\n\n const collateralAssets = offer.collaterals.map((collateral) => collateral.asset);\n collateralDebtQueries.push({\n user: offer.offering,\n obligationId: Offer.obligationId(offer),\n collateralAssets,\n });\n }\n\n const [balanceAllowanceLiquidity, obligationCollateralDebtLiquidity, oraclePrices] =\n await Promise.all([\n fetchBalancesAndAllowances({\n client,\n chainId: chain.id,\n spender: chain.morpho,\n pairs,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n fetchCollateralAndDebt({\n client,\n chainId: chain.id,\n morphoAddress: chain.morpho,\n queries: collateralDebtQueries,\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n fetchOraclePrices({\n client,\n oracles: [...new Set(offers.flatMap((o) => o.collaterals.map((c) => c.oracle)))],\n options: {\n blockNumber: latestBlockNumberChain,\n batchSize: maxBatchSize,\n },\n }),\n ]);\n\n const allPools: Liquidity.LiquidityPool[] = [];\n const allLinks: Liquidity.LiquidityLink[] = [];\n const allOfferPools: Liquidity.OfferLiquidityPool[] = [];\n\n allPools.push(...balanceAllowanceLiquidity.pools);\n allLinks.push(...balanceAllowanceLiquidity.links);\n allPools.push(...obligationCollateralDebtLiquidity.pools);\n\n const poolsMap = new Map(allPools.map((p) => [p.id, p]));\n\n for (const offer of offers) {\n const user = offer.offering;\n const obligationId = Offer.obligationId(offer);\n\n const callbackData = Callback.decodeSellERC20Callback(offer.callback.data);\n const callbackAmountsByCollateral = new Map<string, bigint>();\n for (const callbackItem of callbackData) {\n callbackAmountsByCollateral.set(\n callbackItem.collateral.toLowerCase(),\n callbackItem.amount,\n );\n }\n\n for (const offerCollateral of offer.collaterals) {\n const token = offerCollateral.asset;\n const oraclePrice = oraclePrices.get(offerCollateral.oracle);\n if (!oraclePrice) continue;\n\n const lltv = offerCollateral.lltv;\n const callbackAmount = callbackAmountsByCollateral.get(token.toLowerCase()) ?? 0n;\n\n const obligationCollateralPoolId = Liquidity.generateObligationCollateralPoolId({\n user,\n chainId: chain.id,\n obligationId,\n token,\n });\n const obligationCollateralPool = poolsMap.get(obligationCollateralPoolId);\n const obligationCollateralAmount = obligationCollateralPool\n ? obligationCollateralPool.amount\n : 0n;\n\n if (callbackAmount > 0n) {\n const allowancePoolId = Liquidity.generateAllowancePoolId({\n user,\n chainId: chain.id,\n token,\n });\n const callbackPoolId = Liquidity.generateSellERC20CallbackPoolId({\n user,\n chainId: chain.id,\n obligationId,\n token,\n offerHash: offer.hash,\n });\n\n allPools.push({\n id: callbackPoolId,\n amount: callbackAmount,\n });\n\n allLinks.push({\n parentPoolId: callbackPoolId,\n childPoolId: allowancePoolId,\n priority: 0,\n });\n\n const maxDebt = Liquidity.calculateMaxDebt(callbackAmount, oraclePrice, lltv);\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: callbackPoolId,\n amount: maxDebt,\n });\n }\n\n if (obligationCollateralAmount > 0n) {\n const maxDebt = Liquidity.calculateMaxDebt(\n obligationCollateralAmount,\n oraclePrice,\n lltv,\n );\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: obligationCollateralPoolId,\n amount: maxDebt,\n });\n }\n }\n\n const debtPoolId = Liquidity.generateDebtPoolId({\n user,\n chainId: chain.id,\n obligationId,\n });\n const debtPool = poolsMap.get(debtPoolId);\n if (debtPool) {\n allOfferPools.push({\n offerHash: offer.hash,\n poolId: debtPoolId,\n amount: debtPool.amount,\n });\n }\n }\n\n await liquidityStore.save({\n blockNumber: latestBlockNumberChain,\n pools: allPools,\n links: allLinks,\n offerPools: allOfferPools,\n });\n\n await collectorStore.saveBlockNumber({\n collectorName: collector,\n chainId: chain.id,\n blockNumber: latestBlockNumberChain,\n epoch,\n });\n\n latestBlockNumber = latestBlockNumberChain;\n totalOffersProcessed += offers.length;\n cursor = nextCursor ?? undefined;\n });\n } while (cursor);\n\n if (totalOffersProcessed > 0) {\n logger.info({\n msg: `Offers updated`,\n collector,\n count: totalOffersProcessed,\n chain_id: chain.id,\n block_number: latestBlockNumber,\n });\n }\n return latestBlockNumber;\n}\n","import type { PublicClient } from \"viem\";\nimport type { Chain } from \"#core\";\nimport * as CollectorStore from \"#database/CollectorStore.ts\";\nimport type { PG } from \"#database/index.ts\";\nimport type * as Gatekeeper from \"#gatekeeper/Gatekeeper.ts\";\nimport * as Mempool from \"#mempool/index.ts\";\nimport * as Services from \"#services/Services.ts\";\nimport * as CollectFunctions from \"./CollectFunctions/index.ts\";\nimport * as Collector from \"./Collector.ts\";\n\nexport type Builder<chain extends Chain.Chain = Chain.Chain> = {\n buildMempoolCollector: (parameters: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"mempool_offers\", chain>;\n\n buildConsumedEventsCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"consumed_events\", chain>;\n\n buildBuyWithEmptyCallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"buy_with_empty_callback_liquidity\", chain>;\n\n buildSellERC20CallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"sell_erc20_callback_liquidity\", chain>;\n\n buildBuyVaultV1CallbackLiquidityCollector: (parameters?: {\n options?: { maxBatchSize?: number };\n }) => Collector.Collector<\"buy_vault_v1_callback_liquidity\", chain>;\n};\n\nexport function createBuilder<chain extends Chain.Chain = Chain.Chain>(parameters: {\n client: PublicClient;\n chain: chain;\n db: PG.PG;\n gatekeeper: Gatekeeper.Gatekeeper;\n options: { interval: number; maxBlockNumber?: number };\n}): Builder<chain> {\n const { client, chain, db, gatekeeper, options } = parameters;\n const collectorStore = CollectorStore.create({ db });\n const withTransaction = <T>() => Services.createWithTransaction<T>(db);\n\n const createCollector = <name extends Collector.Name>(\n name: name,\n collect: Collector.CollectFn<chain, name>,\n ): Collector.Collector<name, chain> =>\n Collector.create<name, chain>({\n name,\n collect,\n client,\n chain,\n withTransaction: withTransaction(),\n collectorStore,\n options,\n });\n\n return {\n buildMempoolCollector: ({ options: { maxBatchSize = 1_000 } = {} }) => {\n return createCollector(\"mempool_offers\", (p) =>\n CollectFunctions.collectOffers<chain, \"mempool_offers\">({\n ...p,\n gatekeeper,\n collector: \"mempool_offers\",\n mempool: Mempool.connect({\n // @ts-expect-error - ok to use public client for watching\n client,\n mempoolAddress: chain.mempool!.address,\n }),\n client,\n options: { maxBatchSize },\n }),\n );\n },\n\n buildConsumedEventsCollector: ({ options: { maxBatchSize = 1_000 } = {} } = {}) => {\n return createCollector(\"consumed_events\", (p) =>\n CollectFunctions.collectConsumedEvents<chain, \"consumed_events\">({\n ...p,\n collector: \"consumed_events\",\n options: { maxBatchSize },\n }),\n );\n },\n\n buildBuyWithEmptyCallbackLiquidityCollector: ({\n options: { maxBatchSize = 1_000 } = {},\n } = {}) => {\n return createCollector(\"buy_with_empty_callback_liquidity\", (p) =>\n CollectFunctions.collectBuyWithEmptyCallbackLiquidity<\n chain,\n \"buy_with_empty_callback_liquidity\"\n >({\n ...p,\n collector: \"buy_with_empty_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n\n buildSellERC20CallbackLiquidityCollector: ({ options: { maxBatchSize = 1_000 } = {} } = {}) => {\n return createCollector(\"sell_erc20_callback_liquidity\", (p) =>\n CollectFunctions.collectSellERC20CallbackLiquidity<chain, \"sell_erc20_callback_liquidity\">({\n ...p,\n collector: \"sell_erc20_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n\n buildBuyVaultV1CallbackLiquidityCollector: ({\n options: { maxBatchSize = 1_000 } = {},\n } = {}) => {\n return createCollector(\"buy_vault_v1_callback_liquidity\", (p) =>\n CollectFunctions.collectBuyVaultV1CallbackLiquidity<\n chain,\n \"buy_vault_v1_callback_liquidity\"\n >({\n ...p,\n collector: \"buy_vault_v1_callback_liquidity\",\n options: { maxBatchSize },\n client,\n }),\n );\n },\n };\n}\n","import { and, asc, eq, sql } from \"drizzle-orm\";\nimport { Chain } from \"#core\";\nimport * as Logger from \"#services/Logger.ts\";\nimport { chains } from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type ChainStore = {\n /** Get the latest block number processed by a given chain alongside its epoch. */\n getBlockNumber: (chainId: Chain.Id) => Promise<{ blockNumber: number; epoch: bigint }>;\n\n /** Get the latest block number processed for all chains, optionally filtered by chain id. */\n getBlockNumbers: (parameters?: { chainId?: Chain.Id }) => Promise<\n Array<{\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n updatedAt: Date;\n }>\n >;\n\n /** Save the latest block number processed for a given chain alongside its epoch.*/\n saveBlockNumber: (parameters: {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): ChainStore => {\n const db = config.db;\n const logger = Logger.getLogger();\n\n return {\n getBlockNumber: async (chainId: Chain.Id) => {\n const res = await db\n .select({\n blockNumber: chains.blockNumber,\n epoch: chains.epoch,\n })\n .from(chains)\n .where(eq(chains.chainId, chainId));\n\n if (res.length === 0) {\n const msg = `No block number found for chain ${chainId}`;\n logger.debug({ service: \"chain_store\", msg });\n\n const deploymentBlock = Chain.getChain(chainId)?.mempool.deploymentBlock || 0;\n\n await db\n .insert(chains)\n .values({\n chainId,\n blockNumber: deploymentBlock,\n })\n .onConflictDoNothing();\n\n return {\n blockNumber: deploymentBlock,\n epoch: 0n,\n };\n }\n\n return { blockNumber: Number(res[0]!.blockNumber), epoch: BigInt(res[0]!.epoch) };\n },\n\n getBlockNumbers: async (parameters?: { chainId?: Chain.Id }) => {\n const rows = await db\n .select({\n chainId: chains.chainId,\n blockNumber: chains.blockNumber,\n epoch: chains.epoch,\n updatedAt: chains.updatedAt,\n })\n .from(chains)\n .where(\n parameters?.chainId !== undefined ? eq(chains.chainId, parameters.chainId) : sql`TRUE`,\n )\n .orderBy(asc(chains.chainId));\n\n return rows.map((row) => ({\n chainId: row.chainId,\n blockNumber: Number(row.blockNumber),\n epoch: BigInt(row.epoch),\n updatedAt: row.updatedAt,\n }));\n },\n\n saveBlockNumber: async (parameters: {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: bigint;\n }) => {\n await db\n .update(chains)\n .set({\n blockNumber: parameters.blockNumber,\n epoch: parameters.epoch.toString(),\n updatedAt: sql`now()`,\n })\n .where(and(eq(chains.chainId, parameters.chainId)));\n },\n };\n};\n","import { sql } from \"drizzle-orm\";\nimport type { Liquidity, Offer } from \"#core\";\nimport { liquidityLinks, liquidityPools, offerLiquidityPools } from \"#database/drizzle/schema.ts\";\nimport type * as PG from \"#database/PG.ts\";\n\nexport type LiquidityStore = {\n /**\n * Get all liquidity pools.\n * @returns Array of all liquidity pools\n */\n getAllPools: () => Promise<Liquidity.LiquidityPool[]>;\n\n /**\n * Get all liquidity links.\n * @returns Array of all liquidity links\n */\n getAllLinks: () => Promise<Liquidity.LiquidityLink[]>;\n\n /**\n * Get all offer-pool mappings.\n * @returns Array of all offer liquidity pools\n */\n getAllOfferPools: () => Promise<Liquidity.OfferLiquidityPool[]>;\n\n /**\n * Save or update liquidity data.\n * Accepts flat arrays of pools, links, and offer-pool mappings.\n *\n * Automatically cleans up stale links: for each parent pool being updated,\n * deletes any existing links with priority greater than the maximum priority\n * in the new links. This ensures that when priority-ordered relationships\n * shrink, old links are removed.\n *\n * @param parameters - Object containing arrays of pools, links, and offerPools at a given block number\n */\n save: (parameters: {\n blockNumber: number;\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n offerPools: Liquidity.OfferLiquidityPool[];\n }) => Promise<void>;\n};\n\n/** Postgres implementation. */\nexport const create = (config: { db: PG.PG }): LiquidityStore => {\n const db = config.db;\n\n return {\n getAllPools: async () => {\n const result = await db.select().from(liquidityPools);\n return result.map((row) => ({\n id: row.id,\n amount: BigInt(row.amount),\n }));\n },\n\n getAllLinks: async () => {\n const result = await db.select().from(liquidityLinks);\n return result.map((row) => ({\n parentPoolId: row.parentPoolId,\n childPoolId: row.childPoolId,\n priority: row.priority,\n }));\n },\n\n getAllOfferPools: async () => {\n const result = await db.select().from(offerLiquidityPools);\n return result.map((row) => ({\n offerHash: row.offerHash as Offer.Offer[\"hash\"],\n poolId: row.poolId,\n amount: BigInt(row.amount),\n }));\n },\n\n save: async (parameters: {\n blockNumber: number;\n pools: Liquidity.LiquidityPool[];\n links: Liquidity.LiquidityLink[];\n offerPools: Liquidity.OfferLiquidityPool[];\n }) => {\n const { pools: poolsToSave, links: linksToSave, offerPools: offerPoolsToSave } = parameters;\n\n await db.transaction(async (tx) => {\n for (const pool of poolsToSave) {\n await tx\n .insert(liquidityPools)\n .values({\n id: pool.id,\n amount: pool.amount.toString(),\n blockNumber: parameters.blockNumber,\n })\n .onConflictDoUpdate({\n target: liquidityPools.id,\n set: {\n amount: pool.amount.toString(),\n blockNumber: parameters.blockNumber,\n updatedAt: sql`now()`,\n },\n where: sql`${liquidityPools.amount} IS DISTINCT FROM excluded.amount`,\n });\n }\n\n const maxPriorityByParent = new Map<string, number>();\n for (const link of linksToSave) {\n const currentMax = maxPriorityByParent.get(link.parentPoolId) ?? -1;\n if (link.priority > currentMax) {\n maxPriorityByParent.set(link.parentPoolId, link.priority);\n }\n }\n\n for (const [parentPoolId, maxPriority] of maxPriorityByParent.entries()) {\n await tx\n .delete(liquidityLinks)\n .where(\n sql`${liquidityLinks.parentPoolId} = ${parentPoolId} AND ${liquidityLinks.priority} > ${maxPriority}`,\n );\n }\n\n for (const link of linksToSave) {\n await tx\n .insert(liquidityLinks)\n .values({\n parentPoolId: link.parentPoolId,\n childPoolId: link.childPoolId,\n priority: link.priority,\n blockNumber: parameters.blockNumber,\n })\n .onConflictDoUpdate({\n target: [liquidityLinks.parentPoolId, liquidityLinks.priority],\n set: {\n childPoolId: link.childPoolId,\n blockNumber: parameters.blockNumber,\n updatedAt: sql`now()`,\n },\n where: sql`${liquidityLinks.childPoolId} IS DISTINCT FROM excluded.child_pool_id`,\n });\n }\n\n for (const offerPool of offerPoolsToSave) {\n await tx\n .insert(offerLiquidityPools)\n .values({\n offerHash: offerPool.offerHash,\n poolId: offerPool.poolId,\n amount: offerPool.amount.toString(),\n blockNumber: parameters.blockNumber,\n })\n .onConflictDoUpdate({\n target: [offerLiquidityPools.offerHash, offerLiquidityPools.poolId],\n set: {\n amount: offerPool.amount.toString(),\n blockNumber: parameters.blockNumber,\n updatedAt: sql`now()`,\n },\n where: sql`${offerLiquidityPools.amount} IS DISTINCT FROM excluded.amount`,\n });\n }\n });\n },\n };\n};\n","import { and, asc, desc, eq, gt, gte, inArray, lte, sql } from \"drizzle-orm\";\nimport type { Address, Hex } from \"viem\";\nimport { Collateral, LLTV, Maturity, Obligation, Offer, Quote } from \"#core\";\nimport { Time } from \"#utils/index.ts\";\nimport {\n consumed as consumedTable,\n liquidityLinks,\n liquidityPools,\n obligationCollaterals,\n obligations,\n offerLiquidityPools,\n offers,\n} from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\nimport { Cursor } from \"./utils/index.ts\";\n\n/**\n * The `OfferStore` is responsible for managing offer-related data.\n */\nexport type OfferStore = {\n /** Create a single offer. */\n create: (parameters: { offer: Offer.Offer }) => Promise<string>;\n\n /** Create multiple offers. */\n createMany: (parameters: { offer: Offer.Offer }[]) => Promise<string[]>;\n\n /** Get all offers with optional filtering, sorting, and pagination. */\n getAll: (params?: GetAllParams) => Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n }>;\n\n /** Find offers that match the specified parameters, with cursor pagination. */\n findMatchingOffers: (\n params: FindMatchingOffersParams & { implementation?: \"nodejs\" | \"sql\" },\n ) => Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n implementation?: \"nodejs\" | \"sql\";\n }>;\n\n /** Delete an offer by hash. */\n delete: (hash: Offer.Offer[\"hash\"]) => Promise<boolean>;\n\n /** Delete multiple offers by hashes. */\n deleteMany: (hashes: Offer.Offer[\"hash\"][]) => Promise<number>;\n\n /** Delete multiple offers by block number greater than or equal to the given value. */\n deleteManyByBlockNumberGte: (blockNumberGte: number) => Promise<number>;\n\n /** Update the consumed amount for a set of offers with the same chainId, offering, and nonce. */\n updateConsumedAmount: (parameters: {\n id: string;\n chainId: Offer.Offer[\"chainId\"];\n offering: Offer.Offer[\"offering\"];\n nonce: Offer.Offer[\"nonce\"];\n consumed: bigint;\n blockNumber: number;\n }) => Promise<void>;\n\n /** Delete multiple consumed amounts by block number greater than or equal to the given value. */\n deleteManyConsumedAmountsByBlockNumberGte: (blockNumberGte: number) => Promise<number>;\n\n /** Get all obligations */\n getAllObligations: (parameters?: { cursor?: string; limit?: number }) => Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }>;\n\n /** Get quotes for given obligations. */\n getQuotes: (parameters: { obligationIds: Hex[] }) => Promise<Quote.Quote[]>;\n\n /** Get a single obligation by id */\n getObligation: (id: Hex) => Promise<Obligation.Obligation | null>;\n};\n\nexport type GetOffersFilters = {\n creators?: string[];\n side?: \"buy\" | \"sell\";\n chains?: number[];\n loanTokens?: string[];\n callbackAddresses?: string[];\n minAmount?: bigint;\n maxAmount?: bigint;\n minRate?: bigint;\n maxRate?: bigint;\n minMaturity?: number;\n maxMaturity?: number;\n minExpiry?: number;\n maxExpiry?: number;\n collateralAssets?: string[];\n collateralOracles?: string[];\n collateralTuple?: Array<{\n asset: string;\n oracle?: string;\n lltv?: LLTV.LLTV;\n }>;\n minLltv?: number; // 0-100 scale\n maxLltv?: number; // 0-100 scale\n sortBy?: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n sortOrder?: \"asc\" | \"desc\";\n cursor?: string;\n limit?: number;\n};\n\nexport type FindMatchingOffersParams = {\n /** The side of the offer. */\n side: \"buy\" | \"sell\";\n /** The obligationId of the offer. */\n obligationId: Hex;\n /** Cursor string returned by a previous call, for pagination */\n cursor?: string;\n /** Page size; defaults to 20 */\n limit?: number;\n};\n\nexport type GetAllParams = {\n query?: GetOffersFilters;\n};\n\nexport type PgConfig = {\n /** The database instance to use for operations. */\n db: PG.PG;\n};\n\nexport function create(config: PgConfig): OfferStore {\n const db = config.db;\n\n return {\n create: async (parameters: { offer: Offer.Offer }): Promise<string> => {\n const { offer } = parameters;\n\n return await db.transaction(async (tx) => {\n const obligationId = Offer.obligationId(offer);\n\n await tx\n .insert(obligations)\n .values({\n obligationId,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n maturity: offer.maturity,\n })\n .onConflictDoNothing();\n\n const result = await tx\n .insert(offers)\n .values({\n hash: offer.hash.toLowerCase(),\n obligationId,\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 blockNumber: offer.blockNumber,\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\n .insert(obligationCollaterals)\n .values({\n obligationId,\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n })\n .onConflictDoNothing();\n }\n\n return offer.hash;\n });\n },\n\n createMany: async (\n parameters: {\n offer: Offer.Offer;\n }[],\n ): Promise<string[]> => {\n return await db.transaction(async (tx) => {\n const hashes: string[] = [];\n\n for (const { offer } of parameters) {\n const obligationId = Offer.obligationId(offer);\n await tx\n .insert(obligations)\n .values({\n obligationId,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n maturity: offer.maturity,\n })\n .onConflictDoNothing();\n\n const result = await tx\n .insert(offers)\n .values({\n obligationId,\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 blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing()\n .returning();\n\n // early return to avoid inserting collaterals if the offer already exists\n if (result.length === 0) continue;\n\n for (const collateral of offer.collaterals) {\n await tx\n .insert(obligationCollaterals)\n .values({\n obligationId,\n asset: collateral.asset.toLowerCase(),\n oracle: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n })\n .onConflictDoNothing();\n }\n\n hashes.push(offer.hash);\n }\n\n return hashes;\n });\n },\n\n getAll: async (\n params?: GetAllParams,\n ): Promise<{\n offers: Offer.Offer[];\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 obligationCollaterals.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 obligationCollaterals.oracle,\n query.collateralOracles.map((o) => o.toLowerCase()),\n ),\n );\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 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 collateralsLateral = db\n .select({\n collaterals: sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE(\n jsonb_agg(\n jsonb_build_object(\n 'asset', ${obligationCollaterals.asset},\n 'oracle', ${obligationCollaterals.oracle},\n 'lltv', ${obligationCollaterals.lltv}\n )\n ),\n '[]'::jsonb\n )`.as(\"collaterals\"),\n })\n .from(obligationCollaterals)\n .where(eq(obligationCollaterals.obligationId, offers.obligationId))\n .as(\"collaterals_lateral\");\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 collaterals: collateralsLateral.collaterals,\n blockNumber: offers.blockNumber,\n })\n .from(offers)\n .leftJoinLateral(collateralsLateral, sql`true`)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n conditions.length > 0 ? and(...conditions) : sql`true`,\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 const returnedOffers = results.map((row) =>\n Offer.from({\n offering: row.offering as Address,\n assets: BigInt(row.assets),\n rate: row.rate,\n maturity: Maturity.from(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 collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress as Address,\n data: row.callbackData as Hex,\n gasLimit: row.callbackGasLimit,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n ...(row.signature !== null ? { signature: row.signature as Hex } : undefined),\n }),\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 return { offers: returnedOffers, nextCursor };\n },\n\n /**\n * Find takable offers that satisfy user filters and remain executable when\n * competing over shared liquidity.\n *\n * The query addresses:\n * - Effective liquidity: compute usable capacity per pool by propagating\n * bottlenecks bottom-up across the offer’s reachable subgraph.\n * - Cross-validation: simulate sequential execution (by priority) so that\n * later offers see capacity reduced by earlier selections.\n *\n * Filtering guarantees:\n * - Side, chain, non-expired, non-matured\n * - Optional exact maturity or [min, max] window\n * - Optional loanToken and creator\n * - Optional rate threshold: buy → rate <= threshold, sell → rate >= threshold\n * - Optional exact collateral set match ((asset, oracle, lltv) tuples)\n *\n * Ordering:\n * - Buy: ascending rate; Sell: descending rate. Cursor resumes on (rate, hash).\n */\n findMatchingOffers: async (\n params: FindMatchingOffersParams & { implementation?: \"nodejs\" | \"sql\" },\n ): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n implementation?: \"nodejs\" | \"sql\";\n }> => {\n if (params.implementation === \"sql\") {\n return sqlFindMatchingOffers(db, params);\n }\n return nodeJsFindMatchingOffers(db, params);\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 deleteManyByBlockNumberGte: async (blockNumberGte: number): Promise<number> => {\n const result = await db.delete(offers).where(sql`${offers.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\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 blockNumber: number;\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 blockNumber: parameters.blockNumber,\n })\n .onConflictDoNothing();\n },\n\n deleteManyConsumedAmountsByBlockNumberGte: async (blockNumberGte: number): Promise<number> => {\n const result = await db\n .delete(consumedTable)\n .where(sql`${consumedTable.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\n },\n\n getAllObligations: async (parameters?: {\n cursor?: string;\n limit?: number;\n }): Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }> => {\n const { cursor, limit = 100 } = parameters ?? {};\n\n const result = await db\n .select({\n obligationId: obligations.obligationId,\n chainId: obligations.chainId,\n loanToken: obligations.loanToken,\n collaterals: sql<\n { asset: Address; oracle: Address; lltv: string }[]\n >`ARRAY_AGG(jsonb_build_object('asset', ${obligationCollaterals.asset}, 'oracle', ${obligationCollaterals.oracle}, 'lltv', ${obligationCollaterals.lltv}))`.as(\n \"collaterals\",\n ),\n maturity: obligations.maturity,\n })\n .from(obligations)\n .leftJoin(\n obligationCollaterals,\n eq(obligations.obligationId, obligationCollaterals.obligationId),\n )\n .groupBy(obligations.obligationId)\n .where(\n cursor !== null && cursor !== undefined\n ? gt(obligations.obligationId, cursor)\n : sql`true`,\n )\n .orderBy(asc(obligations.obligationId))\n .limit(limit);\n\n const items: Obligation.Obligation[] = [];\n for (const row of result) {\n items.push(\n Obligation.from({\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n collaterals: row.collaterals\n .sort((a, b) => a.asset.localeCompare(b.asset))\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n ),\n maturity: row.maturity,\n }),\n );\n }\n\n const returnedItems = Array.from(items.values());\n const nextCursor =\n returnedItems.length === limit && returnedItems.length > 0\n ? result[result.length - 1]!.obligationId\n : null;\n\n return { obligations: returnedItems, nextCursor };\n },\n\n getQuotes: async (parameters: { obligationIds: Hex[] }): Promise<Quote.Quote[]> => {\n const { obligationIds } = parameters;\n if (obligationIds.length === 0) return [];\n\n const now = Time.now();\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 remaining = sql<string>`(${offers.assets} - COALESCE(${sumConsumed.consumed}, 0))`;\n\n const query = ({ side }: { side: \"buy\" | \"sell\" }) =>\n db\n .selectDistinctOn([offers.obligationId], {\n obligationId: offers.obligationId,\n rate: offers.rate,\n })\n .from(offers)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n inArray(offers.obligationId, obligationIds),\n gte(offers.expiry, now),\n gte(offers.maturity, now),\n eq(offers.buy, side === \"buy\"),\n sql`${remaining} > 0`,\n ),\n )\n .orderBy(\n offers.obligationId,\n // lower rates first for buy, higher rates first for sell\n side === \"buy\" ? asc(offers.rate) : desc(offers.rate),\n );\n\n const [bestBuys, bestSells] = await Promise.all([\n query({ side: \"buy\" }),\n query({ side: \"sell\" }),\n ]);\n\n const quotes = new Map<string, { ask: Quote.Quote[\"ask\"]; bid: Quote.Quote[\"bid\"] }>();\n\n for (const row of bestSells) {\n quotes.set(row.obligationId, {\n ask: { rate: row.rate },\n bid: { rate: 0n },\n });\n }\n\n for (const row of bestBuys) {\n const quote = quotes.get(row.obligationId);\n\n if (!quote) {\n quotes.set(row.obligationId, {\n ask: { rate: 0n },\n bid: { rate: row.rate },\n });\n continue;\n }\n\n quote.bid = { rate: row.rate };\n }\n\n return Array.from(quotes.entries())\n .map(([id, quote]) => {\n return Quote.from({ obligationId: id as Hex, ask: quote.ask, bid: quote.bid });\n })\n .sort((a, b) => {\n return a.obligationId.localeCompare(b.obligationId);\n });\n },\n\n getObligation: async (id: Hex): Promise<Obligation.Obligation | null> => {\n const result = await db\n .select({\n obligationId: obligations.obligationId,\n chainId: obligations.chainId,\n loanToken: obligations.loanToken,\n collaterals: sql<\n { asset: Address; oracle: Address; lltv: string }[]\n >`ARRAY_AGG(jsonb_build_object('asset', ${obligationCollaterals.asset}, 'oracle', ${obligationCollaterals.oracle}, 'lltv', ${obligationCollaterals.lltv}))`.as(\n \"collaterals\",\n ),\n maturity: obligations.maturity,\n })\n .from(obligations)\n .leftJoin(\n obligationCollaterals,\n eq(obligations.obligationId, obligationCollaterals.obligationId),\n )\n .where(eq(obligations.obligationId, id))\n .groupBy(obligations.obligationId)\n .limit(1);\n\n if (result.length === 0) return null;\n\n const row = result[0]!;\n return Obligation.from({\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n collaterals: row.collaterals\n .sort((a, b) => a.asset.localeCompare(b.asset))\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n ),\n maturity: row.maturity,\n });\n },\n };\n}\n\nasync function nodeJsFindMatchingOffers(\n db: PG.PG,\n params: FindMatchingOffersParams,\n): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n}> {\n const { side, obligationId, cursor, limit = 20 } = params;\n // hard cap for pagination\n // A user can request maximum 5 pages of results\n const HARD_CAP: number = 5;\n\n const nowEpochSeconds = Math.floor(Date.now() / 1000);\n const rateSortDirection: \"asc\" | \"desc\" = side === \"sell\" ? \"desc\" : \"asc\";\n\n const baseWhereClauses: ReturnType<typeof sql>[] = [];\n baseWhereClauses.push(eq(offers.buy, side === \"buy\"));\n baseWhereClauses.push(eq(offers.obligationId, obligationId));\n baseWhereClauses.push(gte(offers.expiry, nowEpochSeconds));\n baseWhereClauses.push(gte(offers.maturity, nowEpochSeconds));\n\n // Cursor decode/validation (windowing handled later to support pre-consumption)\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor && (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection)) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\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 bestOffers = db\n .selectDistinctOn(\n // bucket offers for same maker and nonce\n // allow to only keep the best offer for each bucket\n [offers.offering, offers.nonce],\n {\n hash: offers.hash,\n obligationId: offers.obligationId,\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 blockNumber: offers.blockNumber,\n },\n )\n .from(offers)\n .leftJoinLateral(sumConsumed, sql`true`)\n .where(\n and(\n and(...baseWhereClauses),\n sql`( ${offers.assets} - COALESCE(${sumConsumed.consumed}, 0) ) > 0`,\n ),\n )\n .orderBy(\n // (0) bucket offers for same maker and nonce\n offers.offering,\n offers.nonce,\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 )\n .as(\"best_offers\");\n\n const cursorTuple = parsedCursor\n ? {\n rate: BigInt(parsedCursor.rate!),\n hash: parsedCursor.hash!,\n }\n : null;\n\n type PathRow = {\n offer_hash: string;\n root_id: string;\n leaf_id: string;\n path_key: string;\n path: string[];\n pools: { ord: number; pool_id: string; amount: number }[];\n };\n\n async function* iteratePathChunks({\n maxNbOfOffers,\n batchSize,\n }: {\n maxNbOfOffers: number;\n batchSize: number;\n }): AsyncGenerator<PathRow[]> {\n for (let offset = 0; ; offset += batchSize) {\n const upperBound = Math.min(offset + batchSize, maxNbOfOffers);\n const query = sql`\n WITH RECURSIVE\n -- get offers exactly as in final bestOffers ordering\n ordered_offers AS (\n SELECT\n ranked.hash,\n ranked.rate,\n ranked.offer_order\n FROM (\n SELECT\n ${bestOffers.hash} AS hash,\n ${bestOffers.rate} AS rate,\n ROW_NUMBER() OVER (\n ORDER BY\n ${rateSortDirection === \"asc\" ? sql`(${bestOffers.rate}) ASC` : sql`(${bestOffers.rate}) DESC`},\n ${bestOffers.blockNumber} ASC,\n (${bestOffers.assets}) DESC,\n ${bestOffers.hash} ASC\n ) AS offer_order\n FROM ${bestOffers} WHERE ${\n cursorTuple\n ? sql`(${bestOffers.rate}, ${bestOffers.hash}) ${rateSortDirection === \"asc\" ? sql`>` : sql`<`} (${cursorTuple.rate}, ${cursorTuple.hash})`\n : sql`true`\n }\n ) ranked\n WHERE ranked.offer_order > ${offset}\n AND ranked.offer_order <= ${upperBound}\n ),\n\n -- roots for those offers (per-root cap not needed to list paths)\n roots AS (\n SELECT\n ${offerLiquidityPools.poolId} AS pool_id,\n ${offerLiquidityPools.offerHash} AS offer_hash,\n ${offerLiquidityPools.amount} AS amount,\n oo.offer_order AS offer_order\n FROM ${offerLiquidityPools}\n JOIN ordered_offers oo ON oo.hash = ${offerLiquidityPools.offerHash}\n ),\n\n -- walk the DAG, carrying the whole path, priority key and offer order\n walk AS (\n SELECT\n r.offer_hash,\n ARRAY[r.pool_id]::text[] AS path,\n r.pool_id AS last,\n r.amount AS root_amount,\n ''::text AS key,\n r.offer_order AS offer_order\n FROM roots r\n\n UNION ALL\n\n SELECT\n w.offer_hash,\n w.path || ${liquidityLinks.childPoolId},\n ${liquidityLinks.childPoolId},\n w.root_amount,\n w.key || LPAD(${liquidityLinks.priority}::text, 10, '0') || '/',\n w.offer_order\n FROM walk w\n JOIN ${liquidityLinks} ON ${liquidityLinks.parentPoolId} = w.last\n WHERE NOT (${liquidityLinks.childPoolId} = ANY (w.path))\n )\n\n SELECT\n w.offer_hash,\n w.path[1] AS root_id,\n w.path[array_length(w.path, 1)] AS leaf_id,\n w.key AS path_key,\n w.path,\n jsonb_agg(\n jsonb_build_object(\n 'ord', n.ord,\n 'pool_id', n.pool_id,\n 'amount', lp.amount::numeric\n ) ORDER BY n.ord\n ) AS pools\n FROM walk w\n CROSS JOIN LATERAL unnest(w.path) WITH ORDINALITY AS n(pool_id, ord)\n JOIN ${liquidityPools} lp ON lp.id = n.pool_id\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} WHERE ${liquidityLinks.parentPoolId} = w.last\n )\n GROUP BY w.offer_hash, w.key, w.path, w.offer_order\n ORDER BY w.offer_order ASC, w.key ASC;\n `;\n\n const { rows } = await db.execute<PathRow>(query);\n if (rows.length === 0) break;\n yield rows;\n }\n }\n\n const offerHashValid = new Set<string>();\n const offerHashInvalid = new Set<string>();\n\n // global state of the pools, updated once an offer is valid\n // poolId -> amount\n const globalState = new Map<string, bigint>();\n // intermediate state of the pools when processing all the paths for each offer\n // poolId -> amount\n const intermediateState = new Map<string, bigint>();\n\n for await (const pathsChunk of iteratePathChunks({\n maxNbOfOffers: limit * HARD_CAP,\n batchSize: limit,\n })) {\n if (pathsChunk.length === 0) continue;\n\n for (let i = 0; i < pathsChunk.length; i++) {\n const path = pathsChunk[i]!;\n const offerHash = path.offer_hash;\n if (offerHashInvalid.has(offerHash) || offerHashValid.has(offerHash)) continue;\n\n for (const poolId of path.path) {\n if (intermediateState.has(poolId)) continue;\n\n const poolAmount = globalState.has(poolId)\n ? globalState.get(poolId)!\n : BigInt(path.pools.find((p) => p.pool_id === poolId)?.amount || 0);\n\n intermediateState.set(poolId, poolAmount);\n }\n\n const bottleneck = Array.from(intermediateState.entries()).reduce((acc, [id, curr]) => {\n // not considering the root pool amount since it is the first value of the accumulator\n if (!path.path.includes(id) || id === path.root_id) return acc;\n return acc < curr ? acc : curr;\n }, intermediateState.get(path.root_id)!);\n\n for (const [poolId, amount] of intermediateState.entries()) {\n if (!path.path.includes(poolId)) continue;\n intermediateState.set(poolId, amount - bottleneck);\n }\n\n // A root should never be totally consumed by two offers at the same time\n const isPoolRootUsedBeforeByAnotherOffer =\n globalState.has(path.root_id) && globalState.get(path.root_id)! === 0n;\n if (isPoolRootUsedBeforeByAnotherOffer) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n // All pools of a path should have enough liquidity for the root\n const isOnePoolBelowZero = Array.from(intermediateState.values()).some(\n (amount) => amount < 0n,\n );\n if (isOnePoolBelowZero) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n // Each roots of an offer should have enough liquidity\n const isNextPathUsingSameRoot = path.root_id === pathsChunk[i + 1]?.root_id;\n const isPoolRootTotallyConsumed = intermediateState.get(path.root_id)! === 0n;\n if (!isNextPathUsingSameRoot && !isPoolRootTotallyConsumed) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n const isNextPathUsingSameOffer = offerHash === pathsChunk[i + 1]?.offer_hash;\n if (!isNextPathUsingSameOffer) {\n if (!isPoolRootTotallyConsumed) {\n offerHashInvalid.add(offerHash);\n intermediateState.clear();\n continue;\n }\n\n offerHashValid.add(offerHash);\n for (const [poolId, amount] of intermediateState.entries()) globalState.set(poolId, amount);\n intermediateState.clear();\n if (offerHashValid.size > limit) break;\n }\n }\n if (offerHashValid.size > limit) break;\n }\n\n if (offerHashValid.size === 0) return { offers: [], nextCursor: null };\n\n const collateralsLateral = db\n .select({\n collaterals: sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE(\n jsonb_agg(\n jsonb_build_object(\n 'asset', ${obligationCollaterals.asset},\n 'oracle', ${obligationCollaterals.oracle},\n 'lltv', ${obligationCollaterals.lltv}\n )\n ),\n '[]'::jsonb\n )`.as(\"collaterals\"),\n })\n .from(obligationCollaterals)\n .where(eq(obligationCollaterals.obligationId, bestOffers.obligationId))\n .as(\"collaterals_lateral\");\n\n const callbacksSum = db\n .select({\n total: sql<string>`COALESCE(SUM(${offerLiquidityPools.amount}), 0)`.as(\"roots_total\"),\n })\n .from(offerLiquidityPools)\n .where(eq(offerLiquidityPools.offerHash, bestOffers.hash))\n .as(\"roots_sum\");\n\n const results = await db\n .select({\n // base fields\n hash: sql<Hex>`${bestOffers.hash}`,\n offering: sql<Address>`${bestOffers.offering}`,\n assets: bestOffers.assets,\n consumed: bestOffers.consumed,\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: sql<Address>`${bestOffers.loanToken}`,\n callbackAddress: sql<Address>`${bestOffers.callbackAddress}`,\n callbackData: sql<Hex>`${bestOffers.callbackData}`,\n callbackGasLimit: bestOffers.callbackGasLimit,\n signature: sql<Hex | undefined>`${bestOffers.signature}`,\n blockNumber: bestOffers.blockNumber,\n // aggregated collaterals via lateral join\n collaterals: collateralsLateral.collaterals,\n })\n .from(bestOffers)\n .leftJoinLateral(collateralsLateral, sql`true`)\n .leftJoinLateral(callbacksSum, sql`true`)\n .where(\n and(\n sql`(${callbacksSum.total})::numeric >= (${bestOffers.assets})::numeric`,\n inArray(bestOffers.hash, Array.from(offerHashValid)),\n ),\n )\n .orderBy(\n rateSortDirection === \"asc\" ? asc(bestOffers.rate) : desc(bestOffers.rate), // best rate first\n asc(bestOffers.blockNumber), // earlier blockNumber first\n desc(bestOffers.assets), // higher assets first\n asc(bestOffers.hash),\n );\n\n let nextCursor: string | null = null;\n const hasNextPage = results.length > limit;\n if (hasNextPage) {\n const currentPage = parsedCursor?.page ?? 1;\n if (currentPage >= HARD_CAP) {\n // Hard cap reached\n nextCursor = null;\n } else {\n const last = results[limit - 1]!;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n page: currentPage + 1,\n });\n }\n }\n\n const data = results.slice(0, limit).map((row) =>\n Offer.from({\n offering: row.offering,\n assets: BigInt(row.assets),\n rate: row.rate,\n maturity: Maturity.from(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,\n collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress,\n data: row.callbackData,\n gasLimit: row.callbackGasLimit,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n ...(row.signature !== null ? { signature: row.signature as Hex } : undefined),\n }),\n );\n\n return { offers: data, nextCursor };\n}\n\nasync function sqlFindMatchingOffers(\n db: PG.PG,\n params: FindMatchingOffersParams,\n): Promise<{\n offers: Offer.Offer[];\n nextCursor: string | null;\n}> {\n const { side, obligationId, cursor, limit = 20 } = params;\n const HARD_CAP: number = 5; // Maximum pages allowed for rate-sorted pagination\n\n const nowEpochSeconds = Time.now();\n const isBuy = side === \"buy\";\n const rateSortDirection: \"asc\" | \"desc\" = isBuy ? \"asc\" : \"desc\";\n\n const parsedCursor = Cursor.decode(cursor);\n if (parsedCursor && (parsedCursor.sort !== \"rate\" || parsedCursor.dir !== rateSortDirection)) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n\n const cursorPredicate = parsedCursor\n ? sql`AND (rate, hash) ${sql.raw(rateSortDirection === \"asc\" ? \">\" : \"<\")} (${BigInt(parsedCursor.rate!)}, ${parsedCursor.hash!})`\n : sql``;\n\n const rateDir = sql.raw(rateSortDirection === \"asc\" ? \"ASC\" : \"DESC\"); // Side-aware rate ordering\n\n /**\n * The query below resolves effective liquidity per offer and simulates\n * sequential consumption to ensure returned offers remain takable.\n */\n const raw = await db.execute<{\n hash: string;\n offering: string;\n assets: string;\n consumed: string;\n rate: bigint;\n maturity: number;\n expiry: number;\n start: number;\n nonce: bigint;\n buy: boolean;\n chainId: bigint;\n loanToken: string;\n callbackAddress: string;\n callbackData: string;\n callbackGasLimit: bigint;\n signature: string | null;\n blockNumber: number;\n collaterals: Array<{ asset: string; oracle: string; lltv: string }>;\n }>(sql`\n WITH RECURSIVE\n\n -- ================================================================\n -- CANDIDATE SELECTION\n -- Filtering, deduplication, deterministic ordering\n -- ================================================================\n\n -- Precompute total consumed per (offering, nonce, chain) once\n consumed_totals AS (\n SELECT c.offering, c.nonce, c.chain_id, SUM(c.consumed)::numeric AS total\n FROM ${consumedTable} c\n GROUP BY c.offering, c.nonce, c.chain_id\n ),\n\n -- Apply user filters (side, chain, maturity/expiry, rate, loanToken, creator, exact collaterals).\n -- Join consumed totals once and derive remaining (assets - consumed) as numeric.\n -- Exclude expired/matured.\n base AS (\n SELECT\n o.*,\n COALESCE(ct.total, 0)::numeric AS consumed,\n (o.assets - COALESCE(ct.total, 0))::numeric AS remaining\n FROM ${offers} o\n LEFT JOIN consumed_totals ct\n ON ct.offering = o.offering AND ct.nonce = o.nonce AND ct.chain_id = o.chain_id\n WHERE o.buy = ${isBuy}\n AND o.obligation_id = ${obligationId}\n AND o.expiry >= ${nowEpochSeconds}\n AND o.maturity >= ${nowEpochSeconds}\n ),\n\n -- Deduplicate by (offering, nonce), keeping the best one:\n best_offers AS (\n SELECT DISTINCT ON (offering, nonce)\n hash, obligation_id, offering, assets, consumed, rate, maturity, expiry, start, nonce, buy, chain_id,\n loan_token, callback_address, callback_data, callback_gas_limit, signature, created_at, block_number\n FROM base\n WHERE remaining > 0\n ORDER BY offering, nonce,\n CASE WHEN buy THEN rate ELSE -rate END,\n maturity DESC\n ),\n\n -- Establish deterministic execution order and apply cursor pagination.\n -- ROW_NUMBER over (rate ASC/DESC, created_at ASC, assets DESC, hash ASC).\n -- Cursor resumes from (rate, hash).\n candidates AS (\n SELECT *\n FROM (\n SELECT *, ROW_NUMBER() OVER (ORDER BY rate ${rateDir}, created_at ASC, assets DESC, hash ASC) AS ord\n FROM best_offers\n WHERE 1=1 ${cursorPredicate}\n ) ranked\n WHERE ranked.ord <= ${limit * HARD_CAP}\n ),\n\n -- Entry requirements at root pools: required amount and pool capacity.\n offer_requirements AS (\n SELECT olp.offer_hash, olp.pool_id AS node_id,\n (olp.amount)::numeric AS required_amount,\n (lp.amount)::numeric AS pool_amount\n FROM ${offerLiquidityPools} olp\n JOIN candidates c ON c.hash = olp.offer_hash\n JOIN ${liquidityPools} lp ON lp.id = olp.pool_id\n ),\n\n -- ================================================================\n -- CROSS-VALIDATION\n -- Simulate sequential offer execution to prevent conflicts over shared liquidity.\n --\n -- Strategy: For each candidate offer (in priority order), compute what it would\n -- consume from each pool. Track cumulative consumption so later offers see\n -- reduced availability. Finally, verify each offer has sufficient liquidity.\n -- ================================================================\n\n -- STEP 1: Build top-down LiquidityPaths with path_bottleneck tracking\n liquidity_paths AS (\n SELECT er.offer_hash, er.node_id AS current_node_id, er.node_id AS root_node_id,\n (lp.amount)::numeric AS path_bottleneck, 0::bigint AS traversal_order,\n ARRAY[er.node_id]::varchar[] AS liquidity_path\n FROM offer_requirements er\n JOIN ${liquidityPools} lp ON lp.id = er.node_id\n UNION ALL\n SELECT pf.offer_hash, e.child_pool_id AS current_node_id, pf.root_node_id,\n LEAST(pf.path_bottleneck, (cp.amount)::numeric) AS path_bottleneck,\n (pf.traversal_order * 1000 + e.priority)::bigint AS traversal_order,\n pf.liquidity_path || e.child_pool_id\n FROM liquidity_paths pf\n JOIN ${liquidityLinks} e ON e.parent_pool_id = pf.current_node_id\n JOIN ${liquidityPools} cp ON cp.id = e.child_pool_id\n ),\n\n -- Nodes present in the reachable subgraph\n graph_nodes AS (\n SELECT DISTINCT offer_hash, current_node_id AS node_id\n FROM liquidity_paths\n ),\n\n -- Leaves from top-down traversal\n leaf_paths AS (\n SELECT pf.*\n FROM liquidity_paths pf\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l WHERE l.parent_pool_id = pf.current_node_id\n )\n ),\n\n -- Effective liquidity per node = sum of leaf path minima that include the node\n node_effective_liquidity AS (\n SELECT lp.offer_hash, n.node_id, SUM(lp.path_bottleneck) AS effective_amount\n FROM leaf_paths lp\n CROSS JOIN LATERAL unnest(lp.liquidity_path) AS n(node_id)\n GROUP BY lp.offer_hash, n.node_id\n ),\n\n -- STEP 2: Allocate per-node path bottlenecks\n liquidity_path_node_consumption AS (\n SELECT\n pf.offer_hash,\n unnest(pf.liquidity_path) AS node_id,\n GREATEST(\n LEAST(\n pf.path_bottleneck,\n (ep.amount)::numeric - COALESCE(\n SUM(pf.path_bottleneck) OVER (\n PARTITION BY pf.offer_hash, pf.root_node_id\n ORDER BY pf.traversal_order\n ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING\n ),\n 0\n )\n ),\n 0\n ) AS consumed\n FROM liquidity_paths pf\n JOIN ${liquidityPools} ep ON ep.id = pf.root_node_id\n WHERE NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l WHERE l.parent_pool_id = pf.current_node_id\n )\n ),\n\n node_effective_consumption AS (\n SELECT offer_hash, node_id, SUM(consumed) AS effective_amount\n FROM liquidity_path_node_consumption\n GROUP BY offer_hash, node_id\n ),\n\n selected_offers AS (\n SELECT 0::bigint AS ord, ARRAY[]::varchar[] AS selected\n UNION ALL\n -- Step: consider next candidate and include it iff all entry nodes\n -- remain satisfiable given prior consumption from 'selected'\n SELECT c.ord,\n CASE WHEN NOT EXISTS (\n SELECT 1\n FROM offer_requirements er\n LEFT JOIN node_effective_liquidity el_entry\n ON el_entry.offer_hash = er.offer_hash AND el_entry.node_id = er.node_id\n LEFT JOIN ${liquidityPools} ep ON ep.id = er.node_id\n WHERE er.offer_hash = c.hash\n AND er.pool_amount > (\n -- Available at entry node after prior selected consumption\n CASE\n -- If no children in the current offer graph, use node effective minus prior at entry\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} e\n WHERE e.parent_pool_id = er.node_id\n AND EXISTS (\n SELECT 1 FROM graph_nodes g2\n WHERE g2.offer_hash = er.offer_hash AND g2.node_id = e.child_pool_id\n )\n ) THEN GREATEST(\n COALESCE(el_entry.effective_amount, 0) - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc\n WHERE lpc.node_id = er.node_id AND lpc.offer_hash = ANY(selected)\n ), 0),\n 0\n )\n -- Otherwise, sum priority-capped child availability after prior\n ELSE COALESCE((\n SELECT SUM(LEAST(\n -- child's remaining capacity after prior selected consumption\n GREATEST(\n CASE\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l2\n JOIN graph_nodes g2 ON g2.offer_hash = er.offer_hash AND g2.node_id = l2.child_pool_id\n WHERE l2.parent_pool_id = e.child_pool_id\n )\n THEN (cp.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc2\n WHERE lpc2.node_id = e.child_pool_id AND lpc2.offer_hash = ANY(selected)\n ), 0)\n ELSE LEAST(\n (cp.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc2\n WHERE lpc2.node_id = e.child_pool_id AND lpc2.offer_hash = ANY(selected)\n ), 0),\n COALESCE(el_child_consumption.effective_amount, (cp.amount)::numeric)\n )\n END,\n 0\n ),\n -- root capacity remaining after allocating higher-priority children\n GREATEST(\n LEAST(COALESCE(el_entry.effective_amount, (ep.amount)::numeric), (ep.amount)::numeric)\n - COALESCE((\n SELECT SUM(\n GREATEST(\n CASE\n WHEN NOT EXISTS (\n SELECT 1 FROM ${liquidityLinks} l3\n JOIN graph_nodes g3 ON g3.offer_hash = er.offer_hash AND g3.node_id = l3.child_pool_id\n WHERE l3.parent_pool_id = e_prev.child_pool_id\n )\n THEN (cp_prev.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc3\n WHERE lpc3.node_id = e_prev.child_pool_id AND lpc3.offer_hash = ANY(selected)\n ), 0)\n ELSE LEAST(\n (cp_prev.amount)::numeric - COALESCE((\n SELECT SUM(consumed)\n FROM liquidity_path_node_consumption lpc3\n WHERE lpc3.node_id = e_prev.child_pool_id AND lpc3.offer_hash = ANY(selected)\n ), 0),\n COALESCE(el_child_prev_consumption.effective_amount, (cp_prev.amount)::numeric)\n )\n END,\n 0\n )\n )\n FROM ${liquidityLinks} e_prev\n JOIN ${liquidityPools} cp_prev ON cp_prev.id = e_prev.child_pool_id\n LEFT JOIN node_effective_liquidity el_child_prev\n ON el_child_prev.offer_hash = er.offer_hash AND el_child_prev.node_id = e_prev.child_pool_id\n LEFT JOIN node_effective_consumption el_child_prev_consumption\n ON el_child_prev_consumption.offer_hash = er.offer_hash AND el_child_prev_consumption.node_id = e_prev.child_pool_id\n WHERE e_prev.parent_pool_id = er.node_id\n AND (e_prev.priority < e.priority OR (e_prev.priority = e.priority AND e_prev.child_pool_id < e.child_pool_id))\n AND EXISTS (\n SELECT 1 FROM graph_nodes g4\n WHERE g4.offer_hash = er.offer_hash AND g4.node_id = e_prev.child_pool_id\n )\n ), 0\n ),\n 0\n )\n ))\n FROM ${liquidityLinks} e\n JOIN ${liquidityPools} cp ON cp.id = e.child_pool_id\n LEFT JOIN node_effective_liquidity el_child\n ON el_child.offer_hash = er.offer_hash AND el_child.node_id = e.child_pool_id\n LEFT JOIN node_effective_consumption el_child_consumption\n ON el_child_consumption.offer_hash = er.offer_hash AND el_child_consumption.node_id = e.child_pool_id\n WHERE e.parent_pool_id = er.node_id\n AND EXISTS (\n SELECT 1 FROM graph_nodes g4\n WHERE g4.offer_hash = er.offer_hash AND g4.node_id = e.child_pool_id\n )\n ), 0)\n END\n )\n ) THEN selected || c.hash ELSE selected END AS selected\n FROM selected_offers so\n JOIN candidates c ON c.ord = so.ord + 1\n ),\n\n selected_final AS (\n SELECT unnest(selected) AS offer_hash\n FROM selected_offers\n WHERE ord = (SELECT MAX(ord) FROM selected_offers)\n ),\n\n final AS (\n SELECT c.hash, c.obligation_id, c.offering, c.assets, c.consumed, c.rate, c.maturity, c.expiry, c.start,\n c.nonce, c.buy, c.chain_id AS \"chainId\", c.loan_token AS \"loanToken\",\n c.callback_address AS \"callbackAddress\", c.callback_data AS \"callbackData\",\n c.callback_gas_limit AS \"callbackGasLimit\", c.signature,\n c.created_at AS \"createdAt\", c.block_number AS \"blockNumber\"\n FROM candidates c\n JOIN selected_final sf ON sf.offer_hash = c.hash\n ORDER BY c.rate ${rateDir}, c.created_at ASC, c.assets DESC, c.hash ASC\n LIMIT ${limit + 1}\n )\n\n -- Attach collateral details and enforce assets <= sum(roots)\n SELECT\n fin.hash, fin.offering, fin.assets, fin.consumed, fin.rate, fin.maturity,\n fin.expiry, fin.start, fin.nonce, fin.buy, fin.\"chainId\", fin.\"loanToken\",\n fin.\"callbackAddress\", fin.\"callbackData\", fin.\"callbackGasLimit\",\n fin.signature, fin.\"createdAt\", fin.\"blockNumber\",\n ${sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE((\n SELECT jsonb_agg(jsonb_build_object('asset', oc.asset, 'oracle', oc.oracle, 'lltv', oc.lltv))\n FROM ${obligationCollaterals} oc WHERE oc.obligation_id = fin.obligation_id\n ), '[]'::jsonb)`} AS collaterals\n FROM final fin\n LEFT JOIN LATERAL (\n SELECT COALESCE(SUM(olp.amount), 0)::numeric AS roots_total\n FROM ${offerLiquidityPools} olp\n WHERE olp.offer_hash = fin.hash\n ) roots_sum ON true\n WHERE roots_sum.roots_total >= fin.assets\n `);\n\n const results = raw.rows;\n\n let nextCursor: string | null = null;\n const hasNextPage = results.length > limit;\n if (hasNextPage) {\n const currentPage = parsedCursor?.page ?? 1;\n if (currentPage >= HARD_CAP) {\n // Hard cap reached\n nextCursor = null;\n } else {\n const last = results[limit - 1]!;\n nextCursor = Cursor.encode({\n sort: \"rate\",\n dir: rateSortDirection,\n hash: last.hash,\n rate: last.rate.toString(),\n page: currentPage + 1,\n });\n }\n }\n\n const data = results.slice(0, limit).map((row) =>\n Offer.from({\n offering: row.offering as Address,\n assets: BigInt(row.assets),\n rate: row.rate,\n maturity: Maturity.from(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 collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress as Address,\n data: row.callbackData as Hex,\n gasLimit: row.callbackGasLimit,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n ...(row.signature !== null ? { signature: row.signature as Hex } : undefined),\n }),\n );\n\n return { offers: data, nextCursor };\n}\n","import { Base64 } from \"js-base64\";\n// ---------- Cursor‑pagination helpers ----------\nexport type Cursor = {\n sort: \"rate\" | \"maturity\" | \"expiry\" | \"amount\";\n dir: \"asc\" | \"desc\";\n rate?: string; // bigint rendered to string\n maturity?: number;\n expiry?: number;\n assets?: string; // bigint rendered to string\n hash: string;\n // Optional page number to support client-side hard caps on depth\n page?: number;\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 if (c.page !== undefined) {\n if (typeof c.page !== \"number\" || !Number.isInteger(c.page) || c.page < 1) {\n throw new Error(\"Invalid page: must be a positive integer\");\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 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\";\nimport { VERSION } from \"./drizzle/VERSION.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\", VERSION)\n : path.join(__dirname, \"drizzle\", VERSION);\n\n await pg.execute(`create schema if not exists \"${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 \"${VERSION}\" cascade`);\n await pg.execute(`create schema \"${VERSION}\"`);\n await pg.execute(\"drop schema if exists drizzle cascade\");\n}\n","import * as Collector from \"#collectors/index.ts\";\nimport type { Chain } from \"#core\";\nimport type { ChainStore, CollectorStore } from \"#database/index.ts\";\n\nexport type CollectorHealthStatus = \"live\" | \"lagging\" | \"unknown\";\nexport type RouterStatus = \"live\" | \"syncing\";\n\nexport type CollectorHealth = {\n name: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number | null;\n updatedAt: string | null;\n lag: number | null;\n status: CollectorHealthStatus;\n};\n\nexport type ChainHealth = {\n chainId: Chain.Id;\n blockNumber: number;\n epoch: string;\n updatedAt: string;\n};\n\nexport type HealthService = {\n getStatus: () => Promise<RouterStatus>;\n getCollectors: () => Promise<CollectorHealth[]>;\n getChains: () => Promise<ChainHealth[]>;\n};\n\nexport type HealthServiceParameters = {\n collectorStore: CollectorStore.CollectorStore;\n chainStore: ChainStore.ChainStore;\n /** Maximum number of blocks a collector can lag behind its chain before being considered lagging. */\n maxAllowedLag?: number;\n};\n\nconst DEFAULT_MAX_ALLOWED_LAG = 5;\n\ntype Snapshot = {\n status: RouterStatus;\n collectors: CollectorHealth[];\n chains: ChainHealth[];\n};\n\n/**\n * Create a health service that exposes collector and chain block numbers.\n */\nexport function create(parameters: HealthServiceParameters): HealthService {\n const { collectorStore, chainStore, maxAllowedLag = DEFAULT_MAX_ALLOWED_LAG } = parameters;\n\n const loadSnapshot = async (): Promise<Snapshot> => {\n const [collectorRows, chainRows] = await Promise.all([\n collectorStore.getBlockNumbers(),\n chainStore.getBlockNumbers(),\n ]);\n\n const chainById = new Map<bigint, { blockNumber: number; epoch: bigint; updatedAt: Date }>();\n for (const chain of chainRows) {\n chainById.set(chain.chainId, {\n blockNumber: chain.blockNumber,\n epoch: chain.epoch,\n updatedAt: chain.updatedAt,\n });\n }\n\n const collectorKey = (chainId: bigint, name: Collector.Name) => `${chainId}:${name}`;\n const collectorsByKey = new Map<\n string,\n {\n name: Collector.Name;\n chainId: Chain.Id;\n blockNumber: number;\n updatedAt: Date;\n }\n >();\n\n for (const row of collectorRows) {\n collectorsByKey.set(collectorKey(row.chainId, row.collectorName), {\n name: row.collectorName,\n chainId: row.chainId,\n blockNumber: row.blockNumber,\n updatedAt: row.updatedAt,\n });\n }\n\n const chainIds = new Set<bigint>();\n for (const chain of chainRows) chainIds.add(chain.chainId);\n for (const row of collectorRows) chainIds.add(row.chainId);\n\n const collectors: CollectorHealth[] = Array.from(chainIds)\n .sort((a, b) => (a - b > 0 ? 1 : -1))\n .flatMap((chainId) =>\n [...Collector.names].sort().map((name) => {\n const row = collectorsByKey.get(collectorKey(chainId, name));\n const chain = chainById.get(chainId);\n\n const blockNumber = row?.blockNumber ?? null;\n const chainBlockNumber = chain?.blockNumber ?? null;\n const lag =\n blockNumber !== null && chainBlockNumber !== null\n ? Math.max(chainBlockNumber - blockNumber, 0)\n : null;\n\n let status: CollectorHealthStatus = \"unknown\";\n if (lag !== null) {\n status = lag <= maxAllowedLag ? \"live\" : \"lagging\";\n } else if (chainBlockNumber !== null) {\n status = \"lagging\";\n }\n\n return {\n name,\n chainId: chainId as Chain.Id,\n blockNumber,\n updatedAt: row ? row.updatedAt.toISOString() : null,\n lag,\n status,\n } satisfies CollectorHealth;\n }),\n );\n\n const chains: ChainHealth[] = chainRows\n .map((chain) => ({\n chainId: chain.chainId,\n blockNumber: chain.blockNumber,\n epoch: chain.epoch.toString(),\n updatedAt: chain.updatedAt.toISOString(),\n }))\n .sort((a, b) => (a.chainId - b.chainId > 0 ? 1 : -1));\n\n const status: RouterStatus =\n collectors.length > 0 && collectors.every((collector) => collector.status === \"live\")\n ? \"live\"\n : \"syncing\";\n\n return {\n status,\n collectors,\n chains,\n };\n };\n\n return {\n async getStatus(): Promise<RouterStatus> {\n const snapshot = await loadSnapshot();\n return snapshot.status;\n },\n\n async getCollectors(): Promise<CollectorHealth[]> {\n const snapshot = await loadSnapshot();\n return snapshot.collectors;\n },\n\n async getChains(): Promise<ChainHealth[]> {\n const snapshot = await loadSnapshot();\n return snapshot.chains;\n },\n };\n}\n","import { and, asc, desc, eq, gt, gte, inArray, sql } from \"drizzle-orm\";\nimport { type Address, type Hex, isHex } from \"viem\";\nimport {\n type Chain,\n Collateral,\n type Compute,\n LLTV,\n Maturity,\n Obligation,\n Offer,\n Quote,\n} from \"#core\";\nimport { Logger } from \"#services/index.ts\";\nimport { Time } from \"#utils/index.ts\";\nimport {\n consumedEvents as consumedEventsTable,\n groups as groupsTable,\n obligationCollateralsV2 as obligationCollateralsTable,\n obligations as obligationsTable,\n offerStatus as offerStatusTable,\n offersV2 as offersTable,\n oracles as oraclesTable,\n} from \"./drizzle/schema.ts\";\nimport type * as PG from \"./PG.ts\";\n\nexport type OfferStoreV2 = {\n /** Create multiple offer. */\n create: (offers: Offer.Offer[]) => Promise<Hex[]>;\n\n /** Delete multiple offers by hashes or block number greater than or equal to the given value.\n * @returns the number of offers deleted.\n */\n delete: (parameters: { hashes: Hex[] } | { blockNumberGte: number }) => Promise<number>;\n\n /** Get all offers. */\n get: (\n parameters?: PaginationParams,\n ) => Promise<{ offers: Offer.Offer[]; nextCursor: string | null }>;\n\n /** Get all offers for a given obligation side. */\n getBook: (\n parameters: GetBookParams,\n ) => Promise<{ offers: Offer.Offer[]; nextCursor: string | null }>;\n\n /** Create a new consumed event for a set of offers with the same chainId, offering, and nonce. */\n createConsumedEvent: (parameters: {\n eventId: string;\n chainId: Chain.Id;\n offering: Address;\n group: bigint;\n amount: bigint;\n blockNumber: number;\n }) => Promise<void>;\n\n /** Delete multiple consumed events by block number greater than or equal to the given value. */\n deleteConsumedEvents: (blockNumberGte: number) => Promise<number>;\n\n /** Get obligations */\n getObligations: (parameters?: { ids?: Hex[]; cursor?: string; limit?: number }) => Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }>;\n\n /** Get quotes for given obligations. */\n getQuotes: (parameters: { obligationIds: Hex[] }) => Promise<Quote.Quote[]>;\n};\n\nexport const DEFAULT_LIMIT = 100;\nexport type PaginationParams = {\n /** Cursor string returned by a previous call, for pagination */\n cursor?: string;\n /** Page size; defaults to {@link DEFAULT_LIMIT} */\n limit?: number;\n};\n\nexport type GetBookParams = Compute<\n {\n /** The side of the offer. */\n side: \"buy\" | \"sell\";\n /** The obligationId of the offer. */\n obligationId: Hex;\n } & PaginationParams\n>;\n\nexport function create(config: { db: PG.PG }): OfferStoreV2 {\n const db = config.db;\n const logger = Logger.getLogger();\n\n return {\n create: async (offers: Offer.Offer[]): Promise<Hex[]> => {\n return await db.transaction(async (tx) => {\n const hashes: Hex[] = [];\n\n for (const offer of offers) {\n // todo: remove gas limit from offer type\n const hash = Offer.hash({\n ...offer,\n callback: { ...offer.callback, gasLimit: 0n },\n }).toLowerCase();\n\n const obligationId = Offer.obligationId(offer);\n await tx\n .insert(obligationsTable)\n .values({\n obligationId,\n chainId: offer.chainId,\n loanToken: offer.loanToken.toLowerCase(),\n maturity: offer.maturity,\n })\n .onConflictDoNothing();\n\n await tx\n .insert(groupsTable)\n .values({\n chainId: offer.chainId,\n maker: offer.offering.toLowerCase(),\n group: offer.nonce.toString(), // TODO: replace with group\n consumed: \"0\",\n blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing();\n\n const result = await tx\n .insert(offersTable)\n .values({\n hash,\n obligationId,\n assets: offer.assets.toString(),\n rate: offer.rate.toString(),\n maturity: offer.maturity,\n expiry: offer.expiry,\n start: offer.start,\n groupChainId: offer.chainId,\n groupMaker: offer.offering.toLowerCase(),\n group: offer.nonce.toString(), // TODO: replace with group\n nonce: offer.nonce.toString(),\n buy: offer.buy,\n callbackAddress: offer.callback.address.toLowerCase(),\n callbackData: offer.callback.data,\n blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing()\n .returning();\n\n if (result.length === 0) continue;\n\n for (const collateral of offer.collaterals) {\n await tx\n .insert(oraclesTable)\n .values({\n chainId: offer.chainId,\n address: collateral.oracle.toLowerCase(),\n blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing();\n\n await tx\n .insert(obligationCollateralsTable)\n .values({\n obligationId,\n asset: collateral.asset.toLowerCase(),\n oracleChainId: offer.chainId,\n oracleAddress: collateral.oracle.toLowerCase(),\n lltv: collateral.lltv,\n blockNumber: offer.blockNumber,\n })\n .onConflictDoNothing();\n }\n hashes.push(hash as Hex);\n }\n\n return hashes;\n });\n },\n\n get: async (\n parameters?: PaginationParams,\n ): Promise<{ offers: Offer.Offer[]; nextCursor: string | null }> => {\n const limit = parameters?.limit ?? DEFAULT_LIMIT;\n const cursor = parameters?.cursor;\n\n if (cursor !== null && cursor !== undefined) {\n if (!cursor.startsWith(\"0x\") || cursor.length !== 66) {\n throw new Error(\"Invalid cursor format\");\n }\n }\n\n const collateralsLateral = db\n .select({\n collaterals: sql<Array<{ asset: string; oracle: string; lltv: string }>>`COALESCE(\n jsonb_agg(\n jsonb_build_object(\n 'asset', ${obligationCollateralsTable.asset},\n 'oracle', ${oraclesTable.address},\n 'lltv', ${obligationCollateralsTable.lltv}\n )\n ),\n '[]'::jsonb\n )`.as(\"collaterals\"),\n })\n .from(obligationCollateralsTable)\n .innerJoin(\n oraclesTable,\n sql`${obligationCollateralsTable.oracleChainId} = ${oraclesTable.chainId}\n AND ${obligationCollateralsTable.oracleAddress} = ${oraclesTable.address}`,\n )\n .where(eq(obligationCollateralsTable.obligationId, offersTable.obligationId))\n .as(\"collaterals_lateral\");\n\n const results = await db\n .select({\n hash: offersTable.hash,\n maker: offersTable.groupMaker,\n assets: offersTable.assets,\n consumed: groupsTable.consumed,\n rate: offersTable.rate,\n maturity: offersTable.maturity,\n expiry: offersTable.expiry,\n start: offersTable.start,\n nonce: offersTable.nonce,\n buy: offersTable.buy,\n chainId: obligationsTable.chainId,\n loanToken: obligationsTable.loanToken,\n callbackAddress: offersTable.callbackAddress,\n callbackData: offersTable.callbackData,\n collaterals: collateralsLateral.collaterals,\n blockNumber: offersTable.blockNumber,\n })\n .from(offersTable)\n .innerJoin(obligationsTable, eq(offersTable.obligationId, obligationsTable.obligationId))\n .innerJoin(\n groupsTable,\n and(\n eq(offersTable.groupChainId, groupsTable.chainId),\n eq(offersTable.groupMaker, groupsTable.maker),\n eq(offersTable.group, groupsTable.group),\n ),\n )\n .innerJoinLateral(collateralsLateral, sql`true`)\n .where(cursor !== null && cursor !== undefined ? gt(offersTable.hash, cursor) : sql`true`)\n .orderBy(asc(offersTable.hash))\n .limit(limit);\n\n const offers: Offer.Offer[] = results.map((row) =>\n Offer.from({\n offering: row.maker as Address,\n assets: BigInt(row.assets),\n rate: BigInt(row.rate),\n maturity: Maturity.from(row.maturity),\n expiry: row.expiry,\n start: row.start,\n nonce: BigInt(row.nonce),\n buy: row.buy,\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callbackAddress as Address,\n data: row.callbackData as Hex,\n gasLimit: 0n,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.blockNumber,\n }),\n );\n\n const nextCursor = offers.length === limit ? offers[offers.length - 1]!.hash : null;\n\n return { offers, nextCursor };\n },\n\n getBook: async (\n parameters: GetBookParams,\n ): Promise<{ offers: Offer.Offer[]; nextCursor: string | null }> => {\n const { side, obligationId, cursor: cursorString, limit } = parameters;\n\n const now = Math.floor(Date.now() / 1000);\n const rateSortDirection: \"asc\" | \"desc\" = side === \"sell\" ? \"desc\" : \"asc\";\n\n type Cursor = {\n sort: \"rate\";\n dir: \"asc\" | \"desc\";\n rate: string;\n blockNumber: number;\n assets: string;\n hash: string;\n };\n\n let cursor: Cursor | null = null;\n if (cursorString !== null && cursorString !== undefined) {\n try {\n const v = JSON.parse(Buffer.from(cursorString, \"base64url\").toString(\"utf8\"));\n if (\n v?.sort === \"rate\" &&\n (v?.dir === \"asc\" || v?.dir === \"desc\") &&\n isHex(v?.hash) &&\n v?.rate &&\n v?.blockNumber &&\n v?.assets\n )\n cursor = v as Cursor;\n else throw new Error(\"Invalid cursor\");\n } catch {\n logger.error({ service: \"offer_store\", msg: \"Invalid cursor\", cursor: cursorString });\n return { offers: [], nextCursor: null };\n }\n }\n\n if (cursor && (cursor.sort !== \"rate\" || cursor.dir !== rateSortDirection)) {\n throw new Error(\"Cursor does not match the current sort parameters\");\n }\n\n const raw = await db.execute<{\n hash: Hex;\n obligation_id: Hex;\n group_maker: Address;\n assets: string;\n consumed: string;\n rate: string;\n maturity: number;\n expiry: number;\n start: number;\n nonce: bigint;\n group_group: Hex;\n buy: boolean;\n chain_id: bigint;\n loan_token: Address;\n callback_address: Address;\n callback_data: Hex;\n block_number: number;\n collaterals: Array<{ asset: Address; oracle: Address; lltv: string }>;\n }>(sql`\n WITH collats AS MATERIALIZED (\n SELECT oc.obligation_id,\n COALESCE(jsonb_agg(jsonb_build_object(\n 'asset', oc.asset,\n 'oracle', oracle.address,\n 'lltv', oc.lltv\n )), '[]'::jsonb) AS collaterals\n FROM ${obligationCollateralsTable} oc\n JOIN ${oraclesTable} oracle\n ON oracle.chain_id = oc.oracle_chain_id\n AND oracle.address = oc.oracle_address\n WHERE oc.obligation_id = ${obligationId}\n GROUP BY oc.obligation_id\n ),\n winners AS (\n SELECT DISTINCT ON (o.group_chain_id, o.group_maker, o.\"group_group\")\n o.*\n FROM ${offersTable} o\n JOIN LATERAL (\n SELECT 1\n FROM ${offerStatusTable} s\n WHERE s.status_id = 1\n AND s.offer_hash = o.hash\n LIMIT 1\n ) ok ON TRUE\n WHERE o.obligation_id = ${obligationId}\n AND o.buy = ${side === \"buy\"}\n AND o.expiry > ${now}\n AND o.maturity > ${now}\n ORDER BY\n o.group_chain_id, o.group_maker, o.\"group_group\",\n o.rate ${rateSortDirection === \"asc\" ? sql`ASC` : sql`DESC`}, o.block_number ASC, o.assets DESC, o.hash ASC\n ),\n enriched AS (\n SELECT\n w.*,\n g.consumed, g.chain_id, obl.loan_token,\n /* build normalized ascend-only keys for keyset */\n CASE WHEN ${rateSortDirection === \"asc\" ? sql`TRUE` : sql`FALSE`}\n THEN w.rate ELSE -w.rate END AS rate_norm,\n w.block_number AS block_norm,\n -w.assets AS assets_norm,\n w.hash AS hash_norm\n FROM winners w\n JOIN ${groupsTable} g\n ON g.chain_id = w.group_chain_id\n AND g.maker = w.group_maker\n AND g.\"group\" = w.\"group_group\"\n JOIN ${obligationsTable} obl\n ON obl.obligation_id = w.obligation_id\n WHERE g.consumed < w.assets\n ),\n paged AS (\n SELECT e.*\n FROM enriched e\n ${\n cursor != null &&\n cursor.rate != null &&\n cursor.assets != null &&\n cursor.blockNumber != null &&\n cursor.hash != null\n ? sql`\n WHERE\n (e.rate_norm, e.block_norm, e.assets_norm, e.hash_norm)\n > (\n CASE WHEN ${rateSortDirection === \"asc\" ? sql`TRUE` : sql`FALSE`}\n THEN ${cursor.rate}::numeric ELSE -${cursor.rate}::numeric END,\n ${cursor.blockNumber},\n -${cursor.assets}::numeric,\n ${cursor.hash}\n )`\n : sql``\n }\n ORDER BY e.rate ${rateSortDirection === \"asc\" ? sql`ASC` : sql`DESC`}, e.block_number ASC, e.assets DESC, e.hash ASC\n LIMIT ${limit ?? DEFAULT_LIMIT}\n )\n SELECT\n paged.*, c.collaterals\n FROM paged\n LEFT JOIN collats c ON c.obligation_id = paged.obligation_id\n ORDER BY\n paged.rate ${rateSortDirection === \"asc\" ? sql`ASC` : sql`DESC`},\n paged.block_number ASC,\n paged.assets DESC,\n paged.hash ASC;\n `);\n\n let nextCursor: string | null = null;\n const hasNextPage = raw.rows.length === (limit ?? DEFAULT_LIMIT);\n if (hasNextPage) {\n const last = raw.rows[raw.rows.length - 1]!;\n nextCursor = Buffer.from(\n JSON.stringify({\n sort: \"rate\",\n dir: rateSortDirection,\n rate: last.rate,\n blockNumber: last.block_number,\n assets: last.assets,\n hash: last.hash,\n }),\n ).toString(\"base64url\");\n }\n\n const offers: Offer.Offer[] = raw.rows.map((row) =>\n Offer.from({\n offering: row.group_maker,\n assets: BigInt(row.assets),\n rate: BigInt(row.rate),\n maturity: Maturity.from(row.maturity),\n expiry: row.expiry,\n start: row.start,\n nonce: BigInt(row.nonce),\n buy: row.buy,\n chainId: row.chain_id,\n loanToken: row.loan_token,\n collaterals: row.collaterals\n .map((c) =>\n Collateral.from({\n asset: c.asset,\n oracle: c.oracle,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n )\n .sort((a, b) => a.asset.toLowerCase().localeCompare(b.asset.toLowerCase())),\n callback: {\n address: row.callback_address,\n data: row.callback_data,\n gasLimit: 0n,\n },\n consumed: BigInt(row.consumed),\n blockNumber: row.block_number,\n }),\n );\n\n return { offers, nextCursor };\n },\n\n delete: async (parameters: { hashes: Hex[] } | { blockNumberGte: number }): Promise<number> => {\n if (\"hashes\" in parameters) {\n const { hashes } = parameters;\n if (hashes.length === 0) return 0;\n const normalizedHashes = hashes.map((hash) => hash.toLowerCase());\n const result = await db\n .delete(offersTable)\n .where(inArray(offersTable.hash, normalizedHashes));\n return (result as { affectedRows: number }).affectedRows;\n }\n\n if (\"blockNumberGte\" in parameters) {\n const { blockNumberGte } = parameters;\n const result = await db\n .delete(offersTable)\n .where(sql`${offersTable.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\n }\n\n throw new Error(\"Invalid parameters\");\n },\n\n createConsumedEvent: async (parameters: {\n eventId: string;\n chainId: bigint;\n offering: Address;\n group: bigint;\n amount: bigint;\n blockNumber: number;\n }): Promise<void> => {\n await db\n .insert(consumedEventsTable)\n .values({\n eventId: parameters.eventId,\n chainId: parameters.chainId,\n maker: parameters.offering.toLowerCase(),\n group: parameters.group.toString(),\n amount: parameters.amount.toString(),\n blockNumber: parameters.blockNumber,\n })\n .onConflictDoNothing();\n },\n\n deleteConsumedEvents: async (blockNumberGte: number): Promise<number> => {\n const result = await db\n .delete(consumedEventsTable)\n .where(sql`${consumedEventsTable.blockNumber} >= ${blockNumberGte}`);\n return (result as { affectedRows: number }).affectedRows;\n },\n\n getObligations: async (\n parameters?: { ids?: Hex[] } & PaginationParams,\n ): Promise<{\n obligations: Obligation.Obligation[];\n nextCursor: string | null;\n }> => {\n const { ids, cursor, limit = DEFAULT_LIMIT } = parameters ?? {};\n\n const result = await db\n .select({\n obligationId: obligationsTable.obligationId,\n chainId: obligationsTable.chainId,\n loanToken: obligationsTable.loanToken,\n collaterals: sql<\n { asset: Address; oracle: Address; lltv: string }[]\n >`ARRAY_AGG(jsonb_build_object('asset', ${obligationCollateralsTable.asset}, 'oracle', ${oraclesTable.address}, 'lltv', ${obligationCollateralsTable.lltv}))`.as(\n \"collaterals\",\n ),\n maturity: obligationsTable.maturity,\n })\n .from(obligationsTable)\n .innerJoin(\n obligationCollateralsTable,\n eq(obligationsTable.obligationId, obligationCollateralsTable.obligationId),\n )\n .innerJoin(\n oraclesTable,\n sql`${obligationCollateralsTable.oracleChainId} = ${oraclesTable.chainId}\n AND ${obligationCollateralsTable.oracleAddress} = ${oraclesTable.address}`,\n )\n .groupBy(obligationsTable.obligationId)\n .where(\n and(\n cursor !== null && cursor !== undefined\n ? gt(obligationsTable.obligationId, cursor)\n : sql`true`,\n ids !== undefined && ids.length > 0\n ? inArray(obligationsTable.obligationId, ids)\n : undefined,\n ),\n )\n .orderBy(asc(obligationsTable.obligationId))\n .limit(limit);\n\n const items: Obligation.Obligation[] = [];\n for (const row of result) {\n items.push(\n Obligation.from({\n chainId: row.chainId,\n loanToken: row.loanToken as Address,\n collaterals: row.collaterals\n .sort((a, b) => a.asset.localeCompare(b.asset))\n .map((c) =>\n Collateral.from({\n asset: c.asset as Address,\n oracle: c.oracle as Address,\n lltv: LLTV.from(BigInt(c.lltv)),\n }),\n ),\n maturity: row.maturity,\n }),\n );\n }\n\n const returnedItems = Array.from(items.values());\n const nextCursor =\n returnedItems.length === limit && returnedItems.length > 0\n ? result[result.length - 1]!.obligationId\n : null;\n\n return { obligations: returnedItems, nextCursor };\n },\n\n getQuotes: async (parameters: { obligationIds: Hex[] }): Promise<Quote.Quote[]> => {\n const { obligationIds } = parameters;\n if (obligationIds.length === 0) return [];\n\n const now = Time.now();\n\n const query = ({ side }: { side: \"buy\" | \"sell\" }) =>\n db\n .selectDistinctOn([offersTable.obligationId], {\n obligationId: offersTable.obligationId,\n rate: offersTable.rate,\n })\n .from(offersTable)\n .innerJoin(offerStatusTable, eq(offersTable.hash, offerStatusTable.offerHash))\n .innerJoin(\n groupsTable,\n and(\n eq(offersTable.groupChainId, groupsTable.chainId),\n eq(offersTable.groupMaker, groupsTable.maker),\n eq(offersTable.group, groupsTable.group),\n ),\n )\n .where(\n and(\n inArray(offersTable.obligationId, obligationIds),\n eq(offersTable.buy, side === \"buy\"),\n eq(offerStatusTable.statusId, 1), // VALID\n gte(offersTable.expiry, now),\n gte(offersTable.maturity, now),\n sql`${groupsTable.consumed} < ${offersTable.assets}`,\n ),\n )\n .orderBy(\n offersTable.obligationId,\n // lower rates first for buy, higher rates first for sell\n side === \"buy\" ? asc(offersTable.rate) : desc(offersTable.rate),\n );\n\n const [bestBuys, bestSells] = await Promise.all([\n query({ side: \"buy\" }),\n query({ side: \"sell\" }),\n ]);\n\n const quotes = new Map<string, { ask: Quote.Quote[\"ask\"]; bid: Quote.Quote[\"bid\"] }>();\n\n for (const row of bestSells) {\n quotes.set(row.obligationId, {\n ask: { rate: BigInt(row.rate) },\n bid: { rate: 0n },\n });\n }\n\n for (const row of bestBuys) {\n const quote = quotes.get(row.obligationId);\n\n if (!quote) {\n quotes.set(row.obligationId, {\n ask: { rate: 0n },\n bid: { rate: BigInt(row.rate) },\n });\n continue;\n }\n\n quote.bid = { rate: BigInt(row.rate) };\n }\n\n return Array.from(quotes.entries())\n .map(([id, quote]) => {\n return Quote.from({ obligationId: id as Hex, ask: quote.ask, bid: quote.bid });\n })\n .sort((a, b) => {\n return a.obligationId.localeCompare(b.obligationId);\n });\n },\n };\n}\n","import { createWalletClient, http, publicActions, type Chain as ViemChain } from \"viem\";\nimport * as Collector from \"#collectors/index.ts\";\nimport type { Chain } from \"#core\";\nimport {\n ChainStore,\n CollectorStore,\n LiquidityStore,\n OfferStore,\n type PG,\n} from \"#database/index.ts\";\nimport * as OfferStoreV2 from \"#database/OfferStoreV2.ts\";\nimport * as Health from \"#services/Health.ts\";\nimport type * as Gatekeeper from \"../gatekeeper/Gatekeeper.ts\";\n\nexport type ServicesConfig = {\n DB: PG.PG;\n chain?: Chain.Chain;\n rpcUrl?: string;\n collectorConfig?: {\n interval?: number;\n maxBatchSize?: number;\n maxBlockNumber?: number;\n };\n gatekeeper?: Gatekeeper.Gatekeeper;\n};\n\nexport type Services = {\n offerStore: OfferStore.OfferStore;\n offerStoreV2: OfferStoreV2.OfferStoreV2;\n collectorStore: CollectorStore.CollectorStore;\n liquidityStore: LiquidityStore.LiquidityStore;\n chainStore: ChainStore.ChainStore;\n healthService: Health.HealthService;\n mempoolOffersCollector?: Collector.Collector<\"mempool_offers\">;\n consumedEventsCollector?: Collector.Collector<\"consumed_events\">;\n buyWithEmptyCallbackLiquidityCollector?: Collector.Collector<\"buy_with_empty_callback_liquidity\">;\n buyVaultV1CallbackLiquidityCollector?: Collector.Collector<\"buy_vault_v1_callback_liquidity\">;\n sellERC20CallbackLiquidityCollector?: Collector.Collector<\"sell_erc20_callback_liquidity\">;\n DB: PG.PG;\n};\n\nexport function from(config: ServicesConfig): Services {\n const {\n chain,\n rpcUrl,\n DB,\n collectorConfig: { interval = 10_000, maxBatchSize = 1000, maxBlockNumber } = {},\n gatekeeper,\n } = config;\n\n const { offerStore, offerStoreV2, collectorStore, liquidityStore, chainStore } = createStores(DB);\n\n const healthService = Health.create({ collectorStore, chainStore });\n\n let mempoolOffersCollector: Services[\"mempoolOffersCollector\"];\n let consumedEventsCollector: Services[\"consumedEventsCollector\"];\n let buyWithEmptyCallbackLiquidityCollector: Services[\"buyWithEmptyCallbackLiquidityCollector\"];\n let buyVaultV1CallbackLiquidityCollector: Services[\"buyVaultV1CallbackLiquidityCollector\"];\n let sellERC20CallbackLiquidityCollector: Services[\"sellERC20CallbackLiquidityCollector\"];\n\n if (chain && rpcUrl && gatekeeper) {\n const walletClient = createWalletClient({\n chain: chain as unknown as ViemChain,\n transport: http(rpcUrl),\n }).extend(publicActions);\n\n const client = walletClient.extend(publicActions);\n\n const collectorBuilder = Collector.createBuilder({\n client,\n chain,\n db: DB,\n gatekeeper,\n options: { interval, maxBlockNumber },\n });\n\n mempoolOffersCollector = collectorBuilder.buildMempoolCollector({\n options: { maxBatchSize },\n });\n\n consumedEventsCollector = collectorBuilder.buildConsumedEventsCollector({\n options: { maxBatchSize },\n });\n\n buyWithEmptyCallbackLiquidityCollector =\n collectorBuilder.buildBuyWithEmptyCallbackLiquidityCollector({\n options: {\n maxBatchSize,\n },\n });\n\n buyVaultV1CallbackLiquidityCollector =\n collectorBuilder.buildBuyVaultV1CallbackLiquidityCollector({\n options: {\n maxBatchSize,\n },\n });\n\n sellERC20CallbackLiquidityCollector = collectorBuilder.buildSellERC20CallbackLiquidityCollector(\n {\n options: {\n maxBatchSize,\n },\n },\n );\n }\n\n return {\n offerStore,\n offerStoreV2,\n collectorStore,\n liquidityStore,\n chainStore,\n healthService,\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n buyVaultV1CallbackLiquidityCollector,\n sellERC20CallbackLiquidityCollector,\n DB,\n };\n}\n\nexport type Stores = ReturnType<typeof createStores>;\nexport function createStores(db: PG.PG) {\n return {\n collectorStore: CollectorStore.create({ db }),\n offerStore: OfferStore.create({ db }),\n offerStoreV2: OfferStoreV2.create({ db }),\n liquidityStore: LiquidityStore.create({ db }),\n chainStore: ChainStore.create({ db }),\n };\n}\n\nexport function createWithTransaction<T>(db: PG.PG) {\n // it is safe to cast the transaction to the PG type because the SQL interface is interchangeable with drizzle\n return (fn: (s: ReturnType<typeof createStores>) => Promise<T>) =>\n db.transaction(async (tx) => fn(createStores(tx as unknown as PG.PG)));\n}\n","import * as z from \"zod\";\nimport type { Compute } from \"#core\";\n\nexport const API_ERROR_CODES = [\n \"VALIDATION_ERROR\",\n \"NOT_FOUND\",\n \"INTERNAL_SERVER_ERROR\",\n \"BAD_REQUEST\",\n] as const;\n\ntype APIErrorCode = (typeof API_ERROR_CODES)[number];\n\nexport enum STATUS_CODE {\n SUCCESS = 200,\n BAD_REQUEST = 400,\n NOT_FOUND = 404,\n INTERNAL_SERVER_ERROR = 500,\n}\n\nexport class APIError<Code extends STATUS_CODE = STATUS_CODE> extends Error {\n constructor(\n public statusCode: Code,\n message: string,\n public code: APIErrorCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = \"APIError\";\n }\n}\n\nexport class ValidationError extends APIError<STATUS_CODE.BAD_REQUEST> {\n constructor(message: string, details?: unknown) {\n super(STATUS_CODE.BAD_REQUEST, message, \"VALIDATION_ERROR\", details);\n }\n}\n\nexport class NotFoundError extends APIError<STATUS_CODE.NOT_FOUND> {\n constructor(message: string) {\n super(STATUS_CODE.NOT_FOUND, message, \"NOT_FOUND\");\n }\n}\n\nexport class InternalServerError extends APIError<STATUS_CODE.INTERNAL_SERVER_ERROR> {\n constructor(message = \"Internal server error\") {\n super(STATUS_CODE.INTERNAL_SERVER_ERROR, message, \"INTERNAL_SERVER_ERROR\");\n }\n}\n\nexport class BadRequestError extends APIError<STATUS_CODE.BAD_REQUEST> {\n constructor(message = \"Invalid JSON format\", details?: unknown) {\n super(STATUS_CODE.BAD_REQUEST, message, \"BAD_REQUEST\", details);\n }\n}\n\ntype Meta = { timestamp: string };\n\ntype ErrorDetail = {\n code: APIErrorCode;\n message: string;\n details?: unknown;\n};\n\nexport type SuccessPayload<T> = Compute<{\n statusCode: STATUS_CODE.SUCCESS;\n body: {\n status: \"success\";\n cursor: string | null;\n data: T;\n meta: Meta;\n };\n}>;\n\nexport type ErrorPayload<\n statusCode extends Exclude<STATUS_CODE, STATUS_CODE.SUCCESS> = Exclude<\n STATUS_CODE,\n STATUS_CODE.SUCCESS\n >,\n> = Compute<{\n statusCode: statusCode;\n body: {\n status: \"error\";\n meta: Meta;\n error: ErrorDetail;\n };\n}>;\n\nexport type Payload<T> = SuccessPayload<T> | ErrorPayload;\n\nexport function success<T>(args: { data: T; cursor?: string | null }): SuccessPayload<T> {\n const { data, cursor } = args;\n return {\n statusCode: STATUS_CODE.SUCCESS as const,\n body: {\n status: \"success\",\n meta: { timestamp: new Date().toISOString() },\n cursor: cursor ?? null,\n data,\n },\n };\n}\n\n/**\n * Generic failure builder. Preserves the concrete status code when the input is an APIError.\n * If not an APIError, maps to INTERNAL_SERVER_ERROR. Zod & SyntaxError are mapped to BAD_REQUEST.\n */\nexport function failure<\n Code extends Exclude<STATUS_CODE, STATUS_CODE.SUCCESS> = Exclude<\n STATUS_CODE,\n STATUS_CODE.SUCCESS\n >,\n>(err: unknown): ErrorPayload<Code> {\n if (err instanceof APIError) {\n // Capture the exact status type from the error instance\n return handleAPIError(err) as ErrorPayload<Code>;\n }\n\n if (err instanceof SyntaxError) {\n return handleAPIError(new BadRequestError(err.message)) as ErrorPayload<Code>;\n }\n\n if (err instanceof z.ZodError) {\n return handleAPIError(handleZodError(err)) as ErrorPayload<Code>;\n }\n\n return handleAPIError(new InternalServerError()) as ErrorPayload<Code>;\n}\n\nfunction handleAPIError<Code extends Exclude<STATUS_CODE, STATUS_CODE.SUCCESS>>(\n error: APIError<Code>,\n): ErrorPayload<Code> {\n return {\n statusCode: error.statusCode,\n body: {\n status: \"error\",\n meta: { timestamp: new Date().toISOString() },\n error: {\n code: error.code,\n message: error.message,\n ...(error.details && typeof error.details === \"object\" ? { details: error.details } : {}),\n },\n },\n };\n}\n\nexport function handleZodError(error: z.ZodError): ValidationError {\n const formattedErrors = error.issues.map((issue) => {\n const field = issue.path.join(\".\");\n let msg = issue.message;\n\n switch (issue.code) {\n case \"invalid_type\":\n if (issue.message.includes(\"received undefined\")) {\n msg = `${field} is required`;\n }\n break;\n case \"invalid_format\":\n msg = issue.format === \"regex\" ? issue.message : `${field} has an invalid format`;\n break;\n default:\n break;\n }\n\n return { field, issue: msg };\n });\n\n return new ValidationError(\"Validation failed\", formattedErrors);\n}\n","import \"reflect-metadata\";\nimport { generateDocument, type OpenAPIDocument } from \"openapi-metadata\";\nimport {\n ApiOperation,\n ApiProperty,\n ApiQuery,\n ApiResponse,\n ApiTags,\n} from \"openapi-metadata/decorators\";\nimport type { Address, Hex } from \"viem\";\nimport * as Payload from \"../Controllers/Payload.ts\";\n\nconst timestampExample = \"2024-01-01T12:00:00.000Z\";\nconst offerCursorExample = \"eyJvZmZzZXQiOjEwMH0\";\nconst obligationCursorExample =\n \"0x25690ae1aee324a005be565f3bcdd16dbf8daf7969b26c181c8b8f467dad9abc\";\n\nconst offerExample = {\n hash: \"0xac4bd8318ec914f89f8af913f162230575b0ac0696a19256bc12138c5cfe1427\",\n offering: \"0x7b093658BE7f90B63D7c359e8f408e503c2D9401\",\n assets: \"369216000000000000000000\",\n rate: \"2750000000000000000\",\n maturity: 1761922799,\n expiry: 1761922799,\n start: 1761922790,\n nonce: \"571380\",\n buy: false,\n chain_id: \"1\",\n loan_token: \"0xC9A9C45C0eB717f8b5F193Af6bAa05A1c0Ac5078\",\n collaterals: [\n {\n asset: \"0x34Cf890dB685FC536E05652FB41f02090c3fb751\",\n oracle: \"0x45093658BE7f90B63D7c359e8f408e503c2D9401\",\n lltv: \"860000000000000000\",\n },\n ],\n callback: {\n address: \"0x1111111111111111111111111111111111111111\",\n data: \"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000034cf890db685fc536e05652fb41f02090c3fb751000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000108e644e3ab01184155270aa92a00000000000\",\n gas_limit: \"500000\",\n },\n signature:\n \"0x1234567890123456789012345678901234567890123456789012345678901234123456789012345678901234567890123456789012345678901234567890123400\",\n consumed: \"0\",\n block_number: 2942933377146801,\n} as const;\n\nconst collectorsHealthExample = {\n name: \"mempool_offers\",\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: timestampExample,\n lag: 0,\n status: \"live\",\n} as const;\n\nconst chainsHealthExample = {\n chain_id: \"1\",\n block_number: 21345678,\n updated_at: timestampExample,\n} as const;\n\nconst routerStatusExample = {\n status: \"live\",\n} as const;\n\nclass Meta {\n @ApiProperty({ type: \"string\", example: timestampExample })\n declare timestamp: string;\n}\n\nclass SuccessResponse {\n @ApiProperty({ type: \"string\", enum: [\"success\"] as const })\n declare status: \"success\";\n\n @ApiProperty({ type: () => Meta })\n declare meta: Meta;\n}\n\nclass ErrorResponse {\n @ApiProperty({ type: \"string\", enum: Payload.API_ERROR_CODES, example: \"VALIDATION_ERROR\" })\n declare code: string;\n\n @ApiProperty({\n type: \"string\",\n example: \"Limit must be greater than 0.\",\n })\n declare message: string;\n\n @ApiProperty({\n type: \"object\",\n example: [\n {\n field: \"limit\",\n issue: \"Limit must be greater than 0.\",\n },\n ],\n })\n declare details: unknown;\n}\n\nclass BadRequestResponse {\n @ApiProperty({ type: \"string\", enum: [\"error\"] as const })\n declare status: \"error\";\n\n @ApiProperty({ type: () => ErrorResponse })\n declare error: ErrorResponse;\n\n @ApiProperty({ type: () => Meta })\n declare meta: Meta;\n}\n\nclass CollateralResponse {\n @ApiProperty({ type: \"string\", example: \"0x34Cf890dB685FC536E05652FB41f02090c3fb751\" })\n declare asset: Address;\n\n @ApiProperty({ type: \"string\", example: \"0x45093658BE7f90B63D7c359e8f408e503c2D9401\" })\n declare oracle: Address;\n\n @ApiProperty({ type: \"string\", example: \"860000000000000000\" })\n declare lltv: string;\n}\n\nclass AskResponse {\n @ApiProperty({ type: \"string\", example: \"1000000000000000000\" })\n declare rate: string;\n}\n\nclass BidResponse {\n @ApiProperty({ type: \"string\", example: \"1000000000000000000\" })\n declare rate: string;\n}\n\nclass OfferCallbackResponse {\n @ApiProperty({ type: \"string\", example: offerExample.callback.address })\n declare address: Address;\n\n @ApiProperty({ type: \"string\", example: offerExample.callback.data })\n declare data: Hex;\n\n @ApiProperty({ type: \"string\", example: offerExample.callback.gas_limit })\n declare gas_limit: string;\n}\n\nclass OfferListItemResponse {\n @ApiProperty({ type: \"string\", example: offerExample.hash })\n declare hash: Hex;\n\n @ApiProperty({ type: \"string\", example: offerExample.offering })\n declare offering: Address;\n\n @ApiProperty({ type: \"string\", example: offerExample.assets })\n declare assets: string;\n\n @ApiProperty({ type: \"string\", example: offerExample.rate })\n declare rate: string;\n\n @ApiProperty({ type: \"number\", example: offerExample.maturity })\n declare maturity: number;\n\n @ApiProperty({ type: \"number\", example: offerExample.expiry })\n declare expiry: number;\n\n @ApiProperty({ type: \"number\", example: offerExample.start })\n declare start: number;\n\n @ApiProperty({ type: \"string\", example: offerExample.nonce })\n declare nonce: string;\n\n @ApiProperty({ type: \"boolean\", example: offerExample.buy })\n declare buy: boolean;\n\n @ApiProperty({ type: \"string\", example: offerExample.chain_id })\n declare chain_id: string;\n\n @ApiProperty({ type: \"string\", example: offerExample.loan_token })\n declare loan_token: Address;\n\n @ApiProperty({ type: () => [CollateralResponse], example: offerExample.collaterals })\n declare collaterals: CollateralResponse[];\n\n @ApiProperty({ type: () => OfferCallbackResponse, example: offerExample.callback })\n declare callback: OfferCallbackResponse;\n\n @ApiProperty({ type: \"string\", example: offerExample.consumed })\n declare consumed: string;\n\n @ApiProperty({ type: \"number\", example: offerExample.block_number })\n declare block_number: number;\n\n @ApiProperty({ type: \"string\", nullable: true, example: offerExample.signature })\n declare signature: Hex | null;\n}\n\nclass ObligationResponse {\n @ApiProperty({\n type: \"string\",\n example: \"0x12590ae1aee324a005be565f3bcdd16dbf8daf7969b26c181c8b8f467dad9f67\",\n })\n declare id: Hex;\n\n @ApiProperty({ type: \"string\", example: \"1\" })\n declare chain_id: string;\n\n @ApiProperty({ type: \"string\", example: \"0xC9A9C45C0eB717f8b5F193Af6bAa05A1c0Ac5078\" })\n declare loan_token: Address;\n\n @ApiProperty({ type: () => [CollateralResponse] })\n declare collaterals: CollateralResponse[];\n\n @ApiProperty({ type: \"number\", example: 1761922800 })\n declare maturity: number;\n\n @ApiProperty({ type: () => AskResponse })\n declare ask: AskResponse;\n\n @ApiProperty({ type: () => BidResponse })\n declare bid: BidResponse;\n}\nclass ObligationListResponse extends SuccessResponse {\n @ApiProperty({ type: \"string\", nullable: true, example: obligationCursorExample })\n declare cursor: string | null;\n\n @ApiProperty({\n type: () => [ObligationResponse],\n description: \"List of obligations with takable offers.\",\n })\n declare data: ObligationResponse[];\n}\n\nclass ObligationSingleSuccessResponse extends SuccessResponse {\n @ApiProperty({ type: \"string\", nullable: true, example: null })\n declare cursor: string | null;\n\n @ApiProperty({ type: () => ObligationResponse, description: \"Obligation details.\" })\n declare data: ObligationResponse;\n}\n\nclass OfferListResponse extends SuccessResponse {\n @ApiProperty({ type: \"string\", nullable: true, example: offerCursorExample })\n declare cursor: string | null;\n\n @ApiProperty({\n type: () => [OfferListItemResponse],\n description: \"Offers matching the provided filters.\",\n example: [offerExample],\n })\n declare data: OfferListItemResponse[];\n}\n\nclass RouterStatusDataResponse {\n @ApiProperty({ type: \"string\", enum: [\"live\", \"syncing\"], example: routerStatusExample.status })\n declare status: \"live\" | \"syncing\";\n}\n\nclass RouterStatusSuccessResponse extends SuccessResponse {\n @ApiProperty({\n type: () => RouterStatusDataResponse,\n description: \"Aggregated router status.\",\n example: routerStatusExample,\n })\n declare data: RouterStatusDataResponse;\n}\n\nclass CollectorHealthResponse {\n @ApiProperty({ type: \"string\", example: collectorsHealthExample.name })\n declare name: string;\n\n @ApiProperty({ type: \"string\", example: collectorsHealthExample.chain_id })\n declare chain_id: string;\n\n @ApiProperty({ type: \"number\", nullable: true, example: collectorsHealthExample.block_number })\n declare block_number: number | null;\n\n @ApiProperty({ type: \"string\", nullable: true, example: collectorsHealthExample.updated_at })\n declare updated_at: string | null;\n\n @ApiProperty({ type: \"number\", nullable: true, example: collectorsHealthExample.lag })\n declare lag: number | null;\n\n @ApiProperty({\n type: \"string\",\n enum: [\"live\", \"lagging\", \"unknown\"],\n example: collectorsHealthExample.status,\n })\n declare status: \"live\" | \"lagging\" | \"unknown\";\n}\n\nclass CollectorsHealthSuccessResponse extends SuccessResponse {\n @ApiProperty({\n type: () => [CollectorHealthResponse],\n description: \"Collectors health details and sync status.\",\n example: [collectorsHealthExample],\n })\n declare data: CollectorHealthResponse[];\n}\n\nclass ChainHealthResponse {\n @ApiProperty({ type: \"string\", example: chainsHealthExample.chain_id })\n declare chain_id: string;\n\n @ApiProperty({ type: \"number\", example: chainsHealthExample.block_number })\n declare block_number: number;\n\n @ApiProperty({ type: \"string\", example: chainsHealthExample.updated_at })\n declare updated_at: string;\n}\n\nclass ChainsHealthSuccessResponse extends SuccessResponse {\n @ApiProperty({\n type: () => [ChainHealthResponse],\n description: \"Latest processed block per chain.\",\n example: [chainsHealthExample],\n })\n declare data: ChainHealthResponse[];\n}\n\n@ApiTags(\"Offers\")\n@ApiResponse({ status: 400, description: \"Bad Request\", type: BadRequestResponse })\nexport class OffersController {\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/offers\",\n summary: \"List all offers\",\n description:\n \"Returns a list of offers for a given obligation and side. Offers are sorted by the best rate (depending on the side), their block number (older offers first) and their assets (bigger offers first).\",\n })\n @ApiQuery({ name: \"side\", type: \"string\", required: true, enum: [\"buy\", \"sell\"], example: \"buy\" })\n @ApiQuery({\n name: \"obligation_id\",\n type: \"string\",\n required: true,\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n description: \"Obligation id used to filter offers.\",\n })\n @ApiQuery({\n name: \"cursor\",\n type: \"string\",\n example: offerCursorExample,\n description: \"Pagination cursor in base64url-encoded format.\",\n })\n @ApiQuery({\n name: \"limit\",\n type: \"number\",\n example: 10,\n description: \"Maximum number of offers to return.\",\n })\n @ApiResponse({ status: 200, description: \"Success\", type: OfferListResponse })\n async getOffers() {}\n}\n\n@ApiTags(\"Health\")\nexport class HealthController {\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/health\",\n summary: \"Retrieve global health\",\n description: \"Returns the aggregated status of the router.\",\n })\n @ApiResponse({ status: 200, description: \"Success\", type: RouterStatusSuccessResponse })\n async getRouterStatus() {}\n\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/health/collectors\",\n summary: \"Retrieve collectors health\",\n description: \"Returns the latest block numbers processed by collectors and their sync status.\",\n })\n @ApiResponse({ status: 200, description: \"Success\", type: CollectorsHealthSuccessResponse })\n async getCollectorsHealth() {}\n\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/health/chains\",\n summary: \"Retrieve chains health\",\n description: \"Returns the latest block that can be processed by collectors for each chain.\",\n })\n @ApiResponse({ status: 200, description: \"Success\", type: ChainsHealthSuccessResponse })\n async getChainsHealth() {}\n}\n\n@ApiTags(\"Obligations\")\n@ApiResponse({ status: 400, description: \"Bad Request\", type: BadRequestResponse })\nexport class ObligationsController {\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/obligations\",\n summary: \"List all obligations\",\n description:\n \"Returns a list of obligations with their current best ask and bid. Obligations are sorted by their id in ascending order by default.\",\n })\n @ApiQuery({\n name: \"cursor\",\n type: \"string\",\n example: obligationCursorExample,\n })\n @ApiQuery({ name: \"limit\", type: \"number\", example: 10 })\n @ApiResponse({ status: 200, description: \"Success\", type: ObligationListResponse })\n async getObligations() {}\n\n @ApiOperation({\n methods: [\"get\"],\n path: \"/v1/obligations/{obligationId}\",\n summary: \"Get an obligation\",\n description: \"Returns an obligation by its id.\",\n })\n @ApiResponse({ status: 200, description: \"Success\", type: ObligationSingleSuccessResponse })\n async getObligation() {}\n}\n\nexport const OpenApi = async (): Promise<OpenAPIDocument> =>\n await generateDocument({\n controllers: [OffersController, ObligationsController, HealthController],\n document: {\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 servers: [\n {\n url: \"https://router.morpho.dev\",\n description: \"Production server\",\n },\n {\n url: \"http://localhost:7891\",\n description: \"Local development server\",\n },\n ],\n },\n });\n","import type { OpenAPIDocument } from \"openapi-metadata\";\nimport { OpenApi } from \"../Schema/openapi.ts\";\n\nexport async function getSwaggerJson(): Promise<OpenAPIDocument> {\n return OpenApi();\n}\n\nexport async function getDocsHtml(): Promise<string> {\n const spec = await OpenApi();\n const html = `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <title>Router API Docs (Scalar)</title>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"></script>\n <style>\n html, body { margin: 0; height: 100%; }\n api-reference { height: 100%; width: 100%; }\n </style>\n </head>\n <body>\n <div id=\"api-container\" style=\"height:100%;width:100%;\"></div>\n <script>\n window.addEventListener('load', function () {\n const spec = ${JSON.stringify(spec)};\n Scalar.createApiReference('#api-container', { spec: { content: spec, hideModels: true } });\n });\n </script>\n </body>\n</html>`;\n\n return html;\n}\n","import { type Health, Logger } from \"#services/index.ts\";\nimport * as Format from \"#utils/Format.ts\";\nimport type * as OpenApiSchema from \"../Schema/generated/swagger.d.ts\";\nimport * as ApiPayload from \"./Payload.ts\";\n\nexport async function getHealth(\n healthService: Health.HealthService,\n): Promise<\n ApiPayload.Payload<\n OpenApiSchema.paths[\"/v1/health\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"]\n >\n> {\n const logger = Logger.getLogger();\n try {\n const status = await healthService.getStatus();\n return ApiPayload.success({ data: Format.toSnakeCase({ status }) });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.failure(err);\n }\n}\n\nexport async function getHealthChains(\n healthService: Health.HealthService,\n): Promise<\n ApiPayload.Payload<\n OpenApiSchema.paths[\"/v1/health/chains\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"]\n >\n> {\n const logger = Logger.getLogger();\n try {\n const chains = await healthService.getChains();\n return ApiPayload.success({\n data: chains.map(({ chainId, blockNumber, updatedAt }) =>\n Format.toSnakeCase({\n chainId,\n blockNumber,\n updatedAt,\n }),\n ),\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status for chains\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.failure(err);\n }\n}\n\nexport async function getHealthCollectors(\n healthService: Health.HealthService,\n): Promise<\n ApiPayload.Payload<\n OpenApiSchema.paths[\"/v1/health/collectors\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"]\n >\n> {\n const logger = Logger.getLogger();\n try {\n const collectors = await healthService.getCollectors();\n return ApiPayload.success({\n data: collectors.map(({ name, chainId, blockNumber, updatedAt, lag, status }) =>\n Format.toSnakeCase({\n name,\n chainId,\n blockNumber,\n updatedAt,\n lag,\n status,\n }),\n ),\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error getting health status for collectors\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.failure(err);\n }\n}\n","import { z } from \"zod/v4\";\n\nexport const CollectorHealth = z.object({\n name: z.string(),\n chain_id: z.number(),\n block_number: z.number().nullable(),\n updated_at: z.string().nullable(),\n lag: z.number().nullable(),\n status: z.enum([\"live\", \"lagging\", \"unknown\"]),\n});\n\nexport const CollectorsHealthResponse = z.array(CollectorHealth);\n\nexport const ChainHealth = z.object({\n chain_id: z.number(),\n block_number: z.number(),\n updated_at: z.string(),\n});\n\nexport const ChainsHealthResponse = z.array(ChainHealth);\n\nexport const RouterStatusResponse = z.object({\n status: z.enum([\"live\", \"syncing\"]),\n});\n\nexport type CollectorsHealthResponse = z.infer<typeof CollectorsHealthResponse>;\nexport type ChainsHealthResponse = z.infer<typeof ChainsHealthResponse>;\nexport type RouterStatusResponse = z.infer<typeof RouterStatusResponse>;\n","import type { Obligation, Quote } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\nimport type * as OpenApiSchema from \"./generated/swagger.d.ts\";\n\nexport type ObligationResponse =\n OpenApiSchema.paths[\"/v1/obligations\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"][number];\n\n/**\n * Creates an `ObligationResponse` from a `Obligation`.\n * @constructor\n * @param obligation - {@link Obligation}\n * @returns The created `ObligationResponse`. {@link ObligationResponse}\n */\nexport function from(obligation: Obligation.Obligation, quote: Quote.Quote): ObligationResponse {\n return Format.toSnakeCase({\n id: quote.obligationId,\n ...obligation,\n ask: quote.ask,\n bid: quote.bid,\n });\n}\n","import type { Offer } from \"#core\";\nimport * as Format from \"#utils/Format.ts\";\nimport type * as OpenApiSchema from \"./generated/swagger.d.ts\";\n\nexport type OfferResponse =\n OpenApiSchema.paths[\"/v1/offers\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"data\"][number];\n\n/**\n * Creates an `OfferResponse` from an `Offer`.\n * @constructor\n * @param offer - {@link Offer}\n * @returns The created `OfferResponse`. {@link OfferResponse}\n */\nexport function from(offer: Offer.Offer): OfferResponse {\n const result = Format.toSnakeCase(offer);\n return { ...result, signature: (result.signature as string) ?? null };\n}\n","import type { Hex } from \"viem\";\nimport * as z from \"zod\";\nimport { Cursor } from \"#database/utils/index.ts\";\n\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 20;\nconst PaginationQueryParams = z.object({\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\nexport const GetOffersQueryParams = z.object({\n ...PaginationQueryParams.shape,\n side: z.enum([\"buy\", \"sell\"]).meta({\n description: \"Side of the offer.\",\n example: \"buy\",\n }),\n obligation_id: z\n .string({ error: \"Obligation id is required and must be a valid 32-byte hex string\" })\n .regex(/^0x[a-fA-F0-9]{64}$/, { error: \"Obligation id must be a valid 32-byte hex string\" })\n .transform<Hex>((val) => val.toLowerCase() as Hex)\n .meta({\n description: \"Offers obligation id\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nexport const GetObligationsQueryParams = z.object({\n ...PaginationQueryParams.shape,\n cursor: z.string().optional().meta({\n description: \"Obligation id cursor\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nexport const GetObligationParams = z.object({\n obligation_id: z\n .string({ error: \"Obligation id is required and must be a valid 32-byte hex string\" })\n .regex(/^0x[a-fA-F0-9]{64}$/, { error: \"Obligation id must be a valid 32-byte hex string\" })\n .transform<Hex>((val) => val.toLowerCase() as Hex)\n .meta({\n description: \"Obligation id\",\n example: \"0x1234567890123456789012345678901234567890123456789012345678901234\",\n }),\n});\n\nconst schemas = {\n get_offers: GetOffersQueryParams,\n get_obligations: GetObligationsQueryParams,\n get_obligation: GetObligationParams,\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 { Obligation } from \"#core\";\nimport type { OfferStore } from \"#database/index.ts\";\nimport { Logger } from \"#services/index.ts\";\nimport * as ApiSchema from \"../Schema/index.ts\";\nimport * as ApiPayload from \"./Payload.ts\";\n\nexport async function getObligation(\n params: object,\n store: OfferStore.OfferStore,\n): Promise<ApiPayload.Payload<ApiSchema.ObligationResponse.ObligationResponse>> {\n const logger = Logger.getLogger();\n const result = ApiSchema.safeParse(\"get_obligation\", params, (issue) => issue.message);\n\n if (!result.success) return ApiPayload.failure(result.error);\n const query = result.data;\n\n try {\n const obligation = await store.getObligation(query.obligation_id);\n if (!obligation) {\n return ApiPayload.failure(new ApiPayload.NotFoundError(\"Obligation not found\"));\n }\n\n const [quote] = await store.getQuotes({ obligationIds: [Obligation.id(obligation)] });\n\n return ApiPayload.success({\n data: ApiSchema.ObligationResponse.from(\n obligation,\n quote ?? {\n obligationId: Obligation.id(obligation),\n ask: { rate: 0n },\n bid: { rate: 0n },\n },\n ),\n cursor: null,\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error get obligation\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n return ApiPayload.failure(err);\n }\n}\n","import { Obligation } from \"#core\";\nimport type { OfferStore } from \"#database/index.ts\";\nimport { Logger } from \"#services/index.ts\";\nimport * as ApiSchema from \"../Schema/index.ts\";\nimport * as ApiPayload from \"./Payload.ts\";\n\nexport async function getObligations(\n queryParameters: object,\n store: OfferStore.OfferStore,\n): Promise<ApiPayload.Payload<ApiSchema.ObligationResponse.ObligationResponse[]>> {\n const logger = Logger.getLogger();\n const result = ApiSchema.safeParse(\"get_obligations\", queryParameters, (issue) => issue.message);\n\n if (!result.success) return ApiPayload.failure(result.error);\n const query = result.data;\n\n try {\n const { obligations, nextCursor } = await store.getAllObligations({\n cursor: query.cursor,\n limit: query.limit,\n });\n\n const quotes = await store.getQuotes({\n obligationIds: obligations.map((o) => Obligation.id(o)),\n });\n\n return ApiPayload.success({\n data: obligations.map((o) =>\n ApiSchema.ObligationResponse.from(\n o,\n quotes.find((q) => q.obligationId === Obligation.id(o)) ?? {\n obligationId: Obligation.id(o),\n ask: { rate: 0n },\n bid: { rate: 0n },\n },\n ),\n ),\n cursor: nextCursor ?? null,\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error get obligations\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n\n return ApiPayload.failure(err);\n }\n}\n","import type { OfferStore } from \"#database/index.ts\";\nimport { Logger } from \"#services/index.ts\";\nimport * as ApiSchema from \"../Schema/index.ts\";\nimport * as ApiPayload from \"./Payload.ts\";\n\nexport async function getOffers(\n queryParameters: object,\n store: OfferStore.OfferStore,\n): Promise<ApiPayload.Payload<ApiSchema.OfferResponse.OfferResponse[]>> {\n const logger = Logger.getLogger();\n\n const result = ApiSchema.safeParse(\"get_offers\", queryParameters, (issue) => issue.message);\n\n if (!result.success) return ApiPayload.failure(result.error);\n const query = result.data;\n\n try {\n const offers = await store.findMatchingOffers({\n side: query.side,\n obligationId: query.obligation_id,\n cursor: query.cursor,\n limit: query.limit,\n });\n\n return ApiPayload.success({\n data: offers.offers.map(ApiSchema.OfferResponse.from),\n cursor: offers.nextCursor ?? null,\n });\n } catch (err) {\n logger.error({\n err,\n msg: \"Error get offers\",\n errorMessage: err instanceof Error ? err.message : String(err),\n errorStack: err instanceof Error ? err.stack : undefined,\n });\n\n return ApiPayload.failure(err);\n }\n}\n","import { serve as serveHono } from \"@hono/node-server\";\nimport { type Context, Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { OfferStore, PG } from \"#database/index.ts\";\nimport type * as Health from \"#services/Health.ts\";\nimport * as Services from \"../services/Services.ts\";\nimport * as Controllers from \"./Controllers/index.ts\";\n\nexport type RouterApi = {\n serve: () => void;\n};\n\nexport type ApiConfig = {\n db: PG.PG;\n port: number;\n};\n\nexport function from(config: ApiConfig): RouterApi {\n const { db, port } = config;\n\n const { offerStore, healthService } = Services.from({\n DB: db,\n });\n\n return create({\n port,\n offerStore,\n healthService,\n });\n}\n\ntype CreateParameters = {\n offerStore: OfferStore.OfferStore;\n healthService: Health.HealthService;\n port: number;\n};\n\nexport function create(params: CreateParameters): RouterApi {\n return {\n serve: () => serve(params),\n };\n}\n\n/**\n * Start a local router server.\n * @example\n * ```ts\n * import { RouterApi } from \"@morpho-dev/router\";\n * RouterApi.serve({ port: 8081 }); // local router API server running on http://localhost:8081\n * ```\n */\nfunction serve(parameters: CreateParameters) {\n const { offerStore, healthService } = parameters;\n\n const app = new Hono();\n app.use(\"*\", cors());\n\n app.get(\"/v1/offers\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getOffers(c.req.query(), offerStore);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/obligations\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getObligations(c.req.query(), offerStore);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/obligations/:obligationId\", async (c: Context) => {\n const id = c.req.param(\"obligationId\");\n const { statusCode, body } = await Controllers.getObligation({ obligation_id: id }, offerStore);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealth(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health/collectors\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealthCollectors(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/v1/health/chains\", async (c: Context) => {\n const { statusCode, body } = await Controllers.getHealthChains(healthService);\n return c.json(body, statusCode);\n });\n\n app.get(\"/docs/swagger.json\", async (c: Context) =>\n c.text(JSON.stringify(await Controllers.getSwaggerJson()), 200, {\n \"Content-Type\": \"application/json; charset=utf-8\",\n }),\n );\n app.get(\"/docs\", async (c: Context) => c.html(await Controllers.getDocsHtml(), 200));\n\n serveHono({\n fetch: app.fetch,\n port: parameters.port,\n });\n}\n","import { Command, Option } from \"commander\";\nimport dotenv from \"dotenv\";\nimport * as Chain from \"../../core/Chain.ts\";\nimport * as PG from \"../../database/PG.ts\";\nimport * as Logger from \"../../services/Logger.ts\";\n\ndotenv.config();\n\nexport enum StorageType {\n PGLITE = \"pglite\",\n PG = \"pg\",\n}\n\ntype RawOptions = {\n port: number;\n chain: Chain.ChainName;\n rpcUrl?: string;\n routerUrl: string;\n store: StorageType;\n dbEndpoint?: string;\n logLevel: Logger.LogLevel;\n logPretty?: boolean;\n maxBlockNumber?: number;\n};\n\nexport type GlobalOptions = {\n port: number;\n remoteRouterUrl: string;\n rpcUrl: string;\n db: PG.PG;\n maxBlockNumber?: number;\n logger: Logger.Logger;\n chain: Chain.Chain;\n};\n\nexport class RouterCmd extends Command {\n constructor(name?: string) {\n super(name);\n this.addOption(\n new Option(\"--port <n>\")\n .env(\"ROUTER_PORT\")\n .default(7891)\n .argParser((v) => Number(v)),\n );\n this.addOption(\n new Option(\"--chain <chain>\")\n .env(\"ROUTER_CHAIN\")\n .choices(Chain.chainNames)\n .default(\"ethereum\"),\n );\n this.addOption(new Option(\"--rpc-url <url>\").env(\"ROUTER_RPC_URL\"));\n this.addOption(\n new Option(\"--router-url <url>\")\n .env(\"ROUTER_REMOTE_URL\")\n .default(\"https://router.morpho.dev\"),\n );\n this.addOption(new Option(\"--db-endpoint <url>\"));\n this.addOption(\n new Option(\"--log-level <level>\")\n .env(\"ROUTER_LOG_LEVEL\")\n .choices(Logger.LogLevelValues)\n .default(\"info\"),\n );\n this.addOption(\n new Option(\"--log-pretty\", \"Enable pretty logs\").env(\"ROUTER_LOG_PRETTY\").default(true),\n );\n this.hook(\"preAction\", async (_: Command, actionCommand: Command) => {\n const options = actionCommand.opts<RawOptions>();\n const db = RouterCmd.setup(actionCommand, options);\n\n const logger = actionCommand.getOptionValue(\"logger\") as Logger.Logger;\n await Logger.runWithLogger(logger, async () => {\n await PG.applyMigrations(db);\n });\n });\n }\n\n protected static setup(command: Command, options: RawOptions): PG.PG {\n const logger = Logger.defaultLogger(options.logLevel, options.logPretty);\n\n const chain = Chain.chains[options.chain]!;\n const rpcUrl = options.rpcUrl ?? chain.rpcUrls.default.http[0];\n if (!rpcUrl) {\n throw new Error(\n \"RPC URL is required, please set the ROUTER_RPC_URL environment variable or use --rpc-url <url> option.\",\n );\n }\n\n const db: PG.PG = options.dbEndpoint\n ? PG.connect({ type: \"pg\", endpoint: options.dbEndpoint })\n : PG.connect({ type: \"pglite\" });\n\n command.setOptionValue(\"port\", options.port);\n command.setOptionValue(\"remoteRouterUrl\", options.routerUrl);\n command.setOptionValue(\"rpcUrl\", rpcUrl);\n command.setOptionValue(\"db\", db);\n command.setOptionValue(\"maxBlockNumber\", options.maxBlockNumber);\n command.setOptionValue(\"logger\", logger);\n command.setOptionValue(\"chain\", chain);\n\n return db;\n }\n\n // allows to use the logger defined in the setup function for the action of the command\n // biome-ignore lint/suspicious/noExplicitAny: any is mandatory for the action function signature\n action(fn: (...args: any[]) => any): this {\n // biome-ignore lint/suspicious/noExplicitAny: any is mandatory for the action function signature\n const wrapped = async (...args: any[]) => {\n const cmd = args[args.length - 1] as Command;\n const logger = (cmd.getOptionValue(\"logger\") as Logger.Logger) ?? Logger.defaultLogger();\n return Logger.runWithLogger(logger, async () => fn(...args));\n };\n return super.action(wrapped);\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { type Command, Option } from \"commander\";\nimport type { Address } from \"viem\";\nimport { Offer } from \"#core\";\nimport * as Api from \"../../api/Api.ts\";\nimport { createStores } from \"../../services/Services.ts\";\nimport { type GlobalOptions, RouterCmd } from \"./RouterCmd.ts\";\n\nexport const mockCmd: Command = new RouterCmd(\"mock\");\nmockCmd\n .description(\"Start Router mock.\")\n .addOption(\n new Option(\"--seed <n>\", \"Seed random offers to router\").argParser((v) => Number(v)).default(0),\n )\n .addOption(new Option(\"--file <path>\", \"Seed offers from a JSON file\"))\n .action(\n async (\n opts: {\n blockWindow: number;\n seed: number;\n file?: string;\n services?: string[];\n } & GlobalOptions,\n ) => {\n const { port, logger, db, chain } = opts;\n\n const stops: (() => void)[] = [];\n const { offerStore, liquidityStore } = createStores(db);\n\n if (opts.seed > 0) {\n const tokens: Record<Address, number> = {\n \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\": 6, // USDC\n \"0x6B175474E89094C44Da98b954EedeAC495271d0F\": 18, // DAI\n \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\": 18, // WETH\n \"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599\": 8, // WBTC\n \"0x4200000000000000000000000000000000000006\": 18, // WETH\n \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": 6, // USDC\n \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\": 18, // DAI\n };\n const offers = Array.from(Array(opts.seed ?? 0).keys()).map((_i) => ({\n offer: Offer.random({\n chains: [chain],\n loanTokens: Object.keys(tokens).map((k) => k as Address),\n collateralTokens: Object.keys(tokens).map((k) => k as Address),\n assetsDecimals: tokens,\n }),\n status: \"valid\",\n }));\n await offerStore.createMany(offers);\n for (const offer of offers) {\n await liquidityStore.save({\n blockNumber: 1,\n pools: [\n {\n id: offer.offer.hash,\n amount: offer.offer.assets,\n },\n ],\n offerPools: [\n {\n offerHash: offer.offer.hash,\n poolId: offer.offer.hash,\n amount: offer.offer.assets,\n },\n ],\n links: [],\n });\n }\n logger.info({ msg: `Offers seeded`, count: opts.seed });\n }\n\n if (opts.file) {\n const offers: Offer.Offer[] = await getOffersFromFile(opts.file);\n await offerStore.createMany(offers.map((ro) => ({ offer: ro })));\n for (const offer of offers) {\n await liquidityStore.save({\n blockNumber: 1,\n pools: [\n {\n id: offer.hash,\n amount: offer.assets,\n },\n ],\n offerPools: [\n {\n offerHash: offer.hash,\n poolId: offer.hash,\n amount: offer.assets,\n },\n ],\n links: [],\n });\n }\n logger.info({ msg: `Offers seeded from file`, count: offers.length, file: opts.file });\n }\n\n const api = Api.from({ db, port });\n await api.serve();\n logger.info({ msg: `API started`, url: `http://localhost:${port}` });\n\n const shutdown = async (signal: string) => {\n logger.warn({ msg: `Shutdown signal`, signal });\n try {\n stops.forEach((stop) => {\n stop();\n });\n } catch {}\n process.exit(0);\n };\n\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n process.stdin.resume();\n },\n );\n\nasync function getOffersFromFile(file: string) {\n const raw = await readFile(file, \"utf8\");\n const json = JSON.parse(raw);\n const items: Omit<Offer.Offer, \"hash\">[] = Array.isArray(json) ? json : (json.offers ?? []);\n\n if (!Array.isArray(items) || items.length === 0) {\n // biome-ignore lint: useful\n console.log(\"No offers found in file\");\n return [];\n }\n\n return items.map((o) => Offer.from(o));\n}\n\nexport type StartUiParams = {\n routerUrl: string;\n port?: number;\n mainnetRpcUrl?: string;\n};\n","/**\n * A validation rule.\n */\nexport type Rule<T, Name extends string = string> =\n | { kind: \"single\"; name: Name; run: Single<T, Name> }\n | { kind: \"batch\"; name: Name; run: Batch<T, Name> };\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 * @returns The issue that was found. If the item is valid, this will be undefined.\n */\nexport type Single<T, RuleName extends string> = (\n item: T,\n) =>\n | Omit<Issue<T, RuleName>, \"ruleName\" | \"item\">\n | undefined\n | Promise<Omit<Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>;\n\n/**\n * A batch item validation rule.\n * @param items - The items to validate.\n * @returns A map of the items to the issue that was found.\n */\nexport type Batch<T, RuleName extends string> = (\n items: T[],\n) =>\n | Map<number, Omit<Issue<T, RuleName>, \"ruleName\" | \"item\"> | undefined>\n | Promise<Map<number, Omit<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>(name: Name, run: Single<T, Name>): Rule<T, Name> {\n return { kind: \"single\", name, run } as const satisfies Rule<T, Name>;\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>(name: Name, run: Batch<T, Name>): Rule<T, Name> {\n return { kind: \"batch\", name, run } as const satisfies Rule<T, Name>;\n}\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 async function run<\n T,\n Name extends string,\n Rules extends readonly Rule<T, Name>[],\n>(parameters: {\n items: T[];\n rules: Rules;\n chunkSize?: number;\n}): Promise<Result<T, RuleNames<Rules>>> {\n const { items, rules, chunkSize } = parameters;\n\n const issues: Issue<T, 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);\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);\n for (let i = 0; i < slice.length; i++) {\n const issue = map.get(i);\n if (issue !== undefined) {\n issues.push({ ...issue, ruleName: rule.name, item: slice[i]! });\n indicesToRemove.add(offset + i);\n }\n }\n };\n\n if (!chunkSize) await exec(validItems, 0);\n else {\n for (let i = 0; i < validItems.length; i += chunkSize) {\n await exec(validItems.slice(i, i + chunkSize), i);\n }\n }\n }\n\n validItems = validItems.filter((_, i) => !indicesToRemove.has(i));\n }\n\n return {\n valid: validItems,\n issues,\n };\n}\n","import type { Offer } from \"#core\";\nimport * as Gate from \"./Gate.ts\";\n\nexport type Rules = readonly Gate.Rule<Offer.Offer, string>[];\n\nexport type Gatekeeper = {\n isAllowed: (offers: Offer.Offer[]) => Promise<Gate.Result<Offer.Offer, string>>;\n};\n\ntype GatekeeperParameters = {\n rules: Rules;\n};\n\nexport function create(parameters: GatekeeperParameters): Gatekeeper {\n return {\n isAllowed: async (offers: Offer.Offer[]) => {\n return await Gate.run({\n items: offers,\n rules: parameters.rules,\n });\n },\n };\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { Abi, Callback, type Chain, Maturity, type Offer } from \"#core\";\nimport type * as Validation from \"./Gate.ts\";\nimport { batch, single } from \"./Gate.ts\";\nimport * as GateConfig from \"./GateConfig.ts\";\n\nexport type ValidityParameters = {\n chain: Chain.Chain;\n client: PublicClient;\n};\n\n/**\n * set of rules to validate offers.\n *\n * @param parameters - Validity parameters with chain and client\n * @returns Array of validation rules to evaluate against offers\n */\nexport function validity(parameters: ValidityParameters) {\n const { chain, client } = parameters;\n\n const sellErc20CallbackInvalid = single(\"sell_erc20_callback_invalid\", (offer: Offer.Offer) => {\n const callbackType = GateConfig.getCallbackType(chain.name, offer.callback.address);\n if (callbackType !== Callback.CallbackType.SellERC20Callback) {\n return;\n }\n const decoded = Callback.decode(callbackType as Callback.CallbackType, offer.callback.data);\n if (decoded.length === 0) {\n return { message: \"Callback data cannot be decoded or is empty.\" };\n }\n if (callbackType === Callback.CallbackType.SellERC20Callback) {\n const offerCollaterals = new Set(\n offer.collaterals.map((c) => c.asset.toLowerCase() as Address),\n );\n if (decoded.length !== offer.collaterals.length) {\n return {\n message: `Sell callback collateral length mismatch. Expected ${offer.collaterals.length}, got ${decoded.length}.`,\n };\n }\n for (const { collateral } of decoded as Array<{ collateral: Address; amount: bigint }>) {\n if (!offerCollaterals.has(collateral.toLowerCase() as Address)) {\n return { message: \"Sell callback collateral is not part of offer collaterals.\" };\n }\n }\n }\n });\n\n const buyCallbackVaultInvalid = batch(\n \"buy_offers_callback_vault_invalid\",\n async (offers: Offer.Offer[]) => {\n const validationIssues = new Map<\n number,\n | Omit<\n Validation.Issue<Offer.Offer, \"buy_offers_callback_vault_invalid\">,\n \"ruleName\" | \"item\"\n >\n | undefined\n >();\n\n const offersByVaultAddress = new Map<string, Array<{ index: number; offer: Offer.Offer }>>();\n for (let i = 0; i < offers.length; i++) {\n const offer = offers[i]!;\n const callbackType = GateConfig.getCallbackType(chain.name, offer.callback.address);\n if (callbackType !== Callback.CallbackType.BuyVaultV1Callback) {\n continue;\n }\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n if (!offersByVaultAddress.has(normalizedVaultAddress)) {\n offersByVaultAddress.set(normalizedVaultAddress, []);\n }\n offersByVaultAddress.get(normalizedVaultAddress)!.push({ index: i, offer });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n\n const uniqueVaultAddresses = Array.from(offersByVaultAddress.keys());\n if (uniqueVaultAddresses.length === 0) return validationIssues;\n\n const allowedFactories = GateConfig.getCallback(\n chain.name,\n Callback.CallbackType.BuyVaultV1Callback,\n )?.vaultFactories!.map((f) => f.toLowerCase() as Address);\n\n if (!allowedFactories) return validationIssues;\n\n const multicallContracts = [];\n for (const vaultAddress of uniqueVaultAddresses) {\n multicallContracts.push({\n address: vaultAddress as Address,\n abi: Abi.ERC4626,\n functionName: \"asset\",\n } as const);\n\n for (const factoryAddress of allowedFactories) {\n multicallContracts.push({\n address: factoryAddress as Address,\n abi: Abi.MetaMorphoFactory,\n functionName: \"isMetaMorpho\",\n args: [vaultAddress as Address],\n } as const);\n }\n }\n\n const multicallResults = await client.multicall({\n contracts: multicallContracts,\n allowFailure: true,\n });\n\n const vaultAssetByAddress = new Map<string, Address | null>();\n const registeredVaults = new Set<string>();\n\n const numberOfFactories = allowedFactories.length;\n\n let resultIndex = 0;\n for (const vaultAddress of uniqueVaultAddresses) {\n const assetCallResult = multicallResults[resultIndex++]!;\n const assetAddress =\n assetCallResult.status === \"success\" ? (assetCallResult.result as Address) : null;\n\n vaultAssetByAddress.set(vaultAddress, assetAddress);\n\n let isRegisteredInFactory = false;\n for (let factoryIndex = 0; factoryIndex < numberOfFactories; factoryIndex++) {\n const factoryCallResult = multicallResults[resultIndex++]!;\n\n if (factoryCallResult.status === \"success\" && factoryCallResult.result === true) {\n isRegisteredInFactory = true;\n }\n }\n\n if (isRegisteredInFactory) {\n registeredVaults.add(vaultAddress);\n }\n }\n\n const uniqueOffers = new Map<number, Offer.Offer>();\n for (const offersArray of offersByVaultAddress.values()) {\n for (const { index, offer } of offersArray) {\n uniqueOffers.set(index, offer);\n }\n }\n\n for (const [index, offer] of uniqueOffers) {\n try {\n const callbackVaults = Callback.decodeBuyVaultV1Callback(offer.callback.data);\n const vaultsWithIssues: Array<{ vaultAddress: Address; failureReasons: string }> = [];\n\n for (const { vault } of callbackVaults) {\n const normalizedVaultAddress = vault.toLowerCase();\n const assetAddress = vaultAssetByAddress.get(normalizedVaultAddress);\n const isRegistered = registeredVaults.has(normalizedVaultAddress);\n\n const failureReasons: string[] = [];\n\n if (assetAddress === null) {\n failureReasons.push(\"asset call failed\");\n } else if (\n assetAddress &&\n assetAddress.toLowerCase() !== offer.loanToken.toLowerCase()\n ) {\n failureReasons.push(\"asset mismatch\");\n }\n\n if (!isRegistered) {\n failureReasons.push(\"not registered in factory\");\n }\n\n if (failureReasons.length > 0) {\n vaultsWithIssues.push({\n vaultAddress: vault,\n failureReasons: failureReasons.join(\", \"),\n });\n }\n }\n\n if (vaultsWithIssues.length > 0) {\n const failureDetails = vaultsWithIssues\n .map((v) => `${v.vaultAddress} (${v.failureReasons})`)\n .join(\"; \");\n validationIssues.set(index, {\n message: `Buy offer callback vaults are invalid: ${failureDetails}`,\n });\n }\n } catch (_) {\n // Skip - invalid callback data is already caught by buyCallbackDataInvalid rule\n }\n }\n\n return validationIssues;\n },\n );\n\n const expiry = single(\"expiry\", (offer: Offer.Offer) => {\n if (offer.expiry < Math.floor(Date.now() / 1000)) {\n return { message: \"Expiry mismatch\" };\n }\n });\n\n return [expiry, sellErc20CallbackInvalid, buyCallbackVaultInvalid];\n}\n\nexport const chain = ({ chain }: { chain: Chain.Chain }) =>\n single(\"chain_id\", (offer: Offer.Offer) => {\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\nexport const maturity = ({ maturities }: { maturities: Maturity.MaturityType[] }) =>\n single(\"maturity\", (offer: Offer.Offer) => {\n const allowedMaturities = maturities!.map((m) => Maturity.from(m));\n if (!allowedMaturities.includes(offer.maturity)) {\n return {\n message: `Maturity must be end of current month (${allowedMaturities[0]}) or end of next month (${allowedMaturities[1]}). Got: ${offer.maturity}`,\n };\n }\n });\n\nexport const callback = ({\n callbacks,\n allowedAddresses,\n}: {\n callbacks: Callback.CallbackType[];\n allowedAddresses: Address[];\n}) =>\n single(\"callback\", (offer: Offer.Offer) => {\n if (\n Callback.isEmptyCallback(offer) &&\n offer.buy &&\n !callbacks?.find((c) => c === Callback.CallbackType.BuyWithEmptyCallback)\n ) {\n return {\n message: \"Buy offers with empty callback not allowed.\",\n };\n }\n if (Callback.isEmptyCallback(offer) && !offer.buy) {\n return {\n message: \"Sell offers require a non-empty callback.\",\n };\n }\n if (!Callback.isEmptyCallback(offer)) {\n if (!allowedAddresses.includes(offer.callback.address?.toLowerCase() as Address)) {\n return {\n message: `Callback address ${offer.callback.address} is not allowed.`,\n };\n }\n }\n });\n\n/**\n * A validation rule that checks if the offer's token is allowed.\n * @param offer - The offer to validate.\n * @returns The issue that was found. If the offer is valid, this will be undefined.\n */\nexport const token = ({ assets }: { assets: Address[] }) =>\n single(\"token\", (offer: Offer.Offer) => {\n const allowedAssets = assets?.map((asset) => asset.toLowerCase());\n if (!allowedAssets || allowedAssets.length === 0) return { message: \"No allowed assets\" };\n if (!allowedAssets.includes(offer.loanToken.toLowerCase()))\n return { message: \"Loan token is not allowed\" };\n if (\n offer.collaterals.some(\n (collateral) => !allowedAssets.includes(collateral.asset.toLowerCase()),\n )\n )\n return { message: \"Collateral is not allowed\" };\n return undefined;\n });\n","import type { PG } from \"#database/index.ts\";\nimport type * as Chain from \"../core/Chain.ts\";\nimport type { Gatekeeper } from \"../gatekeeper/index.ts\";\nimport { Collector } from \"../index.node.ts\";\nimport * as Services from \"../services/Services.ts\";\n\nexport type Indexer = {\n start: () => () => void;\n};\n\nexport type IndexerConfig = {\n chain: Chain.Chain;\n rpcUrl: string;\n db: PG.PG;\n gatekeeper?: Gatekeeper.Gatekeeper;\n interval?: number;\n maxBatchSize?: number;\n maxBlockNumber?: number;\n};\n\nexport function from(config: IndexerConfig): Indexer {\n const {\n chain,\n rpcUrl,\n gatekeeper,\n interval = 10_000,\n maxBatchSize = 1000,\n maxBlockNumber,\n db,\n } = config;\n\n const {\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n } = Services.from({\n chain,\n rpcUrl,\n DB: db,\n gatekeeper,\n collectorConfig: {\n interval,\n maxBatchSize,\n maxBlockNumber,\n },\n });\n\n if (\n !mempoolOffersCollector ||\n !consumedEventsCollector ||\n !buyWithEmptyCallbackLiquidityCollector\n ) {\n throw new Error(\"Missing collectors\");\n }\n\n // @TODO: add sell and buy vault v1 callback liquidity collectors once callbacks are implemented\n return create({\n collectors: [\n mempoolOffersCollector,\n consumedEventsCollector,\n buyWithEmptyCallbackLiquidityCollector,\n ],\n });\n}\n\nexport function create(params: { collectors: Collector.Collector[] }): Indexer {\n const { collectors } = params;\n return {\n start: () => {\n const stops: (() => void)[] = [];\n for (const collector of collectors) {\n stops.push(Collector.start(collector));\n }\n return () => {\n stops.forEach((stop) => {\n stop();\n });\n };\n },\n };\n}\n","import { type Command, Option } from \"commander\";\nimport * as Api from \"../../api/Api.ts\";\nimport * as Callback from \"../../core/Callback.ts\";\nimport * as Maturity from \"../../core/Maturity.ts\";\nimport * as GateConfig from \"../../gatekeeper/GateConfig.ts\";\nimport * as Gatekeeper from \"../../gatekeeper/Gatekeeper.ts\";\nimport * as Rules from \"../../gatekeeper/Rules.ts\";\nimport * as Indexer from \"../../indexer/Indexer.ts\";\nimport * as Logger from \"../../services/Logger.ts\";\nimport { type GlobalOptions, RouterCmd } from \"./RouterCmd.ts\";\n\nexport const startCmd: Command = new RouterCmd(\"start\");\nstartCmd\n .description(\"Start Router services.\")\n .addOption(\n new Option(\"--block-window <n>\", \"Block window to get logs from\")\n .argParser((v) => Number(v))\n .default(100),\n )\n .addOption(new Option(\"--file <path>\", \"Seed offers from a JSON file\"))\n .addOption(\n new Option(\"--max-block-number <n>\", \"Block number at which to stop indexing\").argParser((v) =>\n Number(v),\n ),\n )\n .addOption(\n new Option(\"--services <list>\", \"Comma-separated services to run. Default: api,indexer\")\n .env(\"ROUTER_SERVICES\")\n .default([\"indexer\", \"api\"])\n .argParser((v) =>\n v\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter((s) => s.length > 0),\n ),\n )\n .action(\n async (\n opts: {\n blockWindow: number;\n seed: number;\n file?: string;\n services?: string[];\n } & GlobalOptions,\n ) => {\n const { port, db, maxBlockNumber, rpcUrl, chain, logger } = opts;\n\n await Logger.runWithLogger(logger, async () => {\n const stops: (() => void)[] = [];\n const selectedServices = new Set<string>(opts.services!);\n\n const gatekeeper = Gatekeeper.create({\n rules: [\n Rules.chain({ chain }),\n Rules.maturity({\n maturities: [Maturity.MaturityType.EndOfMonth, Maturity.MaturityType.EndOfNextMonth],\n }),\n Rules.callback({\n callbacks: [\n Callback.CallbackType.BuyWithEmptyCallback,\n Callback.CallbackType.BuyVaultV1Callback,\n Callback.CallbackType.SellERC20Callback,\n ],\n allowedAddresses: GateConfig.getCallbackAddresses(chain.name),\n }),\n Rules.token({\n assets: GateConfig.assets[chain.id.toString()] ?? [],\n }),\n ],\n });\n\n if (selectedServices.has(\"indexer\")) {\n const indexer = Indexer.from({\n chain,\n rpcUrl,\n db,\n maxBlockNumber,\n gatekeeper,\n });\n stops.push(await indexer.start());\n logger.info({ msg: `Indexer started` });\n }\n\n if (selectedServices.has(\"api\")) {\n const api = Api.from({ db, port });\n await api.serve();\n logger.info({ msg: `API started`, url: `http://localhost:${port}` });\n }\n\n const shutdown = async (signal: string) => {\n logger.warn({ msg: `Shutdown signal`, signal });\n try {\n stops.forEach((stop) => {\n stop();\n });\n } catch {}\n process.exit(0);\n };\n\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n process.stdin.resume();\n });\n },\n );\n\nexport type StartUiParams = {\n routerUrl: string;\n port?: number;\n mainnetRpcUrl?: string;\n};\n","import { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { mempoolCmd } from \"./commands/mempool.ts\";\nimport { mockCmd } from \"./commands/mock.ts\";\nimport { startCmd } from \"./commands/start.ts\";\n\nconst cli = new Command();\n\ncli\n .name(pkg.name.split(\"/\")[1] || \"cli\")\n .description(pkg.description)\n .version(pkg.version);\n\ncli.addCommand(startCmd);\ncli.addCommand(mempoolCmd);\ncli.addCommand(mockCmd);\n\ncli\n .command(\"__commands\", { hidden: true })\n .description(\"internal: list commands\")\n .action(() => {\n const names = cli.commands.map((c) => c.name());\n // biome-ignore lint: useful\n console.log(JSON.stringify(names));\n });\n\ncli.parse();\n"]}
|