@provex/indexer-client 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-G3PMV62Z.js +36 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/index.cjs +12039 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +11969 -0
- package/dist/index.js.map +1 -0
- package/dist/pg_query-3PTV6WD3.js +147241 -0
- package/dist/pg_query-3PTV6WD3.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/dataloader/index.js","../../../node_modules/lodash/_arrayAggregator.js","../../../node_modules/lodash/_createBaseFor.js","../../../node_modules/lodash/_baseFor.js","../../../node_modules/lodash/_baseTimes.js","../../../node_modules/lodash/_freeGlobal.js","../../../node_modules/lodash/_root.js","../../../node_modules/lodash/_Symbol.js","../../../node_modules/lodash/_getRawTag.js","../../../node_modules/lodash/_objectToString.js","../../../node_modules/lodash/_baseGetTag.js","../../../node_modules/lodash/isObjectLike.js","../../../node_modules/lodash/_baseIsArguments.js","../../../node_modules/lodash/isArguments.js","../../../node_modules/lodash/isArray.js","../../../node_modules/lodash/stubFalse.js","../../../node_modules/lodash/isBuffer.js","../../../node_modules/lodash/_isIndex.js","../../../node_modules/lodash/isLength.js","../../../node_modules/lodash/_baseIsTypedArray.js","../../../node_modules/lodash/_baseUnary.js","../../../node_modules/lodash/_nodeUtil.js","../../../node_modules/lodash/isTypedArray.js","../../../node_modules/lodash/_arrayLikeKeys.js","../../../node_modules/lodash/_isPrototype.js","../../../node_modules/lodash/_overArg.js","../../../node_modules/lodash/_nativeKeys.js","../../../node_modules/lodash/_baseKeys.js","../../../node_modules/lodash/isObject.js","../../../node_modules/lodash/isFunction.js","../../../node_modules/lodash/isArrayLike.js","../../../node_modules/lodash/keys.js","../../../node_modules/lodash/_baseForOwn.js","../../../node_modules/lodash/_createBaseEach.js","../../../node_modules/lodash/_baseEach.js","../../../node_modules/lodash/_baseAggregator.js","../../../node_modules/lodash/_listCacheClear.js","../../../node_modules/lodash/eq.js","../../../node_modules/lodash/_assocIndexOf.js","../../../node_modules/lodash/_listCacheDelete.js","../../../node_modules/lodash/_listCacheGet.js","../../../node_modules/lodash/_listCacheHas.js","../../../node_modules/lodash/_listCacheSet.js","../../../node_modules/lodash/_ListCache.js","../../../node_modules/lodash/_stackClear.js","../../../node_modules/lodash/_stackDelete.js","../../../node_modules/lodash/_stackGet.js","../../../node_modules/lodash/_stackHas.js","../../../node_modules/lodash/_coreJsData.js","../../../node_modules/lodash/_isMasked.js","../../../node_modules/lodash/_toSource.js","../../../node_modules/lodash/_baseIsNative.js","../../../node_modules/lodash/_getValue.js","../../../node_modules/lodash/_getNative.js","../../../node_modules/lodash/_Map.js","../../../node_modules/lodash/_nativeCreate.js","../../../node_modules/lodash/_hashClear.js","../../../node_modules/lodash/_hashDelete.js","../../../node_modules/lodash/_hashGet.js","../../../node_modules/lodash/_hashHas.js","../../../node_modules/lodash/_hashSet.js","../../../node_modules/lodash/_Hash.js","../../../node_modules/lodash/_mapCacheClear.js","../../../node_modules/lodash/_isKeyable.js","../../../node_modules/lodash/_getMapData.js","../../../node_modules/lodash/_mapCacheDelete.js","../../../node_modules/lodash/_mapCacheGet.js","../../../node_modules/lodash/_mapCacheHas.js","../../../node_modules/lodash/_mapCacheSet.js","../../../node_modules/lodash/_MapCache.js","../../../node_modules/lodash/_stackSet.js","../../../node_modules/lodash/_Stack.js","../../../node_modules/lodash/_setCacheAdd.js","../../../node_modules/lodash/_setCacheHas.js","../../../node_modules/lodash/_SetCache.js","../../../node_modules/lodash/_arraySome.js","../../../node_modules/lodash/_cacheHas.js","../../../node_modules/lodash/_equalArrays.js","../../../node_modules/lodash/_Uint8Array.js","../../../node_modules/lodash/_mapToArray.js","../../../node_modules/lodash/_setToArray.js","../../../node_modules/lodash/_equalByTag.js","../../../node_modules/lodash/_arrayPush.js","../../../node_modules/lodash/_baseGetAllKeys.js","../../../node_modules/lodash/_arrayFilter.js","../../../node_modules/lodash/stubArray.js","../../../node_modules/lodash/_getSymbols.js","../../../node_modules/lodash/_getAllKeys.js","../../../node_modules/lodash/_equalObjects.js","../../../node_modules/lodash/_DataView.js","../../../node_modules/lodash/_Promise.js","../../../node_modules/lodash/_Set.js","../../../node_modules/lodash/_WeakMap.js","../../../node_modules/lodash/_getTag.js","../../../node_modules/lodash/_baseIsEqualDeep.js","../../../node_modules/lodash/_baseIsEqual.js","../../../node_modules/lodash/_baseIsMatch.js","../../../node_modules/lodash/_isStrictComparable.js","../../../node_modules/lodash/_getMatchData.js","../../../node_modules/lodash/_matchesStrictComparable.js","../../../node_modules/lodash/_baseMatches.js","../../../node_modules/lodash/isSymbol.js","../../../node_modules/lodash/_isKey.js","../../../node_modules/lodash/memoize.js","../../../node_modules/lodash/_memoizeCapped.js","../../../node_modules/lodash/_stringToPath.js","../../../node_modules/lodash/_arrayMap.js","../../../node_modules/lodash/_baseToString.js","../../../node_modules/lodash/toString.js","../../../node_modules/lodash/_castPath.js","../../../node_modules/lodash/_toKey.js","../../../node_modules/lodash/_baseGet.js","../../../node_modules/lodash/get.js","../../../node_modules/lodash/_baseHasIn.js","../../../node_modules/lodash/_hasPath.js","../../../node_modules/lodash/hasIn.js","../../../node_modules/lodash/_baseMatchesProperty.js","../../../node_modules/lodash/identity.js","../../../node_modules/lodash/_baseProperty.js","../../../node_modules/lodash/_basePropertyDeep.js","../../../node_modules/lodash/property.js","../../../node_modules/lodash/_baseIteratee.js","../../../node_modules/lodash/_createAggregator.js","../../../node_modules/lodash/partition.js","../src/lib/ponder.ts","../../indexer/ponder.schema.ts","../../../node_modules/ponder/src/drizzle/onchain.ts","../../../node_modules/ponder/src/drizzle/bigint.ts","../../../node_modules/ponder/src/drizzle/bytes.ts","../../../node_modules/ponder/src/drizzle/hex.ts","../../../node_modules/ponder/src/internal/errors.ts","../../../node_modules/ponder/src/drizzle/json.ts","../../../node_modules/ponder/src/drizzle/text.ts","../../../node_modules/ponder/src/utils/sql-parse.ts","../../../node_modules/ponder/src/client/index.ts","../../../node_modules/hono/dist/request/constants.js","../../../node_modules/hono/dist/utils/body.js","../../../node_modules/hono/dist/utils/url.js","../../../node_modules/hono/dist/request.js","../../../node_modules/hono/dist/router/reg-exp-router/node.js","../../../node_modules/superjson/src/double-indexed-kv.ts","../../../node_modules/superjson/src/registry.ts","../../../node_modules/superjson/src/class-registry.ts","../../../node_modules/superjson/src/util.ts","../../../node_modules/superjson/src/custom-transformer-registry.ts","../../../node_modules/superjson/src/is.ts","../../../node_modules/superjson/src/pathstringifier.ts","../../../node_modules/superjson/src/transformer.ts","../../../node_modules/superjson/src/accessDeep.ts","../../../node_modules/superjson/src/plainer.ts","../../../node_modules/is-what/dist/getType.js","../../../node_modules/is-what/dist/isArray.js","../../../node_modules/is-what/dist/isPlainObject.js","../../../node_modules/copy-anything/dist/index.js","../../../node_modules/superjson/src/index.ts","../../../node_modules/ponder/node_modules/graphql/jsutils/devAssert.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/isObjectLike.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/invariant.mjs","../../../node_modules/ponder/node_modules/graphql/language/location.mjs","../../../node_modules/ponder/node_modules/graphql/language/printLocation.mjs","../../../node_modules/ponder/node_modules/graphql/error/GraphQLError.mjs","../../../node_modules/ponder/node_modules/graphql/language/ast.mjs","../../../node_modules/ponder/node_modules/graphql/language/kinds.mjs","../../../node_modules/ponder/node_modules/graphql/language/characterClasses.mjs","../../../node_modules/ponder/node_modules/graphql/language/blockString.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/inspect.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/instanceOf.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/didYouMean.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/identityFunc.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/keyMap.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/keyValMap.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/mapValue.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/naturalCompare.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/suggestionList.mjs","../../../node_modules/ponder/node_modules/graphql/jsutils/toObjMap.mjs","../../../node_modules/ponder/node_modules/graphql/language/printString.mjs","../../../node_modules/ponder/node_modules/graphql/language/visitor.mjs","../../../node_modules/ponder/node_modules/graphql/language/printer.mjs","../../../node_modules/ponder/node_modules/graphql/utilities/valueFromASTUntyped.mjs","../../../node_modules/ponder/node_modules/graphql/type/assertName.mjs","../../../node_modules/ponder/node_modules/graphql/type/definition.mjs","../../../node_modules/ponder/node_modules/graphql/type/scalars.mjs","../../../node_modules/ponder/src/drizzle/index.ts","../../../node_modules/ponder/src/drizzle/kit/index.ts","../../../node_modules/ponder/src/indexing-store/utils.ts","../../../node_modules/ponder/src/utils/checkpoint.ts","../../../node_modules/ponder/src/graphql/index.ts","../../../node_modules/ponder/src/graphql/json.ts","../../../node_modules/ponder/src/index.ts","../../token-indexer/ponder.schema.ts","../src/lib/deposits.ts","../src/lib/ponderQueries.ts","../src/hooks/useMatchableDeposits.ts","../src/hooks/useAsyncData.ts","../src/hooks/useBestRate.ts","../src/hooks/useMonthlyStats.ts","../src/adapter.ts"],"sourcesContent":["\"use strict\";\n\n/**\n * Copyright (c) 2019-present, GraphQL Foundation\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n// A Function, which when given an Array of keys, returns a Promise of an Array\n// of values or Errors.\n// Optionally turn off batching or caching or provide a cache key function or a\n// custom cache instance.\n// If a custom cache is provided, it must be of this type (a subset of ES6 Map).\n\n/**\n * A `DataLoader` creates a public API for loading data from a particular\n * data back-end with unique keys such as the `id` column of a SQL table or\n * document name in a MongoDB database, given a batch loading function.\n *\n * Each `DataLoader` instance contains a unique memoized cache. Use caution when\n * used in long-lived applications or those which serve many users with\n * different access permissions and consider creating a new instance per\n * web request.\n */\nvar DataLoader =\n/*#__PURE__*/\nfunction () {\n function DataLoader(batchLoadFn, options) {\n if (typeof batchLoadFn !== 'function') {\n throw new TypeError('DataLoader must be constructed with a function which accepts ' + (\"Array<key> and returns Promise<Array<value>>, but got: \" + batchLoadFn + \".\"));\n }\n\n this._batchLoadFn = batchLoadFn;\n this._maxBatchSize = getValidMaxBatchSize(options);\n this._batchScheduleFn = getValidBatchScheduleFn(options);\n this._cacheKeyFn = getValidCacheKeyFn(options);\n this._cacheMap = getValidCacheMap(options);\n this._batch = null;\n this.name = getValidName(options);\n } // Private\n\n\n var _proto = DataLoader.prototype;\n\n /**\n * Loads a key, returning a `Promise` for the value represented by that key.\n */\n _proto.load = function load(key) {\n if (key === null || key === undefined) {\n throw new TypeError('The loader.load() function must be called with a value, ' + (\"but got: \" + String(key) + \".\"));\n }\n\n var batch = getCurrentBatch(this);\n var cacheMap = this._cacheMap;\n var cacheKey; // If caching and there is a cache-hit, return cached Promise.\n\n if (cacheMap) {\n cacheKey = this._cacheKeyFn(key);\n var cachedPromise = cacheMap.get(cacheKey);\n\n if (cachedPromise) {\n var cacheHits = batch.cacheHits || (batch.cacheHits = []);\n return new Promise(function (resolve) {\n cacheHits.push(function () {\n resolve(cachedPromise);\n });\n });\n }\n } // Otherwise, produce a new Promise for this key, and enqueue it to be\n // dispatched along with the current batch.\n\n\n batch.keys.push(key);\n var promise = new Promise(function (resolve, reject) {\n batch.callbacks.push({\n resolve: resolve,\n reject: reject\n });\n }); // If caching, cache this promise.\n\n if (cacheMap) {\n cacheMap.set(cacheKey, promise);\n }\n\n return promise;\n }\n /**\n * Loads multiple keys, promising an array of values:\n *\n * var [ a, b ] = await myLoader.loadMany([ 'a', 'b' ]);\n *\n * This is similar to the more verbose:\n *\n * var [ a, b ] = await Promise.all([\n * myLoader.load('a'),\n * myLoader.load('b')\n * ]);\n *\n * However it is different in the case where any load fails. Where\n * Promise.all() would reject, loadMany() always resolves, however each result\n * is either a value or an Error instance.\n *\n * var [ a, b, c ] = await myLoader.loadMany([ 'a', 'b', 'badkey' ]);\n * // c instanceof Error\n *\n */\n ;\n\n _proto.loadMany = function loadMany(keys) {\n if (!isArrayLike(keys)) {\n throw new TypeError('The loader.loadMany() function must be called with Array<key> ' + (\"but got: \" + keys + \".\"));\n } // Support ArrayLike by using only minimal property access\n\n\n var loadPromises = [];\n\n for (var i = 0; i < keys.length; i++) {\n loadPromises.push(this.load(keys[i])[\"catch\"](function (error) {\n return error;\n }));\n }\n\n return Promise.all(loadPromises);\n }\n /**\n * Clears the value at `key` from the cache, if it exists. Returns itself for\n * method chaining.\n */\n ;\n\n _proto.clear = function clear(key) {\n var cacheMap = this._cacheMap;\n\n if (cacheMap) {\n var cacheKey = this._cacheKeyFn(key);\n\n cacheMap[\"delete\"](cacheKey);\n }\n\n return this;\n }\n /**\n * Clears the entire cache. To be used when some event results in unknown\n * invalidations across this particular `DataLoader`. Returns itself for\n * method chaining.\n */\n ;\n\n _proto.clearAll = function clearAll() {\n var cacheMap = this._cacheMap;\n\n if (cacheMap) {\n cacheMap.clear();\n }\n\n return this;\n }\n /**\n * Adds the provided key and value to the cache. If the key already\n * exists, no change is made. Returns itself for method chaining.\n *\n * To prime the cache with an error at a key, provide an Error instance.\n */\n ;\n\n _proto.prime = function prime(key, value) {\n var cacheMap = this._cacheMap;\n\n if (cacheMap) {\n var cacheKey = this._cacheKeyFn(key); // Only add the key if it does not already exist.\n\n\n if (cacheMap.get(cacheKey) === undefined) {\n // Cache a rejected promise if the value is an Error, in order to match\n // the behavior of load(key).\n var promise;\n\n if (value instanceof Error) {\n promise = Promise.reject(value); // Since this is a case where an Error is intentionally being primed\n // for a given key, we want to disable unhandled promise rejection.\n\n promise[\"catch\"](function () {});\n } else {\n promise = Promise.resolve(value);\n }\n\n cacheMap.set(cacheKey, promise);\n }\n }\n\n return this;\n }\n /**\n * The name given to this `DataLoader` instance. Useful for APM tools.\n *\n * Is `null` if not set in the constructor.\n */\n ;\n\n return DataLoader;\n}(); // Private: Enqueue a Job to be executed after all \"PromiseJobs\" Jobs.\n//\n// ES6 JavaScript uses the concepts Job and JobQueue to schedule work to occur\n// after the current execution context has completed:\n// http://www.ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues\n//\n// Node.js uses the `process.nextTick` mechanism to implement the concept of a\n// Job, maintaining a global FIFO JobQueue for all Jobs, which is flushed after\n// the current call stack ends.\n//\n// When calling `then` on a Promise, it enqueues a Job on a specific\n// \"PromiseJobs\" JobQueue which is flushed in Node as a single Job on the\n// global JobQueue.\n//\n// DataLoader batches all loads which occur in a single frame of execution, but\n// should include in the batch all loads which occur during the flushing of the\n// \"PromiseJobs\" JobQueue after that same execution frame.\n//\n// In order to avoid the DataLoader dispatch Job occuring before \"PromiseJobs\",\n// A Promise Job is created with the sole purpose of enqueuing a global Job,\n// ensuring that it always occurs after \"PromiseJobs\" ends.\n//\n// Node.js's job queue is unique. Browsers do not have an equivalent mechanism\n// for enqueuing a job to be performed after promise microtasks and before the\n// next macrotask. For browser environments, a macrotask is used (via\n// setImmediate or setTimeout) at a potential performance penalty.\n\n\nvar enqueuePostPromiseJob = typeof process === 'object' && typeof process.nextTick === 'function' ? function (fn) {\n if (!resolvedPromise) {\n resolvedPromise = Promise.resolve();\n }\n\n resolvedPromise.then(function () {\n process.nextTick(fn);\n });\n} : typeof setImmediate === 'function' ? function (fn) {\n setImmediate(fn);\n} : function (fn) {\n setTimeout(fn);\n}; // Private: cached resolved Promise instance\n\nvar resolvedPromise; // Private: Describes a batch of requests\n\n// Private: Either returns the current batch, or creates and schedules a\n// dispatch of a new batch for the given loader.\nfunction getCurrentBatch(loader) {\n // If there is an existing batch which has not yet dispatched and is within\n // the limit of the batch size, then return it.\n var existingBatch = loader._batch;\n\n if (existingBatch !== null && !existingBatch.hasDispatched && existingBatch.keys.length < loader._maxBatchSize) {\n return existingBatch;\n } // Otherwise, create a new batch for this loader.\n\n\n var newBatch = {\n hasDispatched: false,\n keys: [],\n callbacks: []\n }; // Store it on the loader so it may be reused.\n\n loader._batch = newBatch; // Then schedule a task to dispatch this batch of requests.\n\n loader._batchScheduleFn(function () {\n dispatchBatch(loader, newBatch);\n });\n\n return newBatch;\n}\n\nfunction dispatchBatch(loader, batch) {\n // Mark this batch as having been dispatched.\n batch.hasDispatched = true; // If there's nothing to load, resolve any cache hits and return early.\n\n if (batch.keys.length === 0) {\n resolveCacheHits(batch);\n return;\n } // Call the provided batchLoadFn for this loader with the batch's keys and\n // with the loader as the `this` context.\n\n\n var batchPromise;\n\n try {\n batchPromise = loader._batchLoadFn(batch.keys);\n } catch (e) {\n return failedDispatch(loader, batch, new TypeError('DataLoader must be constructed with a function which accepts ' + 'Array<key> and returns Promise<Array<value>>, but the function ' + (\"errored synchronously: \" + String(e) + \".\")));\n } // Assert the expected response from batchLoadFn\n\n\n if (!batchPromise || typeof batchPromise.then !== 'function') {\n return failedDispatch(loader, batch, new TypeError('DataLoader must be constructed with a function which accepts ' + 'Array<key> and returns Promise<Array<value>>, but the function did ' + (\"not return a Promise: \" + String(batchPromise) + \".\")));\n } // Await the resolution of the call to batchLoadFn.\n\n\n batchPromise.then(function (values) {\n // Assert the expected resolution from batchLoadFn.\n if (!isArrayLike(values)) {\n throw new TypeError('DataLoader must be constructed with a function which accepts ' + 'Array<key> and returns Promise<Array<value>>, but the function did ' + (\"not return a Promise of an Array: \" + String(values) + \".\"));\n }\n\n if (values.length !== batch.keys.length) {\n throw new TypeError('DataLoader must be constructed with a function which accepts ' + 'Array<key> and returns Promise<Array<value>>, but the function did ' + 'not return a Promise of an Array of the same length as the Array ' + 'of keys.' + (\"\\n\\nKeys:\\n\" + String(batch.keys)) + (\"\\n\\nValues:\\n\" + String(values)));\n } // Resolve all cache hits in the same micro-task as freshly loaded values.\n\n\n resolveCacheHits(batch); // Step through values, resolving or rejecting each Promise in the batch.\n\n for (var i = 0; i < batch.callbacks.length; i++) {\n var _value = values[i];\n\n if (_value instanceof Error) {\n batch.callbacks[i].reject(_value);\n } else {\n batch.callbacks[i].resolve(_value);\n }\n }\n })[\"catch\"](function (error) {\n failedDispatch(loader, batch, error);\n });\n} // Private: do not cache individual loads if the entire batch dispatch fails,\n// but still reject each request so they do not hang.\n\n\nfunction failedDispatch(loader, batch, error) {\n // Cache hits are resolved, even though the batch failed.\n resolveCacheHits(batch);\n\n for (var i = 0; i < batch.keys.length; i++) {\n loader.clear(batch.keys[i]);\n batch.callbacks[i].reject(error);\n }\n} // Private: Resolves the Promises for any cache hits in this batch.\n\n\nfunction resolveCacheHits(batch) {\n if (batch.cacheHits) {\n for (var i = 0; i < batch.cacheHits.length; i++) {\n batch.cacheHits[i]();\n }\n }\n} // Private: given the DataLoader's options, produce a valid max batch size.\n\n\nfunction getValidMaxBatchSize(options) {\n var shouldBatch = !options || options.batch !== false;\n\n if (!shouldBatch) {\n return 1;\n }\n\n var maxBatchSize = options && options.maxBatchSize;\n\n if (maxBatchSize === undefined) {\n return Infinity;\n }\n\n if (typeof maxBatchSize !== 'number' || maxBatchSize < 1) {\n throw new TypeError(\"maxBatchSize must be a positive number: \" + maxBatchSize);\n }\n\n return maxBatchSize;\n} // Private\n\n\nfunction getValidBatchScheduleFn(options) {\n var batchScheduleFn = options && options.batchScheduleFn;\n\n if (batchScheduleFn === undefined) {\n return enqueuePostPromiseJob;\n }\n\n if (typeof batchScheduleFn !== 'function') {\n throw new TypeError(\"batchScheduleFn must be a function: \" + batchScheduleFn);\n }\n\n return batchScheduleFn;\n} // Private: given the DataLoader's options, produce a cache key function.\n\n\nfunction getValidCacheKeyFn(options) {\n var cacheKeyFn = options && options.cacheKeyFn;\n\n if (cacheKeyFn === undefined) {\n return function (key) {\n return key;\n };\n }\n\n if (typeof cacheKeyFn !== 'function') {\n throw new TypeError(\"cacheKeyFn must be a function: \" + cacheKeyFn);\n }\n\n return cacheKeyFn;\n} // Private: given the DataLoader's options, produce a CacheMap to be used.\n\n\nfunction getValidCacheMap(options) {\n var shouldCache = !options || options.cache !== false;\n\n if (!shouldCache) {\n return null;\n }\n\n var cacheMap = options && options.cacheMap;\n\n if (cacheMap === undefined) {\n return new Map();\n }\n\n if (cacheMap !== null) {\n var cacheFunctions = ['get', 'set', 'delete', 'clear'];\n var missingFunctions = cacheFunctions.filter(function (fnName) {\n return cacheMap && typeof cacheMap[fnName] !== 'function';\n });\n\n if (missingFunctions.length !== 0) {\n throw new TypeError('Custom cacheMap missing methods: ' + missingFunctions.join(', '));\n }\n }\n\n return cacheMap;\n}\n\nfunction getValidName(options) {\n if (options && options.name) {\n return options.name;\n }\n\n return null;\n} // Private\n\n\nfunction isArrayLike(x) {\n return typeof x === 'object' && x !== null && typeof x.length === 'number' && (x.length === 0 || x.length > 0 && Object.prototype.hasOwnProperty.call(x, x.length - 1));\n}\n\nmodule.exports = DataLoader;","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseAggregator;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var arrayAggregator = require('./_arrayAggregator'),\n baseAggregator = require('./_baseAggregator'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nmodule.exports = createAggregator;\n","var createAggregator = require('./_createAggregator');\n\n/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\nvar partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n}, function() { return [[], []]; });\n\nmodule.exports = partition;\n","/**\n * @fileoverview Ponder SQL client initialization and React hooks.\n *\n * Sets up the connection to the indexer's SQL-over-HTTP endpoint\n * and provides type-safe query hooks for React components.\n *\n * @remarks\n * The client uses the schema directly from the indexer package for\n * full type safety without any code generation step.\n *\n * Environment variables:\n * - `VITE_INDEXER_URL` - Indexer base URL (defaults to localhost:21820)\n *\n * @see {@link ./ponderQueries} for query helper functions\n */\n\nimport { createClient, type Client } from \"@ponder/client\";\nimport { usePonderQuery as useBasePonderQuery, type ResolvedSchema } from \"@ponder/react\";\nimport type { DefaultError, UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\nimport * as defaultSchema from \"indexer/schema\";\n\n/**\n * Default indexer URL. Overridable via VITE_INDEXER_URL env var or\n * createProvexIndexerClient({ url }).\n */\nconst DEFAULT_INDEXER_URL = \"https://indexer.provex.com\";\n\nfunction readEnvVar(name: string): string | undefined {\n try {\n const meta = import.meta as unknown as { env?: Record<string, string | undefined> };\n if (meta.env?.[name]) return meta.env[name];\n } catch {\n // import.meta not available in this runtime\n }\n if (typeof process !== 'undefined' && process.env?.[name]) return process.env[name];\n return undefined;\n}\n\nconst baseUrl = readEnvVar('VITE_INDEXER_URL') ?? DEFAULT_INDEXER_URL;\n\n/**\n * Create a custom indexer client with your own URL and/or schema.\n *\n * The bundled `@provex/indexer-client` tarball includes the Provex indexer\n * schema by default. Supply a different schema (e.g., a fork of the indexer\n * that adds custom tables) by passing it here.\n *\n * @example\n * ```ts\n * import { createProvexIndexerClient } from '@provex/indexer-client'\n * import * as mySchema from './my-custom-schema'\n *\n * const client = createProvexIndexerClient({\n * url: 'https://staging-indexer.example.com',\n * schema: mySchema,\n * })\n * ```\n */\nexport function createProvexIndexerClient(\n opts: { url?: string; schema?: typeof defaultSchema } = {},\n) {\n const url = opts.url ?? baseUrl;\n const schema = opts.schema ?? defaultSchema;\n return createClient(`${url}/sql`, { schema });\n}\n\n/**\n * Default Ponder SQL over HTTP client pointing at https://indexer.provex.com.\n * For a custom URL or schema, use {@link createProvexIndexerClient}.\n */\nexport const ponderClient = createProvexIndexerClient();\n\n/**\n * Custom usePonderQuery hook with live updates disabled by default.\n * This improves query performance by preventing continuous polling.\n *\n * @param params - Query parameters with live updates disabled by default\n * @returns Query result from React Query\n *\n * @example\n * ```typescript\n * const { data, isLoading } = usePonderQuery({\n * queryFn: async (db) => {\n * return await db\n * .select()\n * .from(schema.deposits)\n * .where(eq(schema.deposits.status, 'active'))\n * }\n * })\n * ```\n */\nexport function usePonderQuery<\n queryFnData = unknown,\n error = DefaultError,\n data = queryFnData,\n>(\n params: {\n queryFn: (db: Client<ResolvedSchema>[\"db\"]) => Promise<queryFnData>;\n live?: boolean;\n } & Omit<UseQueryOptions<queryFnData, error, data>, \"queryFn\" | \"queryKey\">,\n): UseQueryResult<data, error> {\n return useBasePonderQuery({\n ...params,\n live: params.live ?? true, // Enable live polling by default for real-time updates\n });\n}\n\n// ─── Token Indexer Client ────────────────────────────────────────────────────\n\nimport * as defaultTokenSchema from \"token-indexer/schema\";\n\nconst DEFAULT_TOKEN_INDEXER_URL = \"https://token.provex.com\";\n\nconst tokenBaseUrl = readEnvVar('VITE_TOKEN_INDEXER_URL') ?? DEFAULT_TOKEN_INDEXER_URL;\n\n/**\n * Create a custom token indexer client. See {@link createProvexIndexerClient}\n * for the schema-swap use case.\n */\nexport function createProvexTokenIndexerClient(\n opts: { url?: string; schema?: typeof defaultTokenSchema } = {},\n) {\n const url = opts.url ?? tokenBaseUrl;\n const schema = opts.schema ?? defaultTokenSchema;\n return createClient(`${url}/sql`, { schema });\n}\n\nexport const tokenPonderClient = createProvexTokenIndexerClient();\n\n// Default schemas exported for consumers that want to introspect or extend them.\nexport { defaultSchema as schema, defaultTokenSchema as tokenSchema };\n\n// Alias kept for backwards compatibility.\nexport { ponderClient as client };\n","/**\n * @fileoverview Ponder database schema for the Provex indexer.\n *\n * This schema defines all tables used to store indexed blockchain data.\n * Tables are organized into categories:\n *\n * **Core Entities:**\n * - `deposit` - Escrow deposits with funds, rates, and configuration\n * - `participant` - Unique depositor/payer addresses\n * - `block`, `transaction` - Blockchain metadata\n * - `event` - Normalized event log for all indexed events\n *\n * **Deposit Events:**\n * - `depositReceived` - New deposit creation\n * - `depositFundsAdded` - Funds added to existing deposit\n * - `depositWithdrawn` - Funds removed from deposit\n * - `depositClosed` - V2 deposit closure\n * - `depositCurrencyAdded` - Currency support added\n * - `depositConversionRateUpdated` - Rate changes\n *\n * **Intent Events:**\n * - `intentSignaled` - New intent created\n * - `fundsLocked` - V3 funds locked for intent\n * - `intentFulfilled` - Intent successfully completed\n * - `intentPruned` - Intent cancelled/expired\n * - `fundsUnlockedAndTransferred` - Funds released to buyer\n *\n * **Configuration Events:**\n * - Protocol fees, dust thresholds, verifier registrations, etc.\n *\n * **Statistics:**\n * - `stat` - Aggregated hourly/daily/monthly metrics\n *\n * @remarks\n * Tables use composite primary keys for cross-chain uniqueness:\n * - Deposits: (escrow, localId, chainId)\n * - Participants: (address, chainId)\n * - Events: orderId (includes timestamp, chain, tx index, log index)\n *\n * @see {@link @provex/utils} for shared type definitions\n */\n\nimport { onchainEnum, onchainTable, primaryKey, relations, index } from \"ponder\";\n\n/**\n * Deposit status values for onchainEnum.\n * Keep in sync with @provex/utils/deposit.ts\n *\n * V2: active, underfunded, withdrawn, closed\n * V3: active, underfunded, withdrawn, paused (no 'closed' state)\n */\nconst DEPOSIT_STATUSES = ['active', 'closed', 'paused', 'withdrawn', 'underfunded'] as const;\n\n/**\n * Escrow version values for onchainEnum.\n * Keep in sync with @provex/utils/deposit.ts\n */\nconst ESCROW_VERSIONS = ['v2', 'v3'] as const;\n\n/**\n * ContractStateLink\n *\n * Normalized link table that points to the current state record for any contract.\n * Does NOT store the actual value - values live in the event-specific tables\n * (dustRecipientUpdated, dustThresholdUpdated, protocolFeeUpdated, etc.).\n *\n * Used for tracking current state of:\n * - Dust configuration: 'dustRecipient', 'dustThreshold'\n * - Protocol fees: 'protocolFee', 'protocolFeeRecipient'\n * - Any other contract state that changes over time\n *\n * To get the actual value, join to the appropriate event table using updatedOrderId.\n */\nexport const contractStateLink = onchainTable(\"contractStateLink\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n stateKey: t.text().notNull(),\n updatedOrderId: t.hex().notNull(),\n updatedLogId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId, table.stateKey] }),\n}));\n\nexport const contractStateLinkReferences = relations(contractStateLink, ({ one }) => ({\n event: one(event, {\n fields: [contractStateLink.updatedLogId],\n references: [event.logId],\n }),\n}));\n\n/**\n * FundsLocked (V3 only)\n *\n * Records when funds are temporarily locked for an intent in V3 escrow contracts.\n * In V3, intents have an explicit lock/unlock mechanism with expiry times.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 intents do not use\n * explicit locking - funds remain available in the deposit until fulfillment.\n *\n * Created by: V3Escrow:FundsLocked event\n * One record per intent lock operation.\n */\nexport const fundsLocked = onchainTable(\"fundsLocked\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n intentHash: t.hex().notNull(),\n amount: t.bigint().notNull(),\n expiryTime: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}), (table) => ({\n /** Browse page: useMatchableDeposits batches fundsLocked by deposit compound key */\n depositIdx: index().on(table.depositEscrow, table.depositLocalId, table.depositChainId),\n}));\n\nexport const fundsLockedReferences = relations(fundsLocked, ({ one }) => ({\n transaction: one(transaction, {\n fields: [fundsLocked.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [fundsLocked.depositEscrow, fundsLocked.depositLocalId, fundsLocked.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [fundsLocked.logId],\n references: [event.logId],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [fundsLocked.intentHash, fundsLocked.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\n/**\n * FundsUnlockedAndTransferred (V2 synthetic, V3 native)\n *\n * Records when locked funds are unlocked and transferred to fulfill an intent.\n * This represents successful intent fulfillment where funds move from the deposit to the fulfiller.\n * Includes fee breakdowns (maker fees, referrer fees).\n *\n * V2 behavior: V2 deposits create synthetic FundsUnlockedAndTransferred events for consistency with V3.\n * V3 behavior: V3 deposits emit native FundsUnlockedAndTransferred events.\n *\n * Created by: V3Escrow:FundsUnlockedAndTransferred event (native), V2 synthetic event\n * One record per successful intent fulfillment.\n */\nexport const fundsUnlockedAndTransferred = onchainTable(\"fundsUnlockedAndTransferred\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n intentHash: t.hex().notNull(),\n to: t.hex().notNull(),\n transferredAmount: t.bigint().notNull(),\n makerFees: t.bigint().notNull(),\n referrerFees: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n}), (table) => ({\n /** Browse page: useMatchableDeposits batches transfers by deposit compound key */\n depositIdx: index().on(table.depositEscrow, table.depositLocalId, table.depositChainId),\n}));\n\nexport const fundsUnlockedAndTransferredReferences = relations(fundsUnlockedAndTransferred, ({ one }) => ({\n transaction: one(transaction, {\n fields: [fundsUnlockedAndTransferred.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [fundsUnlockedAndTransferred.depositEscrow, fundsUnlockedAndTransferred.depositLocalId, fundsUnlockedAndTransferred.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [fundsUnlockedAndTransferred.logId],\n references: [event.logId],\n }),\n participant: one(participant, {\n fields: [fundsUnlockedAndTransferred.participantAddress],\n references: [participant.address],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [fundsUnlockedAndTransferred.intentHash, fundsUnlockedAndTransferred.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\n/**\n * Block\n *\n * Stores blockchain block metadata for all indexed blocks.\n * Provides temporal context for all transactions and events.\n *\n * Created by: Every event handler via upsertBlock()\n * One record per unique block.\n */\nexport const block = onchainTable(\"block\", (t) => ({\n hash: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n orderId: t.hex().notNull(),\n number: t.bigint().notNull(),\n timestamp: t.bigint().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.hash, table.chainId] }),\n}));\n\n/**\n * Transevent\n *\n * Stores transaction metadata for all indexed transactions.\n * Links events to their containing transaction and block.\n *\n * Created by: Every event handler via upsertTransevent()\n * One record per unique transaction.\n */\nexport const transaction = onchainTable(\"transaction\", (t) => ({\n hash: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n orderId: t.hex().notNull(),\n blockId: t.hex().notNull(),\n index: t.bigint().notNull(),\n from: t.hex().notNull(),\n to: t.hex().notNull(), // which contract was called\n}), (table) => ({\n pk: primaryKey({ columns: [table.hash, table.chainId] }),\n}));\n\nexport const transactionReferences = relations(transaction, ({ one, many }) => ({\n block: one(block, {\n fields: [transaction.blockId],\n references: [block.orderId],\n }),\n deposits: many(deposit),\n depositReceiveds: many(depositReceived),\n depositWithdrawns: many(depositWithdrawn),\n depositCloseds: many(depositClosed),\n depositCurrencyAddeds: many(depositCurrencyAdded),\n depositConversionRateUpdateds: many(depositConversionRateUpdated),\n intentSignaleds: many(intentSignaled),\n intentPruneds: many(intentPruned),\n intentFulfilleds: many(intentFulfilled),\n fundsLockeds: many(fundsLocked),\n fundsUnlockeds: many(fundsUnlocked),\n fundsUnlockedAndTransferreds: many(fundsUnlockedAndTransferred),\n intentExpiryExtendeds: many(intentExpiryExtended),\n depositPaymentMethodActiveUpdateds: many(depositPaymentMethodActiveUpdated),\n events: many(event),\n}));\n\n/**\n * Participant\n *\n * Represents unique users/addresses across all chains in the system.\n * Participants can be deposit owners, intent fulfillers, or transaction initiators.\n *\n * Created by: All event handlers when new addresses are encountered\n * One record per unique (address, chainId) pair.\n */\nexport const participant = onchainTable(\"participant\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n /** Block timestamp of first IntentSignaled by this address */\n firstSeenAt: t.bigint(),\n /** Block timestamp of most recent IntentSignaled by this address */\n lastSignaledAt: t.bigint(),\n}), (table) => ({\n // Composite primary key: same address can exist on multiple chains\n pk: primaryKey({ columns: [table.address, table.chainId] }),\n}));\n\nexport const participantReferences = relations(participant, ({ many, one }) => ({\n deposits: many(deposit),\n depositReceived: many(depositReceived),\n depositWithdrawn: many(depositWithdrawn),\n stats: one(participantStats, {\n fields: [participant.address, participant.chainId],\n references: [participantStats.address, participantStats.chainId],\n }),\n}));\n\n/**\n * ParticipantStats\n *\n * Pre-computed aggregate stats per participant (address + chain).\n * Maintained incrementally by IntentSignaled, IntentFulfilled, and IntentPruned handlers.\n * Replaces the 4-round-trip getUserReputationStats() query-time computation.\n */\nexport const participantStats = onchainTable(\"participantStats\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n /** Total intents signaled */\n totalSignaled: t.integer().notNull().default(0),\n /** Total intents fulfilled */\n fulfilledCount: t.integer().notNull().default(0),\n /** Total fulfilled volume in token base units */\n fulfilledVolume: t.bigint().notNull().default(0n),\n /** Total intents pruned */\n prunedCount: t.integer().notNull().default(0),\n /** Pruned intents where signal-to-prune time exceeded 15 minutes */\n lateCancellations: t.integer().notNull().default(0),\n /** Last updated block timestamp */\n updatedAt: t.bigint().notNull().default(0n),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId] }),\n}));\n\nexport const participantStatsReferences = relations(participantStats, ({ one }) => ({\n participant: one(participant, {\n fields: [participantStats.address, participantStats.chainId],\n references: [participant.address, participant.chainId],\n }),\n}));\n\n/**\n * DailyParticipant\n *\n * Tracks unique participant activity per day for repeat rate computation.\n * One row per (address, chainId, dayTimestamp). Upserted on each IntentSignaled —\n * the onConflictDoNothing ensures only one row per address per day.\n * `isReturning` is true if the participant existed before this day (checked via participant.firstSeenAt).\n */\nexport const dailyParticipant = onchainTable(\"dailyParticipant\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n dayTimestamp: t.bigint().notNull(),\n /** True if this address appeared on a previous day (participant existed before this intent) */\n isReturning: t.boolean().notNull(),\n /** 'maker' | 'taker' — role in this day's activity */\n role: t.text().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId, table.dayTimestamp, table.role] }),\n}));\n\n/**\n * DepositStats\n *\n * Pre-computed aggregate stats per deposit (escrow + localId + chain).\n * Maintained incrementally by deposit lifecycle event handlers.\n * maxRemaining is a high-water mark — the highest `remaining` balance the deposit has ever had.\n */\nexport const depositStats = onchainTable(\"depositStats\", (t) => ({\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n /** High-water mark of deposit.remaining — used for progress bar right edge */\n maxRemaining: t.bigint().notNull().default(0n),\n /** Cumulative amount transferred to takers via FundsUnlockedAndTransferred */\n totalAmountTaken: t.bigint().notNull().default(0n),\n /** Cumulative amount withdrawn by depositor */\n totalWithdrawn: t.bigint().notNull().default(0n),\n /** Total deposited including FundsAdded (DepositReceived + FundsAdded) */\n grossDeposited: t.bigint().notNull().default(0n),\n /** Number of intents signaled against this deposit */\n signaledIntents: t.integer().notNull().default(0),\n /** Number of intents fulfilled */\n fulfilledIntents: t.integer().notNull().default(0),\n /** Number of intents pruned (cancelled + expired) */\n prunedIntents: t.integer().notNull().default(0),\n /** Success rate in basis points: (fulfilled / (fulfilled + pruned)) * 10000 */\n successRateBps: t.integer().notNull().default(0),\n /** Last updated block timestamp */\n updatedAt: t.bigint().notNull().default(0n),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId] }),\n}));\n\nexport const depositStatsReferences = relations(depositStats, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositStats.depositEscrow, depositStats.depositLocalId, depositStats.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n}));\n\n/**\n * Event (formerly Action)\n *\n * Universal event log providing chronological ordering of all system activity.\n * Records every blockchain event processed by the indexer with references to related entities.\n * Enables querying complete audit trails and event timelines across all contracts and entity types.\n *\n * Event ordering:\n * - orderId: Globally unique event identifier (primary key)\n * - logId: Log position for deterministic ordering\n *\n * Entity references (all nullable to support various event types):\n * - Deposit events: depositEscrow, depositLocalId, depositChainId\n * - Payment method events: paymentMethodId\n * - Intent events: intentHash\n *\n * Common fields:\n * - eventName: Event type (e.g., \"DepositReceived\", \"IntentSignaled\", \"PaymentMethodAdded\")\n * - participantAddress: Actor who triggered the event (transaction sender)\n * - transactionId: Transaction containing this event\n *\n * Created by: All event handlers across V2Escrow, V3Escrow, Orchestrator, PaymentVerifierRegistry\n * One record per blockchain event processed.\n */\nexport const event = onchainTable(\"event\", (t) => ({\n orderId: t.hex().notNull().primaryKey(),\n logId: t.hex().notNull(),\n eventName: t.text().notNull(),\n participantAddress: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n // Deposit reference (nullable - only for deposit-related events)\n depositEscrow: t.hex(),\n depositLocalId: t.bigint(),\n depositChainId: t.bigint(),\n // Payment method reference (nullable - only for payment method events)\n paymentMethodId: t.hex(),\n // Currency reference (nullable - only for DepositCurrencyAdded events)\n currency: t.hex(),\n // Intent reference (nullable - only for intent events)\n intentHash: t.hex(),\n}));\n\nexport const eventReferences = relations(event, ({ one }) => ({\n participant: one(participant, {\n fields: [event.participantAddress],\n references: [participant.address],\n }),\n transaction: one(transaction, {\n fields: [event.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [event.depositEscrow, event.depositLocalId, event.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [event.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n intent: one(intentSignaled, {\n fields: [event.intentHash, event.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n depositReceived: one(depositReceived, {\n fields: [event.orderId],\n references: [depositReceived.orderId],\n }),\n depositWithdrawn: one(depositWithdrawn, {\n fields: [event.orderId],\n references: [depositWithdrawn.orderId],\n }),\n fundsUnlockedAndTransferred: one(fundsUnlockedAndTransferred, {\n fields: [event.orderId],\n references: [fundsUnlockedAndTransferred.orderId],\n }),\n}));\n\nexport const status = onchainEnum('status', DEPOSIT_STATUSES)\nexport const version = onchainEnum('version', ESCROW_VERSIONS)\n\n/**\n * Deposit\n *\n * Core table representing escrowed funds available for P2P exchange.\n * Tracks token deposits that can be exchanged for fiat currency via intents.\n * Uses compound primary key (escrow, localId, chainId) for cross-contract uniqueness.\n *\n * Status lifecycle:\n * - active: Deposit is open and accepting intents\n * - underfunded: Remaining balance is below minAmount\n * - withdrawn: Owner revoked the deposit\n * - closed: Deposit fulfilled and explicitly closed\n *\n * Created by: V2Escrow:DepositReceived or V3Escrow:DepositReceived\n * Updated by: Intent fulfillments, withdrawals, delegate changes, etc.\n * One record per deposit across all escrow contracts.\n */\nexport const deposit = onchainTable(\"deposit\", (t) => ({\n // Compound primary key fields\n escrow: t.hex().notNull(),\n localId: t.bigint().notNull(),\n chainId: t.bigint().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n token: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n deposited: t.bigint().notNull(),\n remaining: t.bigint().notNull(),\n outstandingIntentAmount: t.bigint().notNull(),\n minAmount: t.bigint().notNull(),\n maxAmount: t.bigint().notNull(),\n depositConversionRateCurrencies: t.hex().array().notNull(),\n depositConversionRateVerifiers: t.hex().array().notNull(),\n // v3 fields (nullable for back-compat)\n version: version('version').notNull(),\n acceptingIntents: t.boolean().notNull(),\n delegate: t.hex().notNull(),\n intentGuardian: t.hex().notNull(),\n retainOnEmpty: t.boolean().notNull(), // v3 only: if true, deposit stays open even when balance is 0 (defaults to false for v2)\n // a deposit has an implicit state:\n // active: the deposit is still open\n // drained: the deposit is drained of funds but not yet withdrawn/closed\n // - the remaining balance is less than the minimum amount\n // - applied by the deposit or the verifier's terms\n // withdrawn: the deposit has been revoked by the owner\n // closed: the deposit is closed by successfully fulfilling the intent\n status: status('status').notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.escrow, table.localId, table.chainId] }),\n /** User dashboard: getDepositsByParticipant() filters by (participantAddress, chainId) */\n participantIdx: index().on(table.participantAddress, table.chainId),\n /** Orderbook browse: getActiveDeposits() / getDepositsWithRates() filter by (status, chainId) */\n statusIdx: index().on(table.status, table.chainId),\n}));\n\n/**\n * IntentSignaled\n *\n * Records user intent to exchange deposit tokens for fiat currency.\n * Unified table supporting both V2 and V3 intent mechanisms.\n * Each intent specifies amount, currency, conversion rate, and payment method.\n *\n * Created by: V2Escrow:IntentSignaled, Orchestrator:IntentSignaled, or inferred from V3Escrow:FundsLocked\n * One record per unique intent (identified by intentHash + chainId for cross-chain support).\n */\nexport const intentSignaled = onchainTable(\"intentSignaled\", (t) => ({\n intentHash: t.hex().notNull(),\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n escrow: t.hex().notNull(),\n paymentMethodId: t.hex().notNull(),\n ownerAddress: t.hex().notNull(),\n toAddress: t.hex().notNull(),\n amount: t.bigint().notNull(),\n fiatCurrency: t.hex().notNull(),\n conversionRate: t.bigint().notNull(),\n timestamp: t.bigint().notNull(),\n /** Conversion rate change ID for rate lookup (nullable - populated when rate tracking is available) */\n conversionRateChangeId: t.integer(),\n /** Lifecycle status: signaled → fulfilled | cancelled | expired. Updated by IntentFulfilled/IntentPruned handlers. */\n status: t.text().notNull().default('signaled'),\n}), (table) => ({\n pk: primaryKey({ columns: [table.intentHash, table.depositChainId] }),\n /** Deposit detail: getIntentSignals() + getDepositByCompoundKey() look up intents by deposit */\n depositIdx: index().on(table.depositEscrow, table.depositLocalId, table.depositChainId),\n /** User dashboard: getActivityForAddress() queries intents by owner */\n ownerIdx: index().on(table.ownerAddress, table.depositChainId),\n}));\n\nexport const intentSignaledReferences = relations(intentSignaled, ({ one }) => ({\n deposit: one(deposit, {\n fields: [intentSignaled.depositEscrow, intentSignaled.depositLocalId, intentSignaled.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [intentSignaled.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n transaction: one(transaction, {\n fields: [intentSignaled.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [intentSignaled.logId],\n references: [event.logId],\n }),\n owner: one(participant, {\n fields: [intentSignaled.ownerAddress],\n references: [participant.address],\n }),\n participant: one(participant, {\n fields: [intentSignaled.toAddress],\n references: [participant.address],\n }),\n /** Points to the depositCurrencyAdded record for this intent's payment method and currency */\n depositCurrencyAdded: one(depositCurrencyAdded, {\n fields: [\n intentSignaled.depositEscrow,\n intentSignaled.depositLocalId,\n intentSignaled.depositChainId,\n intentSignaled.paymentMethodId,\n intentSignaled.fiatCurrency,\n ],\n references: [\n depositCurrencyAdded.depositEscrow,\n depositCurrencyAdded.depositLocalId,\n depositCurrencyAdded.depositChainId,\n depositCurrencyAdded.paymentMethodId,\n depositCurrencyAdded.currency,\n ],\n relationName: \"intentSignaled_depositCurrencyAdded\"\n }),\n /** Points to the active conversion rate at the time the intent was created */\n depositConversionRateUpdated: one(depositConversionRateUpdated, {\n fields: [\n intentSignaled.depositEscrow,\n intentSignaled.depositLocalId,\n intentSignaled.depositChainId,\n intentSignaled.paymentMethodId,\n intentSignaled.fiatCurrency,\n intentSignaled.conversionRateChangeId,\n ],\n references: [\n depositConversionRateUpdated.depositEscrow,\n depositConversionRateUpdated.depositLocalId,\n depositConversionRateUpdated.depositChainId,\n depositConversionRateUpdated.paymentMethodId,\n depositConversionRateUpdated.currency,\n depositConversionRateUpdated.changeId,\n ],\n relationName: \"intentSignaled_depositConversionRateUpdated\"\n }),\n /** V3 only: Points to the fundsLocked record containing expiryTime */\n fundsLocked: one(fundsLocked, {\n fields: [intentSignaled.intentHash],\n references: [fundsLocked.intentHash],\n }),\n}));\n\n/**\n * IntentPruned (V2 only)\n *\n * Records when an unfulfilled intent is manually pruned/cancelled from the system.\n * Allows deposit owners or authorized parties to clean up stale intents.\n *\n * V3 behavior: V3 deposits will have no records in this table. V3 intents expire automatically\n * via the expiryTime mechanism and are cancelled via `fundsUnlocked`, not explicit pruning.\n *\n * Created by: V2Escrow:IntentPruned event\n * One record per pruned intent.\n */\nexport const intentPruned = onchainTable(\"intentPruned\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n intentHash: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n /** Address that called the prune function (may differ from intent owner) */\n participantAddress: t.hex().notNull(),\n /** True when signal-to-prune elapsed time exceeded the 15-minute threshold.\n * Computed at event time — owner address and amount are on the related intentSignaled row. */\n isLateCancellation: t.boolean().notNull().default(false),\n}));\n\nexport const intentPrunedReferences = relations(intentPruned, ({ one }) => ({\n transaction: one(transaction, {\n fields: [intentPruned.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [intentPruned.depositEscrow, intentPruned.depositLocalId, intentPruned.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [intentPruned.logId],\n references: [event.logId],\n }),\n participant: one(participant, {\n fields: [intentPruned.participantAddress],\n references: [participant.address],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [intentPruned.intentHash, intentPruned.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\n/**\n * IntentFulfilled\n *\n * Records successful fulfillment of an intent where tokens are exchanged for fiat.\n * Unified table supporting both V2 and V3 fulfillment mechanisms.\n * Links to the original intent and tracks fees and participants.\n *\n * V2: Fields sustainabilityFee, verifierFee, and ownerId are populated. manualRelease is null.\n * V3: Field manualRelease is populated indicating if release was manual vs automatic.\n * V2-specific fee fields are null.\n *\n * Created by: V2Escrow:IntentFulfilled or Orchestrator:IntentFulfilled\n * One record per fulfilled intent.\n */\nexport const intentFulfilled = onchainTable(\"intentFulfilled\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n intentHash: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n amount: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n fiatCurrency: t.hex().notNull(),\n /** Conversion rate change ID for rate lookup (nullable - V2 only, V3 uses conversionRate directly) */\n conversionRateChangeId: t.integer(),\n /** Actual conversion rate used for this intent (tokens per fiat unit, scaled by 10^18).\n * For V3: Always populated from intentSignaled.conversionRate.\n * For V2: Populated from depositConversionRateUpdated.value via conversionRateChangeId lookup.\n * Used directly for profit calculations without needing to join to other tables. */\n conversionRate: t.bigint(),\n // v2-specific fields (nullable for v3)\n sustainabilityFee: t.bigint(),\n verifierFee: t.bigint(),\n ownerAddress: t.hex(),\n // v3-specific fields (nullable for v2)\n manualRelease: t.boolean(),\n /** Seconds from signal to fulfillment. Computed at index time to avoid\n * the 4-table join (intentFulfilled→intentSignaled→transaction→block)\n * that fetchFillTime() previously required. Nullable for historical rows. */\n fillTimeSeconds: t.bigint(),\n}));\n\n/**\n * PaymentVerified (V3 only)\n *\n * Records when a payment verifier validates a fiat payment against an intent.\n * Contains the verified fiat amount extracted from the payment proof.\n * This is the source of truth for the actual fiat amount that was paid.\n *\n * Created by: UnifiedPaymentVerifier:PaymentVerified event\n * One record per payment verification.\n */\nexport const paymentVerified = onchainTable(\"paymentVerified\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n intentHash: t.hex().notNull(),\n paymentMethodId: t.hex().notNull(),\n currency: t.hex().notNull(),\n amount: t.bigint().notNull(), // Verified fiat amount in currency base units (e.g., cents for USD)\n timestamp: t.bigint().notNull(),\n paymentId: t.hex().notNull(),\n payeeId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n /** Chain ID where the intent was signaled (needed for intentSignaled foreign key) */\n depositChainId: t.bigint().notNull(),\n}));\n\nexport const intentFulfilledReferences = relations(intentFulfilled, ({ one }) => ({\n transaction: one(transaction, {\n fields: [intentFulfilled.transactionId],\n references: [transaction.orderId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [intentFulfilled.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n deposit: one(deposit, {\n fields: [intentFulfilled.depositEscrow, intentFulfilled.depositLocalId, intentFulfilled.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [intentFulfilled.logId],\n references: [event.logId],\n }),\n participant: one(participant, {\n fields: [intentFulfilled.participantAddress],\n references: [participant.address],\n }),\n owner: one(participant, {\n fields: [intentFulfilled.ownerAddress],\n references: [participant.address],\n }),\n depositVerifierAdded: one(depositVerifierAdded, {\n fields: [intentFulfilled.depositEscrow, intentFulfilled.depositLocalId, intentFulfilled.depositChainId, intentFulfilled.paymentMethodId],\n references: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId, depositVerifierAdded.paymentMethodId],\n relationName: \"intentFulfilled_depositVerifierAdded\"\n }),\n depositCurrencyAdded: one(depositCurrencyAdded, {\n fields: [intentFulfilled.depositEscrow, intentFulfilled.depositLocalId, intentFulfilled.depositChainId, intentFulfilled.paymentMethodId, intentFulfilled.fiatCurrency],\n references: [depositCurrencyAdded.depositEscrow, depositCurrencyAdded.depositLocalId, depositCurrencyAdded.depositChainId, depositCurrencyAdded.paymentMethodId, depositCurrencyAdded.currency],\n relationName: \"intentFulfilled_depositCurrencyAdded\"\n }),\n depositConversionRateUpdated: one(depositConversionRateUpdated, {\n fields: [\n intentFulfilled.depositEscrow,\n intentFulfilled.depositLocalId,\n intentFulfilled.depositChainId,\n intentFulfilled.paymentMethodId,\n intentFulfilled.fiatCurrency,\n intentFulfilled.conversionRateChangeId,\n ],\n references: [\n depositConversionRateUpdated.depositEscrow,\n depositConversionRateUpdated.depositLocalId,\n depositConversionRateUpdated.depositChainId,\n depositConversionRateUpdated.paymentMethodId,\n depositConversionRateUpdated.currency,\n depositConversionRateUpdated.changeId,\n ],\n relationName: \"intentFulfilled_depositConversionRateUpdated\"\n }),\n depositDelta: one(depositDelta, {\n fields: [intentFulfilled.logId],\n references: [depositDelta.logId],\n }),\n paymentVerified: one(paymentVerified, {\n fields: [intentFulfilled.intentHash],\n references: [paymentVerified.intentHash],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [intentFulfilled.intentHash, intentFulfilled.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\nexport const paymentVerifiedReferences = relations(paymentVerified, ({ one }) => ({\n transaction: one(transaction, {\n fields: [paymentVerified.transactionId],\n references: [transaction.orderId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [paymentVerified.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [paymentVerified.intentHash, paymentVerified.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\nexport const depositReferences = relations(deposit, ({ one, many }) => ({\n transaction: one(transaction, {\n fields: [deposit.transactionId],\n references: [transaction.orderId],\n }),\n owner: one(participant, {\n fields: [deposit.participantAddress],\n references: [participant.address],\n }),\n depositCurrencyAddeds: many(depositCurrencyAdded),\n depositVerifierAddeds: many(depositVerifierAdded),\n depositConversionRateUpdateds: many(depositConversionRateUpdated),\n events: many(event),\n depositReceiveds: many(depositReceived),\n depositWithdrawns: many(depositWithdrawn),\n depositCloseds: many(depositClosed),\n intentSignaleds: many(intentSignaled),\n intentPruneds: many(intentPruned),\n intentFulfilleds: many(intentFulfilled),\n fundsLockeds: many(fundsLocked),\n fundsUnlockeds: many(fundsUnlocked),\n intentExpiryExtendeds: many(intentExpiryExtended),\n depositDeltas: many(depositDelta),\n depositVerifiers: many(depositVerifierAdded),\n}));\n\n/**\n * DepositDelta\n *\n * Tracks changes to deposit balances over time.\n * Records the before/after amounts and delta for each balance-affecting event.\n * Enables balance history reconstruction and auditing.\n *\n * Created by: DepositReceived, IntentFulfilled, DepositWithdrawn events\n * One record per balance-changing event.\n */\nexport const depositDelta = onchainTable(\"depositDelta\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n amountBefore: t.bigint().notNull(),\n delta: t.bigint().notNull(),\n amountAfter: t.bigint().notNull(),\n}));\n\nexport const depositDeltaReferences = relations(depositDelta, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositDelta.depositEscrow, depositDelta.depositLocalId, depositDelta.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [depositDelta.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DepositConversionRateUpdated\n *\n * Tracks conversion rate changes for a deposit's payment method and currency pair.\n * Maintains history of all rate changes with sequential changeId for versioning.\n * Each update creates a new record and marks the previous rate as inactive.\n * Uses compound primary key including changeId to support rate history.\n *\n * V2: Explicit rate updates via DepositCurrencyAdded (initial) and DepositConversionRateUpdated events.\n * Rates can be updated multiple times. This is the primary rate tracking for V2.\n * V3: Initial rate set via DepositCurrencyAdded matching the minConversionRate.\n * V3 primarily uses `depositMinConversionRateUpdated` for rate tracking; this table\n * mirrors those updates for consistency but V3 intents reference min rates.\n *\n * Example: Changing from 1.01 to 1.02 to 1.01 creates three records with changeIds 0, 1, 2.\n * Only the most recent record (changeId=2) has active=true.\n *\n * Created by: V2Escrow:DepositCurrencyAdded, V2Escrow:DepositConversionRateUpdated, V3Escrow:DepositCurrencyAdded\n * One record per rate change.\n */\nexport const depositConversionRateUpdated = onchainTable(\"depositConversionRateUpdated\", (t) => ({\n // Compound primary key fields\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n currency: t.hex().notNull(),\n changeId: t.integer().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n verifier: t.hex().notNull(),\n // actual value!\n value: t.bigint().notNull(),\n active: t.boolean().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId, table.paymentMethodId, table.currency, table.changeId] }),\n // Note: no separate index needed — the composite PK already covers (depositEscrow, depositLocalId, depositChainId)\n // as a prefix, so Postgres uses the PK index for deposit-scoped queries.\n}));\n\nexport const depositConversionRateUpdatedReferences = relations(depositConversionRateUpdated, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositConversionRateUpdated.depositEscrow, depositConversionRateUpdated.depositLocalId, depositConversionRateUpdated.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n depositVerifierAdded: one(depositVerifierAdded, {\n fields: [depositConversionRateUpdated.depositEscrow, depositConversionRateUpdated.depositLocalId, depositConversionRateUpdated.depositChainId, depositConversionRateUpdated.paymentMethodId],\n references: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId, depositVerifierAdded.paymentMethodId],\n relationName: \"depositConversionRateUpdated_depositVerifierAdded\"\n }),\n depositCurrencyAdded: one(depositCurrencyAdded, {\n fields: [depositConversionRateUpdated.depositEscrow, depositConversionRateUpdated.depositLocalId, depositConversionRateUpdated.depositChainId, depositConversionRateUpdated.paymentMethodId, depositConversionRateUpdated.currency],\n references: [depositCurrencyAdded.depositEscrow, depositCurrencyAdded.depositLocalId, depositCurrencyAdded.depositChainId, depositCurrencyAdded.paymentMethodId, depositCurrencyAdded.currency],\n relationName: \"depositConversionRateUpdated_depositCurrencyAdded\"\n }),\n transaction: one(transaction, {\n fields: [depositConversionRateUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [depositConversionRateUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DepositReceived\n *\n * Records the initial deposit creation event when a user deposits tokens into escrow.\n * Marks the start of a deposit's lifecycle and establishes the initial balance.\n * Uses compound primary key matching the deposit it creates.\n *\n * Created by: V2Escrow:DepositReceived or V3Escrow:DepositReceived\n * One record per deposit (1:1 with deposit table).\n */\nexport const depositReceived = onchainTable(\"depositReceived\", (t) => ({\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n token: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n amount: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId] }),\n}));\n\nexport const depositReceivedReferences = relations(depositReceived, ({ one }) => ({\n transaction: one(transaction, {\n fields: [depositReceived.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [depositReceived.depositEscrow, depositReceived.depositLocalId, depositReceived.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n participant: one(participant, {\n fields: [depositReceived.participantAddress],\n references: [participant.address],\n }),\n event: one(event, {\n fields: [depositReceived.logId],\n references: [event.logId],\n }),\n depositDelta: one(depositDelta, {\n fields: [depositReceived.logId],\n references: [depositDelta.logId],\n }),\n}));\n\n/**\n * DepositWithdrawn\n *\n * Records when a deposit owner withdraws their remaining tokens, closing the deposit.\n * This is a voluntary event by the owner to revoke the deposit and reclaim funds.\n * Sets deposit status to 'withdrawn'.\n *\n * Created by: V2Escrow:DepositWithdrawn or V3Escrow:DepositWithdrawn\n * One record per withdrawal event.\n */\nexport const depositWithdrawn = onchainTable(\"depositWithdrawn\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n participantAddress: t.hex().notNull(),\n amount: t.bigint().notNull(), // amount sent to owner during withdrawal\n transactionId: t.hex().notNull(),\n}));\n\nexport const depositWithdrawnReferences = relations(depositWithdrawn, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositWithdrawn.depositEscrow, depositWithdrawn.depositLocalId, depositWithdrawn.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n participant: one(participant, {\n fields: [depositWithdrawn.participantAddress],\n references: [participant.address],\n }),\n event: one(event, {\n fields: [depositWithdrawn.logId],\n references: [event.logId],\n }),\n transaction: one(transaction, {\n fields: [depositWithdrawn.transactionId],\n references: [transaction.orderId],\n }),\n depositDelta: one(depositDelta, {\n fields: [depositWithdrawn.logId],\n references: [depositDelta.logId],\n }),\n}));\n\n/**\n * DepositClosed\n *\n * Records when a deposit is explicitly closed after being fully fulfilled.\n * This represents the successful completion of a deposit's lifecycle.\n * Sets deposit status to 'closed'.\n *\n * Created by: V2Escrow:DepositClosed or V3Escrow:DepositClosed\n * One record per deposit closure.\n */\nexport const depositClosed = onchainTable(\"depositClosed\", (t) => ({\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n participantAddress: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId] }),\n}));\n\nexport const depositClosedReferences = relations(depositClosed, ({ one }) => ({\n participant: one(participant, {\n fields: [depositClosed.participantAddress],\n references: [participant.address],\n }),\n deposit: one(deposit, {\n fields: [depositClosed.depositEscrow, depositClosed.depositLocalId, depositClosed.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n transaction: one(transaction, {\n fields: [depositClosed.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [depositClosed.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DustCollected\n *\n * Records when dust is collected from a deposit.\n * Dust is collected when a deposit's remaining balance falls below the dust threshold\n * after an operation like withdrawal or fund transfer.\n * The dust amount is transferred to the dustRecipient.\n *\n * Created by: V3Escrow:DustCollected\n * One record per dust collection event.\n */\nexport const dustCollected = onchainTable(\"dustCollected\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n dustAmount: t.bigint().notNull(),\n dustRecipient: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const dustCollectedReferences = relations(dustCollected, ({ one }) => ({\n deposit: one(deposit, {\n fields: [dustCollected.depositEscrow, dustCollected.depositLocalId, dustCollected.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n transaction: one(transaction, {\n fields: [dustCollected.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [dustCollected.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DustRecipientUpdated\n *\n * Records when the dust recipient address is updated for an escrow contract.\n * This is an admin config change that affects where collected dust is sent.\n *\n * Created by: V3Escrow:DustRecipientUpdated\n * One record per recipient update.\n */\nexport const dustRecipientUpdated = onchainTable(\"dustRecipientUpdated\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n escrow: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n dustRecipient: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const dustRecipientUpdatedReferences = relations(dustRecipientUpdated, ({ one }) => ({\n transaction: one(transaction, {\n fields: [dustRecipientUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [dustRecipientUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DustThresholdUpdated\n *\n * Records when the dust threshold is updated for an escrow contract.\n * This is an admin config change that affects the minimum balance\n * below which remaining funds are collected as dust.\n *\n * Created by: V3Escrow:DustThresholdUpdated\n * One record per threshold update.\n */\nexport const dustThresholdUpdated = onchainTable(\"dustThresholdUpdated\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n escrow: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n dustThreshold: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const dustThresholdUpdatedReferences = relations(dustThresholdUpdated, ({ one }) => ({\n transaction: one(transaction, {\n fields: [dustThresholdUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [dustThresholdUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * ProtocolFeeRecipientUpdated\n *\n * Records when the protocol fee recipient address is updated for an orchestrator contract.\n * This is an admin config change that affects where collected protocol fees are sent.\n *\n * Created by: Orchestrator:ProtocolFeeRecipientUpdated\n * One record per recipient update.\n */\nexport const protocolFeeRecipientUpdated = onchainTable(\"protocolFeeRecipientUpdated\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n orchestrator: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n protocolFeeRecipient: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const protocolFeeRecipientUpdatedReferences = relations(protocolFeeRecipientUpdated, ({ one }) => ({\n transaction: one(transaction, {\n fields: [protocolFeeRecipientUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [protocolFeeRecipientUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * ProtocolFeeUpdated\n *\n * Records when the protocol fee percentage is updated for an orchestrator contract.\n * This is an admin config change that affects how much fee is taken from transfers.\n *\n * Created by: Orchestrator:ProtocolFeeUpdated\n * One record per fee update.\n */\nexport const protocolFeeUpdated = onchainTable(\"protocolFeeUpdated\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n orchestrator: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n protocolFee: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const protocolFeeUpdatedReferences = relations(protocolFeeUpdated, ({ one }) => ({\n transaction: one(transaction, {\n fields: [protocolFeeUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [protocolFeeUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DepositCurrencyAdded\n *\n * Records when a new fiat currency is enabled for a deposit's payment method.\n * Establishes which currency-payment method pairs are valid for intent creation.\n * Tracks current conversion rate via changeId pointers.\n * Uses compound primary key (deposit + paymentMethodId + currency).\n *\n * V2: Adds currency with initial conversion rate. Field currentConversionRateChangeId tracks\n * the current rate changeId. Field minConversionRate is null (not used in V2).\n * V3: Adds currency with min conversion rate. Field currentMinConversionRateChangeId tracks\n * the current min rate changeId. Field minConversionRate stores the rate value.\n *\n * Created by: V2Escrow:DepositCurrencyAdded or V3Escrow:DepositCurrencyAdded\n * One record per currency-payment method pair added to a deposit.\n */\nexport const depositCurrencyAdded = onchainTable(\"depositCurrencyAdded\", (t) => ({\n // Compound primary key fields\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n currency: t.hex().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n verifier: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n // v2: store changeId of current rate for quick lookup\n currentConversionRateChangeId: t.integer(),\n // v3: store changeId of current min rate for quick lookup\n currentMinConversionRateChangeId: t.integer(),\n // v3: min conversion rate at time of add (nullable for v2)\n minConversionRate: t.bigint(),\n transactionId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId, table.paymentMethodId, table.currency] }),\n}));\n\nexport const depositCurrencyAddedReferences = relations(depositCurrencyAdded, ({ one, many }) => ({\n deposit: one(deposit, {\n fields: [depositCurrencyAdded.depositEscrow, depositCurrencyAdded.depositLocalId, depositCurrencyAdded.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [depositCurrencyAdded.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n transaction: one(transaction, {\n fields: [depositCurrencyAdded.transactionId],\n references: [transaction.orderId],\n }),\n depositVerifierAdded: one(depositVerifierAdded, {\n fields: [depositCurrencyAdded.depositEscrow, depositCurrencyAdded.depositLocalId, depositCurrencyAdded.depositChainId, depositCurrencyAdded.paymentMethodId],\n references: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId, depositVerifierAdded.paymentMethodId],\n relationName: \"depositCurrencyAdded_depositVerifierAdded\"\n }),\n // currentConversionRateChangeId and currentMinConversionRateChangeId point to the latest rate update\n depositConversionRateUpdateds: many(depositConversionRateUpdated),\n participant: one(participant, {\n fields: [depositCurrencyAdded.participantAddress],\n references: [participant.address],\n }),\n event: one(event, {\n fields: [depositCurrencyAdded.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * PayeeDetails (V3 only)\n *\n * Stores payee information and metadata for V3 payment methods.\n * Contains intent gating service address and encoded payment details.\n * Shared across deposits to avoid duplication of identical payee data.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 uses simple verifier\n * addresses without structured payee details or intent gating services.\n *\n * Created by: V3Escrow:DepositPaymentMethodAdded when new payee details are encountered\n * One record per unique payee details hash.\n */\nexport const payeeDetails = onchainTable(\"payeeDetails\", (t) => ({\n payeeDetailsId: t.hex().primaryKey(), // hash of the payee details\n intentGatingService: t.hex().notNull(),\n payeeDetails: t.hex().notNull(),\n data: t.hex().notNull(),\n}));\n\n/**\n * DepositVerifierAdded\n *\n * Records when a payment method is added to a deposit, enabling that method for intents.\n * Uses compound primary key (deposit + paymentMethodId) to support multiple methods per deposit.\n *\n * V2: Payment method is derived from verifier EOA address. Fields payeeDetailsHash and\n * intentGatingService are set to sentinel values (typically zero address/hash).\n * V3: Payment method is explicit hash. Fields payeeDetailsHash and intentGatingService\n * reference actual V3 payee details and gating service contracts.\n *\n * Created by: V2Escrow:DepositVerifierAdded or V3Escrow:DepositPaymentMethodAdded\n * One record per payment method added to a deposit.\n */\nexport const depositVerifierAdded = onchainTable(\"depositVerifierAdded\", (t) => ({\n // Compound primary key fields\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n verifier: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n participantAddress: t.hex().notNull(),\n payeeDetailsHash: t.hex().notNull(),\n intentGatingService: t.hex().notNull(),\n // Current payment method active state (V3 only, defaults true for V2)\n active: t.boolean().notNull(),\n // Links to latest depositPaymentMethodActiveUpdated record (nullable - null until first update)\n currentActiveChangeId: t.integer(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId, table.paymentMethodId] }),\n}));\n\nexport const depositVerifierAddedReferences = relations(depositVerifierAdded, ({ one, many }) => ({\n deposit: one(deposit, {\n fields: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [depositVerifierAdded.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n participant: one(participant, {\n fields: [depositVerifierAdded.participantAddress],\n references: [participant.address],\n }),\n transaction: one(transaction, {\n fields: [depositVerifierAdded.transactionId],\n references: [transaction.orderId],\n }),\n depositCurrencyAdded: many(depositCurrencyAdded),\n depositConversionRateUpdated: many(depositConversionRateUpdated),\n depositPaymentMethodActiveUpdated: many(depositPaymentMethodActiveUpdated),\n payeeDetails: one(payeeDetails, {\n fields: [depositVerifierAdded.payeeDetailsHash],\n references: [payeeDetails.payeeDetailsId],\n }),\n}));\n\n/**\n * DepositMinConversionRateUpdated (V3 only)\n *\n * Tracks minimum conversion rate changes for V3 deposits.\n * Similar to depositConversionRateUpdated but specific to V3's minimum rate enforcement.\n * Maintains history with sequential changeId, marking previous rates as inactive.\n * Uses compound primary key including changeId for versioning.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 uses explicit conversion\n * rates tracked solely in `depositConversionRateUpdated` without separate minimum rates.\n *\n * Created by: V3Escrow:DepositCurrencyAdded (initial), V3Escrow:DepositMinConversionRateUpdated\n * One record per min rate change.\n */\nexport const depositMinConversionRateUpdated = onchainTable(\"depositMinConversionRateUpdated\", (t) => ({\n // Compound primary key fields\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n currency: t.hex().notNull(),\n changeId: t.integer().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n // actual value!\n value: t.bigint().notNull(),\n active: t.boolean().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId, table.paymentMethodId, table.currency, table.changeId] }),\n}));\n\nexport const depositMinConversionRateUpdatedReferences = relations(depositMinConversionRateUpdated, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositMinConversionRateUpdated.depositEscrow, depositMinConversionRateUpdated.depositLocalId, depositMinConversionRateUpdated.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n paymentMethod: one(paymentMethod, {\n fields: [depositMinConversionRateUpdated.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n depositVerifierAdded: one(depositVerifierAdded, {\n fields: [depositMinConversionRateUpdated.depositEscrow, depositMinConversionRateUpdated.depositLocalId, depositMinConversionRateUpdated.depositChainId, depositMinConversionRateUpdated.paymentMethodId],\n references: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId, depositVerifierAdded.paymentMethodId],\n relationName: \"depositMinConversionRateUpdated_depositVerifierAdded\"\n }),\n depositCurrencyAdded: one(depositCurrencyAdded, {\n fields: [depositMinConversionRateUpdated.depositEscrow, depositMinConversionRateUpdated.depositLocalId, depositMinConversionRateUpdated.depositChainId, depositMinConversionRateUpdated.paymentMethodId, depositMinConversionRateUpdated.currency],\n references: [depositCurrencyAdded.depositEscrow, depositCurrencyAdded.depositLocalId, depositCurrencyAdded.depositChainId, depositCurrencyAdded.paymentMethodId, depositCurrencyAdded.currency],\n relationName: \"depositMinConversionRateUpdated_depositCurrencyAdded\"\n }),\n transaction: one(transaction, {\n fields: [depositMinConversionRateUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [depositMinConversionRateUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * DepositPaymentMethodActiveUpdated (V3 only)\n *\n * Tracks payment method active/inactive state changes for V3 deposits.\n * Maintains history with sequential changeId, marking previous records as inactive.\n * Uses compound primary key including changeId for versioning.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 payment methods\n * are always active once added.\n *\n * Created by: V3Escrow:DepositPaymentMethodActiveUpdated\n * One record per active state change.\n */\nexport const depositPaymentMethodActiveUpdated = onchainTable(\"depositPaymentMethodActiveUpdated\", (t) => ({\n // Compound primary key fields\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n paymentMethodId: t.hex().notNull(),\n changeId: t.integer().notNull(),\n // Other fields\n orderId: t.hex().notNull(),\n logId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n // The active state value at this change\n value: t.boolean().notNull(),\n // False when superseded by a newer record\n active: t.boolean().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.depositEscrow, table.depositLocalId, table.depositChainId, table.paymentMethodId, table.changeId] }),\n}));\n\nexport const depositPaymentMethodActiveUpdatedReferences = relations(depositPaymentMethodActiveUpdated, ({ one }) => ({\n deposit: one(deposit, {\n fields: [depositPaymentMethodActiveUpdated.depositEscrow, depositPaymentMethodActiveUpdated.depositLocalId, depositPaymentMethodActiveUpdated.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n depositVerifierAdded: one(depositVerifierAdded, {\n fields: [depositPaymentMethodActiveUpdated.depositEscrow, depositPaymentMethodActiveUpdated.depositLocalId, depositPaymentMethodActiveUpdated.depositChainId, depositPaymentMethodActiveUpdated.paymentMethodId],\n references: [depositVerifierAdded.depositEscrow, depositVerifierAdded.depositLocalId, depositVerifierAdded.depositChainId, depositVerifierAdded.paymentMethodId],\n relationName: \"depositPaymentMethodActiveUpdated_depositVerifierAdded\"\n }),\n paymentMethod: one(paymentMethod, {\n fields: [depositPaymentMethodActiveUpdated.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n transaction: one(transaction, {\n fields: [depositPaymentMethodActiveUpdated.transactionId],\n references: [transaction.orderId],\n }),\n event: one(event, {\n fields: [depositPaymentMethodActiveUpdated.logId],\n references: [event.logId],\n }),\n}));\n\n/**\n * PaymentVerifier (V2 only)\n *\n * Tracks registered payment verifiers in V2 with their current fee share.\n * Verifiers are EOA addresses authorized to verify fiat payments.\n * Updated when fee shares change.\n *\n * V3 behavior: V3 uses payment method hashes instead of verifier addresses. V3 deposits\n * reference the unified `paymentMethod` table, not this V2-specific verifier registry.\n *\n * Created by: PaymentVerifierRegistry:PaymentVerifierAdded\n * Updated by: PaymentVerifierRegistry:PaymentVerifierFeeShareUpdated\n * One record per registered verifier address.\n */\nexport const paymentVerifier = onchainTable(\"paymentVerifier\", (t) => ({\n id: t.hex().primaryKey(),\n verifier: t.hex().notNull(),\n feeShare: t.bigint().notNull(),\n active: t.boolean().notNull(),\n}));\n\n/**\n * PaymentVerifierAdded (V2 only)\n *\n * Event log of payment verifier additions to the V2 registry.\n * Immutable history of when verifiers were registered.\n *\n * V3 behavior: V3 payment method additions are tracked in `paymentMethodEvent` table instead.\n *\n * Created by: PaymentVerifierRegistry:PaymentVerifierAdded\n * One record per verifier addition event.\n */\nexport const paymentVerifierAdded = onchainTable(\"paymentVerifierAdded\", (t) => ({\n orderId: t.hex().primaryKey(),\n verifier: t.hex().notNull(),\n verifierId: t.hex().notNull(),\n feeShare: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const paymentVerifierAddedReferences = relations(paymentVerifierAdded, ({ one }) => ({\n transaction: one(transaction, {\n fields: [paymentVerifierAdded.transactionId],\n references: [transaction.orderId],\n }),\n paymentVerifier: one(paymentVerifier, {\n fields: [paymentVerifierAdded.verifierId],\n references: [paymentVerifier.id],\n }),\n}));\n\n/**\n * PaymentVerifierFeeShareUpdated (V2 only)\n *\n * Event log of verifier fee share updates in the V2 registry.\n * Tracks historical changes to verifier compensation.\n *\n * V3 behavior: V3 does not have a fee share concept at the registry level. Fees in V3\n * are determined per-intent at fulfillment time.\n *\n * Created by: PaymentVerifierRegistry:PaymentVerifierFeeShareUpdated\n * One record per fee share update event.\n */\nexport const paymentVerifierFeeShareUpdated = onchainTable(\"paymentVerifierFeeShareUpdated\", (t) => ({\n orderId: t.hex().primaryKey(),\n verifier: t.hex().notNull(),\n verifierId: t.hex().notNull(),\n feeShare: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const paymentVerifierFeeShareUpdatedReferences = relations(paymentVerifierFeeShareUpdated, ({ one }) => ({\n transaction: one(transaction, {\n fields: [paymentVerifierFeeShareUpdated.transactionId],\n references: [transaction.orderId],\n }),\n verifier: one(paymentVerifier, {\n fields: [paymentVerifierFeeShareUpdated.verifierId],\n references: [paymentVerifier.id],\n }),\n}));\n\n/**\n * PaymentVerifierRemoved (V2 only)\n *\n * Event log of payment verifier removals from the V2 registry.\n * Marks verifiers as inactive in the system.\n *\n * V3 behavior: V3 payment method removals are tracked in `paymentMethodEvent` table instead.\n *\n * Created by: PaymentVerifierRegistry:PaymentVerifierRemoved\n * One record per verifier removal event.\n */\nexport const paymentVerifierRemoved = onchainTable(\"paymentVerifierRemoved\", (t) => ({\n orderId: t.hex().primaryKey(),\n verifier: t.hex().notNull(),\n verifierId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\n/**\n * PaymentMethod\n *\n * Unified registry of all payment methods across V2 and V3.\n * Links verifier addresses (V2) or payment method hashes (V3) to human-readable metadata.\n * Tracks which payment methods are currently active in the system.\n *\n * V2: Derived from verifier EOA addresses when first encountered\n * V3: Registered via PaymentVerifierRegistry:PaymentMethodAdded\n *\n * Created by: First encounter in deposit events or explicit registry events\n * One record per unique payment method across all chains.\n */\nexport const paymentMethod = onchainTable(\"paymentMethod\", (t) => ({\n paymentMethodId: t.hex().primaryKey(),\n verifier: t.hex().notNull(),\n verifierAddress: t.hex().notNull(),\n methodHash: t.hex().notNull(),\n methodKey: t.text(),\n methodName: t.text(),\n chainId: t.bigint().notNull(),\n createdLogId: t.hex().notNull(),\n active: t.boolean().notNull(),\n}));\n\n/**\n * PaymentMethodCurrency\n *\n * Registry of currency support for each payment method.\n * Tracks which fiat currencies are accepted by each payment method at the global level.\n * Distinct from depositCurrencyAdded which tracks deposit-specific currency enablement.\n *\n * Created by: PaymentVerifierRegistry:CurrencyAdded\n * Updated by: PaymentVerifierRegistry:CurrencyRemoved (sets active=false)\n * One record per payment method-currency pair.\n */\nexport const paymentMethodCurrency = onchainTable(\"paymentMethodCurrency\", (t) => ({\n paymentMethodCurrencyId: t.hex().primaryKey(),\n paymentMethodId: t.hex().notNull(),\n currency: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n createdLogId: t.hex().notNull(),\n active: t.boolean().notNull(),\n}));\n\n/**\n * PaymentMethodEvent\n *\n * Event log of payment method lifecycle events (activated, deactivated).\n * Provides immutable audit trail of payment method status changes.\n *\n * Created by: PaymentVerifierRegistry:PaymentMethodAdded, PaymentMethodRemoved\n * One record per payment method status change event.\n */\nexport const paymentMethodEvent = onchainTable(\"paymentMethodEvent\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n paymentMethodId: t.hex().notNull(),\n event: t.text().notNull(),\n}));\n\n/**\n * PaymentMethodCurrencyEvent\n *\n * Event log of currency additions/removals for payment methods.\n * Provides immutable audit trail of payment method currency support changes.\n *\n * Created by: PaymentVerifierRegistry:CurrencyAdded, CurrencyRemoved\n * One record per currency support change event.\n */\nexport const paymentMethodCurrencyEvent = onchainTable(\"paymentMethodCurrencyEvent\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n paymentMethodCurrencyId: t.hex().notNull(),\n event: t.text().notNull(),\n}));\n\nexport const paymentMethodReferences = relations(paymentMethod, ({ many }) => ({\n paymentMethodCurrencies: many(paymentMethodCurrency),\n paymentMethodEvents: many(paymentMethodEvent),\n depositVerifierAddeds: many(depositVerifierAdded),\n depositCurrencyAddeds: many(depositCurrencyAdded),\n intentSignaleds: many(intentSignaled),\n intentFulfilleds: many(intentFulfilled),\n}));\n\nexport const paymentMethodCurrencyReferences = relations(paymentMethodCurrency, ({ one }) => ({\n paymentMethod: one(paymentMethod, {\n fields: [paymentMethodCurrency.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n}));\n\nexport const paymentMethodEventReferences = relations(paymentMethodEvent, ({ one }) => ({\n paymentMethod: one(paymentMethod, {\n fields: [paymentMethodEvent.paymentMethodId],\n references: [paymentMethod.paymentMethodId],\n }),\n}));\n\nexport const paymentMethodCurrencyEventReferences = relations(paymentMethodCurrencyEvent, ({ one }) => ({\n paymentMethodCurrency: one(paymentMethodCurrency, {\n fields: [paymentMethodCurrencyEvent.paymentMethodCurrencyId],\n references: [paymentMethodCurrency.paymentMethodCurrencyId],\n }),\n}));\n\nexport const paymentVerifierRemovedReferences = relations(paymentVerifierRemoved, ({ one }) => ({\n transaction: one(transaction, {\n fields: [paymentVerifierRemoved.transactionId],\n references: [transaction.orderId],\n }),\n verifier: one(paymentVerifier, {\n fields: [paymentVerifierRemoved.verifierId],\n references: [paymentVerifier.id],\n }),\n}));\n\n/**\n * Stat\n *\n * Time-bucketed aggregated statistics for system activity (deposits, withdrawals, exchanges).\n * Groups activity by hour/day/month for analytics and reporting.\n * Amounts are cumulative within each time bucket.\n *\n * Created by: All balance-affecting events via logStats()\n * Updated by: Same events via onConflictDoUpdate to accumulate amounts\n * One record per (timestamp_bucket, event, currency, token, verifier, chain) combination.\n */\nexport const stat = onchainTable(\"stat\", (t) => ({\n orderId: t.hex().primaryKey(), // timestamp truncated to the hour, day, week + event id + chain id\n type: t.text().notNull(), // hour, day, week\n event: t.text().notNull(), // deposit / withdrawal / exchange\n amount: t.bigint().notNull(), // amount of the token moved\n currency: t.hex(), // currency\n token: t.hex().notNull(), // token\n verifier: t.hex().notNull(), // verifier\n chainId: t.bigint().notNull(), // chain id\n timestamp: t.bigint().notNull(), // timestamp\n version: version('version').notNull(), // v2 or v3 escrow protocol\n}), (table) => ({\n /** KPI fetchers: getDailyStats() filters by (type, chainId) then scans timestamp range */\n chainTimestampIdx: index().on(table.type, table.chainId, table.timestamp),\n}));\n\n/**\n * TokenPrice\n *\n * Tracks the price of tokens against major stablecoins (USDC, DAI, USDT).\n * Useful for monitoring token market performance and analytics.\n *\n * One record per (token, base_currency, timestamp_bucket) combination.\n * Prices are sourced from DEX pools or oracles.\n */\nexport const tokenPrice = onchainTable(\"tokenPrice\", (t) => ({\n orderId: t.hex().primaryKey(), // token + base_currency + timestamp_bucket\n token: t.hex().notNull(), // token contract address\n baseCurrency: t.hex().notNull(), // stablecoin contract (USDC, DAI, USDT)\n price: t.bigint().notNull(), // price in base currency units (6 decimals for USDC)\n timestamp: t.bigint().notNull(), // timestamp bucket (hourly)\n chainId: t.bigint().notNull(), // chain id\n source: t.text().notNull(), // price source (uniswap-v3, sushiswap, etc.)\n}));\n\n/**\n * AccumulatedStat\n *\n * Reserved for future use: cumulative running totals of statistics over time.\n * Currently unused but schema maintained for future aggregation features.\n */\nexport const accumulatedStat = onchainTable(\"accumulatedStat\", (t) => ({\n orderId: t.hex().primaryKey(), // timestamp truncated to the hour, day, week + event id + chain id\n type: t.text().notNull(), // hour, day, week\n event: t.text().notNull(), // deposit / withdrawal / exchange\n amount: t.bigint().notNull(), // amount of the token moved\n currency: t.hex(), // currency\n token: t.hex().notNull(), // token\n verifier: t.hex().notNull(), // verifier\n chainId: t.bigint().notNull(), // chain id\n timestamp: t.bigint().notNull(), // timestamp\n}));\n\n/**\n * Verifier\n *\n * Registry of verifier contracts that manage payment method provider hashes.\n * Verifiers maintain mappings of payment provider identifiers for validation.\n *\n * Created by: Verifier contract deployment indexing\n * One record per verifier contract address.\n */\nexport const verifier = onchainTable('verifier', (t) => ({\n verifierId: t.hex().primaryKey(),\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n}))\n\nexport const verifierReferences = relations(verifier, ({ many }) => ({\n providerHashAdded: many(providerHashAdded),\n providerHashRemoved: many(providerHashRemoved),\n}))\n\n/**\n * ProviderHashAdded\n *\n * Event log of payment provider hash additions to verifier contracts.\n * Records when new payment providers are authorized for use.\n *\n * Created by: Verifier:ProviderHashAdded events\n * One record per provider hash addition event.\n */\nexport const providerHashAdded = onchainTable('providerHashAdded', (t) => ({\n orderId: t.hex().primaryKey(),\n verifierId: t.hex().notNull(),\n providerHashId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}))\n\nexport const providerHashAddedReferences = relations(providerHashAdded, ({ one }) => ({\n verifier: one(verifier, {\n fields: [providerHashAdded.verifierId],\n references: [verifier.verifierId],\n }),\n providerHash: one(providerHash, {\n fields: [providerHashAdded.providerHashId],\n references: [providerHash.providerHashId],\n }),\n}))\n\n/**\n * ProviderHashRemoved\n *\n * Event log of payment provider hash removals from verifier contracts.\n * Records when payment providers are deauthorized.\n *\n * Created by: Verifier:ProviderHashRemoved events\n * One record per provider hash removal event.\n */\nexport const providerHashRemoved = onchainTable('providerHashRemoved', (t) => ({\n orderId: t.hex().primaryKey(),\n verifierId: t.hex().notNull(),\n providerHashId: t.hex().notNull(),\n transactionId: t.hex().notNull(),\n}))\n\nexport const providerHashRemovedReferences = relations(providerHashRemoved, ({ one }) => ({\n verifier: one(verifier, {\n fields: [providerHashRemoved.verifierId],\n references: [verifier.verifierId],\n }),\n providerHash: one(providerHash, {\n fields: [providerHashRemoved.providerHashId],\n references: [providerHash.providerHashId],\n }),\n}))\n\n/**\n * ProviderHash\n *\n * Registry of payment provider identifier hashes with current active status.\n * Maps provider hashes to their authorization state across verifier contracts.\n *\n * Created by: ProviderHashAdded events\n * Updated by: ProviderHashRemoved events (sets active=false)\n * One record per unique provider hash.\n */\nexport const providerHash = onchainTable('providerHash', (t) => ({\n providerHashId: t.hex().primaryKey(), // chain id + hash\n providerHash: t.hex().notNull(),\n active: t.boolean().notNull(),\n}))\n\nexport const providerHashReferences = relations(providerHash, ({ many }) => ({\n providerHashAdded: many(providerHashAdded),\n providerHashRemoved: many(providerHashRemoved),\n}))\n\n/**\n * FundsUnlocked (V3 only)\n *\n * Records when locked funds are unlocked WITHOUT transfer (intent cancelled/expired).\n * Distinct from fundsUnlockedAndTransferred which represents successful fulfillment.\n * Returns funds to available pool without executing the intent.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 has no explicit locking\n * mechanism, so cancellations are handled via `intentPruned` without unlock events.\n *\n * Created by: V3Escrow:FundsUnlocked event\n * One record per intent cancellation/expiration.\n */\nexport const fundsUnlocked = onchainTable(\"fundsUnlocked\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n intentHash: t.hex().notNull(),\n amount: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}), (table) => ({\n /** Browse page: useMatchableDeposits batches unlocks by deposit compound key */\n depositIdx: index().on(table.depositEscrow, table.depositLocalId, table.depositChainId),\n}));\n\nexport const fundsUnlockedReferences = relations(fundsUnlocked, ({ one }) => ({\n transaction: one(transaction, {\n fields: [fundsUnlocked.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [fundsUnlocked.depositEscrow, fundsUnlocked.depositLocalId, fundsUnlocked.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [fundsUnlocked.logId],\n references: [event.logId],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [fundsUnlocked.intentHash, fundsUnlocked.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n\n/**\n * IntentExpiryExtended (V3 only)\n *\n * Records when a locked intent's expiry time is extended.\n * Allows participants to extend the fulfillment window for locked intents.\n *\n * V2 behavior: V2 deposits will have no records in this table. V2 intents do not have\n * explicit expiry times; they remain active until fulfilled or pruned.\n *\n * Created by: V3Escrow:IntentExpiryExtended event\n * One record per expiry extension.\n */\nexport const intentExpiryExtended = onchainTable(\"intentExpiryExtended\", (t) => ({\n orderId: t.hex().primaryKey(),\n logId: t.hex().notNull(),\n depositEscrow: t.hex().notNull(),\n depositLocalId: t.bigint().notNull(),\n depositChainId: t.bigint().notNull(),\n intentHash: t.hex().notNull(),\n newExpiryTime: t.bigint().notNull(),\n transactionId: t.hex().notNull(),\n}));\n\nexport const intentExpiryExtendedReferences = relations(intentExpiryExtended, ({ one }) => ({\n transaction: one(transaction, {\n fields: [intentExpiryExtended.transactionId],\n references: [transaction.orderId],\n }),\n deposit: one(deposit, {\n fields: [intentExpiryExtended.depositEscrow, intentExpiryExtended.depositLocalId, intentExpiryExtended.depositChainId],\n references: [deposit.escrow, deposit.localId, deposit.chainId],\n }),\n event: one(event, {\n fields: [intentExpiryExtended.logId],\n references: [event.logId],\n }),\n intentSignaled: one(intentSignaled, {\n fields: [intentExpiryExtended.intentHash, intentExpiryExtended.depositChainId],\n references: [intentSignaled.intentHash, intentSignaled.depositChainId],\n }),\n}));\n","import type { PonderTypeError } from \"@/types/utils.js\";\nimport {\n type BuildColumns,\n type ColumnBuilderBase,\n Table,\n type Writable,\n getTableName,\n} from \"drizzle-orm\";\nimport { toSnakeCase } from \"drizzle-orm/casing\";\nimport {\n type AnyPgColumn,\n type PrimaryKeyBuilder as DrizzlePrimaryKeyBuilder,\n type ExtraConfigColumn,\n ManualViewBuilder,\n type PgColumnBuilder,\n type PgColumnBuilderBase,\n PgEnumColumnBuilder,\n type PgEnumColumnBuilderInitial,\n PgTable,\n type PgTableExtraConfig,\n type PgTableWithColumns,\n type PgTextConfig,\n type TableConfig,\n ViewBuilder,\n primaryKey as drizzlePrimaryKey,\n} from \"drizzle-orm/pg-core\";\nimport {\n type PgColumnsBuilders as _PgColumnsBuilders,\n getPgColumnBuilders,\n} from \"drizzle-orm/pg-core/columns/all\";\nimport { PgBigintBuilder, type PgBigintBuilderInitial } from \"./bigint.js\";\nimport { PgBytesBuilder, type PgBytesBuilderInitial } from \"./bytes.js\";\nimport { PgHexBuilder, type PgHexBuilderInitial } from \"./hex.js\";\nimport {\n PgJsonBuilder,\n type PgJsonBuilderInitial,\n PgJsonbBuilder,\n type PgJsonbBuilderInitial,\n} from \"./json.js\";\nimport { PgTextBuilder, type PgTextBuilderInitial } from \"./text.js\";\n\n// 16 digits for chain ID.\nexport const MAX_DATABASE_OBJECT_NAME_LENGTH = 45;\n\n// Note: All of these database object names should be less than 63 characters, otherwise they will\n// be truncated by postgres.\n\nexport const getLiveQueryTriggerName = () => {\n return \"live_query\";\n};\nexport const getLiveQueryProcedureName = () => {\n return \"live_query()\";\n};\nexport const getLiveQueryChannelName = (schema: string) => {\n return `${schema}_live_query`;\n};\nexport const getLiveQueryNotifyTriggerName = () => {\n return \"live_query_notify\";\n};\n/**\n * Returns the name of the trigger used to notify live queries for the views pattern.\n * @dev The trigger is placed in the base schema, but used to notify in the views schema.\n */\nexport const getViewsLiveQueryNotifyTriggerName = (viewsSchema: string) => {\n return `${viewsSchema}_live_query_notify`;\n};\nexport const getLiveQueryNotifyProcedureName = () => {\n return \"live_query_notify()\";\n};\nexport const getLiveQueryTempTableName = () => {\n return \"live_query_tables\";\n};\nexport const getPartitionName = (table: string | PgTable, chainId: number) => {\n return `${typeof table === \"string\" ? table : getTableName(table)}_${chainId}`;\n};\nexport const getReorgTableName = (table: string | PgTable) => {\n return `_reorg__${typeof table === \"string\" ? table : getTableName(table)}`;\n};\nexport const getReorgTriggerName = () => {\n return \"reorg\";\n};\nexport const getReorgProcedureName = (table: string | PgTable) => {\n return `operation_reorg__${typeof table === \"string\" ? table : getTableName(table)}()`;\n};\nexport const getReorgSequenceName = () => {\n return \"operation_id\";\n};\n\n/** @internal */\nfunction getColumnNameAndConfig<\n TConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n return {\n name: typeof a === \"string\" && a.length > 0 ? a : (\"\" as string),\n config: typeof a === \"object\" ? a : (b as TConfig),\n };\n}\n\n// @ts-ignore\nexport function hex(): PgHexBuilderInitial<\"\">;\nexport function hex<name extends string>(\n columnName: name,\n): PgHexBuilderInitial<name>;\nexport function hex(columnName?: string) {\n return new PgHexBuilder(columnName ?? \"\");\n}\n\n// @ts-ignore\nexport function bigint(): PgBigintBuilderInitial<\"\">;\nexport function bigint<name extends string>(\n columnName: name,\n): PgBigintBuilderInitial<name>;\nexport function bigint(columnName?: string) {\n return new PgBigintBuilder(columnName ?? \"\");\n}\n\nexport function json(): PgJsonBuilderInitial<\"\">;\nexport function json<name extends string>(\n name: name,\n): PgJsonBuilderInitial<name>;\nexport function json(name?: string) {\n return new PgJsonBuilder(name ?? \"\");\n}\n\nexport function jsonb(): PgJsonbBuilderInitial<\"\">;\nexport function jsonb<name extends string>(\n name: name,\n): PgJsonbBuilderInitial<name>;\nexport function jsonb(name?: string) {\n return new PgJsonbBuilder(name ?? \"\");\n}\n\n// @ts-ignore\nexport function bytes(): PgBytesBuilderInitial<\"\">;\nexport function bytes<name extends string>(\n columnName: name,\n): PgBytesBuilderInitial<name>;\nexport function bytes(columnName?: string) {\n return new PgBytesBuilder(columnName ?? \"\");\n}\n\nexport function text(): PgTextBuilderInitial<\"\", [string, ...string[]]>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n config?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<\"\", Writable<T>>;\nexport function text<\n TName extends string,\n U extends string,\n T extends Readonly<[U, ...U[]]>,\n>(\n name: TName,\n config?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<TName, Writable<T>>;\nexport function text(a?: string | PgTextConfig, b: PgTextConfig = {}): any {\n const { name, config } = getColumnNameAndConfig<PgTextConfig>(a, b);\n return new PgTextBuilder(name, config as any);\n}\n\nexport const onchain = Symbol.for(\"ponder:onchain\");\n\nexport type PrimaryKeyBuilder<columnNames extends string = string> =\n DrizzlePrimaryKeyBuilder & { columnNames: columnNames };\n\nexport const primaryKey = <\n tableName extends string,\n column extends AnyPgColumn<{ tableName: tableName }> & { \" name\": string },\n columns extends (AnyPgColumn<{ tableName: tableName }> & {\n \" name\": string;\n })[],\n>({\n name,\n columns,\n}: { name?: string; columns: [column, ...columns] }) =>\n drizzlePrimaryKey({ name, columns }) as PrimaryKeyBuilder<\n column[\" name\"] | columns[number][\" name\"]\n >;\n\nexport type OnchainTable<\n T extends TableConfig & {\n extra: PgTableExtraConfig | undefined;\n } = TableConfig & { extra: PgTableExtraConfig | undefined },\n> = PgTable<T> & {\n [Key in keyof T[\"columns\"]]: T[\"columns\"][Key];\n} & { [onchain]: true } & {\n enableRLS: () => Omit<OnchainTable<T>, \"enableRLS\">;\n};\n\nexport type BuildExtraConfigColumns<\n columns extends Record<string, ColumnBuilderBase>,\n> = {\n [key in keyof columns]: ExtraConfigColumn & {\n \" name\": key;\n };\n};\n\nexport type PgColumnsBuilders = Omit<\n _PgColumnsBuilders,\n \"bigint\" | \"serial\" | \"smallserial\" | \"bigserial\" | \"json\" | \"jsonb\"\n> & {\n /**\n * Create an 8 byte number column.\n */\n int8: _PgColumnsBuilders[\"bigint\"];\n /**\n * Create a column for hex strings.\n *\n * - Docs: https://ponder.sh/docs/api-reference/ponder/schema#onchaintable\n *\n * @example\n * import { hex, onchainTable } from \"ponder\";\n *\n * export const account = onchainTable(\"account\", (p) => ({\n * address: p.hex(),\n * }));\n */\n hex: typeof hex;\n /**\n * Create a column for Ethereum integers\n *\n * - Docs: https://ponder.sh/docs/api-reference/ponder/schema#onchaintable\n *\n * @example\n * import { bigint, onchainTable } from \"ponder\";\n *\n * export const account = onchainTable(\"account\", (p) => ({\n * balance: p.bigint(),\n * }));\n */\n bigint: typeof bigint;\n /**\n * Create a column for Ethereum bytes\n *\n * - Docs: https://ponder.sh/docs/api-reference/ponder/schema#onchaintable\n *\n * @example\n * import { bytes, onchainTable } from \"ponder\";\n *\n * export const account = onchainTable(\"account\", (p) => ({\n * calldata: p.bytes(),\n * }));\n */\n bytes: typeof bytes;\n json: typeof json;\n jsonb: typeof jsonb;\n};\n\n/**\n * Create an onchain table.\n *\n * - Docs: https://ponder.sh/docs/api-reference/ponder/schema#onchaintable\n *\n * @example\n * import { onchainTable } from \"ponder\";\n *\n * export const account = onchainTable(\"account\", (p) => ({\n * address: p.hex().primaryKey(),\n * balance: p.bigint().notNull(),\n * }));\n *\n * @param name - The table name in the database.\n * @param columns - The table columns.\n * @param extra - Config such as indexes or composite primary keys.\n * @returns The onchain table.\n */\nexport const onchainTable = <\n name extends string,\n columns extends Record<string, PgColumnBuilderBase>,\n extra extends PgTableExtraConfig | undefined = undefined,\n>(\n name: name extends \"\" ? PonderTypeError<`Table name cannot be empty`> : name,\n columns: columns | ((columnTypes: PgColumnsBuilders) => columns),\n extraConfig?: (self: BuildExtraConfigColumns<columns>) => extra,\n): OnchainTable<{\n name: name;\n schema: undefined;\n columns: BuildColumns<name, columns, \"pg\">;\n extra: extra;\n dialect: \"pg\";\n}> => {\n const schema = globalThis?.PONDER_NAMESPACE_BUILD?.schema;\n const table = pgTableWithSchema(name, columns, extraConfig as any, schema);\n\n // @ts-ignore\n table[onchain] = true;\n\n // @ts-ignore\n return table;\n};\n\n/**\n * Create an onchain view.\n *\n * - Docs: https://ponder.sh/docs/api-reference/ponder/schema#onchainview\n *\n * @example\n * import { onchainView } from \"ponder\";\n *\n * export const accountView = onchainView(\"account_view\").as((qb) =>\n * qb.select().from(account),\n * );\n *\n * @param name - The view name in the database.\n * @param columns - [Optional] The view columns.\n * @returns The onchain view.\n */\nexport function onchainView<TName extends string>(\n name: TName,\n): ViewBuilder<TName>;\nexport function onchainView<\n TName extends string,\n TColumns extends Record<string, PgColumnBuilderBase>,\n>(name: TName, columns: TColumns): ManualViewBuilder<TName, TColumns>;\nexport function onchainView(\n name: string,\n columns?: Record<string, PgColumnBuilderBase>,\n): ViewBuilder | ManualViewBuilder {\n const schema = globalThis?.PONDER_NAMESPACE_BUILD?.schema;\n\n const view = pgViewWithSchema(name, columns, schema);\n\n // @ts-ignore\n view[onchain] = true;\n\n return view;\n}\n\nexport const isPgEnumSym = Symbol.for(\"drizzle:isPgEnum\");\n\nexport type OnchainEnum<TValues extends [string, ...string[]]> = {\n (): PgEnumColumnBuilderInitial<\"\", TValues>;\n <TName extends string>(\n name: TName,\n ): PgEnumColumnBuilderInitial<TName, TValues>;\n <TName extends string>(\n name?: TName,\n ): PgEnumColumnBuilderInitial<TName, TValues>;\n\n readonly enumName: string;\n readonly enumValues: TValues;\n readonly schema: string | undefined;\n /** @internal */\n [isPgEnumSym]: true;\n} & { [onchain]: true };\n\nexport const onchainEnum = <U extends string, T extends Readonly<[U, ...U[]]>>(\n enumName: string,\n values: T | Writable<T>,\n): OnchainEnum<Writable<T>> => {\n const schema = globalThis?.PONDER_NAMESPACE_BUILD?.schema;\n const e = pgEnumWithSchema(enumName, values, schema);\n\n // @ts-ignore\n e[onchain] = true;\n\n // @ts-ignore\n return e;\n};\n\n/** @see https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/table.ts#L51 */\nfunction pgTableWithSchema<\n name extends string,\n schema extends string | undefined,\n columns extends Record<string, PgColumnBuilderBase>,\n>(\n name: name,\n columns: columns | ((columnTypes: PgColumnsBuilders) => columns),\n extraConfig:\n | ((self: BuildExtraConfigColumns<columns>) => PgTableExtraConfig)\n | undefined,\n schema: schema,\n baseName = name,\n): PgTableWithColumns<{\n name: name;\n schema: schema;\n columns: BuildColumns<name, columns, \"pg\">;\n dialect: \"pg\";\n}> {\n const rawTable = new PgTable<{\n name: name;\n schema: schema;\n columns: BuildColumns<name, columns, \"pg\">;\n dialect: \"pg\";\n }>(name, schema, baseName);\n\n const { bigint: int8, text: _text, ...restColumns } = getPgColumnBuilders();\n\n const parsedColumns: columns =\n typeof columns === \"function\"\n ? columns({ ...restColumns, int8, hex, bigint, bytes, text, json, jsonb })\n : columns;\n\n const builtColumns = Object.fromEntries(\n Object.entries(parsedColumns).map(([name, colBuilderBase]) => {\n const colBuilder = colBuilderBase;\n // @ts-ignore\n colBuilder.setName(toSnakeCase(name));\n // @ts-ignore\n const column = colBuilder.build(rawTable);\n // @ts-ignore\n rawTable[Symbol.for(\"drizzle:PgInlineForeignKeys\")].push(\n // @ts-ignore\n ...colBuilder.buildForeignKeys(column, rawTable),\n );\n return [name, column];\n }),\n ) as unknown as BuildColumns<name, columns, \"pg\">;\n\n const builtColumnsForExtraConfig = Object.fromEntries(\n Object.entries(parsedColumns).map(([name, colBuilderBase]) => {\n const colBuilder = colBuilderBase as PgColumnBuilder;\n //@ts-ignore\n colBuilder.setName(toSnakeCase(name));\n //@ts-ignore\n const column = colBuilder.buildExtraConfigColumn(rawTable);\n return [name, column];\n }),\n ) as unknown as BuildExtraConfigColumns<columns>;\n\n const table = Object.assign(rawTable, builtColumns);\n\n //@ts-ignore\n table[Table.Symbol.Columns] = builtColumns;\n //@ts-ignore\n table[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n if (extraConfig) {\n //@ts-ignore\n table[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n }\n\n return Object.assign(table, {\n enableRLS: () => {\n // @ts-ignore\n table[PgTable.Symbol.EnableRLS] = true;\n return table as PgTableWithColumns<{\n name: name;\n schema: schema;\n columns: BuildColumns<name, columns, \"pg\">;\n dialect: \"pg\";\n }>;\n },\n });\n}\n\nfunction pgViewWithSchema(\n name: string,\n selection: Record<string, PgColumnBuilderBase> | undefined,\n schema: string | undefined,\n): ViewBuilder | ManualViewBuilder {\n if (selection) {\n return new ManualViewBuilder(name, selection, schema);\n }\n return new ViewBuilder(name, schema);\n}\n\nfunction pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n enumName: string,\n values: T | Writable<T>,\n schema?: string,\n): OnchainEnum<Writable<T>> {\n const enumInstance: OnchainEnum<Writable<T>> = Object.assign(\n <TName extends string>(\n name?: TName,\n ): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n new PgEnumColumnBuilder(name ?? (\"\" as TName), enumInstance),\n {\n enumName,\n enumValues: values,\n schema,\n [isPgEnumSym]: true,\n [onchain]: true,\n } as const,\n );\n\n return enumInstance;\n}\n","import {\n type ColumnBaseConfig,\n type ColumnBuilderBaseConfig,\n type ColumnBuilderRuntimeConfig,\n type MakeColumnConfig,\n entityKind,\n} from \"drizzle-orm\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgColumnBuilder,\n} from \"drizzle-orm/pg-core\";\n\nexport type PgBigintBuilderInitial<TName extends string> = PgBigintBuilder<{\n name: TName;\n dataType: \"bigint\";\n columnType: \"PgEvmBigint\";\n data: bigint;\n driverParam: string;\n enumValues: undefined;\n generated: undefined;\n}>;\n\nexport class PgBigintBuilder<\n T extends ColumnBuilderBaseConfig<\"bigint\", \"PgEvmBigint\">,\n> extends PgColumnBuilder<T> {\n static readonly [entityKind]: string = \"PgEvmBigintBuilder\";\n\n constructor(name: T[\"name\"]) {\n super(name, \"bigint\", \"PgEvmBigint\");\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgBigint<MakeColumnConfig<T, TTableName>> {\n return new PgBigint<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n}\n\nexport class PgBigint<\n T extends ColumnBaseConfig<\"bigint\", \"PgEvmBigint\">,\n> extends PgColumn<T> {\n static readonly [entityKind]: string = \"PgEvmBigint\";\n\n getSQLType(): string {\n return \"numeric(78)\";\n }\n\n override mapFromDriverValue(value: string): bigint {\n return BigInt(value);\n }\n}\n","import {\n type ColumnBaseConfig,\n type ColumnBuilderBaseConfig,\n type ColumnBuilderRuntimeConfig,\n type MakeColumnConfig,\n entityKind,\n} from \"drizzle-orm\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgColumnBuilder,\n} from \"drizzle-orm/pg-core\";\n\nexport type PgBytesBuilderInitial<TName extends string> = PgBytesBuilder<{\n name: TName;\n dataType: \"buffer\";\n columnType: \"PgBytes\";\n data: Uint8Array;\n driverParam: string;\n enumValues: undefined;\n generated: undefined;\n}>;\n\nexport class PgBytesBuilder<\n T extends ColumnBuilderBaseConfig<\"buffer\", \"PgBytes\">,\n> extends PgColumnBuilder<T> {\n static readonly [entityKind]: string = \"PgBytesBuilder\";\n\n constructor(name: T[\"name\"]) {\n super(name, \"buffer\", \"PgBytes\");\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgBytes<MakeColumnConfig<T, TTableName>> {\n return new PgBytes<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n\n /**\n * @deprecated Bytes columns cannot be used as arrays\n */\n override array(): never {\n throw new Error(\"bytes().array() is not supported\");\n }\n}\n\nexport class PgBytes<\n T extends ColumnBaseConfig<\"buffer\", \"PgBytes\">,\n> extends PgColumn<T> {\n static readonly [entityKind]: string = \"PgBytes\";\n\n getSQLType(): string {\n return \"bytea\";\n }\n\n override mapFromDriverValue(value: Buffer): Uint8Array {\n return new Uint8Array(value);\n }\n\n override mapToDriverValue(value: Uint8Array): Buffer {\n return Buffer.from(value);\n }\n}\n","import {\n type ColumnBaseConfig,\n type ColumnBuilderBaseConfig,\n type ColumnBuilderRuntimeConfig,\n type MakeColumnConfig,\n entityKind,\n} from \"drizzle-orm\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgColumnBuilder,\n} from \"drizzle-orm/pg-core\";\n\nexport type PgHexBuilderInitial<TName extends string> = PgHexBuilder<{\n name: TName;\n dataType: \"string\";\n columnType: \"PgHex\";\n data: `0x${string}`;\n driverParam: string;\n enumValues: undefined;\n generated: undefined;\n}>;\n\nexport class PgHexBuilder<\n T extends ColumnBuilderBaseConfig<\"string\", \"PgHex\">,\n> extends PgColumnBuilder<T> {\n static readonly [entityKind]: string = \"PgHexBuilder\";\n\n constructor(name: T[\"name\"]) {\n super(name, \"string\", \"PgHex\");\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgHex<MakeColumnConfig<T, TTableName>> {\n return new PgHex<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n}\n\nexport class PgHex<\n T extends ColumnBaseConfig<\"string\", \"PgHex\">,\n> extends PgColumn<T> {\n static readonly [entityKind]: string = \"PgHex\";\n\n getSQLType(): string {\n return \"text\";\n }\n\n override mapToDriverValue(value: `0x${string}`) {\n if (value.length % 2 === 0) return value.toLowerCase() as `0x${string}`;\n return `0x0${value.slice(2)}`.toLowerCase() as `0x${string}`;\n }\n}\n","/** Base class for all known errors. */\nexport class BaseError extends Error {\n override name = \"BaseError\";\n\n meta: string[] = [];\n\n constructor(message?: string | undefined, { cause }: { cause?: Error } = {}) {\n super(message, { cause });\n Object.setPrototypeOf(this, BaseError.prototype);\n }\n}\n\n/** Error caused by user code. Should not be retried. */\nexport class NonRetryableUserError extends BaseError {\n override name = \"NonRetryableUserError\";\n\n constructor(message?: string | undefined, { cause }: { cause?: Error } = {}) {\n super(message, { cause });\n Object.setPrototypeOf(this, NonRetryableUserError.prototype);\n }\n}\n\n/** Error that may succeed if tried again. */\nexport class RetryableError extends BaseError {\n override name = \"RetryableError\";\n\n constructor(message?: string | undefined, { cause }: { cause?: Error } = {}) {\n super(message, { cause });\n Object.setPrototypeOf(this, RetryableError.prototype);\n }\n}\n\nexport class ShutdownError extends NonRetryableUserError {\n override name = \"ShutdownError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, ShutdownError.prototype);\n }\n}\n\nexport class BuildError extends NonRetryableUserError {\n override name = \"BuildError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, BuildError.prototype);\n }\n}\n\nexport class MigrationError extends NonRetryableUserError {\n override name = \"MigrationError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, MigrationError.prototype);\n }\n}\n\n// Non-retryable database errors\n\nexport class UniqueConstraintError extends NonRetryableUserError {\n override name = \"UniqueConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, UniqueConstraintError.prototype);\n }\n}\n\nexport class NotNullConstraintError extends NonRetryableUserError {\n override name = \"NotNullConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, NotNullConstraintError.prototype);\n }\n}\n\nexport class InvalidStoreAccessError extends NonRetryableUserError {\n override name = \"InvalidStoreAccessError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, InvalidStoreAccessError.prototype);\n }\n}\n\nexport class RecordNotFoundError extends NonRetryableUserError {\n override name = \"RecordNotFoundError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, RecordNotFoundError.prototype);\n }\n}\n\nexport class CheckConstraintError extends NonRetryableUserError {\n override name = \"CheckConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, CheckConstraintError.prototype);\n }\n}\n\n// Retryable database errors\n\nexport class DbConnectionError extends RetryableError {\n override name = \"DbConnectionError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, DbConnectionError.prototype);\n }\n}\n\nexport class TransactionStatementError extends RetryableError {\n override name = \"TransactionStatementError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, TransactionStatementError.prototype);\n }\n}\n\nexport class CopyFlushError extends RetryableError {\n override name = \"CopyFlushError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, CopyFlushError.prototype);\n }\n}\n\nexport class InvalidEventAccessError extends RetryableError {\n override name = \"InvalidEventAccessError\";\n key: string;\n\n constructor(key: string, message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, InvalidEventAccessError.prototype);\n\n this.key = key;\n }\n}\n\n// Non-retryable indexing store errors\n\nexport class InvalidStoreMethodError extends NonRetryableUserError {\n override name = \"InvalidStoreMethodError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, InvalidStoreMethodError.prototype);\n }\n}\n\nexport class UndefinedTableError extends NonRetryableUserError {\n override name = \"UndefinedTableError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, UndefinedTableError.prototype);\n }\n}\n\nexport class BigIntSerializationError extends NonRetryableUserError {\n override name = \"BigIntSerializationError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, BigIntSerializationError.prototype);\n }\n}\n\nexport class DelayedInsertError extends NonRetryableUserError {\n override name = \"DelayedInsertError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, DelayedInsertError.prototype);\n }\n}\n\nexport class RawSqlError extends NonRetryableUserError {\n override name = \"RawSqlError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, RawSqlError.prototype);\n }\n}\n\nexport class IndexingFunctionError extends NonRetryableUserError {\n override name = \"IndexingFunctionError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, IndexingFunctionError.prototype);\n }\n}\n\nexport class RpcProviderError extends BaseError {\n override name = \"RpcProviderError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, RpcProviderError.prototype);\n }\n}\n\nexport const nonRetryableUserErrorNames = [\n ShutdownError,\n BuildError,\n MigrationError,\n UniqueConstraintError,\n NotNullConstraintError,\n InvalidStoreAccessError,\n RecordNotFoundError,\n CheckConstraintError,\n InvalidStoreMethodError,\n UndefinedTableError,\n BigIntSerializationError,\n DelayedInsertError,\n RawSqlError,\n IndexingFunctionError,\n].map((err) => err.name);\n","import { type BaseError, BigIntSerializationError } from \"@/internal/errors.js\";\nimport { type ColumnBaseConfig, entityKind } from \"drizzle-orm\";\nimport type {\n ColumnBuilderBaseConfig,\n ColumnBuilderRuntimeConfig,\n MakeColumnConfig,\n} from \"drizzle-orm/column-builder\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgColumnBuilder,\n} from \"drizzle-orm/pg-core\";\n\nexport type PgJsonBuilderInitial<TName extends string> = PgJsonBuilder<{\n name: TName;\n dataType: \"json\";\n columnType: \"PgJson\";\n data: unknown;\n driverParam: string;\n enumValues: undefined;\n}>;\n\nexport class PgJsonBuilder<\n T extends ColumnBuilderBaseConfig<\"json\", \"PgJson\">,\n> extends PgColumnBuilder<T> {\n static readonly [entityKind]: string = \"PgJsonBuilder\";\n\n constructor(name: T[\"name\"]) {\n super(name, \"json\", \"PgJson\");\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgJson<MakeColumnConfig<T, TTableName>> {\n return new PgJson<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n}\n\nexport class PgJson<\n T extends ColumnBaseConfig<\"json\", \"PgJson\">,\n> extends PgColumn<T> {\n static readonly [entityKind]: string = \"PgJson\";\n\n getSQLType(): string {\n return \"json\";\n }\n\n override mapToDriverValue(value: T[\"data\"]): string {\n try {\n return JSON.stringify(value);\n } catch (_error) {\n let error = _error as Error;\n if (\n // node error message\n error?.message?.includes(\"Do not know how to serialize a BigInt\") ||\n // bun error message\n error?.message?.includes(\"cannot serialize BigInt\")\n ) {\n error = new BigIntSerializationError(error.message);\n (error as BaseError).meta.push(\n \"Hint:\\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/api-reference/ponder-utils#replacebigints\",\n );\n }\n\n throw error;\n }\n }\n\n override mapFromDriverValue(value: T[\"data\"] | string): T[\"data\"] {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value as T[\"data\"];\n }\n }\n return value;\n }\n}\n\nexport type PgJsonbBuilderInitial<TName extends string> = PgJsonbBuilder<{\n name: TName;\n dataType: \"json\";\n columnType: \"PgJsonb\";\n data: unknown;\n driverParam: unknown;\n enumValues: undefined;\n}>;\n\nexport class PgJsonbBuilder<\n T extends ColumnBuilderBaseConfig<\"json\", \"PgJsonb\">,\n> extends PgColumnBuilder<T> {\n static override readonly [entityKind]: string = \"PgJsonbBuilder\";\n\n constructor(name: T[\"name\"]) {\n super(name, \"json\", \"PgJsonb\");\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgJsonb<MakeColumnConfig<T, TTableName>> {\n return new PgJsonb<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n}\n\nexport class PgJsonb<\n T extends ColumnBaseConfig<\"json\", \"PgJsonb\">,\n> extends PgColumn<T> {\n static override readonly [entityKind]: string = \"PgJsonb\";\n\n // biome-ignore lint/complexity/noUselessConstructor: <explanation>\n constructor(\n table: AnyPgTable<{ name: T[\"tableName\"] }>,\n config: PgJsonbBuilder<T>[\"config\"],\n ) {\n super(table, config);\n }\n\n getSQLType(): string {\n return \"jsonb\";\n }\n\n override mapToDriverValue(value: T[\"data\"]): string {\n try {\n return JSON.stringify(value);\n } catch (_error) {\n let error = _error as Error;\n if (error?.message?.includes(\"Do not know how to serialize a BigInt\")) {\n error = new BigIntSerializationError(error.message);\n (error as BaseError).meta.push(\n \"Hint:\\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/api-reference/ponder-utils#replacebigints\",\n );\n }\n\n throw error;\n }\n }\n\n override mapFromDriverValue(value: T[\"data\"] | string): T[\"data\"] {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value as T[\"data\"];\n }\n }\n return value;\n }\n}\n","import {\n type ColumnBaseConfig,\n type ColumnBuilderBaseConfig,\n type ColumnBuilderRuntimeConfig,\n type MakeColumnConfig,\n entityKind,\n getTableName,\n} from \"drizzle-orm\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgColumnBuilder,\n type PgTextConfig,\n} from \"drizzle-orm/pg-core\";\n\nexport type PgTextBuilderInitial<\n TName extends string,\n TEnum extends [string, ...string[]],\n> = PgTextBuilder<{\n name: TName;\n dataType: \"string\";\n columnType: \"PgText\";\n data: TEnum[number];\n enumValues: TEnum;\n driverParam: string;\n}>;\n\nexport class PgTextBuilder<\n T extends ColumnBuilderBaseConfig<\"string\", \"PgText\">,\n> extends PgColumnBuilder<T, { enumValues: T[\"enumValues\"] }> {\n static override readonly [entityKind]: string = \"PgTextBuilder\";\n\n constructor(name: T[\"name\"], config: PgTextConfig<T[\"enumValues\"]>) {\n super(name, \"string\", \"PgText\");\n this.config.enumValues = config.enum;\n }\n\n /** @internal */\n // @ts-ignore\n override build<TTableName extends string>(\n table: AnyPgTable<{ name: TTableName }>,\n ): PgText<MakeColumnConfig<T, TTableName>> {\n return new PgText<MakeColumnConfig<T, TTableName>>(\n table,\n this.config as ColumnBuilderRuntimeConfig<any, any>,\n );\n }\n}\n\nexport class PgText<\n T extends ColumnBaseConfig<\"string\", \"PgText\">,\n> extends PgColumn<T, { enumValues: T[\"enumValues\"] }> {\n static override readonly [entityKind]: string = \"PgText\";\n\n override readonly enumValues = this.config.enumValues;\n\n getSQLType(): string {\n return \"text\";\n }\n\n override mapToDriverValue(value: string) {\n // Note: swallow errors because drizzle will throw a more specific error if the value is invalid\n try {\n if (value.match(/\\0/g)) {\n globalThis.PONDER_COMMON?.logger.warn({\n msg: `Detected and removed null byte characters. Postgres \"text\" columns do not support null byte characters. Please consider handling this case in your indexing logic.`,\n value,\n table: getTableName(this.table),\n column: this.name,\n });\n\n return value.replace(/\\0/g, \"\");\n }\n } catch {}\n return value;\n }\n}\n","import type { Node, RangeVar, RawStmt } from \"@pgsql/types\";\n\ntype ValidatorNode<\n node extends Node extends infer T ? (T extends T ? keyof T : never) : never,\n> = {\n node: node | (string & {});\n children: (node: Extract<Node, { [key in node]: unknown }>[node]) => Node[];\n validate?: (node: Extract<Node, { [key in node]: unknown }>[node]) => void;\n};\n\nconst getNodeType = (node: Node) => Object.keys(node)[0]!;\n\nconst ALLOW_CACHE = new Map<string, boolean>();\nconst RELATIONS_CACHE = new Map<string, Set<string>>();\n\nexport const parseSQLQuery = async (sql: string): Promise<Node> => {\n // @ts-ignore\n const Parser = await import(/* webpackIgnore: true */ \"pg-query-emscripten\");\n\n if (sql.length > 5_000) {\n throw new Error(\"Invalid query\");\n }\n\n const { parse } = await Parser.default();\n const parseResult = parse(sql) as {\n parse_tree: { stmts: RawStmt[] };\n error: string | null;\n };\n\n if (parseResult.error !== null) {\n throw new Error(parseResult.error);\n }\n\n if (parseResult.parse_tree.stmts.length === 0) {\n throw new Error(\"Invalid query\");\n }\n\n if (parseResult.parse_tree.stmts.length > 1) {\n throw new Error(\"Multiple statements not supported\");\n }\n\n const stmt = parseResult.parse_tree.stmts[0]!;\n\n if (stmt.stmt === undefined) {\n throw new Error(\"Invalid query\");\n }\n\n return stmt.stmt;\n};\n\n/**\n * Validate a SQL query.\n *\n * @param sql - SQL query\n */\nexport const validateAllowableSQLQuery = async (sql: string) => {\n const crypto = await import(/* webpackIgnore: true */ \"node:crypto\");\n\n const hash = crypto\n .createHash(\"sha256\")\n .update(sql)\n .digest(\"hex\")\n .slice(0, 10);\n\n if (ALLOW_CACHE.has(hash)) {\n const result = ALLOW_CACHE.get(hash)!;\n\n ALLOW_CACHE.delete(hash);\n ALLOW_CACHE.set(hash, result);\n\n if (result) return;\n throw new Error(\"Invalid query\");\n }\n\n let root: Node;\n try {\n root = await parseSQLQuery(sql);\n } catch (error) {\n ALLOW_CACHE.set(hash, false);\n throw error;\n }\n\n const validate = (node: Node) => {\n if (ALLOW_LIST.has(getNodeType(node)) === false) {\n throw new Error(`${getNodeType(node)} not supported`);\n }\n\n // @ts-ignore\n ALLOW_LIST.get(getNodeType(node))!.validate?.(node[getNodeType(node)]);\n\n for (const child of ALLOW_LIST.get(getNodeType(node))!.children(\n // @ts-ignore\n node[getNodeType(node)],\n )) {\n validate(child);\n }\n };\n\n try {\n validate(root);\n } catch (error) {\n ALLOW_CACHE.set(hash, false);\n throw error;\n }\n\n ALLOW_CACHE.set(hash, true);\n if (ALLOW_CACHE.size > 1_000_000) {\n const firstKey = ALLOW_CACHE.keys().next().value;\n if (firstKey) ALLOW_CACHE.delete(firstKey);\n }\n};\n\n/**\n * Return `true` if the SQL query is readonly, else `false`.\n *\n * @param sql - SQL query\n */\nexport const isReadonlySQLQuery = async (sql: string): Promise<boolean> => {\n let root: Node;\n try {\n root = await parseSQLQuery(sql);\n } catch {\n return false;\n }\n\n const validate = (node: Node) => {\n if (ALLOW_LIST.has(getNodeType(node)) === false) {\n throw new Error(`${getNodeType(node)} not supported`);\n }\n\n for (const child of ALLOW_LIST.get(getNodeType(node))!.children(\n // @ts-ignore\n node[getNodeType(node)],\n )) {\n validate(child);\n }\n };\n\n try {\n validate(root);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Find all referenced relations in a SQL query.\n *\n * @param sql - SQL query\n */\nexport const getSQLQueryRelations = async (\n sql: string,\n): Promise<Set<string>> => {\n const crypto = await import(/* webpackIgnore: true */ \"node:crypto\");\n\n if (sql.length > 5_000) {\n throw new Error(\"Invalid query\");\n }\n\n const hash = crypto\n .createHash(\"sha256\")\n .update(sql)\n .digest(\"hex\")\n .slice(0, 10);\n\n if (RELATIONS_CACHE.has(hash)) {\n const result = RELATIONS_CACHE.get(hash)!;\n\n RELATIONS_CACHE.delete(hash);\n RELATIONS_CACHE.set(hash, result);\n\n return result;\n }\n\n const root = await parseSQLQuery(sql);\n\n const find = (node: Node) => {\n if (FIND_LIST.has(getNodeType(node)) === false) {\n throw new Error(`${getNodeType(node)} not supported`);\n }\n\n if (getNodeType(node) === \"RangeVar\") {\n const relation = (node as { RangeVar: RangeVar }).RangeVar.relname;\n if (relation) relations.add(relation);\n }\n\n for (const child of FIND_LIST.get(getNodeType(node))!.children(\n // @ts-ignore\n node[getNodeType(node)],\n )) {\n find(child);\n }\n };\n\n const relations = new Set<string>();\n find(root);\n\n RELATIONS_CACHE.set(hash, relations);\n if (RELATIONS_CACHE.size > 1_000_000) {\n const firstKey = RELATIONS_CACHE.keys().next().value;\n if (firstKey) RELATIONS_CACHE.delete(firstKey);\n }\n\n return relations;\n};\n\n// https://github.com/launchql/pgsql-parser/blob/f1df82ed4358e47c682e007bc5aa306b58f25514/packages/types/src/types.ts#L38\n\nconst INTEGER_VALIDATOR: ValidatorNode<\"Integer\"> = {\n node: \"Integer\",\n children: () => [],\n};\n\nconst FLOAT_VALIDATOR: ValidatorNode<\"Float\"> = {\n node: \"Float\",\n children: () => [],\n};\n\nconst BOOLEAN_VALIDATOR: ValidatorNode<\"Boolean\"> = {\n node: \"Boolean\",\n children: () => [],\n};\n\nconst STRING_VALIDATOR: ValidatorNode<\"String\"> = {\n node: \"String\",\n children: () => [],\n};\n\nconst BIT_STRING_VALIDATOR: ValidatorNode<\"BitString\"> = {\n node: \"BitString\",\n children: () => [],\n};\n\nconst LIST_VALIDATOR: ValidatorNode<\"List\"> = {\n node: \"List\",\n children: (node) => [...(node.items ?? [])],\n};\n\nconst OID_LIST_VALIDATOR: ValidatorNode<\"OidList\"> = {\n node: \"OidList\",\n children: (node) => [...(node.items ?? [])],\n};\n\nconst INT_LIST_VALIDATOR: ValidatorNode<\"IntList\"> = {\n node: \"IntList\",\n children: (node) => [...(node.items ?? [])],\n};\n\nconst A_CONST_VALIDATOR: ValidatorNode<\"A_Const\"> = {\n node: \"A_Const\",\n children: () => [],\n};\n\nconst ALIAS_VALIDATOR: ValidatorNode<\"Alias\"> = {\n node: \"Alias\",\n children: (node) => [...(node.colnames ?? [])],\n};\n\nconst RANGE_VAR_VALIDATOR: ValidatorNode<\"RangeVar\"> = {\n node: \"RangeVar\",\n children: (node) => [...(node.alias ? [{ Alias: node.alias }] : [])],\n validate: (node) => {\n if (node.schemaname) {\n throw new Error(\"Schema name not supported\");\n }\n\n if (node.relname && SYSTEM_TABLES.has(node.relname)) {\n throw new Error(\"System tables not supported\");\n }\n },\n};\n\nconst VAR_VALIDATOR: ValidatorNode<\"Var\"> = {\n node: \"Var\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst PARAM_VALIDATOR: ValidatorNode<\"Param\"> = {\n node: \"Param\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst AGGREF_VALIDATOR: ValidatorNode<\"Aggref\"> = {\n node: \"Aggref\",\n children: (node) => [\n ...(node.aggargtypes ?? []),\n ...(node.aggdirectargs ?? []),\n ...(node.args ?? []),\n ...(node.aggorder ?? []),\n ...(node.aggdistinct ?? []),\n ...(node.aggfilter ? [node.aggfilter] : []),\n ],\n};\n\nconst GROUPING_FUNC_VALIDATOR: ValidatorNode<\"GroupingFunc\"> = {\n node: \"GroupingFunc\",\n children: (node) => [...(node.args ?? []), ...(node.refs ?? [])],\n};\n\nconst WINDOW_FUNC_VALIDATOR: ValidatorNode<\"WindowFunc\"> = {\n node: \"WindowFunc\",\n children: (node) => [\n ...(node.args ?? []),\n ...(node.aggfilter ? [node.aggfilter] : []),\n ],\n};\n\nconst NAMED_ARG_EXPR_VALIDATOR: ValidatorNode<\"NamedArgExpr\"> = {\n node: \"NamedArgExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst OP_EXPR_VALIDATOR: ValidatorNode<\"OpExpr\"> = {\n node: \"OpExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst DISTINCT_EXPR_VALIDATOR: ValidatorNode<\"DistinctExpr\"> = {\n node: \"DistinctExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst NULL_IF_EXPR_VALIDATOR: ValidatorNode<\"NullIfExpr\"> = {\n node: \"NullIfExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst SCALAR_ARRAY_OP_EXPR_VALIDATOR: ValidatorNode<\"ScalarArrayOpExpr\"> = {\n node: \"ScalarArrayOpExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst BOOL_EXPR_VALIDATOR: ValidatorNode<\"BoolExpr\"> = {\n node: \"BoolExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst FIELD_SELECT_VALIDATOR: ValidatorNode<\"FieldSelect\"> = {\n node: \"FieldSelect\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst RELABEL_TYPE_VALIDATOR: ValidatorNode<\"RelabelType\"> = {\n node: \"RelabelType\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst ARRAY_COERCE_EXPR_VALIDATOR: ValidatorNode<\"ArrayCoerceExpr\"> = {\n node: \"ArrayCoerceExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ...(node.elemexpr ? [node.elemexpr] : []),\n ],\n};\n\nconst CONVERT_ROWTYPE_EXPR_VALIDATOR: ValidatorNode<\"ConvertRowtypeExpr\"> = {\n node: \"ConvertRowtypeExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst COLLATE_EXPR_VALIDATOR: ValidatorNode<\"CollateExpr\"> = {\n node: \"CollateExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst CASE_EXPR_VALIDATOR: ValidatorNode<\"CaseExpr\"> = {\n node: \"CaseExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ...(node.args ?? []),\n ...(node.defresult ? [node.defresult] : []),\n ],\n};\n\nconst CASE_WHEN_VALIDATOR: ValidatorNode<\"CaseWhen\"> = {\n node: \"CaseWhen\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.expr ? [node.expr] : []),\n ...(node.result ? [node.result] : []),\n ],\n};\n\nconst CASE_TEST_EXPR_VALIDATOR: ValidatorNode<\"CaseTestExpr\"> = {\n node: \"CaseTestExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst ARRAY_EXPR_VALIDATOR: ValidatorNode<\"ArrayExpr\"> = {\n node: \"ArrayExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.elements ?? []),\n ],\n};\n\nconst ROW_EXPR_VALIDATOR: ValidatorNode<\"RowExpr\"> = {\n node: \"RowExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.args ?? []),\n ...(node.colnames ?? []),\n ],\n};\n\nconst ROW_COMPARE_EXPR_VALIDATOR: ValidatorNode<\"RowCompareExpr\"> = {\n node: \"RowCompareExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.opnos ?? []),\n ...(node.opfamilies ?? []),\n ...(node.inputcollids ?? []),\n ...(node.largs ?? []),\n ...(node.rargs ?? []),\n ],\n};\n\nconst COALESC_EXPR_VALIDATOR: ValidatorNode<\"CoalesceExpr\"> = {\n node: \"CoalesceExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst MIN_MAX_EXPR_VALIDATOR: ValidatorNode<\"MinMaxExpr\"> = {\n node: \"MinMaxExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : []), ...(node.args ?? [])],\n};\n\nconst SQL_VALUE_FUNCTION_VALIDATOR: ValidatorNode<\"SQLValueFunction\"> = {\n node: \"SQLValueFunction\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst JSON_FORMAT_VALIDATOR: ValidatorNode<\"JsonFormat\"> = {\n node: \"JsonFormat\",\n children: () => [],\n};\n\nconst JSON_RETURNING_VALIDATOR: ValidatorNode<\"JsonReturning\"> = {\n node: \"JsonReturning\",\n children: (node) => [...(node.format ? [{ JsonFormat: node.format }] : [])],\n};\n\nconst JSON_VALUE_EXPR_VALIDATOR: ValidatorNode<\"JsonValueExpr\"> = {\n node: \"JsonValueExpr\",\n children: (node) => [\n ...(node.raw_expr ? [node.raw_expr] : []),\n ...(node.formatted_expr ? [node.formatted_expr] : []),\n ...(node.format ? [{ JsonFormat: node.format }] : []),\n ],\n};\n\nconst JSON_CONSTRUCTOR_EXPR_VALIDATOR: ValidatorNode<\"JsonConstructorExpr\"> = {\n node: \"JsonConstructorExpr\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.args ?? []),\n ...(node.func ? [node.func] : []),\n ...(node.coercion ? [node.coercion] : []),\n ...(node.returning ? [{ JsonReturning: node.returning }] : []),\n ],\n};\n\nconst JSON_IS_PREDICATE_VALIDATOR: ValidatorNode<\"JsonIsPredicate\"> = {\n node: \"JsonIsPredicate\",\n children: (node) => [\n ...(node.expr ? [node.expr] : []),\n ...(node.format ? [{ JsonFormat: node.format }] : []),\n ],\n};\n\nconst NULL_TEST_VALIDATOR: ValidatorNode<\"NullTest\"> = {\n node: \"NullTest\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst BOOLEAN_TEST_VALIDATOR: ValidatorNode<\"BooleanTest\"> = {\n node: \"BooleanTest\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst COERCE_TO_DOMAIN_VALIDATOR: ValidatorNode<\"CoerceToDomain\"> = {\n node: \"CoerceToDomain\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.arg ? [node.arg] : []),\n ],\n};\n\nconst COERCE_TO_DOMAIN_VALUE_VALIDATOR: ValidatorNode<\"CoerceToDomainValue\"> = {\n node: \"CoerceToDomainValue\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst CURRENT_OF_EXPR_VALIDATOR: ValidatorNode<\"CurrentOfExpr\"> = {\n node: \"CurrentOfExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst NEXT_VALUE_EXPR_VALIDATOR: ValidatorNode<\"NextValueExpr\"> = {\n node: \"NextValueExpr\",\n children: (node) => [...(node.xpr ? [node.xpr] : [])],\n};\n\nconst INFERENCE_ELEM_VALIDATOR: ValidatorNode<\"InferenceElem\"> = {\n node: \"InferenceElem\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.expr ? [node.expr] : []),\n ],\n};\n\nconst TARGET_ENTRY_VALIDATOR: ValidatorNode<\"TargetEntry\"> = {\n node: \"TargetEntry\",\n children: (node) => [\n ...(node.xpr ? [node.xpr] : []),\n ...(node.expr ? [node.expr] : []),\n ],\n};\n\nconst RANGE_TBL_REF_VALIDATOR: ValidatorNode<\"RangeTblRef\"> = {\n node: \"RangeTblRef\",\n children: () => [],\n};\n\nconst JOIN_EXPR_VALIDATOR: ValidatorNode<\"JoinExpr\"> = {\n node: \"JoinExpr\",\n children: (node) => [\n ...(node.larg ? [node.larg] : []),\n ...(node.rarg ? [node.rarg] : []),\n ...(node.usingClause ?? []),\n ...(node.join_using_alias ? [{ Alias: node.join_using_alias }] : []),\n ...(node.quals ? [node.quals] : []),\n ...(node.alias ? [{ Alias: node.alias }] : []),\n ],\n};\n\nconst FROM_EXPR_VALIDATOR: ValidatorNode<\"FromExpr\"> = {\n node: \"FromExpr\",\n children: (node) => [\n ...(node.fromlist ?? []),\n ...(node.quals ? [node.quals] : []),\n ],\n};\n\nconst ON_CONFLICT_EXPR_VALIDATOR: ValidatorNode<\"OnConflictExpr\"> = {\n node: \"OnConflictExpr\",\n children: (node) => [\n ...(node.arbiterElems ?? []),\n ...(node.arbiterWhere ? [node.arbiterWhere] : []),\n ...(node.onConflictSet ?? []),\n ...(node.onConflictWhere ? [node.onConflictWhere] : []),\n ...(node.exclRelTlist ?? []),\n ],\n};\n\nconst TYPE_NAME_VALIDATOR: ValidatorNode<\"TypeName\"> = {\n node: \"TypeName\",\n children: (node) => [\n ...(node.names ?? []),\n ...(node.typmods ?? []),\n ...(node.arrayBounds ?? []),\n ],\n};\n\nconst COLUMN_REF_VALIDATOR: ValidatorNode<\"ColumnRef\"> = {\n node: \"ColumnRef\",\n children: (node) => [...(node.fields ?? [])],\n};\n\nconst PARAM_REF_VALIDATOR: ValidatorNode<\"ParamRef\"> = {\n node: \"ParamRef\",\n children: () => [],\n};\n\nconst A_EXPR_VALIDATOR: ValidatorNode<\"A_Expr\"> = {\n node: \"A_Expr\",\n children: (node) => [\n ...(node.name ?? []),\n ...(node.lexpr ? [node.lexpr] : []),\n ...(node.rexpr ? [node.rexpr] : []),\n ],\n};\n\nconst TYPE_CAST_VALIDATOR: ValidatorNode<\"TypeCast\"> = {\n node: \"TypeCast\",\n children: (node) => [\n ...(node.arg ? [node.arg] : []),\n ...(node.typeName ? [{ TypeName: node.typeName }] : []),\n ],\n};\n\nconst COLLATE_CLAUSE_VALIDATOR: ValidatorNode<\"CollateClause\"> = {\n node: \"CollateClause\",\n children: (node) => [\n ...(node.arg ? [node.arg] : []),\n ...(node.collname ?? []),\n ],\n};\n\nconst ALLOWED_FUNCTIONS = new Set([\n \"count\",\n \"sum\",\n \"avg\",\n \"min\",\n \"max\",\n \"lower\",\n \"upper\",\n \"length\",\n \"trim\",\n \"replace\",\n \"substring\",\n \"cast\",\n \"concat\",\n \"now\",\n \"current_timestamp\",\n \"current_date\",\n \"current_time\",\n \"coalesce\",\n \"json_agg\",\n \"json_object\",\n \"json_array\",\n \"json_object_agg\",\n \"json_array_agg\",\n \"json_build_array\",\n \"row_number\",\n \"rank\",\n \"dense_rank\",\n \"percent_rank\",\n \"cume_dist\",\n \"ntile\",\n \"lag\",\n \"lead\",\n \"first_value\",\n \"last_value\",\n \"nth_value\",\n \"abs\",\n \"cbrt\",\n \"ceil\",\n \"ceiling\",\n \"degrees\",\n \"div\",\n \"exp\",\n \"floor\",\n \"ln\",\n \"log\",\n \"mod\",\n \"pi\",\n \"power\",\n \"radians\",\n \"random\",\n \"round\",\n \"sign\",\n \"sqrt\",\n \"width_bucket\",\n \"acos\",\n \"asin\",\n \"atan\",\n \"atan2\",\n \"cos\",\n \"cot\",\n \"sin\",\n \"tan\",\n]);\n\nconst FUNC_CALL_VALIDATOR: ValidatorNode<\"FuncCall\"> = {\n node: \"FuncCall\",\n children: (node) => [\n ...(node.funcname ?? []),\n ...(node.args ?? []),\n ...(node.agg_order ?? []),\n ...(node.agg_filter ? [node.agg_filter] : []),\n ...(node.over ? [{ WindowDef: node.over }] : []),\n ],\n validate: (node) => {\n if (\n node.funcname?.every(\n (name) =>\n getNodeType(name) === \"String\" &&\n // @ts-ignore\n ALLOWED_FUNCTIONS.has(name.String.sval),\n )\n ) {\n return;\n }\n throw new Error(\"Function call not supported\");\n },\n};\n\nconst A_STAR_VALIDATOR: ValidatorNode<\"A_Star\"> = {\n node: \"A_Star\",\n children: () => [],\n};\n\nconst A_INDICES_VALIDATOR: ValidatorNode<\"A_Indices\"> = {\n node: \"A_Indices\",\n children: (node) => [\n ...(node.lidx ? [node.lidx] : []),\n ...(node.uidx ? [node.uidx] : []),\n ],\n};\n\nconst A_INDIRECTION_VALIDATOR: ValidatorNode<\"A_Indirection\"> = {\n node: \"A_Indirection\",\n children: (node) => [\n ...(node.arg ? [node.arg] : []),\n ...(node.indirection ?? []),\n ],\n};\n\nconst A_ARRAY_EXPR_VALIDATOR: ValidatorNode<\"A_ArrayExpr\"> = {\n node: \"A_ArrayExpr\",\n children: (node) => [...(node.elements ?? [])],\n};\n\nconst RES_TARGET_VALIDATOR: ValidatorNode<\"ResTarget\"> = {\n node: \"ResTarget\",\n children: (node) => [\n ...(node.indirection ?? []),\n ...(node.val ? [node.val] : []),\n ],\n};\n\nconst MULTI_ASSIGN_REF_VALIDATOR: ValidatorNode<\"MultiAssignRef\"> = {\n node: \"MultiAssignRef\",\n children: (node) => [...(node.source ? [node.source] : [])],\n};\n\nconst SORT_BY_VALIDATOR: ValidatorNode<\"SortBy\"> = {\n node: \"SortBy\",\n children: (node) => [\n ...(node.node ? [node.node] : []),\n ...(node.useOp ?? []),\n ],\n};\n\nconst WINDOW_DEF_VALIDATOR: ValidatorNode<\"WindowDef\"> = {\n node: \"WindowDef\",\n children: (node) => [\n ...(node.partitionClause ?? []),\n ...(node.orderClause ?? []),\n ...(node.startOffset ? [node.startOffset] : []),\n ...(node.endOffset ? [node.endOffset] : []),\n ],\n};\n\nconst RANGE_SUBSELECT_VALIDATOR: ValidatorNode<\"RangeSubselect\"> = {\n node: \"RangeSubselect\",\n children: (node) => [\n ...(node.subquery ? [node.subquery] : []),\n ...(node.alias ? [{ Alias: node.alias }] : []),\n ],\n};\n\nconst SORT_GROUP_CLAUSE_VALIDATOR: ValidatorNode<\"SortGroupClause\"> = {\n node: \"SortGroupClause\",\n children: () => [],\n};\n\nconst GROUPING_SET_VALIDATOR: ValidatorNode<\"GroupingSet\"> = {\n node: \"GroupingSet\",\n children: (node) => [...(node.content ?? [])],\n};\n\nconst WITH_CLAUSE_VALIDATOR: ValidatorNode<\"WithClause\"> = {\n node: \"WithClause\",\n children: (node) => [...(node.ctes ?? [])],\n validate: (node) => {\n if (node.recursive) {\n throw new Error(\"Recursive CTEs not supported\");\n }\n },\n};\n\nconst COMMON_TABLE_EXPR_VALIDATOR: ValidatorNode<\"CommonTableExpr\"> = {\n node: \"CommonTableExpr\",\n children: (node) => [\n ...(node.aliascolnames ?? []),\n ...(node.ctequery ? [node.ctequery] : []),\n ...(node.search_clause ? [{ CTESearchClause: node.search_clause }] : []),\n ...(node.cycle_clause ? [{ CTECycleClause: node.cycle_clause }] : []),\n ...(node.ctecolnames ?? []),\n ...(node.ctecoltypes ?? []),\n ...(node.ctecoltypmods ?? []),\n ...(node.ctecolcollations ?? []),\n ],\n validate: (node) => {\n if (node.ctematerialized === \"CTEMaterializeAlways\" || node.cterecursive) {\n throw new Error(\"Invalid CTE\");\n }\n },\n};\n\nconst JSON_OUTPUT_VALIDATOR: ValidatorNode<\"JsonOutput\"> = {\n node: \"JsonOutput\",\n children: (node) => [\n ...(node.returning ? [{ JsonReturning: node.returning }] : []),\n ],\n};\n\nconst JSON_KEY_VALUE_VALIDATOR: ValidatorNode<\"JsonKeyValue\"> = {\n node: \"JsonKeyValue\",\n children: (node) => [\n ...(node.key ? [node.key] : []),\n ...(node.value ? [{ JsonValueExpr: node.value }] : []),\n ],\n};\n\nconst JSON_OBJECT_CONSTRUCTOR_VALIDATOR: ValidatorNode<\"JsonObjectConstructor\"> =\n {\n node: \"JsonObjectConstructor\",\n children: (node) => [\n ...(node.exprs ?? []),\n ...(node.output ? [{ JsonOutput: node.output }] : []),\n ],\n };\n\nconst JSON_ARRAY_CONSTRUCTOR_VALIDATOR: ValidatorNode<\"JsonArrayConstructor\"> =\n {\n node: \"JsonArrayConstructor\",\n children: (node) => [\n ...(node.exprs ?? []),\n ...(node.output ? [{ JsonOutput: node.output }] : []),\n ],\n };\n\nconst JSON_ARRAY_QUERY_CONSTRUCTOR_VALIDATOR: ValidatorNode<\"JsonArrayQueryConstructor\"> =\n {\n node: \"JsonArrayQueryConstructor\",\n children: (node) => [\n ...(node.query ? [node.query] : []),\n ...(node.output ? [{ JsonOutput: node.output }] : []),\n ...(node.format ? [{ JsonFormat: node.format }] : []),\n ],\n };\n\nconst JSON_AGG_CONSTRUCTOR_VALIDATOR: ValidatorNode<\"JsonAggConstructor\"> = {\n node: \"JsonAggConstructor\",\n children: (node) => [\n ...(node.output ? [{ JsonOutput: node.output }] : []),\n ...(node.agg_filter ? [node.agg_filter] : []),\n ...(node.agg_order ?? []),\n ...(node.over ? [{ WindowDef: node.over }] : []),\n ],\n};\n\nconst JSON_OBJECT_AGG_VALIDATOR: ValidatorNode<\"JsonObjectAgg\"> = {\n node: \"JsonObjectAgg\",\n children: (node) => [\n ...(node.constructor ? [{ JsonAggConstructor: node.constructor }] : []),\n ...(node.arg ? [{ JsonKeyValue: node.arg }] : []),\n ],\n};\n\nconst JSON_ARRAY_AGG_VALIDATOR: ValidatorNode<\"JsonArrayAgg\"> = {\n node: \"JsonArrayAgg\",\n children: (node) => [\n ...(node.constructor ? [{ JsonAggConstructor: node.constructor }] : []),\n ...(node.arg ? [{ JsonValueExpr: node.arg }] : []),\n ],\n};\n\nconst SELECT_STMT_VALIDATOR: ValidatorNode<\"SelectStmt\"> = {\n node: \"SelectStmt\",\n children: (node) => [\n ...(node.distinctClause ?? []),\n ...(node.intoClause ? [{ IntoClause: node.intoClause }] : []),\n ...(node.targetList ?? []),\n ...(node.fromClause ?? []),\n ...(node.whereClause ? [node.whereClause] : []),\n ...(node.groupClause ?? []),\n ...(node.havingClause ? [node.havingClause] : []),\n ...(node.windowClause ?? []),\n ...(node.valuesLists ?? []),\n ...(node.sortClause ?? []),\n ...(node.limitOffset ? [node.limitOffset] : []),\n ...(node.limitCount ? [node.limitCount] : []),\n ...(node.lockingClause ?? []),\n ...(node.withClause ? [{ WithClause: node.withClause }] : []),\n ...(node.larg ? [{ SelectStmt: node.larg }] : []),\n ...(node.rarg ? [{ SelectStmt: node.rarg }] : []),\n ],\n validate: (node) => {\n if (node.lockingClause) {\n throw new Error(\"Invalid query\");\n }\n },\n};\n\nconst COMMENT_STMT_VALIDATOR: ValidatorNode<\"CommentStmt\"> = {\n node: \"CommentStmt\",\n children: (node) => [...(node.object ? [node.object] : [])],\n};\n\n/** Validation rules for allowed Postgres SQL AST nodes. */\nconst ALLOW_LIST = new Map(\n [\n INTEGER_VALIDATOR,\n FLOAT_VALIDATOR,\n BOOLEAN_VALIDATOR,\n STRING_VALIDATOR,\n BIT_STRING_VALIDATOR,\n LIST_VALIDATOR,\n OID_LIST_VALIDATOR,\n INT_LIST_VALIDATOR,\n A_CONST_VALIDATOR,\n ALIAS_VALIDATOR,\n RANGE_VAR_VALIDATOR,\n VAR_VALIDATOR,\n PARAM_VALIDATOR,\n AGGREF_VALIDATOR,\n GROUPING_FUNC_VALIDATOR,\n WINDOW_FUNC_VALIDATOR,\n NAMED_ARG_EXPR_VALIDATOR,\n OP_EXPR_VALIDATOR,\n DISTINCT_EXPR_VALIDATOR,\n NULL_IF_EXPR_VALIDATOR,\n SCALAR_ARRAY_OP_EXPR_VALIDATOR,\n BOOL_EXPR_VALIDATOR,\n FIELD_SELECT_VALIDATOR,\n RELABEL_TYPE_VALIDATOR,\n ARRAY_COERCE_EXPR_VALIDATOR,\n CONVERT_ROWTYPE_EXPR_VALIDATOR,\n COLLATE_EXPR_VALIDATOR,\n CASE_EXPR_VALIDATOR,\n CASE_WHEN_VALIDATOR,\n CASE_TEST_EXPR_VALIDATOR,\n ARRAY_EXPR_VALIDATOR,\n ROW_EXPR_VALIDATOR,\n ROW_COMPARE_EXPR_VALIDATOR,\n COALESC_EXPR_VALIDATOR,\n MIN_MAX_EXPR_VALIDATOR,\n SQL_VALUE_FUNCTION_VALIDATOR,\n JSON_FORMAT_VALIDATOR,\n JSON_RETURNING_VALIDATOR,\n JSON_VALUE_EXPR_VALIDATOR,\n JSON_CONSTRUCTOR_EXPR_VALIDATOR,\n JSON_IS_PREDICATE_VALIDATOR,\n NULL_TEST_VALIDATOR,\n BOOLEAN_TEST_VALIDATOR,\n COERCE_TO_DOMAIN_VALIDATOR,\n COERCE_TO_DOMAIN_VALUE_VALIDATOR,\n CURRENT_OF_EXPR_VALIDATOR,\n NEXT_VALUE_EXPR_VALIDATOR,\n INFERENCE_ELEM_VALIDATOR,\n TARGET_ENTRY_VALIDATOR,\n RANGE_TBL_REF_VALIDATOR,\n JOIN_EXPR_VALIDATOR,\n FROM_EXPR_VALIDATOR,\n ON_CONFLICT_EXPR_VALIDATOR,\n TYPE_NAME_VALIDATOR,\n COLUMN_REF_VALIDATOR,\n PARAM_REF_VALIDATOR,\n A_EXPR_VALIDATOR,\n TYPE_CAST_VALIDATOR,\n COLLATE_CLAUSE_VALIDATOR,\n FUNC_CALL_VALIDATOR,\n A_STAR_VALIDATOR,\n A_INDICES_VALIDATOR,\n A_INDIRECTION_VALIDATOR,\n A_ARRAY_EXPR_VALIDATOR,\n RES_TARGET_VALIDATOR,\n MULTI_ASSIGN_REF_VALIDATOR,\n SORT_BY_VALIDATOR,\n WINDOW_DEF_VALIDATOR,\n RANGE_SUBSELECT_VALIDATOR,\n SORT_GROUP_CLAUSE_VALIDATOR,\n GROUPING_SET_VALIDATOR,\n WITH_CLAUSE_VALIDATOR,\n COMMON_TABLE_EXPR_VALIDATOR,\n JSON_OUTPUT_VALIDATOR,\n JSON_KEY_VALUE_VALIDATOR,\n JSON_OBJECT_CONSTRUCTOR_VALIDATOR,\n JSON_ARRAY_CONSTRUCTOR_VALIDATOR,\n JSON_ARRAY_QUERY_CONSTRUCTOR_VALIDATOR,\n JSON_AGG_CONSTRUCTOR_VALIDATOR,\n JSON_OBJECT_AGG_VALIDATOR,\n JSON_ARRAY_AGG_VALIDATOR,\n SELECT_STMT_VALIDATOR,\n COMMENT_STMT_VALIDATOR,\n ].map((node) => [node.node, node]),\n);\n\nconst UPDATE_STMT_VALIDATOR: ValidatorNode<\"UpdateStmt\"> = {\n node: \"UpdateStmt\",\n children: (node) => [\n ...(node.relation ? [{ RangeVar: node.relation }] : []),\n ...(node.targetList ?? []),\n ...(node.whereClause ? [node.whereClause] : []),\n ...(node.fromClause ?? []),\n ...(node.returningList ?? []),\n ...(node.withClause ? [{ WithClause: node.withClause }] : []),\n ],\n};\n\nconst DELETE_STMT_VALIDATOR: ValidatorNode<\"DeleteStmt\"> = {\n node: \"DeleteStmt\",\n children: (node) => [\n ...(node.relation ? [{ RangeVar: node.relation }] : []),\n ...(node.usingClause ?? []),\n ...(node.whereClause ? [node.whereClause] : []),\n ...(node.returningList ?? []),\n ...(node.withClause ? [{ WithClause: node.withClause }] : []),\n ],\n};\n\nconst FIND_LIST = new Map(\n [\n ...Array.from(ALLOW_LIST.values()),\n UPDATE_STMT_VALIDATOR,\n DELETE_STMT_VALIDATOR,\n ].map((node) => [node.node, node]),\n);\n\n// NOT_ALLOW_LIST\n// ParseResult\n// ScanResult\n// TableFunc\n// IntoClause\n// SubscriptingRef\n// FuncExpr\n// SubLink\n// SubPlan\n// AlternativeSubPlan\n// FieldStore\n// CoerceViaIO\n// XmlExpr\n// SetToDefault\n// Query\n// RoleSpec\n// RangeFunction\n// RangeTableFunc\n// RangeTableFuncCol\n// RangeTableSample\n// ColumnDef\n// TableLikeClause\n// IndexElem\n// DefElem\n// LockingClause\n// XmlSerialize\n// PartitionElem\n// PartitionSpec\n// PartitionBounSpec\n// PartitionRangeDatum\n// PartitionCmd\n// RangeTableEntry\n// RTEPermissionInfo\n// RangeTblFunction\n// TableSampleClause\n// WithCheckOption\n// WindowClause\n// RowMarkClause\n// InferClausej\n// OnConflictClause\n// CTESearchClause\n// CTECycleClause\n// MergeWhenClause\n// MergeAction\n// TriggerTransition\n// RawStmt\n// InsertStmt\n// DeleteStmt\n// UpdateStmt\n// MergeStmt\n// SetOperationStmt\n// ReturnStmt\n// PLAssignStmt\n// CreateSchemaStmt\n// AlterTableStmt\n// ReplicaIdentityStmt\n// AlterTableCmd\n// AlterCollationStmt\n// AlterDomainStmt\n// GrantStmt\n// ObjectWithArgs\n// AccessPriv\n// GrantRoleStmt\n// AlterDefaultPrivilegesStmt\n// CopyStmt\n// VariableSetStmt\n// VariableShowStmt\n// CreateStmt\n// Constraint\n// CreateTableSpaceStmt\n// DropTableSpaceStmt\n// AlterTableSpaceOptionsStmt\n// AlterTableMoveAllStmt\n// CreateExtensionStmt\n// AlterExtensionStmt\n// AlterExtensionContentsStmt\n// CreateFdwStmt\n// AlterFdwStmt\n// CreateForeignServerStmt\n// AlterForeignServerStmt\n// CreateForeignTableStmt\n// CreateUserMappingStmt\n// AlterUserMappingStmt\n// DropUserMappingStmt\n// ImportForeignSchemaStmt\n// CreatePolicyStmt\n// AlterPolicyStmt\n// CreateAmStmt\n// CreateTrigStmt\n// CreateEventTrigStmt\n// AlterEventTrigStmt\n// CreatePLangStmt\n// CreateRoleStmt\n// AlterRoleStmt\n// AlterRoleSetStmt\n// DropRoleStmt\n// CreateSeqStmt\n// AlterSeqStmt\n// DefineStmt\n// CreateDomainStmt\n// CreateOpClassStmt\n// CreateOpClassItem\n// CreateOpFamilyStmt\n// AlterOpFamilyStmt\n// DropStmt\n// TruncateStmt\n// SecLabelStmt\n// DeclareCursorStmt\n// ClosePortalStmt\n// FetchStmt\n// IndexStmt\n// CreateStatsStmt\n// StatsElem\n// AlterStatsStmt\n// CreateFunctionStmt\n// FunctionParameter\n// AlterFunctionStmt\n// DoStmt\n// InlineCodeBlock\n// CallStmt\n// CallContext\n// RenameStmt\n// AlterObjectDependsStmt\n// AlterObjectSchemaStmt\n// AlterOwnerStmt\n// AlterOperatorStmt\n// AlterTypeStmt\n// RuleStmt\n// NotifyStmt\n// ListenStmt\n// UnlistenStmt\n// TransactionStmt\n// CompositeTypeStmt\n// CreateEnumStmt\n// CreateRangeStmt\n// AlterEnumStmt\n// ViewStmt\n// LoadStmt\n// CreatedbStmt\n// AlterDatabaseStmt\n// AlterDatabaseRefreshCollStmt\n// AlterDatabaseSetStmt\n// DropdbStmt\n// AlterSystemStmt\n// ClusterStmt\n// VacuumStmt\n// VacuumRelation\n// ExplainStmt\n// CreateTableAsStmt\n// RefreshMatViewStmt\n// CheckPointStmt\n// DiscardStmt\n// LockStmt\n// ConstraintsSetStmt\n// ReindexStmt\n// CreateConversionStmt\n// CreateCastStmt\n// CreateTransformStmt\n// PrepareStmt\n// ExecuteStmt\n// DeallocateStmt\n// DropOwnedStmt\n// ReassignOwnedStmt\n// AlterTSDictionaryStmt\n// AlterTSConfigurationStmt\n// PublicationTable\n// PublicationObjSpec\n// CreatePublicationStmt\n// AlterPublicationStmt\n// CreateSubscriptionStmt\n// AlterSubscriptionStmt\n// DropSubscriptionStmt\n// ScanToken\n\nconst SYSTEM_TABLES = new Set([\n \"pg_statistic\",\n \"pg_type\",\n \"pg_foreign_table\",\n \"pg_proc_oid_index\",\n \"pg_proc_proname_args_nsp_index\",\n \"pg_type_oid_index\",\n \"pg_type_typname_nsp_index\",\n \"pg_attribute_relid_attnam_index\",\n \"pg_attribute_relid_attnum_index\",\n \"pg_class_oid_index\",\n \"pg_class_relname_nsp_index\",\n \"pg_class_tblspc_relfilenode_index\",\n \"pg_attrdef_adrelid_adnum_index\",\n \"pg_attrdef_oid_index\",\n \"pg_constraint_conname_nsp_index\",\n \"pg_constraint_conrelid_contypid_conname_index\",\n \"pg_constraint_contypid_index\",\n \"pg_constraint_oid_index\",\n \"pg_constraint_conparentid_index\",\n \"pg_inherits_relid_seqno_index\",\n \"pg_inherits_parent_index\",\n \"pg_index_indrelid_index\",\n \"pg_index_indexrelid_index\",\n \"pg_operator_oid_index\",\n \"pg_operator_oprname_l_r_n_index\",\n \"pg_opfamily_am_name_nsp_index\",\n \"pg_opfamily_oid_index\",\n \"pg_opclass_am_name_nsp_index\",\n \"pg_opclass_oid_index\",\n \"pg_am_name_index\",\n \"pg_am_oid_index\",\n \"pg_amop_fam_strat_index\",\n \"pg_amop_opr_fam_index\",\n \"pg_amop_oid_index\",\n \"pg_amproc_fam_proc_index\",\n \"pg_amproc_oid_index\",\n \"pg_language_name_index\",\n \"pg_language_oid_index\",\n \"pg_largeobject_metadata_oid_index\",\n \"pg_largeobject_loid_pn_index\",\n \"pg_aggregate_fnoid_index\",\n \"pg_statistic_relid_att_inh_index\",\n \"pg_statistic_ext_oid_index\",\n \"pg_statistic_ext_name_index\",\n \"pg_statistic_ext_relid_index\",\n \"pg_statistic_ext_data_stxoid_inh_index\",\n \"pg_rewrite_oid_index\",\n \"pg_rewrite_rel_rulename_index\",\n \"pg_trigger_tgconstraint_index\",\n \"pg_trigger_tgrelid_tgname_index\",\n \"pg_trigger_oid_index\",\n \"pg_event_trigger_evtname_index\",\n \"pg_event_trigger_oid_index\",\n \"pg_description_o_c_o_index\",\n \"pg_cast_oid_index\",\n \"pg_cast_source_target_index\",\n \"pg_enum_oid_index\",\n \"pg_enum_typid_label_index\",\n \"pg_enum_typid_sortorder_index\",\n \"pg_namespace_nspname_index\",\n \"pg_namespace_oid_index\",\n \"pg_conversion_default_index\",\n \"pg_conversion_name_nsp_index\",\n \"pg_conversion_oid_index\",\n \"pg_depend_depender_index\",\n \"pg_depend_reference_index\",\n \"pg_database_datname_index\",\n \"pg_database_oid_index\",\n \"pg_db_role_setting_databaseid_rol_index\",\n \"pg_tablespace_oid_index\",\n \"pg_tablespace_spcname_index\",\n \"pg_authid_rolname_index\",\n \"pg_authid_oid_index\",\n \"pg_auth_members_oid_index\",\n \"pg_auth_members_role_member_index\",\n \"pg_auth_members_member_role_index\",\n \"pg_auth_members_grantor_index\",\n \"pg_shdepend_depender_index\",\n \"pg_shdepend_reference_index\",\n \"pg_shdescription_o_c_index\",\n \"pg_ts_config_cfgname_index\",\n \"pg_ts_config_oid_index\",\n \"pg_ts_config_map_index\",\n \"pg_ts_dict_dictname_index\",\n \"pg_ts_dict_oid_index\",\n \"pg_ts_parser_prsname_index\",\n \"pg_ts_parser_oid_index\",\n \"pg_ts_template_tmplname_index\",\n \"pg_ts_template_oid_index\",\n \"pg_extension_oid_index\",\n \"pg_extension_name_index\",\n \"pg_foreign_data_wrapper_oid_index\",\n \"pg_foreign_data_wrapper_name_index\",\n \"pg_foreign_server_oid_index\",\n \"pg_foreign_server_name_index\",\n \"pg_user_mapping_oid_index\",\n \"pg_user_mapping_user_server_index\",\n \"pg_foreign_table_relid_index\",\n \"pg_policy_oid_index\",\n \"pg_policy_polrelid_polname_index\",\n \"pg_replication_origin_roiident_index\",\n \"pg_replication_origin_roname_index\",\n \"pg_default_acl_role_nsp_obj_index\",\n \"pg_default_acl_oid_index\",\n \"pg_init_privs_o_c_o_index\",\n \"pg_seclabel_object_index\",\n \"pg_shseclabel_object_index\",\n \"pg_collation_name_enc_nsp_index\",\n \"pg_collation_oid_index\",\n \"pg_parameter_acl_parname_index\",\n \"pg_parameter_acl_oid_index\",\n \"pg_partitioned_table_partrelid_index\",\n \"pg_range_rngtypid_index\",\n \"pg_range_rngmultitypid_index\",\n \"pg_transform_oid_index\",\n \"pg_transform_type_lang_index\",\n \"pg_sequence_seqrelid_index\",\n \"pg_publication_oid_index\",\n \"pg_publication_pubname_index\",\n \"pg_publication_namespace_oid_index\",\n \"pg_publication_namespace_pnnspid_pnpubid_index\",\n \"pg_publication_rel_oid_index\",\n \"pg_publication_rel_prrelid_prpubid_index\",\n \"pg_publication_rel_prpubid_index\",\n \"pg_subscription_oid_index\",\n \"pg_subscription_subname_index\",\n \"pg_subscription_rel_srrelid_srsubid_index\",\n \"pg_authid\",\n \"pg_shadow\",\n \"pg_roles\",\n \"pg_statistic_ext_data\",\n \"pg_hba_file_rules\",\n \"pg_settings\",\n \"pg_file_settings\",\n \"pg_backend_memory_contexts\",\n \"pg_ident_file_mappings\",\n \"pg_config\",\n \"pg_shmem_allocations\",\n \"pg_tables\",\n \"pg_user_mapping\",\n \"pg_replication_origin_status\",\n \"pg_subscription\",\n \"pg_attribute\",\n \"pg_proc\",\n \"pg_class\",\n \"pg_attrdef\",\n \"pg_constraint\",\n \"pg_inherits\",\n \"pg_index\",\n \"pg_operator\",\n \"pg_statio_all_sequences\",\n \"pg_opfamily\",\n \"pg_opclass\",\n \"pg_am\",\n \"pg_amop\",\n \"pg_amproc\",\n \"pg_language\",\n \"pg_largeobject_metadata\",\n \"pg_aggregate\",\n \"pg_statistic_ext\",\n \"pg_rewrite\",\n \"pg_trigger\",\n \"pg_event_trigger\",\n \"pg_description\",\n \"pg_cast\",\n \"pg_enum\",\n \"pg_namespace\",\n \"pg_conversion\",\n \"pg_depend\",\n \"pg_database\",\n \"pg_db_role_setting\",\n \"pg_tablespace\",\n \"pg_auth_members\",\n \"pg_shdepend\",\n \"pg_shdescription\",\n \"pg_ts_config\",\n \"pg_ts_config_map\",\n \"pg_ts_dict\",\n \"pg_ts_parser\",\n \"pg_ts_template\",\n \"pg_extension\",\n \"pg_foreign_data_wrapper\",\n \"pg_foreign_server\",\n \"pg_policy\",\n \"pg_replication_origin\",\n \"pg_default_acl\",\n \"pg_init_privs\",\n \"pg_seclabel\",\n \"pg_shseclabel\",\n \"pg_collation\",\n \"pg_parameter_acl\",\n \"pg_partitioned_table\",\n \"pg_range\",\n \"pg_transform\",\n \"pg_sequence\",\n \"pg_publication\",\n \"pg_publication_namespace\",\n \"pg_publication_rel\",\n \"pg_subscription_rel\",\n \"pg_group\",\n \"pg_user\",\n \"pg_policies\",\n \"pg_rules\",\n \"pg_views\",\n \"pg_matviews\",\n \"pg_indexes\",\n \"pg_sequences\",\n \"pg_stats\",\n \"pg_stats_ext\",\n \"pg_stats_ext_exprs\",\n \"pg_publication_tables\",\n \"pg_locks\",\n \"pg_cursors\",\n \"pg_available_extensions\",\n \"pg_available_extension_versions\",\n \"pg_prepared_xacts\",\n \"pg_prepared_statements\",\n \"pg_seclabels\",\n \"pg_timezone_abbrevs\",\n \"pg_timezone_names\",\n \"pg_stat_all_tables\",\n \"pg_stat_xact_all_tables\",\n \"pg_stat_xact_user_tables\",\n \"pg_stat_sys_tables\",\n \"pg_stat_xact_sys_tables\",\n \"pg_stat_user_tables\",\n \"pg_statio_all_tables\",\n \"pg_statio_sys_tables\",\n \"pg_statio_user_tables\",\n \"pg_stat_all_indexes\",\n \"pg_stat_sys_indexes\",\n \"pg_stat_user_indexes\",\n \"pg_statio_all_indexes\",\n \"pg_statio_sys_indexes\",\n \"pg_statio_user_indexes\",\n \"pg_statio_sys_sequences\",\n \"pg_statio_user_sequences\",\n \"pg_stat_activity\",\n \"pg_stat_replication\",\n \"pg_stat_slru\",\n \"pg_stat_wal_receiver\",\n \"pg_stat_recovery_prefetch\",\n \"pg_stat_subscription\",\n \"pg_stat_ssl\",\n \"pg_stat_gssapi\",\n \"pg_replication_slots\",\n \"pg_stat_replication_slots\",\n \"pg_stat_database\",\n \"pg_stat_database_conflicts\",\n \"pg_stat_user_functions\",\n \"pg_stat_xact_user_functions\",\n \"pg_stat_archiver\",\n \"pg_stat_bgwriter\",\n \"pg_stat_io\",\n \"pg_stat_wal\",\n \"pg_stat_progress_analyze\",\n \"pg_stat_progress_vacuum\",\n \"pg_stat_progress_cluster\",\n \"pg_stat_progress_create_index\",\n \"pg_stat_progress_basebackup\",\n \"pg_stat_progress_copy\",\n \"pg_user_mappings\",\n \"pg_stat_subscription_stats\",\n \"pg_largeobject\",\n]);\n","import type { PonderApp6 } from \"@/database/index.js\";\nimport { getLiveQueryChannelName } from \"@/drizzle/onchain.js\";\nimport type { Schema } from \"@/internal/types.js\";\nimport type { ReadonlyDrizzle } from \"@/types/db.js\";\nimport {\n type PromiseWithResolvers,\n promiseWithResolvers,\n} from \"@/utils/promiseWithResolvers.js\";\nimport {\n getSQLQueryRelations,\n validateAllowableSQLQuery,\n} from \"@/utils/sql-parse.js\";\nimport {\n type QueryWithTypings,\n getTableName,\n getViewName,\n isTable,\n isView,\n} from \"drizzle-orm\";\nimport {\n type PgDialect,\n type PgSession,\n type PgView,\n getViewConfig,\n pgSchema,\n pgTable,\n} from \"drizzle-orm/pg-core\";\nimport { createMiddleware } from \"hono/factory\";\nimport { streamSSE } from \"hono/streaming\";\nimport type * as pg from \"pg\";\nimport superjson from \"superjson\";\n\ntype QueryString = string;\ntype QueryResult = unknown;\n\nconst MAX_LIVE_QUERIES = 1000;\n\n/**\n * @dev This is copied to avoid bundling another dependency.\n */\nconst getPonderMetaTable = (schema?: string) => {\n if (schema === undefined || schema === \"public\") {\n return pgTable(\"_ponder_meta\", (t) => ({\n key: t.text().primaryKey().$type<\"app\">(),\n value: t.jsonb().$type<PonderApp6>().notNull(),\n }));\n }\n\n return pgSchema(schema).table(\"_ponder_meta\", (t) => ({\n key: t.text().primaryKey().$type<\"app\">(),\n value: t.jsonb().$type<PonderApp6>().notNull(),\n }));\n};\n\n/**\n * Middleware for `@ponder/client`.\n *\n * @param db - Drizzle database instance\n * @param schema - Ponder schema\n *\n * @example\n * ```ts\n * import { db } from \"ponder:api\";\n * import schema from \"ponder:schema\";\n * import { Hono } from \"hono\";\n * import { client } from \"ponder\";\n *\n * const app = new Hono();\n *\n * app.use(\"/sql/*\", client({ db, schema }));\n *\n * export default app;\n * ```\n */\nexport const client = ({\n db,\n schema,\n}: { db: ReadonlyDrizzle<Schema>; schema: Schema }) => {\n if (\n globalThis.PONDER_COMMON === undefined ||\n globalThis.PONDER_DATABASE === undefined ||\n globalThis.PONDER_NAMESPACE_BUILD === undefined ||\n globalThis.PONDER_PRE_BUILD === undefined\n ) {\n throw new Error(\n \"client() middleware cannot be initialized outside of a Ponder project\",\n );\n }\n\n const tables = Object.values(schema).filter(isTable);\n const views = Object.values(schema).filter(isView);\n const tableNames = new Set(tables.map(getTableName));\n const viewNames = new Set(views.map(getViewName));\n\n // Note: Add system tables to the live query registry.\n tableNames.add(\"_ponder_checkpoint\");\n\n // @ts-ignore\n const session: PgSession = db._.session;\n // @ts-ignore\n const dialect: PgDialect = session.dialect;\n const driver = globalThis.PONDER_DATABASE.driver;\n\n const perTableResolver = new Map<string, PromiseWithResolvers<void>>();\n const perViewTables = new Map<string, Set<string>>();\n\n /** `true` if the app is indexing live blocks. */\n let liveQueryCount = 0;\n let isReady = false;\n\n (async () => {\n while (globalThis.PONDER_COMMON.apiShutdown.isKilled === false) {\n try {\n isReady = await globalThis.PONDER_DATABASE.readonlyQB.wrap(\n { label: \"select_ready\" },\n (db) =>\n db\n .select()\n .from(getPonderMetaTable())\n .then((result) => result[0]!.value.is_ready === 1),\n );\n } catch {}\n if (isReady) return;\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n })();\n\n const cache = new Map<QueryString, WeakRef<Promise<unknown>>>();\n const perQueryReferences = new Map<QueryString, Set<string>>();\n\n const registry = new FinalizationRegistry<QueryString>((queryString) => {\n // Note: When a cache entry is garbage collected, delete the key from `perQueryReferences`.\n cache.delete(queryString);\n perQueryReferences.delete(queryString);\n });\n\n for (const table of tableNames) {\n perTableResolver.set(table, promiseWithResolvers<void>());\n }\n\n const parseViewPromise = (async () => {\n const unresolvedViewRelations = new Map<string, Set<string>>();\n for (const view of views) {\n const query = dialect.sqlToQuery(getViewConfig(view as PgView).query!);\n const relations = await getSQLQueryRelations(query.sql);\n\n unresolvedViewRelations.set(getViewName(view), relations);\n }\n\n /**\n * Recursively resolve nested views (views that reference other views).\n *\n * @dev This assumes views cannot be infinitely cursive - an invariant enforced by Postgres.\n */\n const resolveRelation = (relation: string): Set<string> => {\n if (perViewTables.has(relation)) {\n return perViewTables.get(relation)!;\n }\n\n if (tableNames.has(relation)) {\n return new Set([relation]);\n }\n\n if (viewNames.has(relation)) {\n const result = new Set<string>();\n for (const _relation of unresolvedViewRelations.get(relation)!) {\n for (const __relation of resolveRelation(_relation)) {\n result.add(__relation);\n }\n }\n return result;\n }\n\n return new Set();\n };\n\n for (const [viewName, relations] of unresolvedViewRelations) {\n const resolvedRelations = new Set<string>();\n for (const relation of relations) {\n for (const _relation of resolveRelation(relation)) {\n resolvedRelations.add(_relation);\n }\n }\n perViewTables.set(viewName, resolvedRelations);\n }\n })();\n\n if (driver.dialect === \"pglite\") {\n const channel = getLiveQueryChannelName(\n globalThis.PONDER_NAMESPACE_BUILD.schema,\n );\n driver.instance.query(`LISTEN \"${channel}\"`);\n\n driver.instance.onNotification((_, payload) => {\n const tables = JSON.parse(payload!) as string[];\n tables.push(\"_ponder_checkpoint\");\n let invalidQueryCount = 0;\n\n for (const [queryString, referencedTables] of perQueryReferences) {\n let isQueryInvalid = false;\n for (const table of tables) {\n if (referencedTables.has(table)) {\n isQueryInvalid = true;\n break;\n }\n }\n\n if (isQueryInvalid) {\n invalidQueryCount++;\n\n const resultPromise = cache.get(queryString)?.deref();\n if (resultPromise) registry.unregister(resultPromise);\n\n cache.delete(queryString);\n perQueryReferences.delete(queryString);\n }\n }\n\n for (const table of tables) {\n perTableResolver.get(table)!.resolve();\n perTableResolver.set(table, promiseWithResolvers<void>());\n }\n\n if (invalidQueryCount > 0) {\n globalThis.PONDER_COMMON.logger.debug({\n msg: \"Updated live queries\",\n tables: JSON.stringify(Array.from(tables)),\n query_count: invalidQueryCount,\n });\n }\n });\n } else {\n (async () => {\n let client: pg.PoolClient | undefined;\n\n let hasRegisteredShutdown = false;\n\n while (globalThis.PONDER_COMMON.apiShutdown.isKilled === false) {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: <explanation>\n await new Promise<void>(async (resolve) => {\n try {\n client = await driver.admin.connect();\n\n if (hasRegisteredShutdown === false) {\n globalThis.PONDER_COMMON.apiShutdown.add(() => {\n client?.release();\n client = undefined;\n });\n hasRegisteredShutdown = true;\n }\n\n globalThis.PONDER_COMMON.logger.info({\n msg: `Established listen connection for \"@ponder/client\" middleware`,\n });\n\n client.on(\"notification\", (notification) => {\n let tables = JSON.parse(notification.payload!) as string[];\n\n // Convert partition names to table names\n if (\n globalThis.PONDER_PRE_BUILD.ordering === \"experimental_isolated\"\n ) {\n tables = tables.map((table) => {\n const _table = table.split(\"_\");\n _table.pop();\n return _table.join(\"_\");\n });\n }\n\n tables.push(\"_ponder_checkpoint\");\n let invalidQueryCount = 0;\n\n for (const [\n queryString,\n referencedTables,\n ] of perQueryReferences) {\n let isQueryInvalid = false;\n for (const table of tables) {\n if (referencedTables.has(table)) {\n isQueryInvalid = true;\n break;\n }\n }\n\n if (isQueryInvalid) {\n invalidQueryCount++;\n\n const resultPromise = cache.get(queryString)?.deref();\n if (resultPromise) registry.unregister(resultPromise);\n\n cache.delete(queryString);\n perQueryReferences.delete(queryString);\n }\n }\n\n for (const table of tables) {\n perTableResolver.get(table)!.resolve();\n perTableResolver.set(table, promiseWithResolvers<void>());\n }\n\n if (invalidQueryCount > 0) {\n globalThis.PONDER_COMMON.logger.debug({\n msg: \"Updated live queries\",\n tables: JSON.stringify(tables),\n query_count: invalidQueryCount,\n });\n }\n });\n\n client.on(\"error\", async (error) => {\n globalThis.PONDER_COMMON.logger.warn({\n msg: `Failed listen connection for \"@ponder/client\" middleware`,\n retry_delay: 250,\n error,\n });\n client?.release();\n client = undefined;\n\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n resolve();\n });\n\n const channel = getLiveQueryChannelName(\n globalThis.PONDER_NAMESPACE_BUILD.schema,\n );\n\n await client.query(`LISTEN \"${channel}\"`);\n } catch (error) {\n globalThis.PONDER_COMMON.logger.warn({\n msg: `Failed listen connection for \"@ponder/client\" middleware`,\n retry_delay: 250,\n error: error as Error,\n });\n client?.release();\n client = undefined;\n\n await new Promise((resolve) => setTimeout(resolve, 250));\n\n resolve();\n }\n });\n }\n })();\n }\n\n const getQueryResult = (query: QueryWithTypings): Promise<QueryResult> => {\n if (driver.dialect === \"pglite\") {\n return session.prepareQuery(query, undefined, undefined, false).execute();\n } else {\n return globalThis.PONDER_DATABASE.readonlyQB.raw.transaction(\n (tx) => {\n return tx._.session\n .prepareQuery(query, undefined, undefined, false)\n .execute();\n },\n { accessMode: \"read only\" },\n );\n }\n };\n\n return createMiddleware(async (c, next) => {\n const crypto = await import(/* webpackIgnore: true */ \"node:crypto\");\n await parseViewPromise;\n\n if (c.req.path === \"/sql/db\") {\n const queryString = c.req.query(\"sql\");\n if (queryString === undefined) {\n return c.text('Missing \"sql\" query parameter', 400);\n }\n const query = superjson.parse(queryString) as QueryWithTypings;\n\n try {\n await validateAllowableSQLQuery(query.sql);\n } catch (error) {\n (error as Error).stack = undefined;\n return c.text((error as Error).message, 500);\n }\n\n const relations = await getSQLQueryRelations(query.sql);\n const referencedTables = new Set<string>();\n for (const relation of relations) {\n if (tableNames.has(relation)) {\n referencedTables.add(relation);\n } else if (viewNames.has(relation)) {\n for (const tableName of perViewTables.get(relation)!) {\n referencedTables.add(tableName);\n }\n }\n }\n\n let resultPromise: Promise<unknown>;\n\n if (isReady === false) {\n resultPromise = getQueryResult(query);\n } else if (cache.has(queryString)) {\n const resultRef = cache.get(queryString)!.deref();\n\n if (resultRef === undefined) {\n cache.delete(queryString);\n resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n } else {\n resultPromise = resultRef;\n }\n } else {\n resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n }\n\n try {\n return c.json((await resultPromise) as object);\n } catch (error) {\n (error as Error).stack = undefined;\n return c.text((error as Error).message, 500);\n }\n }\n\n if (c.req.path === \"/sql/live\") {\n if (isReady === false) {\n return c.text(\n \"Live queries are not available until the backfill is complete\",\n 503,\n );\n }\n\n if (liveQueryCount >= MAX_LIVE_QUERIES) {\n return c.text(\"Maximum number of live queries reached\", 503);\n }\n\n liveQueryCount++;\n\n c.header(\"Content-Type\", \"text/event-stream\");\n c.header(\"Cache-Control\", \"no-cache\");\n c.header(\"Connection\", \"keep-alive\");\n\n const queryString = c.req.query(\"sql\");\n if (queryString === undefined) {\n return c.text('Missing \"sql\" query parameter', 400);\n }\n const query = superjson.parse(queryString) as QueryWithTypings;\n\n try {\n await validateAllowableSQLQuery(query.sql);\n } catch (error) {\n (error as Error).stack = undefined;\n return c.text((error as Error).message, 500);\n }\n\n const relations = await getSQLQueryRelations(query.sql);\n const referencedTables = new Set<string>();\n for (const relation of relations) {\n if (tableNames.has(relation)) {\n referencedTables.add(relation);\n } else if (viewNames.has(relation)) {\n for (const tableName of perViewTables.get(relation)!) {\n referencedTables.add(tableName);\n }\n }\n }\n\n let result: QueryResult;\n if (cache.has(queryString)) {\n const resultRef = cache.get(queryString)!.deref();\n\n if (resultRef === undefined) {\n cache.delete(queryString);\n const resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n result = await resultPromise;\n } else {\n result = await resultRef;\n }\n } else {\n const resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n result = await resultPromise;\n }\n\n let resultHash = crypto\n .createHash(\"MD5\")\n // @ts-ignore\n .update(JSON.stringify(result.rows))\n .digest(\"hex\")\n .slice(0, 10);\n\n return streamSSE(c, async (stream) => {\n stream.onAbort(() => {\n liveQueryCount--;\n });\n\n while (stream.closed === false && stream.aborted === false) {\n await Promise.race(\n Array.from(referencedTables).map(\n (relation) => perTableResolver.get(relation)!.promise,\n ),\n );\n\n try {\n let resultPromise: Promise<unknown>;\n if (cache.has(queryString)) {\n const resultRef = cache.get(queryString)!.deref();\n\n if (resultRef === undefined) {\n cache.delete(queryString);\n resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n } else {\n resultPromise = resultRef;\n }\n } else {\n resultPromise = getQueryResult(query);\n cache.set(queryString, new WeakRef(resultPromise));\n perQueryReferences.set(queryString, referencedTables);\n registry.register(resultPromise, queryString);\n }\n\n const result = await resultPromise;\n\n const _resultHash = crypto\n .createHash(\"MD5\")\n // @ts-ignore\n .update(JSON.stringify(result.rows))\n .digest(\"hex\")\n .slice(0, 10);\n\n if (_resultHash === resultHash) continue;\n resultHash = _resultHash;\n\n // @ts-ignore\n await stream.writeSSE({ data: JSON.stringify(result) });\n } catch {\n stream.abort();\n }\n }\n });\n }\n\n return next();\n });\n};\n","// src/request/constants.ts\nvar GET_MATCH_RESULT = Symbol();\nexport {\n GET_MATCH_RESULT\n};\n","// src/utils/body.ts\nimport { HonoRequest } from \"../request.js\";\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;\n const contentType = headers.get(\"Content-Type\");\n if (contentType?.startsWith(\"multipart/form-data\") || contentType?.startsWith(\"application/x-www-form-urlencoded\")) {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n const formData = await request.formData();\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value) => {\n let nestedForm = form;\n const keys = key.split(\".\");\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nexport {\n parseBody\n};\n","// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const path = url.slice(start, queryIndex === -1 ? void 0 : queryIndex);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n return queryIndex === -1 ? \"\" : \"?\" + url.slice(queryIndex + 1);\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (/\\?/.test(segment)) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.replace(\"?\", \"\");\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar _decodeURI = (value) => {\n if (!/[%+]/.test(value)) {\n return value;\n }\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return value.indexOf(\"%\") !== -1 ? tryDecode(value, decodeURIComponent_) : value;\n};\nvar _getQueryParam = (url, key, multiple) => {\n let encoded;\n if (!multiple && key && !/[%+]/.test(key)) {\n let keyIndex2 = url.indexOf(`?${key}`, 8);\n if (keyIndex2 === -1) {\n keyIndex2 = url.indexOf(`&${key}`, 8);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = {};\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode\n};\n","// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { decodeURIComponent_, getQueryParam, getQueryParams, tryDecode } from \"./utils/url.js\";\nvar tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_);\nvar HonoRequest = class {\n raw;\n #validatedData;\n #matchResult;\n routeIndex = 0;\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n this.#validatedData = {};\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex][1][key];\n const param = this.#getParamValue(paramKey);\n return param && /\\%/.test(param) ? tryDecodeURIComponent(param) : param;\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]);\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = /\\%/.test(value) ? tryDecodeURIComponent(value) : value;\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = {};\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return this.bodyCache.parsedBody ??= await parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n const anyCachedKey = Object.keys(bodyCache)[0];\n if (anyCachedKey) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n text() {\n return this.#cachedBody(\"text\");\n }\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n blob() {\n return this.#cachedBody(\"blob\");\n }\n formData() {\n return this.#cachedBody(\"formData\");\n }\n addValidatedData(target, data) {\n this.#validatedData[target] = data;\n }\n valid(target) {\n return this.#validatedData[target];\n }\n get url() {\n return this.raw.url;\n }\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n const requestInit = {\n body: await req[cacheKey](),\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers: req.header(),\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n","// src/router/reg-exp-router/node.ts\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class {\n #index;\n #varIndex;\n #children = /* @__PURE__ */ Object.create(null);\n insert(tokens, index, paramMap, context, pathErrorCheckOnly) {\n if (tokens.length === 0) {\n if (this.#index !== void 0) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n this.#index = index;\n return;\n }\n const [token, ...restTokens] = tokens;\n const pattern = token === \"*\" ? restTokens.length === 0 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let node;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n node = this.#children[regexpStr];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[regexpStr] = new Node();\n if (name !== \"\") {\n node.#varIndex = context.varIndex++;\n }\n }\n if (!pathErrorCheckOnly && name !== \"\") {\n paramMap.push([name, node.#varIndex]);\n }\n } else {\n node = this.#children[token];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[token] = new Node();\n }\n }\n node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly);\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n return (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + c.buildRegExpStr();\n });\n if (typeof this.#index === \"number\") {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n Node,\n PATH_ERROR\n};\n",null,null,null,null,null,null,null,null,null,null,"/** Returns the object type of the given payload */\nexport function getType(payload) {\n return Object.prototype.toString.call(payload).slice(8, -1);\n}\n","import { getType } from './getType.js';\n/** Returns whether the payload is an array */\nexport function isArray(payload) {\n return getType(payload) === 'Array';\n}\n","import { getType } from './getType.js';\n/**\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects\n * with other prototypes)\n */\nexport function isPlainObject(payload) {\n if (getType(payload) !== 'Object')\n return false;\n const prototype = Object.getPrototypeOf(payload);\n return !!prototype && prototype.constructor === Object && prototype === Object.prototype;\n}\n","import { isArray, isPlainObject } from 'is-what';\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\n const propType = {}.propertyIsEnumerable.call(originalObject, key)\n ? 'enumerable'\n : 'nonenumerable';\n if (propType === 'enumerable')\n carry[key] = newVal;\n if (includeNonenumerable && propType === 'nonenumerable') {\n Object.defineProperty(carry, key, {\n value: newVal,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n}\n/**\n * Copy (clone) an object and all its props recursively to get rid of any prop referenced of the\n * original object. Arrays are also cloned, however objects inside arrays are still linked.\n *\n * @param target Target can be anything\n * @param [options={}] See type {@link Options} for more details.\n *\n * - `{ props: ['key1'] }` will only copy the `key1` property. When using this you will need to cast\n * the return type manually (in order to keep the TS implementation in here simple I didn't\n * built a complex auto resolved type for those few cases people want to use this option)\n * - `{ nonenumerable: true }` will copy all non-enumerable properties. Default is `{}`\n *\n * @returns The target with replaced values\n */\nexport function copy(target, options = {}) {\n if (isArray(target)) {\n return target.map((item) => copy(item, options));\n }\n if (!isPlainObject(target)) {\n return target;\n }\n const props = Object.getOwnPropertyNames(target);\n const symbols = Object.getOwnPropertySymbols(target);\n return [...props, ...symbols].reduce((carry, key) => {\n // Skip __proto__ properties to prevent prototype pollution\n if (key === '__proto__')\n return carry;\n if (isArray(options.props) && !options.props.includes(key)) {\n return carry;\n }\n const val = target[key];\n const newVal = copy(val, options);\n assignProp(carry, key, newVal, target, options.nonenumerable);\n return carry;\n }, {});\n}\n",null,"export function devAssert(condition, message) {\n const booleanCondition = Boolean(condition);\n\n if (!booleanCondition) {\n throw new Error(message);\n }\n}\n","/**\n * Return true if `value` is object-like. A value is object-like if it's not\n * `null` and has a `typeof` result of \"object\".\n */\nexport function isObjectLike(value) {\n return typeof value == 'object' && value !== null;\n}\n","export function invariant(condition, message) {\n const booleanCondition = Boolean(condition);\n\n if (!booleanCondition) {\n throw new Error(\n message != null ? message : 'Unexpected invariant triggered.',\n );\n }\n}\n","import { invariant } from '../jsutils/invariant.mjs';\nconst LineRegExp = /\\r\\n|[\\n\\r]/g;\n/**\n * Represents a location in a Source.\n */\n\n/**\n * Takes a Source and a UTF-8 character offset, and returns the corresponding\n * line and column as a SourceLocation.\n */\nexport function getLocation(source, position) {\n let lastLineStart = 0;\n let line = 1;\n\n for (const match of source.body.matchAll(LineRegExp)) {\n typeof match.index === 'number' || invariant(false);\n\n if (match.index >= position) {\n break;\n }\n\n lastLineStart = match.index + match[0].length;\n line += 1;\n }\n\n return {\n line,\n column: position + 1 - lastLineStart,\n };\n}\n","import { getLocation } from './location.mjs';\n\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\nexport function printLocation(location) {\n return printSourceLocation(\n location.source,\n getLocation(location.source, location.start),\n );\n}\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\n\nexport function printSourceLocation(source, sourceLocation) {\n const firstLineColumnOffset = source.locationOffset.column - 1;\n const body = ''.padStart(firstLineColumnOffset) + source.body;\n const lineIndex = sourceLocation.line - 1;\n const lineOffset = source.locationOffset.line - 1;\n const lineNum = sourceLocation.line + lineOffset;\n const columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;\n const columnNum = sourceLocation.column + columnOffset;\n const locationStr = `${source.name}:${lineNum}:${columnNum}\\n`;\n const lines = body.split(/\\r\\n|[\\n\\r]/g);\n const locationLine = lines[lineIndex]; // Special case for minified documents\n\n if (locationLine.length > 120) {\n const subLineIndex = Math.floor(columnNum / 80);\n const subLineColumnNum = columnNum % 80;\n const subLines = [];\n\n for (let i = 0; i < locationLine.length; i += 80) {\n subLines.push(locationLine.slice(i, i + 80));\n }\n\n return (\n locationStr +\n printPrefixedLines([\n [`${lineNum} |`, subLines[0]],\n ...subLines.slice(1, subLineIndex + 1).map((subLine) => ['|', subLine]),\n ['|', '^'.padStart(subLineColumnNum)],\n ['|', subLines[subLineIndex + 1]],\n ])\n );\n }\n\n return (\n locationStr +\n printPrefixedLines([\n // Lines specified like this: [\"prefix\", \"string\"],\n [`${lineNum - 1} |`, lines[lineIndex - 1]],\n [`${lineNum} |`, locationLine],\n ['|', '^'.padStart(columnNum)],\n [`${lineNum + 1} |`, lines[lineIndex + 1]],\n ])\n );\n}\n\nfunction printPrefixedLines(lines) {\n const existingLines = lines.filter(([_, line]) => line !== undefined);\n const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length));\n return existingLines\n .map(([prefix, line]) => prefix.padStart(padLen) + (line ? ' ' + line : ''))\n .join('\\n');\n}\n","import { isObjectLike } from '../jsutils/isObjectLike.mjs';\nimport { getLocation } from '../language/location.mjs';\nimport {\n printLocation,\n printSourceLocation,\n} from '../language/printLocation.mjs';\n\nfunction toNormalizedOptions(args) {\n const firstArg = args[0];\n\n if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {\n return {\n nodes: firstArg,\n source: args[1],\n positions: args[2],\n path: args[3],\n originalError: args[4],\n extensions: args[5],\n };\n }\n\n return firstArg;\n}\n/**\n * A GraphQLError describes an Error found during the parse, validate, or\n * execute phases of performing a GraphQL operation. In addition to a message\n * and stack trace, it also includes information about the locations in a\n * GraphQL document and/or execution result that correspond to the Error.\n */\n\nexport class GraphQLError extends Error {\n /**\n * An array of `{ line, column }` locations within the source GraphQL document\n * which correspond to this error.\n *\n * Errors during validation often contain multiple locations, for example to\n * point out two things with the same name. Errors during execution include a\n * single location, the field which produced the error.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array describing the JSON-path into the execution response which\n * corresponds to this error. Only included for errors during execution.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array of GraphQL AST Nodes corresponding to this error.\n */\n\n /**\n * The source GraphQL document for the first location of this error.\n *\n * Note that if this Error represents more than one node, the source may not\n * represent nodes after the first node.\n */\n\n /**\n * An array of character offsets within the source GraphQL document\n * which correspond to this error.\n */\n\n /**\n * The original error thrown from a field resolver during execution.\n */\n\n /**\n * Extension fields to add to the formatted error.\n */\n\n /**\n * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead.\n */\n constructor(message, ...rawArgs) {\n var _this$nodes, _nodeLocations$, _ref;\n\n const { nodes, source, positions, path, originalError, extensions } =\n toNormalizedOptions(rawArgs);\n super(message);\n this.name = 'GraphQLError';\n this.path = path !== null && path !== void 0 ? path : undefined;\n this.originalError =\n originalError !== null && originalError !== void 0\n ? originalError\n : undefined; // Compute list of blame nodes.\n\n this.nodes = undefinedIfEmpty(\n Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined,\n );\n const nodeLocations = undefinedIfEmpty(\n (_this$nodes = this.nodes) === null || _this$nodes === void 0\n ? void 0\n : _this$nodes.map((node) => node.loc).filter((loc) => loc != null),\n ); // Compute locations in the source for the given nodes/positions.\n\n this.source =\n source !== null && source !== void 0\n ? source\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : (_nodeLocations$ = nodeLocations[0]) === null ||\n _nodeLocations$ === void 0\n ? void 0\n : _nodeLocations$.source;\n this.positions =\n positions !== null && positions !== void 0\n ? positions\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => loc.start);\n this.locations =\n positions && source\n ? positions.map((pos) => getLocation(source, pos))\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => getLocation(loc.source, loc.start));\n const originalExtensions = isObjectLike(\n originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions,\n )\n ? originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions\n : undefined;\n this.extensions =\n (_ref =\n extensions !== null && extensions !== void 0\n ? extensions\n : originalExtensions) !== null && _ref !== void 0\n ? _ref\n : Object.create(null); // Only properties prescribed by the spec should be enumerable.\n // Keep the rest as non-enumerable.\n\n Object.defineProperties(this, {\n message: {\n writable: true,\n enumerable: true,\n },\n name: {\n enumerable: false,\n },\n nodes: {\n enumerable: false,\n },\n source: {\n enumerable: false,\n },\n positions: {\n enumerable: false,\n },\n originalError: {\n enumerable: false,\n },\n }); // Include (non-enumerable) stack trace.\n\n /* c8 ignore start */\n // FIXME: https://github.com/graphql/graphql-js/issues/2317\n\n if (\n originalError !== null &&\n originalError !== void 0 &&\n originalError.stack\n ) {\n Object.defineProperty(this, 'stack', {\n value: originalError.stack,\n writable: true,\n configurable: true,\n });\n } else if (Error.captureStackTrace) {\n Error.captureStackTrace(this, GraphQLError);\n } else {\n Object.defineProperty(this, 'stack', {\n value: Error().stack,\n writable: true,\n configurable: true,\n });\n }\n /* c8 ignore stop */\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLError';\n }\n\n toString() {\n let output = this.message;\n\n if (this.nodes) {\n for (const node of this.nodes) {\n if (node.loc) {\n output += '\\n\\n' + printLocation(node.loc);\n }\n }\n } else if (this.source && this.locations) {\n for (const location of this.locations) {\n output += '\\n\\n' + printSourceLocation(this.source, location);\n }\n }\n\n return output;\n }\n\n toJSON() {\n const formattedError = {\n message: this.message,\n };\n\n if (this.locations != null) {\n formattedError.locations = this.locations;\n }\n\n if (this.path != null) {\n formattedError.path = this.path;\n }\n\n if (this.extensions != null && Object.keys(this.extensions).length > 0) {\n formattedError.extensions = this.extensions;\n }\n\n return formattedError;\n }\n}\n\nfunction undefinedIfEmpty(array) {\n return array === undefined || array.length === 0 ? undefined : array;\n}\n/**\n * See: https://spec.graphql.org/draft/#sec-Errors\n */\n\n/**\n * Prints a GraphQLError to a string, representing useful location information\n * about the error's position in the source.\n *\n * @deprecated Please use `error.toString` instead. Will be removed in v17\n */\nexport function printError(error) {\n return error.toString();\n}\n/**\n * Given a GraphQLError, format it according to the rules described by the\n * Response Format, Errors section of the GraphQL Specification.\n *\n * @deprecated Please use `error.toJSON` instead. Will be removed in v17\n */\n\nexport function formatError(error) {\n return error.toJSON();\n}\n","/**\n * Contains a range of UTF-8 character offsets and token references that\n * identify the region of the source from which the AST derived.\n */\nexport class Location {\n /**\n * The character offset at which this Node begins.\n */\n\n /**\n * The character offset at which this Node ends.\n */\n\n /**\n * The Token at which this Node begins.\n */\n\n /**\n * The Token at which this Node ends.\n */\n\n /**\n * The Source document the AST represents.\n */\n constructor(startToken, endToken, source) {\n this.start = startToken.start;\n this.end = endToken.end;\n this.startToken = startToken;\n this.endToken = endToken;\n this.source = source;\n }\n\n get [Symbol.toStringTag]() {\n return 'Location';\n }\n\n toJSON() {\n return {\n start: this.start,\n end: this.end,\n };\n }\n}\n/**\n * Represents a range of characters represented by a lexical token\n * within a Source.\n */\n\nexport class Token {\n /**\n * The kind of Token.\n */\n\n /**\n * The character offset at which this Node begins.\n */\n\n /**\n * The character offset at which this Node ends.\n */\n\n /**\n * The 1-indexed line number on which this Token appears.\n */\n\n /**\n * The 1-indexed column number at which this Token begins.\n */\n\n /**\n * For non-punctuation tokens, represents the interpreted value of the token.\n *\n * Note: is undefined for punctuation tokens, but typed as string for\n * convenience in the parser.\n */\n\n /**\n * Tokens exist as nodes in a double-linked-list amongst all tokens\n * including ignored tokens. <SOF> is always the first node and <EOF>\n * the last.\n */\n constructor(kind, start, end, line, column, value) {\n this.kind = kind;\n this.start = start;\n this.end = end;\n this.line = line;\n this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\n this.value = value;\n this.prev = null;\n this.next = null;\n }\n\n get [Symbol.toStringTag]() {\n return 'Token';\n }\n\n toJSON() {\n return {\n kind: this.kind,\n value: this.value,\n line: this.line,\n column: this.column,\n };\n }\n}\n/**\n * The list of all possible AST node types.\n */\n\n/**\n * @internal\n */\nexport const QueryDocumentKeys = {\n Name: [],\n Document: ['definitions'],\n OperationDefinition: [\n 'name',\n 'variableDefinitions',\n 'directives',\n 'selectionSet',\n ],\n VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'],\n Variable: ['name'],\n SelectionSet: ['selections'],\n Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'],\n Argument: ['name', 'value'],\n FragmentSpread: ['name', 'directives'],\n InlineFragment: ['typeCondition', 'directives', 'selectionSet'],\n FragmentDefinition: [\n 'name', // Note: fragment variable definitions are deprecated and will removed in v17.0.0\n 'variableDefinitions',\n 'typeCondition',\n 'directives',\n 'selectionSet',\n ],\n IntValue: [],\n FloatValue: [],\n StringValue: [],\n BooleanValue: [],\n NullValue: [],\n EnumValue: [],\n ListValue: ['values'],\n ObjectValue: ['fields'],\n ObjectField: ['name', 'value'],\n Directive: ['name', 'arguments'],\n NamedType: ['name'],\n ListType: ['type'],\n NonNullType: ['type'],\n SchemaDefinition: ['description', 'directives', 'operationTypes'],\n OperationTypeDefinition: ['type'],\n ScalarTypeDefinition: ['description', 'name', 'directives'],\n ObjectTypeDefinition: [\n 'description',\n 'name',\n 'interfaces',\n 'directives',\n 'fields',\n ],\n FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'],\n InputValueDefinition: [\n 'description',\n 'name',\n 'type',\n 'defaultValue',\n 'directives',\n ],\n InterfaceTypeDefinition: [\n 'description',\n 'name',\n 'interfaces',\n 'directives',\n 'fields',\n ],\n UnionTypeDefinition: ['description', 'name', 'directives', 'types'],\n EnumTypeDefinition: ['description', 'name', 'directives', 'values'],\n EnumValueDefinition: ['description', 'name', 'directives'],\n InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'],\n DirectiveDefinition: ['description', 'name', 'arguments', 'locations'],\n SchemaExtension: ['directives', 'operationTypes'],\n ScalarTypeExtension: ['name', 'directives'],\n ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'],\n InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'],\n UnionTypeExtension: ['name', 'directives', 'types'],\n EnumTypeExtension: ['name', 'directives', 'values'],\n InputObjectTypeExtension: ['name', 'directives', 'fields'],\n};\nconst kindValues = new Set(Object.keys(QueryDocumentKeys));\n/**\n * @internal\n */\n\nexport function isNode(maybeNode) {\n const maybeKind =\n maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind;\n return typeof maybeKind === 'string' && kindValues.has(maybeKind);\n}\n/** Name */\n\nvar OperationTypeNode;\n\n(function (OperationTypeNode) {\n OperationTypeNode['QUERY'] = 'query';\n OperationTypeNode['MUTATION'] = 'mutation';\n OperationTypeNode['SUBSCRIPTION'] = 'subscription';\n})(OperationTypeNode || (OperationTypeNode = {}));\n\nexport { OperationTypeNode };\n","/**\n * The set of allowed kind values for AST nodes.\n */\nvar Kind;\n\n(function (Kind) {\n Kind['NAME'] = 'Name';\n Kind['DOCUMENT'] = 'Document';\n Kind['OPERATION_DEFINITION'] = 'OperationDefinition';\n Kind['VARIABLE_DEFINITION'] = 'VariableDefinition';\n Kind['SELECTION_SET'] = 'SelectionSet';\n Kind['FIELD'] = 'Field';\n Kind['ARGUMENT'] = 'Argument';\n Kind['FRAGMENT_SPREAD'] = 'FragmentSpread';\n Kind['INLINE_FRAGMENT'] = 'InlineFragment';\n Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition';\n Kind['VARIABLE'] = 'Variable';\n Kind['INT'] = 'IntValue';\n Kind['FLOAT'] = 'FloatValue';\n Kind['STRING'] = 'StringValue';\n Kind['BOOLEAN'] = 'BooleanValue';\n Kind['NULL'] = 'NullValue';\n Kind['ENUM'] = 'EnumValue';\n Kind['LIST'] = 'ListValue';\n Kind['OBJECT'] = 'ObjectValue';\n Kind['OBJECT_FIELD'] = 'ObjectField';\n Kind['DIRECTIVE'] = 'Directive';\n Kind['NAMED_TYPE'] = 'NamedType';\n Kind['LIST_TYPE'] = 'ListType';\n Kind['NON_NULL_TYPE'] = 'NonNullType';\n Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition';\n Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition';\n Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition';\n Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition';\n Kind['FIELD_DEFINITION'] = 'FieldDefinition';\n Kind['INPUT_VALUE_DEFINITION'] = 'InputValueDefinition';\n Kind['INTERFACE_TYPE_DEFINITION'] = 'InterfaceTypeDefinition';\n Kind['UNION_TYPE_DEFINITION'] = 'UnionTypeDefinition';\n Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition';\n Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition';\n Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition';\n Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition';\n Kind['SCHEMA_EXTENSION'] = 'SchemaExtension';\n Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension';\n Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension';\n Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension';\n Kind['UNION_TYPE_EXTENSION'] = 'UnionTypeExtension';\n Kind['ENUM_TYPE_EXTENSION'] = 'EnumTypeExtension';\n Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension';\n})(Kind || (Kind = {}));\n\nexport { Kind };\n/**\n * The enum type representing the possible kind values of AST nodes.\n *\n * @deprecated Please use `Kind`. Will be remove in v17.\n */\n","/**\n * ```\n * WhiteSpace ::\n * - \"Horizontal Tab (U+0009)\"\n * - \"Space (U+0020)\"\n * ```\n * @internal\n */\nexport function isWhiteSpace(code) {\n return code === 0x0009 || code === 0x0020;\n}\n/**\n * ```\n * Digit :: one of\n * - `0` `1` `2` `3` `4` `5` `6` `7` `8` `9`\n * ```\n * @internal\n */\n\nexport function isDigit(code) {\n return code >= 0x0030 && code <= 0x0039;\n}\n/**\n * ```\n * Letter :: one of\n * - `A` `B` `C` `D` `E` `F` `G` `H` `I` `J` `K` `L` `M`\n * - `N` `O` `P` `Q` `R` `S` `T` `U` `V` `W` `X` `Y` `Z`\n * - `a` `b` `c` `d` `e` `f` `g` `h` `i` `j` `k` `l` `m`\n * - `n` `o` `p` `q` `r` `s` `t` `u` `v` `w` `x` `y` `z`\n * ```\n * @internal\n */\n\nexport function isLetter(code) {\n return (\n (code >= 0x0061 && code <= 0x007a) || // A-Z\n (code >= 0x0041 && code <= 0x005a) // a-z\n );\n}\n/**\n * ```\n * NameStart ::\n * - Letter\n * - `_`\n * ```\n * @internal\n */\n\nexport function isNameStart(code) {\n return isLetter(code) || code === 0x005f;\n}\n/**\n * ```\n * NameContinue ::\n * - Letter\n * - Digit\n * - `_`\n * ```\n * @internal\n */\n\nexport function isNameContinue(code) {\n return isLetter(code) || isDigit(code) || code === 0x005f;\n}\n","import { isWhiteSpace } from './characterClasses.mjs';\n/**\n * Produces the value of a block string from its parsed raw value, similar to\n * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc.\n *\n * This implements the GraphQL spec's BlockStringValue() static algorithm.\n *\n * @internal\n */\n\nexport function dedentBlockStringLines(lines) {\n var _firstNonEmptyLine2;\n\n let commonIndent = Number.MAX_SAFE_INTEGER;\n let firstNonEmptyLine = null;\n let lastNonEmptyLine = -1;\n\n for (let i = 0; i < lines.length; ++i) {\n var _firstNonEmptyLine;\n\n const line = lines[i];\n const indent = leadingWhitespace(line);\n\n if (indent === line.length) {\n continue; // skip empty lines\n }\n\n firstNonEmptyLine =\n (_firstNonEmptyLine = firstNonEmptyLine) !== null &&\n _firstNonEmptyLine !== void 0\n ? _firstNonEmptyLine\n : i;\n lastNonEmptyLine = i;\n\n if (i !== 0 && indent < commonIndent) {\n commonIndent = indent;\n }\n }\n\n return lines // Remove common indentation from all lines but first.\n .map((line, i) => (i === 0 ? line : line.slice(commonIndent))) // Remove leading and trailing blank lines.\n .slice(\n (_firstNonEmptyLine2 = firstNonEmptyLine) !== null &&\n _firstNonEmptyLine2 !== void 0\n ? _firstNonEmptyLine2\n : 0,\n lastNonEmptyLine + 1,\n );\n}\n\nfunction leadingWhitespace(str) {\n let i = 0;\n\n while (i < str.length && isWhiteSpace(str.charCodeAt(i))) {\n ++i;\n }\n\n return i;\n}\n/**\n * @internal\n */\n\nexport function isPrintableAsBlockString(value) {\n if (value === '') {\n return true; // empty string is printable\n }\n\n let isEmptyLine = true;\n let hasIndent = false;\n let hasCommonIndent = true;\n let seenNonEmptyLine = false;\n\n for (let i = 0; i < value.length; ++i) {\n switch (value.codePointAt(i)) {\n case 0x0000:\n case 0x0001:\n case 0x0002:\n case 0x0003:\n case 0x0004:\n case 0x0005:\n case 0x0006:\n case 0x0007:\n case 0x0008:\n case 0x000b:\n case 0x000c:\n case 0x000e:\n case 0x000f:\n return false;\n // Has non-printable characters\n\n case 0x000d:\n // \\r\n return false;\n // Has \\r or \\r\\n which will be replaced as \\n\n\n case 10:\n // \\n\n if (isEmptyLine && !seenNonEmptyLine) {\n return false; // Has leading new line\n }\n\n seenNonEmptyLine = true;\n isEmptyLine = true;\n hasIndent = false;\n break;\n\n case 9: // \\t\n\n case 32:\n // <space>\n hasIndent || (hasIndent = isEmptyLine);\n break;\n\n default:\n hasCommonIndent && (hasCommonIndent = hasIndent);\n isEmptyLine = false;\n }\n }\n\n if (isEmptyLine) {\n return false; // Has trailing empty lines\n }\n\n if (hasCommonIndent && seenNonEmptyLine) {\n return false; // Has internal indent\n }\n\n return true;\n}\n/**\n * Print a block string in the indented block form by adding a leading and\n * trailing blank line. However, if a block string starts with whitespace and is\n * a single-line, adding a leading blank line would strip that whitespace.\n *\n * @internal\n */\n\nexport function printBlockString(value, options) {\n const escapedValue = value.replace(/\"\"\"/g, '\\\\\"\"\"'); // Expand a block string's raw value into independent lines.\n\n const lines = escapedValue.split(/\\r\\n|[\\n\\r]/g);\n const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line\n\n const forceLeadingNewLine =\n lines.length > 1 &&\n lines\n .slice(1)\n .every((line) => line.length === 0 || isWhiteSpace(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line\n\n const hasTrailingTripleQuotes = escapedValue.endsWith('\\\\\"\"\"'); // Trailing quote (single or double) or slash forces trailing new line\n\n const hasTrailingQuote = value.endsWith('\"') && !hasTrailingTripleQuotes;\n const hasTrailingSlash = value.endsWith('\\\\');\n const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash;\n const printAsMultipleLines =\n !(options !== null && options !== void 0 && options.minimize) && // add leading and trailing new lines only if it improves readability\n (!isSingleLine ||\n value.length > 70 ||\n forceTrailingNewline ||\n forceLeadingNewLine ||\n hasTrailingTripleQuotes);\n let result = ''; // Format a multi-line block quote to account for leading space.\n\n const skipLeadingNewLine = isSingleLine && isWhiteSpace(value.charCodeAt(0));\n\n if ((printAsMultipleLines && !skipLeadingNewLine) || forceLeadingNewLine) {\n result += '\\n';\n }\n\n result += escapedValue;\n\n if (printAsMultipleLines || forceTrailingNewline) {\n result += '\\n';\n }\n\n return '\"\"\"' + result + '\"\"\"';\n}\n","const MAX_ARRAY_LENGTH = 10;\nconst MAX_RECURSIVE_DEPTH = 2;\n/**\n * Used to print values in error messages.\n */\n\nexport function inspect(value) {\n return formatValue(value, []);\n}\n\nfunction formatValue(value, seenValues) {\n switch (typeof value) {\n case 'string':\n return JSON.stringify(value);\n\n case 'function':\n return value.name ? `[function ${value.name}]` : '[function]';\n\n case 'object':\n return formatObjectValue(value, seenValues);\n\n default:\n return String(value);\n }\n}\n\nfunction formatObjectValue(value, previouslySeenValues) {\n if (value === null) {\n return 'null';\n }\n\n if (previouslySeenValues.includes(value)) {\n return '[Circular]';\n }\n\n const seenValues = [...previouslySeenValues, value];\n\n if (isJSONable(value)) {\n const jsonValue = value.toJSON(); // check for infinite recursion\n\n if (jsonValue !== value) {\n return typeof jsonValue === 'string'\n ? jsonValue\n : formatValue(jsonValue, seenValues);\n }\n } else if (Array.isArray(value)) {\n return formatArray(value, seenValues);\n }\n\n return formatObject(value, seenValues);\n}\n\nfunction isJSONable(value) {\n return typeof value.toJSON === 'function';\n}\n\nfunction formatObject(object, seenValues) {\n const entries = Object.entries(object);\n\n if (entries.length === 0) {\n return '{}';\n }\n\n if (seenValues.length > MAX_RECURSIVE_DEPTH) {\n return '[' + getObjectTag(object) + ']';\n }\n\n const properties = entries.map(\n ([key, value]) => key + ': ' + formatValue(value, seenValues),\n );\n return '{ ' + properties.join(', ') + ' }';\n}\n\nfunction formatArray(array, seenValues) {\n if (array.length === 0) {\n return '[]';\n }\n\n if (seenValues.length > MAX_RECURSIVE_DEPTH) {\n return '[Array]';\n }\n\n const len = Math.min(MAX_ARRAY_LENGTH, array.length);\n const remaining = array.length - len;\n const items = [];\n\n for (let i = 0; i < len; ++i) {\n items.push(formatValue(array[i], seenValues));\n }\n\n if (remaining === 1) {\n items.push('... 1 more item');\n } else if (remaining > 1) {\n items.push(`... ${remaining} more items`);\n }\n\n return '[' + items.join(', ') + ']';\n}\n\nfunction getObjectTag(object) {\n const tag = Object.prototype.toString\n .call(object)\n .replace(/^\\[object /, '')\n .replace(/]$/, '');\n\n if (tag === 'Object' && typeof object.constructor === 'function') {\n const name = object.constructor.name;\n\n if (typeof name === 'string' && name !== '') {\n return name;\n }\n }\n\n return tag;\n}\n","import { inspect } from './inspect.mjs';\n/* c8 ignore next 3 */\n\nconst isProduction =\n globalThis.process && // eslint-disable-next-line no-undef\n process.env.NODE_ENV === 'production';\n/**\n * A replacement for instanceof which includes an error warning when multi-realm\n * constructors are detected.\n * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production\n * See: https://webpack.js.org/guides/production/\n */\n\nexport const instanceOf =\n /* c8 ignore next 6 */\n // FIXME: https://github.com/graphql/graphql-js/issues/2317\n isProduction\n ? function instanceOf(value, constructor) {\n return value instanceof constructor;\n }\n : function instanceOf(value, constructor) {\n if (value instanceof constructor) {\n return true;\n }\n\n if (typeof value === 'object' && value !== null) {\n var _value$constructor;\n\n // Prefer Symbol.toStringTag since it is immune to minification.\n const className = constructor.prototype[Symbol.toStringTag];\n const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library.\n Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009\n ? value[Symbol.toStringTag]\n : (_value$constructor = value.constructor) === null ||\n _value$constructor === void 0\n ? void 0\n : _value$constructor.name;\n\n if (className === valueClassName) {\n const stringifiedValue = inspect(value);\n throw new Error(`Cannot use ${className} \"${stringifiedValue}\" from another module or realm.\n\nEnsure that there is only one instance of \"graphql\" in the node_modules\ndirectory. If different versions of \"graphql\" are the dependencies of other\nrelied on modules, use \"resolutions\" to ensure only one version is installed.\n\nhttps://yarnpkg.com/en/docs/selective-version-resolutions\n\nDuplicate \"graphql\" modules cannot be used at the same time since different\nversions may have different capabilities and behavior. The data from one\nversion used in the function from another could produce confusing and\nspurious results.`);\n }\n }\n\n return false;\n };\n","const MAX_SUGGESTIONS = 5;\n/**\n * Given [ A, B, C ] return ' Did you mean A, B, or C?'.\n */\n\nexport function didYouMean(firstArg, secondArg) {\n const [subMessage, suggestionsArg] = secondArg\n ? [firstArg, secondArg]\n : [undefined, firstArg];\n let message = ' Did you mean ';\n\n if (subMessage) {\n message += subMessage + ' ';\n }\n\n const suggestions = suggestionsArg.map((x) => `\"${x}\"`);\n\n switch (suggestions.length) {\n case 0:\n return '';\n\n case 1:\n return message + suggestions[0] + '?';\n\n case 2:\n return message + suggestions[0] + ' or ' + suggestions[1] + '?';\n }\n\n const selected = suggestions.slice(0, MAX_SUGGESTIONS);\n const lastItem = selected.pop();\n return message + selected.join(', ') + ', or ' + lastItem + '?';\n}\n","/**\n * Returns the first argument it receives.\n */\nexport function identityFunc(x) {\n return x;\n}\n","/**\n * Creates a keyed JS object from an array, given a function to produce the keys\n * for each value in the array.\n *\n * This provides a convenient lookup for the array items if the key function\n * produces unique results.\n * ```ts\n * const phoneBook = [\n * { name: 'Jon', num: '555-1234' },\n * { name: 'Jenny', num: '867-5309' }\n * ]\n *\n * const entriesByName = keyMap(\n * phoneBook,\n * entry => entry.name\n * )\n *\n * // {\n * // Jon: { name: 'Jon', num: '555-1234' },\n * // Jenny: { name: 'Jenny', num: '867-5309' }\n * // }\n *\n * const jennyEntry = entriesByName['Jenny']\n *\n * // { name: 'Jenny', num: '857-6309' }\n * ```\n */\nexport function keyMap(list, keyFn) {\n const result = Object.create(null);\n\n for (const item of list) {\n result[keyFn(item)] = item;\n }\n\n return result;\n}\n","/**\n * Creates a keyed JS object from an array, given a function to produce the keys\n * and a function to produce the values from each item in the array.\n * ```ts\n * const phoneBook = [\n * { name: 'Jon', num: '555-1234' },\n * { name: 'Jenny', num: '867-5309' }\n * ]\n *\n * // { Jon: '555-1234', Jenny: '867-5309' }\n * const phonesByName = keyValMap(\n * phoneBook,\n * entry => entry.name,\n * entry => entry.num\n * )\n * ```\n */\nexport function keyValMap(list, keyFn, valFn) {\n const result = Object.create(null);\n\n for (const item of list) {\n result[keyFn(item)] = valFn(item);\n }\n\n return result;\n}\n","/**\n * Creates an object map with the same keys as `map` and values generated by\n * running each value of `map` thru `fn`.\n */\nexport function mapValue(map, fn) {\n const result = Object.create(null);\n\n for (const key of Object.keys(map)) {\n result[key] = fn(map[key], key);\n }\n\n return result;\n}\n","/**\n * Returns a number indicating whether a reference string comes before, or after,\n * or is the same as the given string in natural sort order.\n *\n * See: https://en.wikipedia.org/wiki/Natural_sort_order\n *\n */\nexport function naturalCompare(aStr, bStr) {\n let aIndex = 0;\n let bIndex = 0;\n\n while (aIndex < aStr.length && bIndex < bStr.length) {\n let aChar = aStr.charCodeAt(aIndex);\n let bChar = bStr.charCodeAt(bIndex);\n\n if (isDigit(aChar) && isDigit(bChar)) {\n let aNum = 0;\n\n do {\n ++aIndex;\n aNum = aNum * 10 + aChar - DIGIT_0;\n aChar = aStr.charCodeAt(aIndex);\n } while (isDigit(aChar) && aNum > 0);\n\n let bNum = 0;\n\n do {\n ++bIndex;\n bNum = bNum * 10 + bChar - DIGIT_0;\n bChar = bStr.charCodeAt(bIndex);\n } while (isDigit(bChar) && bNum > 0);\n\n if (aNum < bNum) {\n return -1;\n }\n\n if (aNum > bNum) {\n return 1;\n }\n } else {\n if (aChar < bChar) {\n return -1;\n }\n\n if (aChar > bChar) {\n return 1;\n }\n\n ++aIndex;\n ++bIndex;\n }\n }\n\n return aStr.length - bStr.length;\n}\nconst DIGIT_0 = 48;\nconst DIGIT_9 = 57;\n\nfunction isDigit(code) {\n return !isNaN(code) && DIGIT_0 <= code && code <= DIGIT_9;\n}\n","import { naturalCompare } from './naturalCompare.mjs';\n/**\n * Given an invalid input string and a list of valid options, returns a filtered\n * list of valid options sorted based on their similarity with the input.\n */\n\nexport function suggestionList(input, options) {\n const optionsByDistance = Object.create(null);\n const lexicalDistance = new LexicalDistance(input);\n const threshold = Math.floor(input.length * 0.4) + 1;\n\n for (const option of options) {\n const distance = lexicalDistance.measure(option, threshold);\n\n if (distance !== undefined) {\n optionsByDistance[option] = distance;\n }\n }\n\n return Object.keys(optionsByDistance).sort((a, b) => {\n const distanceDiff = optionsByDistance[a] - optionsByDistance[b];\n return distanceDiff !== 0 ? distanceDiff : naturalCompare(a, b);\n });\n}\n/**\n * Computes the lexical distance between strings A and B.\n *\n * The \"distance\" between two strings is given by counting the minimum number\n * of edits needed to transform string A into string B. An edit can be an\n * insertion, deletion, or substitution of a single character, or a swap of two\n * adjacent characters.\n *\n * Includes a custom alteration from Damerau-Levenshtein to treat case changes\n * as a single edit which helps identify mis-cased values with an edit distance\n * of 1.\n *\n * This distance can be useful for detecting typos in input or sorting\n */\n\nclass LexicalDistance {\n constructor(input) {\n this._input = input;\n this._inputLowerCase = input.toLowerCase();\n this._inputArray = stringToArray(this._inputLowerCase);\n this._rows = [\n new Array(input.length + 1).fill(0),\n new Array(input.length + 1).fill(0),\n new Array(input.length + 1).fill(0),\n ];\n }\n\n measure(option, threshold) {\n if (this._input === option) {\n return 0;\n }\n\n const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit\n\n if (this._inputLowerCase === optionLowerCase) {\n return 1;\n }\n\n let a = stringToArray(optionLowerCase);\n let b = this._inputArray;\n\n if (a.length < b.length) {\n const tmp = a;\n a = b;\n b = tmp;\n }\n\n const aLength = a.length;\n const bLength = b.length;\n\n if (aLength - bLength > threshold) {\n return undefined;\n }\n\n const rows = this._rows;\n\n for (let j = 0; j <= bLength; j++) {\n rows[0][j] = j;\n }\n\n for (let i = 1; i <= aLength; i++) {\n const upRow = rows[(i - 1) % 3];\n const currentRow = rows[i % 3];\n let smallestCell = (currentRow[0] = i);\n\n for (let j = 1; j <= bLength; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n let currentCell = Math.min(\n upRow[j] + 1, // delete\n currentRow[j - 1] + 1, // insert\n upRow[j - 1] + cost, // substitute\n );\n\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n // transposition\n const doubleDiagonalCell = rows[(i - 2) % 3][j - 2];\n currentCell = Math.min(currentCell, doubleDiagonalCell + 1);\n }\n\n if (currentCell < smallestCell) {\n smallestCell = currentCell;\n }\n\n currentRow[j] = currentCell;\n } // Early exit, since distance can't go smaller than smallest element of the previous row.\n\n if (smallestCell > threshold) {\n return undefined;\n }\n }\n\n const distance = rows[aLength % 3][bLength];\n return distance <= threshold ? distance : undefined;\n }\n}\n\nfunction stringToArray(str) {\n const strLength = str.length;\n const array = new Array(strLength);\n\n for (let i = 0; i < strLength; ++i) {\n array[i] = str.charCodeAt(i);\n }\n\n return array;\n}\n","export function toObjMap(obj) {\n if (obj == null) {\n return Object.create(null);\n }\n\n if (Object.getPrototypeOf(obj) === null) {\n return obj;\n }\n\n const map = Object.create(null);\n\n for (const [key, value] of Object.entries(obj)) {\n map[key] = value;\n }\n\n return map;\n}\n","/**\n * Prints a string as a GraphQL StringValue literal. Replaces control characters\n * and excluded characters (\" U+0022 and \\\\ U+005C) with escape sequences.\n */\nexport function printString(str) {\n return `\"${str.replace(escapedRegExp, escapedReplacer)}\"`;\n} // eslint-disable-next-line no-control-regex\n\nconst escapedRegExp = /[\\x00-\\x1f\\x22\\x5c\\x7f-\\x9f]/g;\n\nfunction escapedReplacer(str) {\n return escapeSequences[str.charCodeAt(0)];\n} // prettier-ignore\n\nconst escapeSequences = [\n '\\\\u0000',\n '\\\\u0001',\n '\\\\u0002',\n '\\\\u0003',\n '\\\\u0004',\n '\\\\u0005',\n '\\\\u0006',\n '\\\\u0007',\n '\\\\b',\n '\\\\t',\n '\\\\n',\n '\\\\u000B',\n '\\\\f',\n '\\\\r',\n '\\\\u000E',\n '\\\\u000F',\n '\\\\u0010',\n '\\\\u0011',\n '\\\\u0012',\n '\\\\u0013',\n '\\\\u0014',\n '\\\\u0015',\n '\\\\u0016',\n '\\\\u0017',\n '\\\\u0018',\n '\\\\u0019',\n '\\\\u001A',\n '\\\\u001B',\n '\\\\u001C',\n '\\\\u001D',\n '\\\\u001E',\n '\\\\u001F',\n '',\n '',\n '\\\\\"',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '', // 2F\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '', // 3F\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '', // 4F\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '\\\\\\\\',\n '',\n '',\n '', // 5F\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '', // 6F\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '\\\\u007F',\n '\\\\u0080',\n '\\\\u0081',\n '\\\\u0082',\n '\\\\u0083',\n '\\\\u0084',\n '\\\\u0085',\n '\\\\u0086',\n '\\\\u0087',\n '\\\\u0088',\n '\\\\u0089',\n '\\\\u008A',\n '\\\\u008B',\n '\\\\u008C',\n '\\\\u008D',\n '\\\\u008E',\n '\\\\u008F',\n '\\\\u0090',\n '\\\\u0091',\n '\\\\u0092',\n '\\\\u0093',\n '\\\\u0094',\n '\\\\u0095',\n '\\\\u0096',\n '\\\\u0097',\n '\\\\u0098',\n '\\\\u0099',\n '\\\\u009A',\n '\\\\u009B',\n '\\\\u009C',\n '\\\\u009D',\n '\\\\u009E',\n '\\\\u009F',\n];\n","import { devAssert } from '../jsutils/devAssert.mjs';\nimport { inspect } from '../jsutils/inspect.mjs';\nimport { isNode, QueryDocumentKeys } from './ast.mjs';\nimport { Kind } from './kinds.mjs';\n/**\n * A visitor is provided to visit, it contains the collection of\n * relevant functions to be called during the visitor's traversal.\n */\n\nexport const BREAK = Object.freeze({});\n/**\n * visit() will walk through an AST using a depth-first traversal, calling\n * the visitor's enter function at each node in the traversal, and calling the\n * leave function after visiting that node and all of its child nodes.\n *\n * By returning different values from the enter and leave functions, the\n * behavior of the visitor can be altered, including skipping over a sub-tree of\n * the AST (by returning false), editing the AST by returning a value or null\n * to remove the value, or to stop the whole traversal by returning BREAK.\n *\n * When using visit() to edit an AST, the original AST will not be modified, and\n * a new version of the AST with the changes applied will be returned from the\n * visit function.\n *\n * ```ts\n * const editedAST = visit(ast, {\n * enter(node, key, parent, path, ancestors) {\n * // @return\n * // undefined: no action\n * // false: skip visiting this node\n * // visitor.BREAK: stop visiting altogether\n * // null: delete this node\n * // any value: replace this node with the returned value\n * },\n * leave(node, key, parent, path, ancestors) {\n * // @return\n * // undefined: no action\n * // false: no action\n * // visitor.BREAK: stop visiting altogether\n * // null: delete this node\n * // any value: replace this node with the returned value\n * }\n * });\n * ```\n *\n * Alternatively to providing enter() and leave() functions, a visitor can\n * instead provide functions named the same as the kinds of AST nodes, or\n * enter/leave visitors at a named key, leading to three permutations of the\n * visitor API:\n *\n * 1) Named visitors triggered when entering a node of a specific kind.\n *\n * ```ts\n * visit(ast, {\n * Kind(node) {\n * // enter the \"Kind\" node\n * }\n * })\n * ```\n *\n * 2) Named visitors that trigger upon entering and leaving a node of a specific kind.\n *\n * ```ts\n * visit(ast, {\n * Kind: {\n * enter(node) {\n * // enter the \"Kind\" node\n * }\n * leave(node) {\n * // leave the \"Kind\" node\n * }\n * }\n * })\n * ```\n *\n * 3) Generic visitors that trigger upon entering and leaving any node.\n *\n * ```ts\n * visit(ast, {\n * enter(node) {\n * // enter any node\n * },\n * leave(node) {\n * // leave any node\n * }\n * })\n * ```\n */\n\nexport function visit(root, visitor, visitorKeys = QueryDocumentKeys) {\n const enterLeaveMap = new Map();\n\n for (const kind of Object.values(Kind)) {\n enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));\n }\n /* eslint-disable no-undef-init */\n\n let stack = undefined;\n let inArray = Array.isArray(root);\n let keys = [root];\n let index = -1;\n let edits = [];\n let node = root;\n let key = undefined;\n let parent = undefined;\n const path = [];\n const ancestors = [];\n /* eslint-enable no-undef-init */\n\n do {\n index++;\n const isLeaving = index === keys.length;\n const isEdited = isLeaving && edits.length !== 0;\n\n if (isLeaving) {\n key = ancestors.length === 0 ? undefined : path[path.length - 1];\n node = parent;\n parent = ancestors.pop();\n\n if (isEdited) {\n if (inArray) {\n node = node.slice();\n let editOffset = 0;\n\n for (const [editKey, editValue] of edits) {\n const arrayKey = editKey - editOffset;\n\n if (editValue === null) {\n node.splice(arrayKey, 1);\n editOffset++;\n } else {\n node[arrayKey] = editValue;\n }\n }\n } else {\n node = Object.defineProperties(\n {},\n Object.getOwnPropertyDescriptors(node),\n );\n\n for (const [editKey, editValue] of edits) {\n node[editKey] = editValue;\n }\n }\n }\n\n index = stack.index;\n keys = stack.keys;\n edits = stack.edits;\n inArray = stack.inArray;\n stack = stack.prev;\n } else if (parent) {\n key = inArray ? index : keys[index];\n node = parent[key];\n\n if (node === null || node === undefined) {\n continue;\n }\n\n path.push(key);\n }\n\n let result;\n\n if (!Array.isArray(node)) {\n var _enterLeaveMap$get, _enterLeaveMap$get2;\n\n isNode(node) || devAssert(false, `Invalid AST Node: ${inspect(node)}.`);\n const visitFn = isLeaving\n ? (_enterLeaveMap$get = enterLeaveMap.get(node.kind)) === null ||\n _enterLeaveMap$get === void 0\n ? void 0\n : _enterLeaveMap$get.leave\n : (_enterLeaveMap$get2 = enterLeaveMap.get(node.kind)) === null ||\n _enterLeaveMap$get2 === void 0\n ? void 0\n : _enterLeaveMap$get2.enter;\n result =\n visitFn === null || visitFn === void 0\n ? void 0\n : visitFn.call(visitor, node, key, parent, path, ancestors);\n\n if (result === BREAK) {\n break;\n }\n\n if (result === false) {\n if (!isLeaving) {\n path.pop();\n continue;\n }\n } else if (result !== undefined) {\n edits.push([key, result]);\n\n if (!isLeaving) {\n if (isNode(result)) {\n node = result;\n } else {\n path.pop();\n continue;\n }\n }\n }\n }\n\n if (result === undefined && isEdited) {\n edits.push([key, node]);\n }\n\n if (isLeaving) {\n path.pop();\n } else {\n var _node$kind;\n\n stack = {\n inArray,\n index,\n keys,\n edits,\n prev: stack,\n };\n inArray = Array.isArray(node);\n keys = inArray\n ? node\n : (_node$kind = visitorKeys[node.kind]) !== null &&\n _node$kind !== void 0\n ? _node$kind\n : [];\n index = -1;\n edits = [];\n\n if (parent) {\n ancestors.push(parent);\n }\n\n parent = node;\n }\n } while (stack !== undefined);\n\n if (edits.length !== 0) {\n // New root\n return edits[edits.length - 1][1];\n }\n\n return root;\n}\n/**\n * Creates a new visitor instance which delegates to many visitors to run in\n * parallel. Each visitor will be visited for each node before moving on.\n *\n * If a prior visitor edits a node, no following visitors will see that node.\n */\n\nexport function visitInParallel(visitors) {\n const skipping = new Array(visitors.length).fill(null);\n const mergedVisitor = Object.create(null);\n\n for (const kind of Object.values(Kind)) {\n let hasVisitor = false;\n const enterList = new Array(visitors.length).fill(undefined);\n const leaveList = new Array(visitors.length).fill(undefined);\n\n for (let i = 0; i < visitors.length; ++i) {\n const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);\n hasVisitor || (hasVisitor = enter != null || leave != null);\n enterList[i] = enter;\n leaveList[i] = leave;\n }\n\n if (!hasVisitor) {\n continue;\n }\n\n const mergedEnterLeave = {\n enter(...args) {\n const node = args[0];\n\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n var _enterList$i;\n\n const result =\n (_enterList$i = enterList[i]) === null || _enterList$i === void 0\n ? void 0\n : _enterList$i.apply(visitors[i], args);\n\n if (result === false) {\n skipping[i] = node;\n } else if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined) {\n return result;\n }\n }\n }\n },\n\n leave(...args) {\n const node = args[0];\n\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n var _leaveList$i;\n\n const result =\n (_leaveList$i = leaveList[i]) === null || _leaveList$i === void 0\n ? void 0\n : _leaveList$i.apply(visitors[i], args);\n\n if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined && result !== false) {\n return result;\n }\n } else if (skipping[i] === node) {\n skipping[i] = null;\n }\n }\n },\n };\n mergedVisitor[kind] = mergedEnterLeave;\n }\n\n return mergedVisitor;\n}\n/**\n * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.\n */\n\nexport function getEnterLeaveForKind(visitor, kind) {\n const kindVisitor = visitor[kind];\n\n if (typeof kindVisitor === 'object') {\n // { Kind: { enter() {}, leave() {} } }\n return kindVisitor;\n } else if (typeof kindVisitor === 'function') {\n // { Kind() {} }\n return {\n enter: kindVisitor,\n leave: undefined,\n };\n } // { enter() {}, leave() {} }\n\n return {\n enter: visitor.enter,\n leave: visitor.leave,\n };\n}\n/**\n * Given a visitor instance, if it is leaving or not, and a node kind, return\n * the function the visitor runtime should call.\n *\n * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17\n */\n\n/* c8 ignore next 8 */\n\nexport function getVisitFn(visitor, kind, isLeaving) {\n const { enter, leave } = getEnterLeaveForKind(visitor, kind);\n return isLeaving ? leave : enter;\n}\n","import { printBlockString } from './blockString.mjs';\nimport { printString } from './printString.mjs';\nimport { visit } from './visitor.mjs';\n/**\n * Converts an AST into a string, using one set of reasonable\n * formatting rules.\n */\n\nexport function print(ast) {\n return visit(ast, printDocASTReducer);\n}\nconst MAX_LINE_LENGTH = 80;\nconst printDocASTReducer = {\n Name: {\n leave: (node) => node.value,\n },\n Variable: {\n leave: (node) => '$' + node.name,\n },\n // Document\n Document: {\n leave: (node) => join(node.definitions, '\\n\\n'),\n },\n OperationDefinition: {\n leave(node) {\n const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')');\n const prefix = join(\n [\n node.operation,\n join([node.name, varDefs]),\n join(node.directives, ' '),\n ],\n ' ',\n ); // Anonymous queries with no directives or variable definitions can use\n // the query short form.\n\n return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet;\n },\n },\n VariableDefinition: {\n leave: ({ variable, type, defaultValue, directives }) =>\n variable +\n ': ' +\n type +\n wrap(' = ', defaultValue) +\n wrap(' ', join(directives, ' ')),\n },\n SelectionSet: {\n leave: ({ selections }) => block(selections),\n },\n Field: {\n leave({ alias, name, arguments: args, directives, selectionSet }) {\n const prefix = wrap('', alias, ': ') + name;\n let argsLine = prefix + wrap('(', join(args, ', '), ')');\n\n if (argsLine.length > MAX_LINE_LENGTH) {\n argsLine = prefix + wrap('(\\n', indent(join(args, '\\n')), '\\n)');\n }\n\n return join([argsLine, join(directives, ' '), selectionSet], ' ');\n },\n },\n Argument: {\n leave: ({ name, value }) => name + ': ' + value,\n },\n // Fragments\n FragmentSpread: {\n leave: ({ name, directives }) =>\n '...' + name + wrap(' ', join(directives, ' ')),\n },\n InlineFragment: {\n leave: ({ typeCondition, directives, selectionSet }) =>\n join(\n [\n '...',\n wrap('on ', typeCondition),\n join(directives, ' '),\n selectionSet,\n ],\n ' ',\n ),\n },\n FragmentDefinition: {\n leave: (\n { name, typeCondition, variableDefinitions, directives, selectionSet }, // Note: fragment variable definitions are experimental and may be changed\n ) =>\n // or removed in the future.\n `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` +\n `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` +\n selectionSet,\n },\n // Value\n IntValue: {\n leave: ({ value }) => value,\n },\n FloatValue: {\n leave: ({ value }) => value,\n },\n StringValue: {\n leave: ({ value, block: isBlockString }) =>\n isBlockString ? printBlockString(value) : printString(value),\n },\n BooleanValue: {\n leave: ({ value }) => (value ? 'true' : 'false'),\n },\n NullValue: {\n leave: () => 'null',\n },\n EnumValue: {\n leave: ({ value }) => value,\n },\n ListValue: {\n leave: ({ values }) => '[' + join(values, ', ') + ']',\n },\n ObjectValue: {\n leave: ({ fields }) => '{' + join(fields, ', ') + '}',\n },\n ObjectField: {\n leave: ({ name, value }) => name + ': ' + value,\n },\n // Directive\n Directive: {\n leave: ({ name, arguments: args }) =>\n '@' + name + wrap('(', join(args, ', '), ')'),\n },\n // Type\n NamedType: {\n leave: ({ name }) => name,\n },\n ListType: {\n leave: ({ type }) => '[' + type + ']',\n },\n NonNullType: {\n leave: ({ type }) => type + '!',\n },\n // Type System Definitions\n SchemaDefinition: {\n leave: ({ description, directives, operationTypes }) =>\n wrap('', description, '\\n') +\n join(['schema', join(directives, ' '), block(operationTypes)], ' '),\n },\n OperationTypeDefinition: {\n leave: ({ operation, type }) => operation + ': ' + type,\n },\n ScalarTypeDefinition: {\n leave: ({ description, name, directives }) =>\n wrap('', description, '\\n') +\n join(['scalar', name, join(directives, ' ')], ' '),\n },\n ObjectTypeDefinition: {\n leave: ({ description, name, interfaces, directives, fields }) =>\n wrap('', description, '\\n') +\n join(\n [\n 'type',\n name,\n wrap('implements ', join(interfaces, ' & ')),\n join(directives, ' '),\n block(fields),\n ],\n ' ',\n ),\n },\n FieldDefinition: {\n leave: ({ description, name, arguments: args, type, directives }) =>\n wrap('', description, '\\n') +\n name +\n (hasMultilineItems(args)\n ? wrap('(\\n', indent(join(args, '\\n')), '\\n)')\n : wrap('(', join(args, ', '), ')')) +\n ': ' +\n type +\n wrap(' ', join(directives, ' ')),\n },\n InputValueDefinition: {\n leave: ({ description, name, type, defaultValue, directives }) =>\n wrap('', description, '\\n') +\n join(\n [name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')],\n ' ',\n ),\n },\n InterfaceTypeDefinition: {\n leave: ({ description, name, interfaces, directives, fields }) =>\n wrap('', description, '\\n') +\n join(\n [\n 'interface',\n name,\n wrap('implements ', join(interfaces, ' & ')),\n join(directives, ' '),\n block(fields),\n ],\n ' ',\n ),\n },\n UnionTypeDefinition: {\n leave: ({ description, name, directives, types }) =>\n wrap('', description, '\\n') +\n join(\n ['union', name, join(directives, ' '), wrap('= ', join(types, ' | '))],\n ' ',\n ),\n },\n EnumTypeDefinition: {\n leave: ({ description, name, directives, values }) =>\n wrap('', description, '\\n') +\n join(['enum', name, join(directives, ' '), block(values)], ' '),\n },\n EnumValueDefinition: {\n leave: ({ description, name, directives }) =>\n wrap('', description, '\\n') + join([name, join(directives, ' ')], ' '),\n },\n InputObjectTypeDefinition: {\n leave: ({ description, name, directives, fields }) =>\n wrap('', description, '\\n') +\n join(['input', name, join(directives, ' '), block(fields)], ' '),\n },\n DirectiveDefinition: {\n leave: ({ description, name, arguments: args, repeatable, locations }) =>\n wrap('', description, '\\n') +\n 'directive @' +\n name +\n (hasMultilineItems(args)\n ? wrap('(\\n', indent(join(args, '\\n')), '\\n)')\n : wrap('(', join(args, ', '), ')')) +\n (repeatable ? ' repeatable' : '') +\n ' on ' +\n join(locations, ' | '),\n },\n SchemaExtension: {\n leave: ({ directives, operationTypes }) =>\n join(\n ['extend schema', join(directives, ' '), block(operationTypes)],\n ' ',\n ),\n },\n ScalarTypeExtension: {\n leave: ({ name, directives }) =>\n join(['extend scalar', name, join(directives, ' ')], ' '),\n },\n ObjectTypeExtension: {\n leave: ({ name, interfaces, directives, fields }) =>\n join(\n [\n 'extend type',\n name,\n wrap('implements ', join(interfaces, ' & ')),\n join(directives, ' '),\n block(fields),\n ],\n ' ',\n ),\n },\n InterfaceTypeExtension: {\n leave: ({ name, interfaces, directives, fields }) =>\n join(\n [\n 'extend interface',\n name,\n wrap('implements ', join(interfaces, ' & ')),\n join(directives, ' '),\n block(fields),\n ],\n ' ',\n ),\n },\n UnionTypeExtension: {\n leave: ({ name, directives, types }) =>\n join(\n [\n 'extend union',\n name,\n join(directives, ' '),\n wrap('= ', join(types, ' | ')),\n ],\n ' ',\n ),\n },\n EnumTypeExtension: {\n leave: ({ name, directives, values }) =>\n join(['extend enum', name, join(directives, ' '), block(values)], ' '),\n },\n InputObjectTypeExtension: {\n leave: ({ name, directives, fields }) =>\n join(['extend input', name, join(directives, ' '), block(fields)], ' '),\n },\n};\n/**\n * Given maybeArray, print an empty string if it is null or empty, otherwise\n * print all items together separated by separator if provided\n */\n\nfunction join(maybeArray, separator = '') {\n var _maybeArray$filter$jo;\n\n return (_maybeArray$filter$jo =\n maybeArray === null || maybeArray === void 0\n ? void 0\n : maybeArray.filter((x) => x).join(separator)) !== null &&\n _maybeArray$filter$jo !== void 0\n ? _maybeArray$filter$jo\n : '';\n}\n/**\n * Given array, print each item on its own line, wrapped in an indented `{ }` block.\n */\n\nfunction block(array) {\n return wrap('{\\n', indent(join(array, '\\n')), '\\n}');\n}\n/**\n * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string.\n */\n\nfunction wrap(start, maybeString, end = '') {\n return maybeString != null && maybeString !== ''\n ? start + maybeString + end\n : '';\n}\n\nfunction indent(str) {\n return wrap(' ', str.replace(/\\n/g, '\\n '));\n}\n\nfunction hasMultilineItems(maybeArray) {\n var _maybeArray$some;\n\n // FIXME: https://github.com/graphql/graphql-js/issues/2203\n\n /* c8 ignore next */\n return (_maybeArray$some =\n maybeArray === null || maybeArray === void 0\n ? void 0\n : maybeArray.some((str) => str.includes('\\n'))) !== null &&\n _maybeArray$some !== void 0\n ? _maybeArray$some\n : false;\n}\n","import { keyValMap } from '../jsutils/keyValMap.mjs';\nimport { Kind } from '../language/kinds.mjs';\n/**\n * Produces a JavaScript value given a GraphQL Value AST.\n *\n * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value\n * will reflect the provided GraphQL value AST.\n *\n * | GraphQL Value | JavaScript Value |\n * | -------------------- | ---------------- |\n * | Input Object | Object |\n * | List | Array |\n * | Boolean | Boolean |\n * | String / Enum | String |\n * | Int / Float | Number |\n * | Null | null |\n *\n */\n\nexport function valueFromASTUntyped(valueNode, variables) {\n switch (valueNode.kind) {\n case Kind.NULL:\n return null;\n\n case Kind.INT:\n return parseInt(valueNode.value, 10);\n\n case Kind.FLOAT:\n return parseFloat(valueNode.value);\n\n case Kind.STRING:\n case Kind.ENUM:\n case Kind.BOOLEAN:\n return valueNode.value;\n\n case Kind.LIST:\n return valueNode.values.map((node) =>\n valueFromASTUntyped(node, variables),\n );\n\n case Kind.OBJECT:\n return keyValMap(\n valueNode.fields,\n (field) => field.name.value,\n (field) => valueFromASTUntyped(field.value, variables),\n );\n\n case Kind.VARIABLE:\n return variables === null || variables === void 0\n ? void 0\n : variables[valueNode.name.value];\n }\n}\n","import { devAssert } from '../jsutils/devAssert.mjs';\nimport { GraphQLError } from '../error/GraphQLError.mjs';\nimport { isNameContinue, isNameStart } from '../language/characterClasses.mjs';\n/**\n * Upholds the spec rules about naming.\n */\n\nexport function assertName(name) {\n name != null || devAssert(false, 'Must provide name.');\n typeof name === 'string' || devAssert(false, 'Expected name to be a string.');\n\n if (name.length === 0) {\n throw new GraphQLError('Expected name to be a non-empty string.');\n }\n\n for (let i = 1; i < name.length; ++i) {\n if (!isNameContinue(name.charCodeAt(i))) {\n throw new GraphQLError(\n `Names must only contain [_a-zA-Z0-9] but \"${name}\" does not.`,\n );\n }\n }\n\n if (!isNameStart(name.charCodeAt(0))) {\n throw new GraphQLError(\n `Names must start with [_a-zA-Z] but \"${name}\" does not.`,\n );\n }\n\n return name;\n}\n/**\n * Upholds the spec rules about naming enum values.\n *\n * @internal\n */\n\nexport function assertEnumValueName(name) {\n if (name === 'true' || name === 'false' || name === 'null') {\n throw new GraphQLError(`Enum values cannot be named: ${name}`);\n }\n\n return assertName(name);\n}\n","import { devAssert } from '../jsutils/devAssert.mjs';\nimport { didYouMean } from '../jsutils/didYouMean.mjs';\nimport { identityFunc } from '../jsutils/identityFunc.mjs';\nimport { inspect } from '../jsutils/inspect.mjs';\nimport { instanceOf } from '../jsutils/instanceOf.mjs';\nimport { isObjectLike } from '../jsutils/isObjectLike.mjs';\nimport { keyMap } from '../jsutils/keyMap.mjs';\nimport { keyValMap } from '../jsutils/keyValMap.mjs';\nimport { mapValue } from '../jsutils/mapValue.mjs';\nimport { suggestionList } from '../jsutils/suggestionList.mjs';\nimport { toObjMap } from '../jsutils/toObjMap.mjs';\nimport { GraphQLError } from '../error/GraphQLError.mjs';\nimport { Kind } from '../language/kinds.mjs';\nimport { print } from '../language/printer.mjs';\nimport { valueFromASTUntyped } from '../utilities/valueFromASTUntyped.mjs';\nimport { assertEnumValueName, assertName } from './assertName.mjs';\nexport function isType(type) {\n return (\n isScalarType(type) ||\n isObjectType(type) ||\n isInterfaceType(type) ||\n isUnionType(type) ||\n isEnumType(type) ||\n isInputObjectType(type) ||\n isListType(type) ||\n isNonNullType(type)\n );\n}\nexport function assertType(type) {\n if (!isType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL type.`);\n }\n\n return type;\n}\n/**\n * There are predicates for each kind of GraphQL type.\n */\n\nexport function isScalarType(type) {\n return instanceOf(type, GraphQLScalarType);\n}\nexport function assertScalarType(type) {\n if (!isScalarType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL Scalar type.`);\n }\n\n return type;\n}\nexport function isObjectType(type) {\n return instanceOf(type, GraphQLObjectType);\n}\nexport function assertObjectType(type) {\n if (!isObjectType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL Object type.`);\n }\n\n return type;\n}\nexport function isInterfaceType(type) {\n return instanceOf(type, GraphQLInterfaceType);\n}\nexport function assertInterfaceType(type) {\n if (!isInterfaceType(type)) {\n throw new Error(\n `Expected ${inspect(type)} to be a GraphQL Interface type.`,\n );\n }\n\n return type;\n}\nexport function isUnionType(type) {\n return instanceOf(type, GraphQLUnionType);\n}\nexport function assertUnionType(type) {\n if (!isUnionType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL Union type.`);\n }\n\n return type;\n}\nexport function isEnumType(type) {\n return instanceOf(type, GraphQLEnumType);\n}\nexport function assertEnumType(type) {\n if (!isEnumType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL Enum type.`);\n }\n\n return type;\n}\nexport function isInputObjectType(type) {\n return instanceOf(type, GraphQLInputObjectType);\n}\nexport function assertInputObjectType(type) {\n if (!isInputObjectType(type)) {\n throw new Error(\n `Expected ${inspect(type)} to be a GraphQL Input Object type.`,\n );\n }\n\n return type;\n}\nexport function isListType(type) {\n return instanceOf(type, GraphQLList);\n}\nexport function assertListType(type) {\n if (!isListType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL List type.`);\n }\n\n return type;\n}\nexport function isNonNullType(type) {\n return instanceOf(type, GraphQLNonNull);\n}\nexport function assertNonNullType(type) {\n if (!isNonNullType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL Non-Null type.`);\n }\n\n return type;\n}\n/**\n * These types may be used as input types for arguments and directives.\n */\n\nexport function isInputType(type) {\n return (\n isScalarType(type) ||\n isEnumType(type) ||\n isInputObjectType(type) ||\n (isWrappingType(type) && isInputType(type.ofType))\n );\n}\nexport function assertInputType(type) {\n if (!isInputType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL input type.`);\n }\n\n return type;\n}\n/**\n * These types may be used as output types as the result of fields.\n */\n\nexport function isOutputType(type) {\n return (\n isScalarType(type) ||\n isObjectType(type) ||\n isInterfaceType(type) ||\n isUnionType(type) ||\n isEnumType(type) ||\n (isWrappingType(type) && isOutputType(type.ofType))\n );\n}\nexport function assertOutputType(type) {\n if (!isOutputType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL output type.`);\n }\n\n return type;\n}\n/**\n * These types may describe types which may be leaf values.\n */\n\nexport function isLeafType(type) {\n return isScalarType(type) || isEnumType(type);\n}\nexport function assertLeafType(type) {\n if (!isLeafType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL leaf type.`);\n }\n\n return type;\n}\n/**\n * These types may describe the parent context of a selection set.\n */\n\nexport function isCompositeType(type) {\n return isObjectType(type) || isInterfaceType(type) || isUnionType(type);\n}\nexport function assertCompositeType(type) {\n if (!isCompositeType(type)) {\n throw new Error(\n `Expected ${inspect(type)} to be a GraphQL composite type.`,\n );\n }\n\n return type;\n}\n/**\n * These types may describe the parent context of a selection set.\n */\n\nexport function isAbstractType(type) {\n return isInterfaceType(type) || isUnionType(type);\n}\nexport function assertAbstractType(type) {\n if (!isAbstractType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL abstract type.`);\n }\n\n return type;\n}\n/**\n * List Type Wrapper\n *\n * A list is a wrapping type which points to another type.\n * Lists are often created within the context of defining the fields of\n * an object type.\n *\n * Example:\n *\n * ```ts\n * const PersonType = new GraphQLObjectType({\n * name: 'Person',\n * fields: () => ({\n * parents: { type: new GraphQLList(PersonType) },\n * children: { type: new GraphQLList(PersonType) },\n * })\n * })\n * ```\n */\n\nexport class GraphQLList {\n constructor(ofType) {\n isType(ofType) ||\n devAssert(false, `Expected ${inspect(ofType)} to be a GraphQL type.`);\n this.ofType = ofType;\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLList';\n }\n\n toString() {\n return '[' + String(this.ofType) + ']';\n }\n\n toJSON() {\n return this.toString();\n }\n}\n/**\n * Non-Null Type Wrapper\n *\n * A non-null is a wrapping type which points to another type.\n * Non-null types enforce that their values are never null and can ensure\n * an error is raised if this ever occurs during a request. It is useful for\n * fields which you can make a strong guarantee on non-nullability, for example\n * usually the id field of a database row will never be null.\n *\n * Example:\n *\n * ```ts\n * const RowType = new GraphQLObjectType({\n * name: 'Row',\n * fields: () => ({\n * id: { type: new GraphQLNonNull(GraphQLString) },\n * })\n * })\n * ```\n * Note: the enforcement of non-nullability occurs within the executor.\n */\n\nexport class GraphQLNonNull {\n constructor(ofType) {\n isNullableType(ofType) ||\n devAssert(\n false,\n `Expected ${inspect(ofType)} to be a GraphQL nullable type.`,\n );\n this.ofType = ofType;\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLNonNull';\n }\n\n toString() {\n return String(this.ofType) + '!';\n }\n\n toJSON() {\n return this.toString();\n }\n}\n/**\n * These types wrap and modify other types\n */\n\nexport function isWrappingType(type) {\n return isListType(type) || isNonNullType(type);\n}\nexport function assertWrappingType(type) {\n if (!isWrappingType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL wrapping type.`);\n }\n\n return type;\n}\n/**\n * These types can all accept null as a value.\n */\n\nexport function isNullableType(type) {\n return isType(type) && !isNonNullType(type);\n}\nexport function assertNullableType(type) {\n if (!isNullableType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL nullable type.`);\n }\n\n return type;\n}\nexport function getNullableType(type) {\n if (type) {\n return isNonNullType(type) ? type.ofType : type;\n }\n}\n/**\n * These named types do not include modifiers like List or NonNull.\n */\n\nexport function isNamedType(type) {\n return (\n isScalarType(type) ||\n isObjectType(type) ||\n isInterfaceType(type) ||\n isUnionType(type) ||\n isEnumType(type) ||\n isInputObjectType(type)\n );\n}\nexport function assertNamedType(type) {\n if (!isNamedType(type)) {\n throw new Error(`Expected ${inspect(type)} to be a GraphQL named type.`);\n }\n\n return type;\n}\nexport function getNamedType(type) {\n if (type) {\n let unwrappedType = type;\n\n while (isWrappingType(unwrappedType)) {\n unwrappedType = unwrappedType.ofType;\n }\n\n return unwrappedType;\n }\n}\n/**\n * Used while defining GraphQL types to allow for circular references in\n * otherwise immutable type definitions.\n */\n\nexport function resolveReadonlyArrayThunk(thunk) {\n return typeof thunk === 'function' ? thunk() : thunk;\n}\nexport function resolveObjMapThunk(thunk) {\n return typeof thunk === 'function' ? thunk() : thunk;\n}\n/**\n * Custom extensions\n *\n * @remarks\n * Use a unique identifier name for your extension, for example the name of\n * your library or project. Do not use a shortened identifier as this increases\n * the risk of conflicts. We recommend you add at most one extension field,\n * an object which can contain all the values you need.\n */\n\n/**\n * Scalar Type Definition\n *\n * The leaf values of any request and input values to arguments are\n * Scalars (or Enums) and are defined with a name and a series of functions\n * used to parse input from ast or variables and to ensure validity.\n *\n * If a type's serialize function returns `null` or does not return a value\n * (i.e. it returns `undefined`) then an error will be raised and a `null`\n * value will be returned in the response. It is always better to validate\n *\n * Example:\n *\n * ```ts\n * const OddType = new GraphQLScalarType({\n * name: 'Odd',\n * serialize(value) {\n * if (!Number.isFinite(value)) {\n * throw new Error(\n * `Scalar \"Odd\" cannot represent \"${value}\" since it is not a finite number.`,\n * );\n * }\n *\n * if (value % 2 === 0) {\n * throw new Error(`Scalar \"Odd\" cannot represent \"${value}\" since it is even.`);\n * }\n * return value;\n * }\n * });\n * ```\n */\nexport class GraphQLScalarType {\n constructor(config) {\n var _config$parseValue,\n _config$serialize,\n _config$parseLiteral,\n _config$extensionASTN;\n\n const parseValue =\n (_config$parseValue = config.parseValue) !== null &&\n _config$parseValue !== void 0\n ? _config$parseValue\n : identityFunc;\n this.name = assertName(config.name);\n this.description = config.description;\n this.specifiedByURL = config.specifiedByURL;\n this.serialize =\n (_config$serialize = config.serialize) !== null &&\n _config$serialize !== void 0\n ? _config$serialize\n : identityFunc;\n this.parseValue = parseValue;\n this.parseLiteral =\n (_config$parseLiteral = config.parseLiteral) !== null &&\n _config$parseLiteral !== void 0\n ? _config$parseLiteral\n : (node, variables) => parseValue(valueFromASTUntyped(node, variables));\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN = config.extensionASTNodes) !== null &&\n _config$extensionASTN !== void 0\n ? _config$extensionASTN\n : [];\n config.specifiedByURL == null ||\n typeof config.specifiedByURL === 'string' ||\n devAssert(\n false,\n `${this.name} must provide \"specifiedByURL\" as a string, ` +\n `but got: ${inspect(config.specifiedByURL)}.`,\n );\n config.serialize == null ||\n typeof config.serialize === 'function' ||\n devAssert(\n false,\n `${this.name} must provide \"serialize\" function. If this custom Scalar is also used as an input type, ensure \"parseValue\" and \"parseLiteral\" functions are also provided.`,\n );\n\n if (config.parseLiteral) {\n (typeof config.parseValue === 'function' &&\n typeof config.parseLiteral === 'function') ||\n devAssert(\n false,\n `${this.name} must provide both \"parseValue\" and \"parseLiteral\" functions.`,\n );\n }\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLScalarType';\n }\n\n toConfig() {\n return {\n name: this.name,\n description: this.description,\n specifiedByURL: this.specifiedByURL,\n serialize: this.serialize,\n parseValue: this.parseValue,\n parseLiteral: this.parseLiteral,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\n/**\n * Object Type Definition\n *\n * Almost all of the GraphQL types you define will be object types. Object types\n * have a name, but most importantly describe their fields.\n *\n * Example:\n *\n * ```ts\n * const AddressType = new GraphQLObjectType({\n * name: 'Address',\n * fields: {\n * street: { type: GraphQLString },\n * number: { type: GraphQLInt },\n * formatted: {\n * type: GraphQLString,\n * resolve(obj) {\n * return obj.number + ' ' + obj.street\n * }\n * }\n * }\n * });\n * ```\n *\n * When two types need to refer to each other, or a type needs to refer to\n * itself in a field, you can use a function expression (aka a closure or a\n * thunk) to supply the fields lazily.\n *\n * Example:\n *\n * ```ts\n * const PersonType = new GraphQLObjectType({\n * name: 'Person',\n * fields: () => ({\n * name: { type: GraphQLString },\n * bestFriend: { type: PersonType },\n * })\n * });\n * ```\n */\nexport class GraphQLObjectType {\n constructor(config) {\n var _config$extensionASTN2;\n\n this.name = assertName(config.name);\n this.description = config.description;\n this.isTypeOf = config.isTypeOf;\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN2 = config.extensionASTNodes) !== null &&\n _config$extensionASTN2 !== void 0\n ? _config$extensionASTN2\n : [];\n\n this._fields = () => defineFieldMap(config);\n\n this._interfaces = () => defineInterfaces(config);\n\n config.isTypeOf == null ||\n typeof config.isTypeOf === 'function' ||\n devAssert(\n false,\n `${this.name} must provide \"isTypeOf\" as a function, ` +\n `but got: ${inspect(config.isTypeOf)}.`,\n );\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLObjectType';\n }\n\n getFields() {\n if (typeof this._fields === 'function') {\n this._fields = this._fields();\n }\n\n return this._fields;\n }\n\n getInterfaces() {\n if (typeof this._interfaces === 'function') {\n this._interfaces = this._interfaces();\n }\n\n return this._interfaces;\n }\n\n toConfig() {\n return {\n name: this.name,\n description: this.description,\n interfaces: this.getInterfaces(),\n fields: fieldsToFieldsConfig(this.getFields()),\n isTypeOf: this.isTypeOf,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nfunction defineInterfaces(config) {\n var _config$interfaces;\n\n const interfaces = resolveReadonlyArrayThunk(\n (_config$interfaces = config.interfaces) !== null &&\n _config$interfaces !== void 0\n ? _config$interfaces\n : [],\n );\n Array.isArray(interfaces) ||\n devAssert(\n false,\n `${config.name} interfaces must be an Array or a function which returns an Array.`,\n );\n return interfaces;\n}\n\nfunction defineFieldMap(config) {\n const fieldMap = resolveObjMapThunk(config.fields);\n isPlainObj(fieldMap) ||\n devAssert(\n false,\n `${config.name} fields must be an object with field names as keys or a function which returns such an object.`,\n );\n return mapValue(fieldMap, (fieldConfig, fieldName) => {\n var _fieldConfig$args;\n\n isPlainObj(fieldConfig) ||\n devAssert(\n false,\n `${config.name}.${fieldName} field config must be an object.`,\n );\n fieldConfig.resolve == null ||\n typeof fieldConfig.resolve === 'function' ||\n devAssert(\n false,\n `${config.name}.${fieldName} field resolver must be a function if ` +\n `provided, but got: ${inspect(fieldConfig.resolve)}.`,\n );\n const argsConfig =\n (_fieldConfig$args = fieldConfig.args) !== null &&\n _fieldConfig$args !== void 0\n ? _fieldConfig$args\n : {};\n isPlainObj(argsConfig) ||\n devAssert(\n false,\n `${config.name}.${fieldName} args must be an object with argument names as keys.`,\n );\n return {\n name: assertName(fieldName),\n description: fieldConfig.description,\n type: fieldConfig.type,\n args: defineArguments(argsConfig),\n resolve: fieldConfig.resolve,\n subscribe: fieldConfig.subscribe,\n deprecationReason: fieldConfig.deprecationReason,\n extensions: toObjMap(fieldConfig.extensions),\n astNode: fieldConfig.astNode,\n };\n });\n}\n\nexport function defineArguments(config) {\n return Object.entries(config).map(([argName, argConfig]) => ({\n name: assertName(argName),\n description: argConfig.description,\n type: argConfig.type,\n defaultValue: argConfig.defaultValue,\n deprecationReason: argConfig.deprecationReason,\n extensions: toObjMap(argConfig.extensions),\n astNode: argConfig.astNode,\n }));\n}\n\nfunction isPlainObj(obj) {\n return isObjectLike(obj) && !Array.isArray(obj);\n}\n\nfunction fieldsToFieldsConfig(fields) {\n return mapValue(fields, (field) => ({\n description: field.description,\n type: field.type,\n args: argsToArgsConfig(field.args),\n resolve: field.resolve,\n subscribe: field.subscribe,\n deprecationReason: field.deprecationReason,\n extensions: field.extensions,\n astNode: field.astNode,\n }));\n}\n/**\n * @internal\n */\n\nexport function argsToArgsConfig(args) {\n return keyValMap(\n args,\n (arg) => arg.name,\n (arg) => ({\n description: arg.description,\n type: arg.type,\n defaultValue: arg.defaultValue,\n deprecationReason: arg.deprecationReason,\n extensions: arg.extensions,\n astNode: arg.astNode,\n }),\n );\n}\nexport function isRequiredArgument(arg) {\n return isNonNullType(arg.type) && arg.defaultValue === undefined;\n}\n\n/**\n * Interface Type Definition\n *\n * When a field can return one of a heterogeneous set of types, a Interface type\n * is used to describe what types are possible, what fields are in common across\n * all types, as well as a function to determine which type is actually used\n * when the field is resolved.\n *\n * Example:\n *\n * ```ts\n * const EntityType = new GraphQLInterfaceType({\n * name: 'Entity',\n * fields: {\n * name: { type: GraphQLString }\n * }\n * });\n * ```\n */\nexport class GraphQLInterfaceType {\n constructor(config) {\n var _config$extensionASTN3;\n\n this.name = assertName(config.name);\n this.description = config.description;\n this.resolveType = config.resolveType;\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN3 = config.extensionASTNodes) !== null &&\n _config$extensionASTN3 !== void 0\n ? _config$extensionASTN3\n : [];\n this._fields = defineFieldMap.bind(undefined, config);\n this._interfaces = defineInterfaces.bind(undefined, config);\n config.resolveType == null ||\n typeof config.resolveType === 'function' ||\n devAssert(\n false,\n `${this.name} must provide \"resolveType\" as a function, ` +\n `but got: ${inspect(config.resolveType)}.`,\n );\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLInterfaceType';\n }\n\n getFields() {\n if (typeof this._fields === 'function') {\n this._fields = this._fields();\n }\n\n return this._fields;\n }\n\n getInterfaces() {\n if (typeof this._interfaces === 'function') {\n this._interfaces = this._interfaces();\n }\n\n return this._interfaces;\n }\n\n toConfig() {\n return {\n name: this.name,\n description: this.description,\n interfaces: this.getInterfaces(),\n fields: fieldsToFieldsConfig(this.getFields()),\n resolveType: this.resolveType,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\n/**\n * Union Type Definition\n *\n * When a field can return one of a heterogeneous set of types, a Union type\n * is used to describe what types are possible as well as providing a function\n * to determine which type is actually used when the field is resolved.\n *\n * Example:\n *\n * ```ts\n * const PetType = new GraphQLUnionType({\n * name: 'Pet',\n * types: [ DogType, CatType ],\n * resolveType(value) {\n * if (value instanceof Dog) {\n * return DogType;\n * }\n * if (value instanceof Cat) {\n * return CatType;\n * }\n * }\n * });\n * ```\n */\nexport class GraphQLUnionType {\n constructor(config) {\n var _config$extensionASTN4;\n\n this.name = assertName(config.name);\n this.description = config.description;\n this.resolveType = config.resolveType;\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN4 = config.extensionASTNodes) !== null &&\n _config$extensionASTN4 !== void 0\n ? _config$extensionASTN4\n : [];\n this._types = defineTypes.bind(undefined, config);\n config.resolveType == null ||\n typeof config.resolveType === 'function' ||\n devAssert(\n false,\n `${this.name} must provide \"resolveType\" as a function, ` +\n `but got: ${inspect(config.resolveType)}.`,\n );\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLUnionType';\n }\n\n getTypes() {\n if (typeof this._types === 'function') {\n this._types = this._types();\n }\n\n return this._types;\n }\n\n toConfig() {\n return {\n name: this.name,\n description: this.description,\n types: this.getTypes(),\n resolveType: this.resolveType,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nfunction defineTypes(config) {\n const types = resolveReadonlyArrayThunk(config.types);\n Array.isArray(types) ||\n devAssert(\n false,\n `Must provide Array of types or a function which returns such an array for Union ${config.name}.`,\n );\n return types;\n}\n\n/**\n * Enum Type Definition\n *\n * Some leaf values of requests and input values are Enums. GraphQL serializes\n * Enum values as strings, however internally Enums can be represented by any\n * kind of type, often integers.\n *\n * Example:\n *\n * ```ts\n * const RGBType = new GraphQLEnumType({\n * name: 'RGB',\n * values: {\n * RED: { value: 0 },\n * GREEN: { value: 1 },\n * BLUE: { value: 2 }\n * }\n * });\n * ```\n *\n * Note: If a value is not provided in a definition, the name of the enum value\n * will be used as its internal value.\n */\nexport class GraphQLEnumType {\n /* <T> */\n constructor(config) {\n var _config$extensionASTN5;\n\n this.name = assertName(config.name);\n this.description = config.description;\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN5 = config.extensionASTNodes) !== null &&\n _config$extensionASTN5 !== void 0\n ? _config$extensionASTN5\n : [];\n this._values = defineEnumValues(this.name, config.values);\n this._valueLookup = new Map(\n this._values.map((enumValue) => [enumValue.value, enumValue]),\n );\n this._nameLookup = keyMap(this._values, (value) => value.name);\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLEnumType';\n }\n\n getValues() {\n return this._values;\n }\n\n getValue(name) {\n return this._nameLookup[name];\n }\n\n serialize(outputValue) {\n const enumValue = this._valueLookup.get(outputValue);\n\n if (enumValue === undefined) {\n throw new GraphQLError(\n `Enum \"${this.name}\" cannot represent value: ${inspect(outputValue)}`,\n );\n }\n\n return enumValue.name;\n }\n\n parseValue(inputValue) /* T */\n {\n if (typeof inputValue !== 'string') {\n const valueStr = inspect(inputValue);\n throw new GraphQLError(\n `Enum \"${this.name}\" cannot represent non-string value: ${valueStr}.` +\n didYouMeanEnumValue(this, valueStr),\n );\n }\n\n const enumValue = this.getValue(inputValue);\n\n if (enumValue == null) {\n throw new GraphQLError(\n `Value \"${inputValue}\" does not exist in \"${this.name}\" enum.` +\n didYouMeanEnumValue(this, inputValue),\n );\n }\n\n return enumValue.value;\n }\n\n parseLiteral(valueNode, _variables) /* T */\n {\n // Note: variables will be resolved to a value before calling this function.\n if (valueNode.kind !== Kind.ENUM) {\n const valueStr = print(valueNode);\n throw new GraphQLError(\n `Enum \"${this.name}\" cannot represent non-enum value: ${valueStr}.` +\n didYouMeanEnumValue(this, valueStr),\n {\n nodes: valueNode,\n },\n );\n }\n\n const enumValue = this.getValue(valueNode.value);\n\n if (enumValue == null) {\n const valueStr = print(valueNode);\n throw new GraphQLError(\n `Value \"${valueStr}\" does not exist in \"${this.name}\" enum.` +\n didYouMeanEnumValue(this, valueStr),\n {\n nodes: valueNode,\n },\n );\n }\n\n return enumValue.value;\n }\n\n toConfig() {\n const values = keyValMap(\n this.getValues(),\n (value) => value.name,\n (value) => ({\n description: value.description,\n value: value.value,\n deprecationReason: value.deprecationReason,\n extensions: value.extensions,\n astNode: value.astNode,\n }),\n );\n return {\n name: this.name,\n description: this.description,\n values,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nfunction didYouMeanEnumValue(enumType, unknownValueStr) {\n const allNames = enumType.getValues().map((value) => value.name);\n const suggestedValues = suggestionList(unknownValueStr, allNames);\n return didYouMean('the enum value', suggestedValues);\n}\n\nfunction defineEnumValues(typeName, valueMap) {\n isPlainObj(valueMap) ||\n devAssert(\n false,\n `${typeName} values must be an object with value names as keys.`,\n );\n return Object.entries(valueMap).map(([valueName, valueConfig]) => {\n isPlainObj(valueConfig) ||\n devAssert(\n false,\n `${typeName}.${valueName} must refer to an object with a \"value\" key ` +\n `representing an internal value but got: ${inspect(valueConfig)}.`,\n );\n return {\n name: assertEnumValueName(valueName),\n description: valueConfig.description,\n value: valueConfig.value !== undefined ? valueConfig.value : valueName,\n deprecationReason: valueConfig.deprecationReason,\n extensions: toObjMap(valueConfig.extensions),\n astNode: valueConfig.astNode,\n };\n });\n}\n\n/**\n * Input Object Type Definition\n *\n * An input object defines a structured collection of fields which may be\n * supplied to a field argument.\n *\n * Using `NonNull` will ensure that a value must be provided by the query\n *\n * Example:\n *\n * ```ts\n * const GeoPoint = new GraphQLInputObjectType({\n * name: 'GeoPoint',\n * fields: {\n * lat: { type: new GraphQLNonNull(GraphQLFloat) },\n * lon: { type: new GraphQLNonNull(GraphQLFloat) },\n * alt: { type: GraphQLFloat, defaultValue: 0 },\n * }\n * });\n * ```\n */\nexport class GraphQLInputObjectType {\n constructor(config) {\n var _config$extensionASTN6;\n\n this.name = assertName(config.name);\n this.description = config.description;\n this.extensions = toObjMap(config.extensions);\n this.astNode = config.astNode;\n this.extensionASTNodes =\n (_config$extensionASTN6 = config.extensionASTNodes) !== null &&\n _config$extensionASTN6 !== void 0\n ? _config$extensionASTN6\n : [];\n this._fields = defineInputFieldMap.bind(undefined, config);\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLInputObjectType';\n }\n\n getFields() {\n if (typeof this._fields === 'function') {\n this._fields = this._fields();\n }\n\n return this._fields;\n }\n\n toConfig() {\n const fields = mapValue(this.getFields(), (field) => ({\n description: field.description,\n type: field.type,\n defaultValue: field.defaultValue,\n deprecationReason: field.deprecationReason,\n extensions: field.extensions,\n astNode: field.astNode,\n }));\n return {\n name: this.name,\n description: this.description,\n fields,\n extensions: this.extensions,\n astNode: this.astNode,\n extensionASTNodes: this.extensionASTNodes,\n };\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nfunction defineInputFieldMap(config) {\n const fieldMap = resolveObjMapThunk(config.fields);\n isPlainObj(fieldMap) ||\n devAssert(\n false,\n `${config.name} fields must be an object with field names as keys or a function which returns such an object.`,\n );\n return mapValue(fieldMap, (fieldConfig, fieldName) => {\n !('resolve' in fieldConfig) ||\n devAssert(\n false,\n `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`,\n );\n return {\n name: assertName(fieldName),\n description: fieldConfig.description,\n type: fieldConfig.type,\n defaultValue: fieldConfig.defaultValue,\n deprecationReason: fieldConfig.deprecationReason,\n extensions: toObjMap(fieldConfig.extensions),\n astNode: fieldConfig.astNode,\n };\n });\n}\n\nexport function isRequiredInputField(field) {\n return isNonNullType(field.type) && field.defaultValue === undefined;\n}\n","import { inspect } from '../jsutils/inspect.mjs';\nimport { isObjectLike } from '../jsutils/isObjectLike.mjs';\nimport { GraphQLError } from '../error/GraphQLError.mjs';\nimport { Kind } from '../language/kinds.mjs';\nimport { print } from '../language/printer.mjs';\nimport { GraphQLScalarType } from './definition.mjs';\n/**\n * Maximum possible Int value as per GraphQL Spec (32-bit signed integer).\n * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1\n * */\n\nexport const GRAPHQL_MAX_INT = 2147483647;\n/**\n * Minimum possible Int value as per GraphQL Spec (32-bit signed integer).\n * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1)\n * */\n\nexport const GRAPHQL_MIN_INT = -2147483648;\nexport const GraphQLInt = new GraphQLScalarType({\n name: 'Int',\n description:\n 'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',\n\n serialize(outputValue) {\n const coercedValue = serializeObject(outputValue);\n\n if (typeof coercedValue === 'boolean') {\n return coercedValue ? 1 : 0;\n }\n\n let num = coercedValue;\n\n if (typeof coercedValue === 'string' && coercedValue !== '') {\n num = Number(coercedValue);\n }\n\n if (typeof num !== 'number' || !Number.isInteger(num)) {\n throw new GraphQLError(\n `Int cannot represent non-integer value: ${inspect(coercedValue)}`,\n );\n }\n\n if (num > GRAPHQL_MAX_INT || num < GRAPHQL_MIN_INT) {\n throw new GraphQLError(\n 'Int cannot represent non 32-bit signed integer value: ' +\n inspect(coercedValue),\n );\n }\n\n return num;\n },\n\n parseValue(inputValue) {\n if (typeof inputValue !== 'number' || !Number.isInteger(inputValue)) {\n throw new GraphQLError(\n `Int cannot represent non-integer value: ${inspect(inputValue)}`,\n );\n }\n\n if (inputValue > GRAPHQL_MAX_INT || inputValue < GRAPHQL_MIN_INT) {\n throw new GraphQLError(\n `Int cannot represent non 32-bit signed integer value: ${inputValue}`,\n );\n }\n\n return inputValue;\n },\n\n parseLiteral(valueNode) {\n if (valueNode.kind !== Kind.INT) {\n throw new GraphQLError(\n `Int cannot represent non-integer value: ${print(valueNode)}`,\n {\n nodes: valueNode,\n },\n );\n }\n\n const num = parseInt(valueNode.value, 10);\n\n if (num > GRAPHQL_MAX_INT || num < GRAPHQL_MIN_INT) {\n throw new GraphQLError(\n `Int cannot represent non 32-bit signed integer value: ${valueNode.value}`,\n {\n nodes: valueNode,\n },\n );\n }\n\n return num;\n },\n});\nexport const GraphQLFloat = new GraphQLScalarType({\n name: 'Float',\n description:\n 'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',\n\n serialize(outputValue) {\n const coercedValue = serializeObject(outputValue);\n\n if (typeof coercedValue === 'boolean') {\n return coercedValue ? 1 : 0;\n }\n\n let num = coercedValue;\n\n if (typeof coercedValue === 'string' && coercedValue !== '') {\n num = Number(coercedValue);\n }\n\n if (typeof num !== 'number' || !Number.isFinite(num)) {\n throw new GraphQLError(\n `Float cannot represent non numeric value: ${inspect(coercedValue)}`,\n );\n }\n\n return num;\n },\n\n parseValue(inputValue) {\n if (typeof inputValue !== 'number' || !Number.isFinite(inputValue)) {\n throw new GraphQLError(\n `Float cannot represent non numeric value: ${inspect(inputValue)}`,\n );\n }\n\n return inputValue;\n },\n\n parseLiteral(valueNode) {\n if (valueNode.kind !== Kind.FLOAT && valueNode.kind !== Kind.INT) {\n throw new GraphQLError(\n `Float cannot represent non numeric value: ${print(valueNode)}`,\n valueNode,\n );\n }\n\n return parseFloat(valueNode.value);\n },\n});\nexport const GraphQLString = new GraphQLScalarType({\n name: 'String',\n description:\n 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.',\n\n serialize(outputValue) {\n const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not\n // attempt to coerce object, function, symbol, or other types as strings.\n\n if (typeof coercedValue === 'string') {\n return coercedValue;\n }\n\n if (typeof coercedValue === 'boolean') {\n return coercedValue ? 'true' : 'false';\n }\n\n if (typeof coercedValue === 'number' && Number.isFinite(coercedValue)) {\n return coercedValue.toString();\n }\n\n throw new GraphQLError(\n `String cannot represent value: ${inspect(outputValue)}`,\n );\n },\n\n parseValue(inputValue) {\n if (typeof inputValue !== 'string') {\n throw new GraphQLError(\n `String cannot represent a non string value: ${inspect(inputValue)}`,\n );\n }\n\n return inputValue;\n },\n\n parseLiteral(valueNode) {\n if (valueNode.kind !== Kind.STRING) {\n throw new GraphQLError(\n `String cannot represent a non string value: ${print(valueNode)}`,\n {\n nodes: valueNode,\n },\n );\n }\n\n return valueNode.value;\n },\n});\nexport const GraphQLBoolean = new GraphQLScalarType({\n name: 'Boolean',\n description: 'The `Boolean` scalar type represents `true` or `false`.',\n\n serialize(outputValue) {\n const coercedValue = serializeObject(outputValue);\n\n if (typeof coercedValue === 'boolean') {\n return coercedValue;\n }\n\n if (Number.isFinite(coercedValue)) {\n return coercedValue !== 0;\n }\n\n throw new GraphQLError(\n `Boolean cannot represent a non boolean value: ${inspect(coercedValue)}`,\n );\n },\n\n parseValue(inputValue) {\n if (typeof inputValue !== 'boolean') {\n throw new GraphQLError(\n `Boolean cannot represent a non boolean value: ${inspect(inputValue)}`,\n );\n }\n\n return inputValue;\n },\n\n parseLiteral(valueNode) {\n if (valueNode.kind !== Kind.BOOLEAN) {\n throw new GraphQLError(\n `Boolean cannot represent a non boolean value: ${print(valueNode)}`,\n {\n nodes: valueNode,\n },\n );\n }\n\n return valueNode.value;\n },\n});\nexport const GraphQLID = new GraphQLScalarType({\n name: 'ID',\n description:\n 'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.',\n\n serialize(outputValue) {\n const coercedValue = serializeObject(outputValue);\n\n if (typeof coercedValue === 'string') {\n return coercedValue;\n }\n\n if (Number.isInteger(coercedValue)) {\n return String(coercedValue);\n }\n\n throw new GraphQLError(\n `ID cannot represent value: ${inspect(outputValue)}`,\n );\n },\n\n parseValue(inputValue) {\n if (typeof inputValue === 'string') {\n return inputValue;\n }\n\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n return inputValue.toString();\n }\n\n throw new GraphQLError(`ID cannot represent value: ${inspect(inputValue)}`);\n },\n\n parseLiteral(valueNode) {\n if (valueNode.kind !== Kind.STRING && valueNode.kind !== Kind.INT) {\n throw new GraphQLError(\n 'ID cannot represent a non-string and non-integer value: ' +\n print(valueNode),\n {\n nodes: valueNode,\n },\n );\n }\n\n return valueNode.value;\n },\n});\nexport const specifiedScalarTypes = Object.freeze([\n GraphQLString,\n GraphQLInt,\n GraphQLFloat,\n GraphQLBoolean,\n GraphQLID,\n]);\nexport function isSpecifiedScalarType(type) {\n return specifiedScalarTypes.some(({ name }) => type.name === name);\n} // Support serializing objects with custom valueOf() or toJSON() functions -\n// a common way to represent a complex value which can be represented as\n// a string (ex: MongoDB id objects).\n\nfunction serializeObject(outputValue) {\n if (isObjectLike(outputValue)) {\n if (typeof outputValue.valueOf === 'function') {\n const valueOfResult = outputValue.valueOf();\n\n if (!isObjectLike(valueOfResult)) {\n return valueOfResult;\n }\n }\n\n if (typeof outputValue.toJSON === 'function') {\n return outputValue.toJSON();\n }\n }\n\n return outputValue;\n}\n","import { getTableColumns } from \"drizzle-orm\";\nimport {\n type PgColumn,\n type PgTable,\n getTableConfig,\n} from \"drizzle-orm/pg-core\";\nimport { getColumnCasing } from \"./kit/index.js\";\n\nexport const getPrimaryKeyColumns = (\n table: PgTable,\n): { sql: string; js: string }[] => {\n const primaryKeys = getTableConfig(table).primaryKeys;\n\n const findJsName = (column: PgColumn): string => {\n const name = column.name;\n for (const [js, column] of Object.entries(getTableColumns(table))) {\n if (column.name === name) return js;\n }\n\n throw \"unreachable\";\n };\n\n if (primaryKeys.length > 0) {\n return primaryKeys[0]!.columns.map((column) => ({\n sql: getColumnCasing(column, \"snake_case\"),\n js: findJsName(column),\n }));\n }\n\n const pkColumn = Object.values(getTableColumns(table)).find(\n (c) => c.primary,\n )!;\n\n return [\n {\n sql: getColumnCasing(pkColumn, \"snake_case\"),\n js: findJsName(pkColumn),\n },\n ];\n};\n","import { SQL, is, sql } from \"drizzle-orm\";\nimport { CasingCache, toCamelCase, toSnakeCase } from \"drizzle-orm/casing\";\nimport {\n type AnyPgTable,\n PgColumn,\n PgDialect,\n type PgEnum,\n PgEnumColumn,\n PgMaterializedView,\n PgSchema,\n type PgSequence,\n PgTable,\n PgView,\n getTableConfig,\n getViewConfig,\n index,\n integer,\n isPgEnum,\n isPgSequence,\n pgSchema,\n pgTable,\n varchar,\n} from \"drizzle-orm/pg-core\";\nimport { getReorgSequenceName, getReorgTableName } from \"../onchain.js\";\n\ntype Dialect = \"postgresql\";\ntype CasingType = \"snake_case\" | \"camelCase\";\n\nexport type SqlStatements = {\n tables: {\n sql: string[];\n json: JsonCreateTableStatement[];\n };\n views: {\n sql: string[];\n json: JsonCreatePgViewStatement[];\n };\n enums: {\n sql: string[];\n json: JsonCreateEnumStatement[];\n };\n indexes: { sql: string[]; json: JsonPgCreateIndexStatement[] };\n};\n\nexport const getReorgTable = (table: PgTable) => {\n const schema = getTableConfig(table).schema;\n if (schema && schema !== \"public\") {\n return pgSchema(schema).table(\n getReorgTableName(table),\n {\n operation_id: integer()\n .notNull()\n .primaryKey()\n .default(\n sql.raw(`nextval('\"${schema}\".\"${getReorgSequenceName()}\"')`),\n ),\n operation: integer().notNull().$type<0 | 1 | 2>(),\n checkpoint: varchar({ length: 75 }).notNull(),\n },\n (table) => [index().on(table.checkpoint)],\n );\n }\n return pgTable(\n getReorgTableName(table),\n {\n operation_id: integer()\n .notNull()\n .primaryKey()\n .default(sql.raw(`nextval('\"${getReorgSequenceName()}\"')`)),\n operation: integer().notNull().$type<0 | 1 | 2>(),\n checkpoint: varchar({ length: 75 }).notNull(),\n },\n (table) => [index().on(table.checkpoint)],\n );\n};\n\nexport const getSql = (schema: { [name: string]: unknown }): SqlStatements => {\n const { tables, views, enums, schemas } = prepareFromExports(schema);\n const json = generatePgSnapshot(tables, views, enums, schemas, \"snake_case\");\n const squashed = squashPgScheme(json);\n\n const jsonCreateIndexesForCreatedTables = Object.values(\n squashed.tables,\n ).flatMap((it) => {\n // @ts-ignore\n return preparePgCreateIndexesJson(it.name, it.schema, it.indexes);\n });\n\n const jsonCreateEnums =\n Object.values(squashed.enums).map((it) => {\n // @ts-ignore\n return prepareCreateEnumJson(it.name, it.schema, it.values);\n }) ?? [];\n\n const jsonCreateTables = Object.values(squashed.tables).map((it: any) => {\n return preparePgCreateTableJson(it, json);\n });\n\n const jsonCreateViews = Object.values(squashed.views).map((it: any) => {\n return preparePgCreateViewJson(\n it.name,\n it.schema,\n it.definition!,\n it.materialized,\n it.withNoData,\n it.with,\n it.using,\n it.tablespace,\n );\n });\n\n const fromJson = (statements: any[]) =>\n statements\n .flatMap((statement) => {\n const filtered = convertors.filter((it) => {\n return it.can(statement, \"postgresql\");\n });\n\n const convertor = filtered.length === 1 ? filtered[0] : undefined;\n\n if (!convertor) {\n return \"\";\n }\n\n return convertor.convert(statement);\n })\n .filter((it) => it !== \"\");\n\n const combinedTables = jsonCreateTables.flatMap((statement) => [\n statement,\n createReorgTableStatement(statement),\n ]);\n\n return {\n tables: {\n sql: fromJson(combinedTables),\n json: combinedTables,\n },\n views: { sql: fromJson(jsonCreateViews), json: jsonCreateViews },\n enums: { sql: fromJson(jsonCreateEnums), json: jsonCreateEnums },\n indexes: {\n sql: fromJson(jsonCreateIndexesForCreatedTables),\n json: jsonCreateIndexesForCreatedTables,\n },\n };\n};\n\nconst createReorgTableStatement = (statement: JsonCreateTableStatement) => {\n const reorgStatement: JsonCreateTableStatement = structuredClone(statement);\n\n reorgStatement.compositePkName = undefined;\n reorgStatement.compositePKs = [];\n\n for (const column of reorgStatement.columns) {\n column.primaryKey = false;\n }\n\n const reorgColumns = Object.values(\n squashPgScheme(\n generatePgSnapshot(\n [\n pgTable(\"\", {\n operation_id: integer()\n .notNull()\n .primaryKey()\n .default(\n sql.raw(\n `nextval('\"${statement.schema === \"\" ? \"public\" : statement.schema}\".\"${getReorgSequenceName()}\"')`,\n ),\n ),\n operation: integer().notNull(),\n checkpoint: varchar({ length: 75 }).notNull(),\n }),\n ],\n [],\n [],\n [],\n \"snake_case\",\n ),\n ).tables,\n //@ts-ignore\n )[0]!.columns;\n\n reorgStatement.columns.push(...Object.values(reorgColumns));\n\n reorgStatement.tableName = getReorgTableName(reorgStatement.tableName);\n\n return reorgStatement;\n};\n\n////////\n// Serializer\n////////\n\ntype Index = any;\ntype Column = any;\ntype PgSchemaSquashed = any;\ntype Table = any;\ntype Enum = any;\ntype PrimaryKey = any;\ntype IndexedColumn = any;\ntype IndexColumnType = any;\n\nconst PgSquasher = {\n squashIdx: (idx: Index) => {\n return `${idx.name};${idx.columns\n .map(\n (c: {\n expression: any;\n isExpression: any;\n asc: any;\n nulls: any;\n opclass: any;\n }) =>\n `${c.expression}--${c.isExpression}--${c.asc}--${c.nulls}--${\n c.opclass && \"\"\n }`,\n )\n .join(\n \",,\",\n )};${idx.isUnique};${idx.concurrently};${idx.method};${idx.where};${JSON.stringify(idx.with)}`;\n },\n unsquashIdx: (input: string): Index => {\n const [\n name,\n columnsString,\n isUnique,\n concurrently,\n method,\n where,\n idxWith,\n ] = input.split(\";\");\n\n const columnString = columnsString!.split(\",,\");\n const columns: IndexColumnType[] = [];\n\n for (const column of columnString) {\n const [expression, isExpression, asc, nulls, opclass] =\n column.split(\"--\");\n columns.push({\n nulls: nulls as IndexColumnType[\"nulls\"],\n isExpression: isExpression === \"true\",\n asc: asc === \"true\",\n expression: expression,\n opclass: opclass === \"undefined\" ? undefined : opclass,\n });\n }\n\n return {\n name,\n columns,\n isUnique: isUnique === \"true\",\n concurrently: concurrently === \"true\",\n method,\n where: where === \"undefined\" ? undefined : where,\n with:\n !idxWith || idxWith === \"undefined\" ? undefined : JSON.parse(idxWith),\n };\n },\n squashPK: (pk: PrimaryKey) => {\n return `${pk.columns.join(\",\")};${pk.name}`;\n },\n unsquashPK: (pk: string): PrimaryKey => {\n const splitted = pk.split(\";\");\n return { name: splitted[1], columns: splitted[0]!.split(\",\") };\n },\n};\n\n////////\n// JSON\n////////\n\ninterface JsonCreateTableStatement {\n type: \"create_table\";\n tableName: string;\n schema: string;\n columns: Column[];\n compositePKs: string[];\n compositePkName?: string;\n uniqueConstraints?: string[];\n checkConstraints?: string[];\n}\n\ntype JsonCreatePgViewStatement = {\n type: \"create_view\";\n name: string;\n schema: string;\n definition?: string;\n materialized: boolean;\n with: any;\n withNoData?: boolean;\n using?: string;\n tablespace?: string;\n};\n\ninterface JsonCreateEnumStatement {\n type: \"create_type_enum\";\n name: string;\n schema: string;\n values: string[];\n}\n\ninterface JsonCreateIndexStatement {\n type: \"create_index\";\n tableName: string;\n data: string;\n schema: string;\n}\n\ninterface JsonPgCreateIndexStatement {\n type: \"create_index_pg\";\n tableName: string;\n data: Index;\n schema: string;\n}\n\ninterface JsonCreateUniqueConstraint {\n type: \"create_unique_constraint\";\n tableName: string;\n data: string;\n schema?: string;\n constraintName?: string;\n}\n\ninterface JsonCreateCheckConstraint {\n type: \"create_check_constraint\";\n tableName: string;\n data: string;\n schema?: string;\n}\n\ninterface JsonCreateCompositePK {\n type: \"create_composite_pk\";\n tableName: string;\n data: string;\n schema?: string;\n constraintName?: string;\n}\n\ninterface JsonCreateSchema {\n type: \"create_schema\";\n name: string;\n}\n\ninterface JsonCreateReferenceStatement {\n type: \"create_reference\";\n data: string;\n schema: string;\n tableName: string;\n isMulticolumn?: boolean;\n columnNotNull?: boolean;\n columnDefault?: string;\n columnType?: string;\n}\n\ntype JsonStatement =\n | JsonCreateTableStatement\n | JsonCreatePgViewStatement\n | JsonCreateEnumStatement\n | JsonCreateIndexStatement\n | JsonPgCreateIndexStatement\n | JsonCreateReferenceStatement\n | JsonCreateCompositePK\n | JsonCreateUniqueConstraint\n | JsonCreateSchema\n | JsonCreateCheckConstraint;\n\n////////\n// Generator\n////////\n\nconst parseType = (schemaPrefix: string, type: string) => {\n const pgNativeTypes = [\n \"uuid\",\n \"smallint\",\n \"integer\",\n \"bigint\",\n \"boolean\",\n \"text\",\n \"varchar\",\n \"serial\",\n \"bigserial\",\n \"decimal\",\n \"numeric\",\n \"real\",\n \"json\",\n \"jsonb\",\n \"time\",\n \"time with time zone\",\n \"time without time zone\",\n \"time\",\n \"timestamp\",\n \"timestamp with time zone\",\n \"timestamp without time zone\",\n \"date\",\n \"interval\",\n \"bigint\",\n \"bigserial\",\n \"double precision\",\n \"interval year\",\n \"interval month\",\n \"interval day\",\n \"interval hour\",\n \"interval minute\",\n \"interval second\",\n \"interval year to month\",\n \"interval day to hour\",\n \"interval day to minute\",\n \"interval day to second\",\n \"interval hour to minute\",\n \"interval hour to second\",\n \"interval minute to second\",\n ];\n\n const arrayDefinitionRegex = /\\[\\d*(?:\\[\\d*\\])*\\]/g;\n const arrayDefinition = (type.match(arrayDefinitionRegex) ?? []).join(\"\");\n const withoutArrayDefinition = type.replace(arrayDefinitionRegex, \"\");\n return pgNativeTypes.some((it) => type.startsWith(it))\n ? `${withoutArrayDefinition}${arrayDefinition}`\n : `${schemaPrefix}\"${withoutArrayDefinition}\"${arrayDefinition}`;\n};\n\nabstract class Convertor {\n abstract can(statement: JsonStatement, dialect: Dialect): boolean;\n abstract convert(\n statement: JsonStatement,\n action?: \"push\",\n ): string | string[];\n}\n\nclass PgCreateTableConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_table\" && dialect === \"postgresql\";\n }\n\n convert(st: JsonCreateTableStatement) {\n const { tableName, schema, columns, compositePKs } = st;\n\n let statement = \"\";\n const name = schema ? `\"${schema}\".\"${tableName}\"` : `\"${tableName}\"`;\n\n statement += `CREATE TABLE ${name} (\\n`;\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const primaryKeyStatement = column.primaryKey ? \" PRIMARY KEY\" : \"\";\n const notNullStatement =\n column.notNull && !column.identity ? \" NOT NULL\" : \"\";\n const defaultStatement =\n column.default !== undefined ? ` DEFAULT ${column.default}` : \"\";\n\n // const uniqueConstraint = column.isUnique\n // ? ` CONSTRAINT \"${column.uniqueName}\" UNIQUE${column.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"}`\n // : \"\";\n\n const schemaPrefix =\n column.typeSchema && column.typeSchema !== \"public\"\n ? `\"${column.typeSchema}\".`\n : \"\";\n\n const type = parseType(schemaPrefix, column.type);\n // const generated = column.generated;\n\n // const generatedStatement = generated\n // ? ` GENERATED ALWAYS AS (${generated?.as}) STORED`\n // : \"\";\n\n // const unsquashedIdentity = column.identity\n // ? PgSquasher.unsquashIdentity(column.identity)\n // : undefined;\n\n // const identityWithSchema = schema\n // ? `\"${schema}\".\"${unsquashedIdentity?.name}\"`\n // : `\"${unsquashedIdentity?.name}\"`;\n\n // const identity = unsquashedIdentity\n // ? ` GENERATED ${\n // unsquashedIdentity.type === \"always\" ? \"ALWAYS\" : \"BY DEFAULT\"\n // } AS IDENTITY (sequence name ${identityWithSchema}${\n // unsquashedIdentity.increment\n // ? ` INCREMENT BY ${unsquashedIdentity.increment}`\n // : \"\"\n // }${\n // unsquashedIdentity.minValue\n // ? ` MINVALUE ${unsquashedIdentity.minValue}`\n // : \"\"\n // }${\n // unsquashedIdentity.maxValue\n // ? ` MAXVALUE ${unsquashedIdentity.maxValue}`\n // : \"\"\n // }${\n // unsquashedIdentity.startWith\n // ? ` START WITH ${unsquashedIdentity.startWith}`\n // : \"\"\n // }${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : \"\"}${\n // unsquashedIdentity.cycle ? \" CYCLE\" : \"\"\n // })`\n // : \"\";\n\n statement += `\\t\"${column.name}\" ${type}${primaryKeyStatement}${defaultStatement}${notNullStatement}`;\n statement += i === columns.length - 1 ? \"\" : \",\\n\";\n }\n\n if (typeof compositePKs !== \"undefined\" && compositePKs.length > 0) {\n statement += \",\\n\";\n const compositePK = PgSquasher.unsquashPK(compositePKs[0]!);\n statement += `\\tCONSTRAINT \"${st.compositePkName}\" PRIMARY KEY(\\\"${compositePK.columns.join(`\",\"`)}\\\")`;\n // statement += `\\n`;\n }\n\n // if (\n // typeof uniqueConstraints !== \"undefined\" &&\n // uniqueConstraints.length > 0\n // ) {\n // for (const uniqueConstraint of uniqueConstraints) {\n // statement += \",\\n\";\n // const unsquashedUnique = PgSquasher.unsquashUnique(uniqueConstraint);\n // statement += `\\tCONSTRAINT \"${unsquashedUnique.name}\" UNIQUE${\n // unsquashedUnique.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"\n // }(\\\"${unsquashedUnique.columns.join(`\",\"`)}\\\")`;\n // // statement += `\\n`;\n // }\n // }\n\n // if (\n // typeof checkConstraints !== \"undefined\" &&\n // checkConstraints.length > 0\n // ) {\n // for (const checkConstraint of checkConstraints) {\n // statement += \",\\n\";\n // const unsquashedCheck = PgSquasher.unsquashCheck(checkConstraint);\n // statement += `\\tCONSTRAINT \"${unsquashedCheck.name}\" CHECK (${unsquashedCheck.value})`;\n // }\n // }\n\n statement += \"\\n);\";\n statement += \"\\n\";\n\n return statement;\n }\n}\n\nclass PgCreateViewConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_view\" && dialect === \"postgresql\";\n }\n\n convert(st: JsonCreatePgViewStatement) {\n const {\n definition,\n name: viewName,\n schema,\n with: withOption,\n materialized,\n withNoData,\n tablespace,\n using,\n } = st;\n\n const name = schema ? `\"${schema}\".\"${viewName}\"` : `\"${viewName}\"`;\n\n let statement = materialized\n ? `CREATE MATERIALIZED VIEW ${name}`\n : `CREATE VIEW ${name}`;\n\n if (using) statement += ` USING \"${using}\"`;\n\n const options: string[] = [];\n if (withOption) {\n statement += \" WITH (\";\n\n Object.entries(withOption).forEach(([key, value]) => {\n if (typeof value === \"undefined\") return;\n\n options.push(`${toSnakeCase(key)} = ${value}`);\n });\n\n statement += options.join(\", \");\n\n statement += \")\";\n }\n\n if (tablespace) statement += ` TABLESPACE ${tablespace}`;\n\n statement += ` AS (${definition})`;\n\n if (withNoData) statement += \" WITH NO DATA\";\n\n statement += \";\";\n\n return statement;\n }\n}\n\nclass CreateTypeEnumConvertor extends Convertor {\n can(statement: JsonStatement): boolean {\n return statement.type === \"create_type_enum\";\n }\n\n convert(st: JsonCreateEnumStatement) {\n const { name, values, schema } = st;\n\n const enumNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n let valuesStatement = \"(\";\n valuesStatement += values.map((it) => `'${it}'`).join(\", \");\n valuesStatement += \")\";\n\n // TODO do we need this?\n // let statement = 'DO $$ BEGIN';\n // statement += '\\n';\n const statement = `CREATE TYPE ${enumNameWithSchema} AS ENUM${valuesStatement};`;\n // statement += '\\n';\n // statement += 'EXCEPTION';\n // statement += '\\n';\n // statement += ' WHEN duplicate_object THEN null;';\n // statement += '\\n';\n // statement += 'END $$;';\n // statement += '\\n';\n return statement;\n }\n}\n\nclass CreatePgIndexConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_index_pg\" && dialect === \"postgresql\";\n }\n\n convert(statement: JsonPgCreateIndexStatement): string {\n const {\n name,\n columns,\n isUnique,\n concurrently,\n with: withMap,\n method,\n where,\n } = statement.data;\n // // since postgresql 9.5\n const indexPart = isUnique ? \"UNIQUE INDEX\" : \"INDEX\";\n const value = columns\n .map(\n (it: {\n isExpression: any;\n expression: any;\n opclass: any;\n asc: any;\n nulls: string;\n }) =>\n `${it.isExpression ? it.expression : `\"${it.expression}\"`}${\n it.opclass ? ` ${it.opclass}` : it.asc ? \"\" : \" DESC\"\n }${\n (it.asc && it.nulls && it.nulls === \"last\") || it.opclass\n ? \"\"\n : ` NULLS ${it.nulls!.toUpperCase()}`\n }`,\n )\n .join(\",\");\n\n const tableNameWithSchema = statement.schema\n ? `\"${statement.schema}\".\"${statement.tableName}\"`\n : `\"${statement.tableName}\"`;\n\n function reverseLogic(mappedWith: Record<string, string>): string {\n let reversedString = \"\";\n for (const key in mappedWith) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (mappedWith.hasOwnProperty(key)) {\n reversedString += `${key}=${mappedWith[key]},`;\n }\n }\n reversedString = reversedString.slice(0, -1);\n return reversedString;\n }\n\n return `CREATE ${indexPart}${\n concurrently ? \" CONCURRENTLY\" : \"\"\n } IF NOT EXISTS \"${name}\" ON ${tableNameWithSchema} USING ${method} (${value})${\n Object.keys(withMap!).length !== 0\n ? ` WITH (${reverseLogic(withMap!)})`\n : \"\"\n }${where ? ` WHERE ${where}` : \"\"};`;\n }\n}\n\nclass PgCreateSchemaConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_schema\" && dialect === \"postgresql\";\n }\n\n convert(statement: JsonCreateSchema) {\n const { name } = statement;\n return `CREATE SCHEMA IF NOT EXISTS\"${name}\";\\n`;\n }\n}\n\nconst convertors: Convertor[] = [];\nconvertors.push(new PgCreateTableConvertor());\nconvertors.push(new PgCreateViewConvertor());\nconvertors.push(new CreateTypeEnumConvertor());\nconvertors.push(new CreatePgIndexConvertor());\nconvertors.push(new PgCreateSchemaConvertor());\n\nconst preparePgCreateTableJson = (\n table: Table,\n json: PgSchemaSquashed,\n): JsonCreateTableStatement => {\n const { name, schema, columns, compositePrimaryKeys } = table;\n const tableKey = `${schema || \"public\"}.${name}`;\n\n // TODO: @AndriiSherman. We need this, will add test cases\n const compositePkName =\n Object.values(compositePrimaryKeys).length > 0\n ? json.tables[tableKey].compositePrimaryKeys[\n `${PgSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0]! as string).name}`\n ].name\n : \"\";\n\n return {\n type: \"create_table\",\n tableName: name,\n schema,\n columns: Object.values(columns),\n compositePKs: Object.values(compositePrimaryKeys),\n compositePkName: compositePkName,\n };\n};\n\nconst preparePgCreateViewJson = (\n name: string,\n schema: string,\n definition: string,\n materialized: boolean,\n withNoData = false,\n withOption?: any,\n using?: string,\n tablespace?: string,\n): JsonCreatePgViewStatement => {\n return {\n type: \"create_view\",\n name: name,\n schema: schema,\n definition: definition,\n with: withOption,\n materialized: materialized,\n withNoData,\n using,\n tablespace,\n };\n};\n\nconst preparePgCreateIndexesJson = (\n tableName: string,\n schema: string,\n indexes: Record<string, string>,\n): JsonPgCreateIndexStatement[] => {\n return Object.values(indexes).map((indexData) => {\n return {\n type: \"create_index_pg\",\n tableName,\n data: PgSquasher.unsquashIdx(indexData),\n schema,\n };\n });\n};\n\nconst prepareCreateEnumJson = (\n name: string,\n schema: string,\n values: string[],\n): JsonCreateEnumStatement => {\n return {\n type: \"create_type_enum\",\n name: name,\n schema: schema,\n values,\n };\n};\n\nconst prepareFromExports = (exports: Record<string, unknown>) => {\n const tables: AnyPgTable[] = [];\n const enums: PgEnum<any>[] = [];\n const schemas: PgSchema[] = [];\n const sequences: PgSequence[] = [];\n const views: PgView[] = [];\n const matViews: PgMaterializedView[] = [];\n\n const i0values = Object.values(exports);\n i0values.forEach((t) => {\n if (isPgEnum(t)) {\n enums.push(t);\n return;\n }\n if (is(t, PgTable)) {\n tables.push(t);\n }\n\n if (is(t, PgSchema)) {\n schemas.push(t);\n }\n\n if (is(t, PgView)) {\n views.push(t);\n }\n\n if (is(t, PgMaterializedView)) {\n matViews.push(t);\n }\n\n if (isPgSequence(t)) {\n sequences.push(t);\n }\n });\n\n return { tables, enums, schemas, sequences, views, matViews };\n};\n\nexport function getColumnCasing(\n column: { keyAsName: boolean; name: string | undefined },\n casing: CasingType | undefined,\n) {\n if (!column.name) return \"\";\n return !column.keyAsName || casing === undefined\n ? column.name\n : casing === \"camelCase\"\n ? toCamelCase(column.name)\n : toSnakeCase(column.name);\n}\n\nconst sqlToStr = (sql: SQL, casing: CasingType | undefined) => {\n return sql.toQuery({\n escapeName: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n escapeParam: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n escapeString: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n casing: new CasingCache(casing),\n }).sql;\n};\n\nfunction isPgArrayType(sqlType: string) {\n return sqlType.match(/.*\\[\\d*\\].*|.*\\[\\].*/g) !== null;\n}\n\nfunction buildArrayString(array: readonly any[], sqlType: string): string {\n sqlType = sqlType.split(\"[\")[0]!;\n const values = array\n .map((value) => {\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return value.toString();\n } else if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n } else if (Array.isArray(value)) {\n return buildArrayString(value, sqlType);\n } else if (value instanceof Date) {\n if (sqlType === \"date\") {\n return `\"${value.toISOString().split(\"T\")[0]}\"`;\n } else if (sqlType === \"timestamp\") {\n return `\"${value.toISOString().replace(\"T\", \" \").slice(0, 23)}\"`;\n } else {\n return `\"${value.toISOString()}\"`;\n }\n } else if (typeof value === \"object\") {\n return `\"${JSON.stringify(value).replaceAll('\"', '\\\\\"')}\"`;\n }\n\n return `\"${value}\"`;\n })\n .join(\",\");\n\n return `{${values}}`;\n}\n\nconst indexName = (tableName: string, columns: string[]) => {\n return `${tableName}_${columns.join(\"_\")}_index`;\n};\n\nconst generatePgSnapshot = (\n tables: AnyPgTable[],\n views: PgView[],\n enums: PgEnum<any>[],\n schemas: PgSchema[],\n casing: CasingType | undefined,\n) => {\n const dialect = new PgDialect({ casing });\n const result: Record<string, Table> = {};\n const resultViews: Record<string, any> = {};\n\n // This object stores unique names for indexes and will be used to detect if you have the same names for indexes\n // within the same PostgreSQL schema\n const indexesInSchema: Record<string, string[]> = {};\n\n for (const table of tables) {\n const {\n name: tableName,\n columns,\n indexes,\n schema,\n primaryKeys,\n } = getTableConfig(table);\n\n const columnsObject: Record<string, Column> = {};\n const indexesObject: Record<string, Index> = {};\n const primaryKeysObject: Record<string, PrimaryKey> = {};\n\n columns.forEach((column) => {\n const name = getColumnCasing(column, casing);\n const notNull: boolean = column.notNull;\n const primaryKey: boolean = column.primary;\n const sqlTypeLowered = column.getSQLType().toLowerCase();\n\n const typeSchema = is(column, PgEnumColumn)\n ? column.enum.schema || \"public\"\n : undefined;\n\n const columnToSet: Column = {\n name,\n type: column.getSQLType(),\n typeSchema: typeSchema,\n primaryKey,\n notNull,\n };\n\n if (column.default !== undefined) {\n if (is(column.default, SQL)) {\n columnToSet.default = sqlToStr(column.default, casing);\n } else {\n if (typeof column.default === \"string\") {\n columnToSet.default = `'${column.default}'`;\n } else {\n if (sqlTypeLowered === \"jsonb\" || sqlTypeLowered === \"json\") {\n columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n } else if (column.default instanceof Date) {\n if (sqlTypeLowered === \"date\") {\n columnToSet.default = `'${column.default.toISOString().split(\"T\")[0]}'`;\n } else if (sqlTypeLowered === \"timestamp\") {\n columnToSet.default = `'${column.default.toISOString().replace(\"T\", \" \").slice(0, 23)}'`;\n } else {\n columnToSet.default = `'${column.default.toISOString()}'`;\n }\n } else if (\n isPgArrayType(sqlTypeLowered) &&\n Array.isArray(column.default)\n ) {\n columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n } else {\n // Should do for all types\n // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n columnToSet.default = column.default;\n }\n }\n }\n }\n columnsObject[name] = columnToSet;\n });\n\n primaryKeys.map((pk) => {\n const originalColumnNames = pk.columns.map((c) => c.name);\n const columnNames = pk.columns.map((c) => getColumnCasing(c, casing));\n\n let name = pk.getName();\n if (casing !== undefined) {\n for (let i = 0; i < originalColumnNames.length; i++) {\n name = name.replace(originalColumnNames[i]!, columnNames[i]!);\n }\n }\n\n primaryKeysObject[name] = {\n name,\n columns: columnNames,\n };\n });\n\n indexes.forEach((value) => {\n const columns = value.config.columns;\n\n const indexColumnNames: string[] = [];\n columns.forEach((it) => {\n const name = getColumnCasing(it as IndexedColumn, casing);\n\n indexColumnNames.push(name);\n });\n\n const name = value.config.name\n ? value.config.name\n : indexName(tableName, indexColumnNames);\n\n const indexColumns: IndexColumnType[] = columns.map(\n (it): IndexColumnType => {\n if (is(it, SQL)) {\n return {\n expression: dialect.sqlToQuery(it, \"indexes\").sql,\n asc: true,\n isExpression: true,\n nulls: \"last\",\n };\n } else {\n it = it as IndexedColumn;\n return {\n expression: getColumnCasing(it as IndexedColumn, casing),\n isExpression: false,\n // @ts-ignore\n asc: it.indexConfig?.order === \"asc\",\n // @ts-ignore\n nulls: it.indexConfig?.nulls\n ? // @ts-ignore\n it.indexConfig?.nulls\n : // @ts-ignore\n it.indexConfig?.order === \"desc\"\n ? \"first\"\n : \"last\",\n // @ts-ignore\n opclass: it.indexConfig?.opClass,\n };\n }\n },\n );\n\n // check for index names duplicates\n if (typeof indexesInSchema[schema ?? \"public\"] !== \"undefined\") {\n indexesInSchema[schema ?? \"public\"]!.push(name);\n } else {\n indexesInSchema[schema ?? \"public\"] = [name];\n }\n\n indexesObject[name] = {\n name,\n columns: indexColumns,\n isUnique: value.config.unique ?? false,\n where: value.config.where\n ? dialect.sqlToQuery(value.config.where).sql\n : undefined,\n concurrently: value.config.concurrently ?? false,\n method: value.config.method ?? \"btree\",\n with: value.config.with ?? {},\n };\n });\n\n const tableKey = `${schema ?? \"public\"}.${tableName}`;\n\n result[tableKey] = {\n name: tableName,\n schema: schema ?? \"\",\n columns: columnsObject,\n indexes: indexesObject,\n compositePrimaryKeys: primaryKeysObject,\n };\n }\n\n const combinedViews = [...views];\n for (const view of combinedViews) {\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let viewName;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let schema;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let query;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let selectedFields;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let isExisting;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let withOption;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let tablespace;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let using;\n // @ts-ignore\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n // biome-ignore lint/style/useConst: <explanation>\n let withNoData;\n const materialized: boolean = false;\n\n // if (is(view, PgView)) {\n ({\n name: viewName,\n schema,\n query,\n selectedFields,\n isExisting,\n with: withOption,\n } = getViewConfig(view));\n // } else {\n // \t({ name: viewName, schema, query, selectedFields, isExisting, with: withOption, tablespace, using, withNoData } =\n // \t\tgetMaterializedViewConfig(view));\n\n // \tmaterialized = true;\n // }\n\n const viewSchema = schema ?? \"public\";\n\n const viewKey = `${viewSchema}.${viewName}`;\n\n const columnsObject: Record<string, Column> = {};\n // const uniqueConstraintObject: Record<string, UniqueConstraint> = {};\n\n // const existingView = resultViews[viewKey];\n // if (typeof existingView !== 'undefined') {\n // \tconsole.log(\n // \t\t`\\n${\n // \t\t\twithStyle.errorWarning(\n // \t\t\t\t`We\\'ve found duplicated view name across ${\n // \t\t\t\t\tchalk.underline.blue(schema ?? 'public')\n // \t\t\t\t} schema. Please rename your view`,\n // \t\t\t)\n // \t\t}`,\n // \t);\n // \tprocess.exit(1);\n // }\n\n for (const key in selectedFields) {\n if (is(selectedFields[key], PgColumn)) {\n const column = selectedFields[key] as PgColumn;\n\n const notNull: boolean = column.notNull;\n const primaryKey: boolean = column.primary;\n const sqlTypeLowered = column.getSQLType().toLowerCase();\n\n const typeSchema = is(column, PgEnumColumn)\n ? column.enum.schema || \"public\"\n : undefined;\n // const generated = column.generated;\n // const identity = column.generatedIdentity;\n\n // const increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';\n // const minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)\n // \t?? (Number.parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');\n // const maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)\n // \t?? (Number.parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));\n // const startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)\n // \t?? (Number.parseFloat(increment) < 0 ? maxValue : minValue);\n // const cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';\n\n const columnToSet: Column = {\n name: column.name,\n type: column.getSQLType(),\n typeSchema: typeSchema,\n primaryKey,\n notNull,\n // generated: generated\n // \t? {\n // \t\tas: is(generated.as, SQL)\n // \t\t\t? dialect.sqlToQuery(generated.as as SQL).sql\n // \t\t\t: typeof generated.as === 'function'\n // \t\t\t? dialect.sqlToQuery(generated.as() as SQL).sql\n // \t\t\t: (generated.as as any),\n // \t\ttype: 'stored',\n // \t}\n // \t: undefined,\n // identity: identity\n // \t? {\n // \t\ttype: identity.type,\n // \t\tname: identity.sequenceName ?? `${viewName}_${column.name}_seq`,\n // \t\tschema: schema ?? 'public',\n // \t\tincrement,\n // \t\tstartWith,\n // \t\tminValue,\n // \t\tmaxValue,\n // \t\tcache,\n // \t\tcycle: identity?.sequenceOptions?.cycle ?? false,\n // \t}\n // \t: undefined,\n };\n\n // if (column.isUnique) {\n // \t// const existingUnique = uniqueConstraintObject[column.uniqueName!];\n // \t// if (typeof existingUnique !== 'undefined') {\n // \t// \tconsole.log(\n // \t// \t\t`\\n${\n // \t// \t\t\twithStyle.errorWarning(\n // \t// \t\t\t\t`We\\'ve found duplicated unique constraint names in ${chalk.underline.blue(viewName)} table.\n // // The unique constraint ${chalk.underline.blue(column.uniqueName)} on the ${\n // \t// \t\t\t\t\tchalk.underline.blue(\n // \t// \t\t\t\t\t\tcolumn.name,\n // \t// \t\t\t\t\t)\n // \t// \t\t\t\t} column is conflicting with a unique constraint name already defined for ${\n // \t// \t\t\t\t\tchalk.underline.blue(existingUnique.columns.join(','))\n // \t// \t\t\t\t} columns\\n`,\n // \t// \t\t\t)\n // \t// \t\t}`,\n // \t// \t);\n // \t// \tprocess.exit(1);\n // \t// }\n // \tuniqueConstraintObject[column.uniqueName!] = {\n // \t\tname: column.uniqueName!,\n // \t\tnullsNotDistinct: column.uniqueType === 'not distinct',\n // \t\tcolumns: [columnToSet.name],\n // \t};\n // }\n\n if (column.default !== undefined) {\n if (is(column.default, SQL)) {\n columnToSet.default = sqlToStr(column.default, casing);\n } else {\n if (typeof column.default === \"string\") {\n columnToSet.default = `'${column.default}'`;\n } else {\n if (sqlTypeLowered === \"jsonb\" || sqlTypeLowered === \"json\") {\n columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n } else if (column.default instanceof Date) {\n if (sqlTypeLowered === \"date\") {\n columnToSet.default = `'${column.default.toISOString().split(\"T\")[0]}'`;\n } else if (sqlTypeLowered === \"timestamp\") {\n columnToSet.default = `'${column.default.toISOString().replace(\"T\", \" \").slice(0, 23)}'`;\n } else {\n columnToSet.default = `'${column.default.toISOString()}'`;\n }\n } else if (\n isPgArrayType(sqlTypeLowered) &&\n Array.isArray(column.default)\n ) {\n columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n } else {\n // Should do for all types\n // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n columnToSet.default = column.default;\n }\n }\n }\n }\n columnsObject[column.name] = columnToSet;\n }\n }\n\n resultViews[viewKey] = {\n columns: columnsObject,\n definition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,\n name: viewName,\n schema: viewSchema,\n isExisting,\n with: withOption,\n withNoData,\n materialized,\n tablespace,\n using,\n };\n }\n\n const enumsToReturn: Record<string, Enum> = enums.reduce<{\n [key: string]: Enum;\n }>((map, obj) => {\n const enumSchema = obj.schema || \"public\";\n const key = `${enumSchema}.${obj.enumName}`;\n map[key] = {\n name: obj.enumName,\n schema: enumSchema,\n values: obj.enumValues,\n };\n return map;\n }, {});\n\n const schemasObject = Object.fromEntries(\n schemas\n .filter((it) => {\n return it.schemaName !== \"public\";\n })\n .map((it) => [it.schemaName, it.schemaName]),\n );\n\n return {\n version: \"7\",\n dialect: \"postgresql\",\n tables: result,\n enums: enumsToReturn,\n schemas: schemasObject,\n views: resultViews,\n };\n};\n\nconst mapValues = <IN, OUT>(\n obj: Record<string, IN>,\n map: (input: IN) => OUT,\n): Record<string, OUT> => {\n const result = Object.keys(obj).reduce(\n (result, key) => {\n result[key] = map(obj[key]!);\n return result;\n },\n {} as Record<string, OUT>,\n );\n return result;\n};\n\nconst squashPgScheme = (json: PgSchemaSquashed): PgSchemaSquashed => {\n const mappedTables = Object.fromEntries(\n Object.entries(json.tables).map((it: [string, any]) => {\n const squashedIndexes = mapValues(it[1]!.indexes, (index) => {\n return PgSquasher.squashIdx(index);\n });\n\n const squashedPKs = mapValues(it[1]!.compositePrimaryKeys, (pk) => {\n return PgSquasher.squashPK(pk);\n });\n\n const mappedColumns = Object.fromEntries(\n Object.entries(it[1]!.columns).map((it) => {\n return [\n it[0],\n {\n ...it[1]!,\n identity: undefined,\n },\n ];\n }),\n );\n\n return [\n it[0],\n {\n name: it[1]!.name,\n schema: it[1]!.schema,\n columns: mappedColumns,\n indexes: squashedIndexes,\n compositePrimaryKeys: squashedPKs,\n },\n ];\n }),\n );\n\n return {\n version: \"7\",\n dialect: json.dialect,\n tables: mappedTables,\n enums: json.enums,\n schemas: json.schemas,\n views: json.views,\n };\n};\n","import { getPrimaryKeyColumns } from \"@/drizzle/index.js\";\nimport {\n BigIntSerializationError,\n NotNullConstraintError,\n} from \"@/internal/errors.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport {\n type Column,\n type SQL,\n type SQLWrapper,\n type Table,\n and,\n eq,\n getTableColumns,\n getTableName,\n} from \"drizzle-orm\";\nimport { PgArray } from \"drizzle-orm/pg-core\";\n\n/**\n * Returns true if the column has a \"default\" value that is used when no value is passed.\n * Handles `.default`, `.$defaultFn()`, `.$onUpdateFn()`.\n */\nexport const hasEmptyValue = (column: Column) => {\n return column.hasDefault;\n};\n\n/** Returns the \"default\" value for `column`. */\nexport const getEmptyValue = (column: Column, isUpdate: boolean) => {\n if (isUpdate && column.onUpdateFn) {\n return column.onUpdateFn();\n }\n if (column.default !== undefined) return column.default;\n if (column.defaultFn !== undefined) return column.defaultFn();\n if (column.onUpdateFn !== undefined) return column.onUpdateFn();\n\n // TODO(kyle) is it an invariant that it doesn't get here\n\n return undefined;\n};\n\nexport const getPrimaryKeyCache = (tables: Table[]) => {\n const cache = new Map<Table, [string, Column][]>();\n\n for (const table of tables) {\n cache.set(table, []);\n for (const { js } of getPrimaryKeyColumns(table)) {\n // @ts-expect-error\n cache.get(table)!.push([js, table[js]!]);\n }\n }\n\n return cache;\n};\n\nexport const normalizeColumn = (\n column: Column,\n value: unknown,\n isUpdate: boolean,\n): unknown => {\n if (value === undefined) {\n if (hasEmptyValue(column)) return getEmptyValue(column, isUpdate);\n return null;\n }\n if (value === null) return null;\n if (column.mapToDriverValue === undefined) return value;\n\n try {\n if (Array.isArray(value) && column instanceof PgArray) {\n return value.map((v) => {\n if (column.baseColumn.columnType === \"PgTimestamp\") {\n return v;\n }\n\n return column.baseColumn.mapFromDriverValue(\n column.baseColumn.mapToDriverValue(v),\n );\n });\n }\n\n if (column.columnType === \"PgTimestamp\") {\n return value;\n }\n\n return column.mapFromDriverValue(column.mapToDriverValue(value));\n } catch (e) {\n if (\n (e as Error)?.message?.includes(\"Do not know how to serialize a BigInt\")\n ) {\n const error = new BigIntSerializationError((e as Error).message);\n error.meta.push(\n \"Hint:\\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/api-reference/ponder-utils#replacebigints\",\n );\n throw error;\n }\n\n throw e;\n }\n};\n\nexport const normalizeRow = (\n table: Table,\n row: { [key: string]: unknown },\n isUpdate: boolean,\n) => {\n for (const [columnName, column] of Object.entries(getTableColumns(table))) {\n // not-null constraint\n if (\n isUpdate === false &&\n (row[columnName] === undefined || row[columnName] === null) &&\n column.notNull &&\n hasEmptyValue(column) === false\n ) {\n const error = new NotNullConstraintError(\n `Column '${getTableName(\n table,\n )}.${columnName}' violates not-null constraint.`,\n );\n error.meta.push(`db.insert arguments:\\n${prettyPrint(row)}`);\n throw error;\n }\n\n row[columnName] = normalizeColumn(column, row[columnName], isUpdate);\n }\n\n return row;\n};\n\nexport const getCacheKey = (\n table: Table,\n key: object,\n cache: Map<Table, [string, Column][]>,\n): string => {\n const primaryKeys = cache.get(table)!;\n\n if (primaryKeys.length === 1) {\n const [pk, col] = primaryKeys[0]!;\n // @ts-expect-error\n return String(normalizeColumn(col, key[pk]!, false));\n }\n\n let result = \"\";\n for (let i = 0; i < primaryKeys.length; i++) {\n const [pk, col] = primaryKeys[i]!;\n // @ts-expect-error\n const value = normalizeColumn(col, key[pk]!, false);\n result += `${String(value)}_`;\n }\n\n return result;\n};\n\n/** Returns an sql where condition for `table` with `key`. */\nexport const getWhereCondition = (table: Table, key: Object): SQL<unknown> => {\n const conditions: SQLWrapper[] = [];\n\n for (const { js } of getPrimaryKeyColumns(table)) {\n // @ts-ignore\n conditions.push(eq(table[js]!, key[js]));\n }\n\n return and(...conditions)!;\n};\n","import type { LightBlock, SyncBlock } from \"@/internal/types.js\";\nimport { hexToBigInt } from \"viem\";\n\nexport type Checkpoint = {\n blockTimestamp: bigint;\n chainId: bigint;\n blockNumber: bigint;\n transactionIndex: bigint;\n eventType: number;\n eventIndex: bigint;\n};\n\n// 10 digits for unix timestamp gets us to the year 2277.\nconst BLOCK_TIMESTAMP_DIGITS = 10;\n// Chain IDs are uint256. As of writing the largest Chain ID on https://chainlist.org\n// is 13 digits. 16 digits should be enough (JavaScript's max safe integer).\nconst CHAIN_ID_DIGITS = 16;\n// Same logic as chain ID.\nconst BLOCK_NUMBER_DIGITS = 16;\n// Same logic as chain ID.\nconst TRANSACTION_INDEX_DIGITS = 16;\n// At time of writing, we only have 2 event types planned, so one digit (10 types) is enough.\nconst EVENT_TYPE_DIGITS = 1;\n// This could contain log index, trace index, etc. 16 digits should be enough.\nconst EVENT_INDEX_DIGITS = 16;\n\nconst CHECKPOINT_LENGTH =\n BLOCK_TIMESTAMP_DIGITS +\n CHAIN_ID_DIGITS +\n BLOCK_NUMBER_DIGITS +\n TRANSACTION_INDEX_DIGITS +\n EVENT_TYPE_DIGITS +\n EVENT_INDEX_DIGITS;\n\nexport const EVENT_TYPES = {\n transactions: 2,\n blocks: 5,\n logs: 5,\n traces: 7,\n} as const;\n\nconst encodedChainIds = new Map<number | bigint, string>();\n\nexport const encodeCheckpoint = (\n checkpoint: Checkpoint | { [K in keyof Checkpoint]: number | bigint },\n) => {\n const {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n } = checkpoint;\n\n if (eventType < 0 || eventType > 9) {\n throw new Error(\n `Got invalid event type ${eventType}, expected a number from 0 to 9`,\n );\n }\n\n let encodedChainId = encodedChainIds.get(chainId);\n if (encodedChainId === undefined) {\n encodedChainId = chainId.toString().padStart(CHAIN_ID_DIGITS, \"0\");\n encodedChainIds.set(chainId, encodedChainId);\n }\n\n const result = `${blockTimestamp.toString().padStart(BLOCK_TIMESTAMP_DIGITS, \"0\")}${encodedChainId}${blockNumber.toString().padStart(BLOCK_NUMBER_DIGITS, \"0\")}${transactionIndex.toString().padStart(TRANSACTION_INDEX_DIGITS, \"0\")}${eventType.toString()}${eventIndex.toString().padStart(EVENT_INDEX_DIGITS, \"0\")}`;\n\n if (result.length !== CHECKPOINT_LENGTH) {\n throw new Error(`Invalid stringified checkpoint: ${result}`);\n }\n\n return result;\n};\n\nexport const decodeCheckpoint = (checkpoint: string): Checkpoint => {\n let offset = 0;\n\n const blockTimestamp = BigInt(\n checkpoint.slice(offset, offset + BLOCK_TIMESTAMP_DIGITS),\n );\n offset += BLOCK_TIMESTAMP_DIGITS;\n\n const chainId = BigInt(checkpoint.slice(offset, offset + CHAIN_ID_DIGITS));\n offset += CHAIN_ID_DIGITS;\n\n const blockNumber = BigInt(\n checkpoint.slice(offset, offset + BLOCK_NUMBER_DIGITS),\n );\n offset += BLOCK_NUMBER_DIGITS;\n\n const transactionIndex = BigInt(\n checkpoint.slice(offset, offset + TRANSACTION_INDEX_DIGITS),\n );\n offset += TRANSACTION_INDEX_DIGITS;\n\n const eventType = +checkpoint.slice(offset, offset + EVENT_TYPE_DIGITS);\n offset += EVENT_TYPE_DIGITS;\n\n const eventIndex = BigInt(\n checkpoint.slice(offset, offset + EVENT_INDEX_DIGITS),\n );\n offset += EVENT_INDEX_DIGITS;\n\n return {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n };\n};\n\nexport const ZERO_CHECKPOINT: Checkpoint = {\n blockTimestamp: 0n,\n chainId: 0n,\n blockNumber: 0n,\n transactionIndex: 0n,\n eventType: 0,\n eventIndex: 0n,\n};\n\nexport const MAX_CHECKPOINT: Checkpoint = {\n blockTimestamp: 99999_99999n,\n chainId: 9999_9999_9999_9999n,\n blockNumber: 9999_9999_9999_9999n,\n transactionIndex: 9999_9999_9999_9999n,\n eventType: 9,\n eventIndex: 9999_9999_9999_9999n,\n};\n\nexport const ZERO_CHECKPOINT_STRING = encodeCheckpoint(ZERO_CHECKPOINT);\nexport const MAX_CHECKPOINT_STRING = encodeCheckpoint(MAX_CHECKPOINT);\n\n/**\n/**\n * Returns true if two checkpoints are equal.\n */\nexport const isCheckpointEqual = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) === encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than checkpoint b.\n * Returns false if the checkpoints are equal.\n */\nexport const isCheckpointGreaterThan = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) > encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than or equal to checkpoint b.|\n */\nexport const isCheckpointGreaterThanOrEqualTo = (\n a: Checkpoint,\n b: Checkpoint,\n) => encodeCheckpoint(a) >= encodeCheckpoint(b);\n\nexport const checkpointMax = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((max, checkpoint) => {\n return isCheckpointGreaterThan(checkpoint, max) ? checkpoint : max;\n });\n\nexport const checkpointMin = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((min, checkpoint) => {\n return isCheckpointGreaterThan(min, checkpoint) ? checkpoint : min;\n });\n\nexport const LATEST = MAX_CHECKPOINT_STRING;\n\n/** Compute the minimum checkpoint, filtering out undefined. */\nexport const min = (...checkpoints: (string | undefined)[]) => {\n return checkpoints.reduce((acc, cur) => {\n if (cur === undefined) return acc;\n if (acc === undefined) return cur;\n if (acc < cur) return acc;\n return cur;\n })!;\n};\n\n/** Compute the maximum checkpoint, filtering out undefined. */\nexport const max = (...checkpoints: (string | undefined)[]) => {\n return checkpoints.reduce((acc, cur) => {\n if (cur === undefined) return acc;\n if (acc === undefined) return cur;\n if (acc > cur) return acc;\n return cur;\n });\n};\n\n/** Convert `block` to a `Checkpoint`. */\nexport const blockToCheckpoint = (\n block: LightBlock | SyncBlock,\n chainId: number,\n rounding: \"up\" | \"down\",\n): Checkpoint => {\n return {\n ...(rounding === \"up\" ? MAX_CHECKPOINT : ZERO_CHECKPOINT),\n blockTimestamp: hexToBigInt(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n };\n};\n","import type { QB } from \"@/database/queryBuilder.js\";\nimport { getPrimaryKeyColumns } from \"@/drizzle/index.js\";\nimport type { OnchainTable } from \"@/drizzle/onchain.js\";\nimport { normalizeColumn } from \"@/indexing-store/utils.js\";\nimport type { Schema, Status } from \"@/internal/types.js\";\nimport { decodeCheckpoint } from \"@/utils/checkpoint.js\";\nimport { never } from \"@/utils/never.js\";\nimport DataLoader from \"dataloader\";\nimport {\n type Column,\n Many,\n One,\n SQL,\n type TableRelationalConfig,\n and,\n arrayContained,\n arrayContains,\n asc,\n count,\n createTableRelationsHelpers,\n desc,\n eq,\n extractTablesRelationalConfig,\n getTableColumns,\n gt,\n gte,\n inArray,\n is,\n isNotNull,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n notInArray,\n notLike,\n or,\n} from \"drizzle-orm\";\nimport {\n type PgColumn,\n type PgEnum,\n PgEnumColumn,\n PgInteger,\n PgSerial,\n type PgTable,\n PgView,\n getViewConfig,\n isPgEnum,\n isPgView,\n} from \"drizzle-orm/pg-core\";\nimport {\n GraphQLBoolean,\n GraphQLEnumType,\n type GraphQLFieldConfig,\n type GraphQLFieldConfigMap,\n GraphQLFloat,\n type GraphQLInputFieldConfigMap,\n GraphQLInputObjectType,\n type GraphQLInputType,\n GraphQLInt,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLOutputType,\n type GraphQLResolveInfo,\n GraphQLScalarType,\n GraphQLSchema,\n GraphQLString,\n} from \"graphql\";\nimport superjson from \"superjson\";\nimport { GraphQLJSON } from \"./json.js\";\n\ntype Parent = Record<string, any>;\ntype Context = {\n qb: QB<{ [key: string]: OnchainTable }>;\n getDataLoader: ReturnType<typeof buildDataLoaderCache>;\n};\n\ntype PluralArgs = {\n where?: { [key: string]: number | string };\n after?: string;\n before?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: \"asc\" | \"desc\";\n};\n\nconst DEFAULT_LIMIT = 50 as const;\nconst MAX_LIMIT = 1000 as const;\n\nexport function buildGraphQLSchema({\n schema,\n}: { schema: Schema }): GraphQLSchema {\n const tablesConfig = extractTablesRelationalConfig(\n schema,\n createTableRelationsHelpers,\n );\n\n const tables = Object.values(tablesConfig.tables) as TableRelationalConfig[];\n\n const views = Object.entries(schema).filter((el): el is [string, PgView] =>\n isPgView(el[1]),\n );\n\n const enums = Object.entries(schema).filter(\n (el): el is [string, PgEnum<[string, ...string[]]>] => isPgEnum(el[1]),\n );\n const enumTypes: Record<string, GraphQLEnumType> = {};\n for (const [enumTsName, enumObject] of enums) {\n // Note that this is keyed by enumName (the SQL name) because that's what is\n // available on the PgEnumColumn type. See `columnToGraphQLCore` for context.\n enumTypes[enumObject.enumName] = new GraphQLEnumType({\n name: enumTsName,\n values: enumObject.enumValues.reduce(\n (acc: Record<string, {}>, cur) => ({ ...acc, [cur]: {} }),\n {},\n ),\n });\n }\n\n const entityFilterTypes: Record<string, GraphQLInputObjectType> = {};\n for (const table of tables) {\n const filterType = new GraphQLInputObjectType({\n name: `${table.tsName}Filter`,\n fields: () => {\n const filterFields: GraphQLInputFieldConfigMap = {\n // Logical operators\n AND: { type: new GraphQLList(filterType) },\n OR: { type: new GraphQLList(filterType) },\n };\n\n for (const [columnName, column] of Object.entries(table.columns)) {\n const type = columnToGraphQLCore(column, enumTypes);\n\n // List fields => universal, plural\n if (type instanceof GraphQLList) {\n const baseType = innerType(type);\n\n conditionSuffixes.universal.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: new GraphQLList(baseType),\n };\n });\n\n conditionSuffixes.plural.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = { type: baseType };\n });\n }\n\n // JSON => no filters.\n // Boolean => universal and singular only.\n // All other scalar => universal, singular, numeric OR string depending on type\n if (\n type instanceof GraphQLScalarType ||\n type instanceof GraphQLEnumType\n ) {\n if (type.name === \"JSON\") continue;\n\n conditionSuffixes.universal.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type,\n };\n });\n\n conditionSuffixes.singular.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: new GraphQLList(type),\n };\n });\n\n if ([\"String\", \"ID\"].includes(type.name)) {\n conditionSuffixes.string.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: type,\n };\n });\n }\n\n if ([\"Int\", \"Float\", \"BigInt\"].includes(type.name)) {\n conditionSuffixes.numeric.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: type,\n };\n });\n }\n }\n }\n\n return filterFields;\n },\n });\n entityFilterTypes[table.tsName] = filterType;\n }\n\n for (const [viewName, view] of views) {\n const viewConfig = getViewConfig(view);\n const filterType = new GraphQLInputObjectType({\n name: `${viewName}Filter`,\n fields: () => {\n const filterFields: GraphQLInputFieldConfigMap = {\n // Logical operators\n AND: { type: new GraphQLList(filterType) },\n OR: { type: new GraphQLList(filterType) },\n };\n\n for (const [columnName, column] of Object.entries(\n viewConfig.selectedFields,\n )) {\n if (is(column, SQL.Aliased)) {\n // Note: Aliased column filters are not supported by GraphQL because they don't have an associated type.\n continue;\n }\n const type = columnToGraphQLCore(column as PgColumn, enumTypes);\n\n // List fields => universal, plural\n if (type instanceof GraphQLList) {\n const baseType = innerType(type);\n\n conditionSuffixes.universal.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: new GraphQLList(baseType),\n };\n });\n\n conditionSuffixes.plural.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = { type: baseType };\n });\n }\n\n // JSON => no filters.\n // Boolean => universal and singular only.\n // All other scalar => universal, singular, numeric OR string depending on type\n if (\n type instanceof GraphQLScalarType ||\n type instanceof GraphQLEnumType\n ) {\n if (type.name === \"JSON\") continue;\n\n conditionSuffixes.universal.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type,\n };\n });\n\n conditionSuffixes.singular.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: new GraphQLList(type),\n };\n });\n\n if ([\"String\", \"ID\"].includes(type.name)) {\n conditionSuffixes.string.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: type,\n };\n });\n }\n\n if ([\"Int\", \"Float\", \"BigInt\"].includes(type.name)) {\n conditionSuffixes.numeric.forEach((suffix) => {\n filterFields[`${columnName}${suffix}`] = {\n type: type,\n };\n });\n }\n }\n }\n\n return filterFields;\n },\n });\n entityFilterTypes[viewName] = filterType;\n }\n\n const entityTypes: Record<string, GraphQLObjectType<Parent, Context>> = {};\n const entityPageTypes: Record<string, GraphQLObjectType> = {};\n\n for (const table of tables) {\n entityTypes[table.tsName] = new GraphQLObjectType({\n name: table.tsName,\n fields: () => {\n const fieldConfigMap: GraphQLFieldConfigMap<Parent, Context> = {};\n\n // Scalar fields\n for (const [columnName, column] of Object.entries(table.columns)) {\n const type = columnToGraphQLCore(column, enumTypes);\n fieldConfigMap[columnName] = {\n type: column.notNull ? new GraphQLNonNull(type) : type,\n };\n }\n\n // Relations\n const relations = Object.entries(table.relations);\n for (const [relationName, relation] of relations) {\n const referencedTable = tables.find(\n (table) => table.dbName === relation.referencedTableName,\n );\n if (!referencedTable)\n throw new Error(\n `Internal error: Referenced table \"${relation.referencedTableName}\" not found`,\n );\n\n const referencedEntityType = entityTypes[referencedTable.tsName];\n const referencedEntityPageType =\n entityPageTypes[referencedTable.tsName];\n const referencedEntityFilterType =\n entityFilterTypes[referencedTable.tsName];\n if (\n referencedEntityType === undefined ||\n referencedEntityPageType === undefined ||\n referencedEntityFilterType === undefined\n )\n throw new Error(\n `Internal error: Referenced entity types not found for table \"${referencedTable.tsName}\" `,\n );\n\n if (is(relation, One)) {\n const fields = relation.config?.fields ?? [];\n const references = relation.config?.references ?? [];\n\n if (fields.length !== references.length) {\n throw new Error(\n \"Internal error: Fields and references arrays must be the same length\",\n );\n }\n\n fieldConfigMap[relationName] = {\n // Note: There is a `relation.isNullable` field here but it appears\n // to be internal / incorrect. Until we have support for foreign\n // key constraints, all `one` relations must be nullable.\n type: referencedEntityType,\n resolve: (parent, _args, context) => {\n const loader = context.getDataLoader({\n table: referencedTable,\n });\n\n const rowFragment: Record<string, unknown> = {};\n for (let i = 0; i < references.length; i++) {\n const referenceColumn = references[i]!;\n const fieldColumn = fields[i]!;\n\n const fieldColumnTsName = getColumnTsName(fieldColumn);\n const referenceColumnTsName =\n getColumnTsName(referenceColumn);\n\n rowFragment[referenceColumnTsName] =\n parent[fieldColumnTsName];\n }\n const encodedId = encodeRowFragment(rowFragment);\n\n return loader.load(encodedId);\n },\n };\n } else if (is(relation, Many)) {\n // Search the relations of the referenced table for the corresponding `one` relation.\n // If `relation.relationName` is not provided, use the first `one` relation that references this table.\n\n let oneRelation: One | undefined;\n\n // Note: can find the wrong relation if `relationName` is undefined.\n // The first relation will be found.\n\n if (relation.relationName !== undefined) {\n for (const referencedRelation of Object.values(\n referencedTable.relations,\n )) {\n if (\n is(referencedRelation, One) &&\n relation.relationName === referencedRelation.relationName\n ) {\n oneRelation = referencedRelation;\n break;\n }\n }\n }\n\n if (oneRelation === undefined) {\n for (const referencedRelation of Object.values(\n referencedTable.relations,\n )) {\n if (\n is(referencedRelation, One) &&\n table.dbName === referencedRelation.referencedTableName\n ) {\n oneRelation = referencedRelation;\n break;\n }\n }\n }\n\n if (oneRelation === undefined) {\n throw new Error(\n `Internal error: Relation \"${relationName}\" not found in table \"${referencedTable.tsName}\"`,\n );\n }\n\n const fields = oneRelation.config?.fields ?? [];\n const references = oneRelation.config?.references ?? [];\n\n fieldConfigMap[relationName] = {\n type: referencedEntityPageType,\n args: {\n where: { type: referencedEntityFilterType },\n orderBy: { type: GraphQLString },\n orderDirection: { type: GraphQLString },\n before: { type: GraphQLString },\n after: { type: GraphQLString },\n limit: { type: GraphQLInt },\n offset: { type: GraphQLInt },\n },\n resolve: (parent, args: PluralArgs, context, info) => {\n const relationalConditions = [];\n for (let i = 0; i < references.length; i++) {\n const column = fields[i]!;\n const value = parent[getColumnTsName(references[i]!)];\n relationalConditions.push(eq(column, value));\n }\n\n const includeTotalCount = selectionIncludesField(\n info,\n \"totalCount\",\n );\n\n return executePluralQuery(\n schema[referencedTable.tsName] as PgTable,\n referencedTable.columns,\n context.qb,\n args,\n includeTotalCount,\n relationalConditions,\n );\n },\n };\n } else {\n throw new Error(\n `Internal error: Relation \"${relationName}\" is unsupported, expected One or Many`,\n );\n }\n }\n\n return fieldConfigMap;\n },\n });\n\n entityPageTypes[table.tsName] = new GraphQLObjectType({\n name: `${table.tsName}Page`,\n fields: () => ({\n items: {\n type: new GraphQLNonNull(\n new GraphQLList(new GraphQLNonNull(entityTypes[table.tsName]!)),\n ),\n },\n pageInfo: { type: new GraphQLNonNull(GraphQLPageInfo) },\n totalCount: { type: new GraphQLNonNull(GraphQLInt) },\n }),\n });\n }\n\n for (const [viewName, view] of views) {\n entityTypes[viewName] = new GraphQLObjectType({\n name: viewName,\n fields: () => {\n const fieldConfigMap: GraphQLFieldConfigMap<Parent, Context> = {};\n\n const viewConfig = getViewConfig(view);\n\n // Scalar fields\n for (const [columnName, column] of Object.entries(\n viewConfig.selectedFields,\n )) {\n if (is(column, SQL.Aliased)) {\n fieldConfigMap[columnName] = { type: GraphQLJSON };\n } else {\n const type = columnToGraphQLCore(column as PgColumn, enumTypes);\n fieldConfigMap[columnName] = {\n type: (column as PgColumn).notNull\n ? new GraphQLNonNull(type)\n : type,\n };\n }\n }\n\n return fieldConfigMap;\n },\n });\n\n entityPageTypes[viewName] = new GraphQLObjectType({\n name: `${viewName}Page`,\n fields: () => ({\n items: {\n type: new GraphQLNonNull(\n new GraphQLList(new GraphQLNonNull(entityTypes[viewName]!)),\n ),\n },\n pageInfo: { type: new GraphQLNonNull(GraphQLViewPageInfo) },\n totalCount: { type: new GraphQLNonNull(GraphQLInt) },\n }),\n });\n }\n\n const queryFields: Record<string, GraphQLFieldConfig<Parent, Context>> = {};\n for (const table of tables) {\n const entityType = entityTypes[table.tsName]!;\n const entityPageType = entityPageTypes[table.tsName]!;\n const entityFilterType = entityFilterTypes[table.tsName]!;\n\n const singularFieldName =\n table.tsName.charAt(0).toLowerCase() + table.tsName.slice(1);\n const pluralFieldName = `${singularFieldName}s`;\n\n queryFields[singularFieldName] = {\n type: entityType,\n // Find the primary key columns and GraphQL core types and include them\n // as arguments to the singular query type.\n args: Object.fromEntries(\n table.primaryKey.map((column) => [\n getColumnTsName(column),\n {\n type: new GraphQLNonNull(\n columnToGraphQLCore(column, enumTypes) as GraphQLInputType,\n ),\n },\n ]),\n ),\n resolve: async (_parent, args, context) => {\n const loader = context.getDataLoader({ table });\n\n // The `args` object here should be a valid `where` argument that\n // uses the `eq` shorthand for each primary key column.\n const encodedId = encodeRowFragment(args);\n\n return loader.load(encodedId);\n },\n };\n\n queryFields[pluralFieldName] = {\n type: new GraphQLNonNull(entityPageType),\n args: {\n where: { type: entityFilterType },\n orderBy: { type: GraphQLString },\n orderDirection: { type: GraphQLString },\n before: { type: GraphQLString },\n after: { type: GraphQLString },\n limit: { type: GraphQLInt },\n offset: { type: GraphQLInt },\n },\n resolve: async (_parent, args: PluralArgs, context, info) => {\n const includeTotalCount = selectionIncludesField(info, \"totalCount\");\n\n return executePluralQuery(\n schema[table.tsName] as PgTable,\n table.columns,\n context.qb,\n args,\n includeTotalCount,\n );\n },\n };\n }\n for (const [viewName, view] of views) {\n const viewConfig = getViewConfig(view);\n const entityPageType = entityPageTypes[viewName]!;\n const entityFilterType = entityFilterTypes[viewName]!;\n\n const singularFieldName =\n viewName.charAt(0).toLowerCase() + viewName.slice(1);\n const pluralFieldName = `${singularFieldName}s`;\n\n queryFields[pluralFieldName] = {\n type: new GraphQLNonNull(entityPageType),\n args: {\n where: { type: entityFilterType },\n orderBy: { type: GraphQLString },\n orderDirection: { type: GraphQLString },\n limit: { type: GraphQLInt },\n offset: { type: GraphQLInt },\n },\n resolve: async (_parent, args: PluralArgs, context, info) => {\n const includeTotalCount = selectionIncludesField(info, \"totalCount\");\n\n return executePluralQuery(\n view,\n viewConfig.selectedFields as Record<string, Column>,\n context.qb,\n args,\n includeTotalCount,\n );\n },\n };\n }\n\n queryFields._meta = {\n type: GraphQLMeta,\n resolve: async (_source, _args, context) => {\n // Note: This is done to avoid non-browser compatible dependencies\n const checkpoints = (await context.qb\n .wrap({ label: \"select_checkpoints\" }, (db) =>\n db.execute(\n \"SELECT chain_name, chain_id, latest_checkpoint, safe_checkpoint from _ponder_checkpoint\",\n ),\n )\n .then((res) => res.rows)) as {\n chain_name: string;\n chain_id: string;\n latest_checkpoint: string;\n safe_checkpoint: string;\n }[];\n\n const status: Status = {};\n for (const {\n chain_name,\n chain_id,\n latest_checkpoint,\n } of checkpoints.sort((a, b) => (a.chain_id > b.chain_id ? 1 : -1))) {\n status[chain_name] = {\n id: Number(chain_id),\n block: {\n number: Number(decodeCheckpoint(latest_checkpoint).blockNumber),\n timestamp: Number(\n decodeCheckpoint(latest_checkpoint).blockTimestamp,\n ),\n },\n };\n }\n return { status };\n },\n };\n\n return new GraphQLSchema({\n // Include these here so they are listed first in the printed schema.\n types: [\n GraphQLJSON,\n GraphQLBigInt,\n GraphQLPageInfo,\n GraphQLViewPageInfo,\n GraphQLMeta,\n ],\n query: new GraphQLObjectType({\n name: \"Query\",\n fields: queryFields,\n }),\n });\n}\n\nconst GraphQLPageInfo = new GraphQLObjectType({\n name: \"PageInfo\",\n fields: {\n hasNextPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n hasPreviousPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n startCursor: { type: GraphQLString },\n endCursor: { type: GraphQLString },\n },\n});\n\nconst GraphQLViewPageInfo = new GraphQLObjectType({\n name: \"ViewPageInfo\",\n fields: {\n hasNextPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n hasPreviousPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n },\n});\n\nconst GraphQLBigInt = new GraphQLScalarType({\n name: \"BigInt\",\n serialize: (value) => String(value),\n parseValue: (value) => BigInt(value as any),\n parseLiteral: (value) => {\n if (value.kind === \"StringValue\") {\n return BigInt(value.value);\n } else {\n throw new Error(\n `Invalid value kind provided for field of type BigInt: ${value.kind}. Expected: StringValue`,\n );\n }\n },\n});\n\nconst GraphQLMeta = new GraphQLObjectType({\n name: \"Meta\",\n fields: { status: { type: GraphQLJSON } },\n});\n\nconst columnToGraphQLCore = (\n column: Column,\n enumTypes: Record<string, GraphQLEnumType>,\n): GraphQLOutputType => {\n if (column.columnType === \"PgEvmBigint\") {\n return GraphQLBigInt;\n }\n\n if (column instanceof PgEnumColumn) {\n if (column.enum === undefined) {\n throw new Error(\n `Internal error: Expected enum column \"${getColumnTsName(column)}\" to have an \"enum\" property`,\n );\n }\n const enumType = enumTypes[column.enum.enumName];\n if (enumType === undefined) {\n throw new Error(\n `Internal error: Expected to find a GraphQL enum named \"${column.enum.enumName}\". This may happen if \"${column.enum.enumName}\" has not been exported from your Ponder schema`,\n );\n }\n\n return enumType;\n }\n\n switch (column.dataType) {\n case \"boolean\":\n return GraphQLBoolean;\n case \"json\":\n return GraphQLJSON;\n case \"date\":\n return GraphQLString;\n case \"string\":\n return GraphQLString;\n case \"bigint\":\n return GraphQLString;\n case \"number\":\n return is(column, PgInteger) || is(column, PgSerial)\n ? GraphQLInt\n : GraphQLFloat;\n case \"buffer\":\n return new GraphQLList(new GraphQLNonNull(GraphQLInt));\n case \"array\": {\n if (column.columnType === \"PgVector\") {\n return new GraphQLList(new GraphQLNonNull(GraphQLFloat));\n }\n\n if (column.columnType === \"PgGeometry\") {\n return new GraphQLList(new GraphQLNonNull(GraphQLFloat));\n }\n\n const innerType = columnToGraphQLCore(\n (column as any).baseColumn,\n enumTypes,\n );\n\n return new GraphQLList(new GraphQLNonNull(innerType));\n }\n default:\n throw new Error(`Type ${column.dataType} is not implemented`);\n }\n};\n\nconst innerType = (\n type: GraphQLOutputType,\n): GraphQLScalarType | GraphQLEnumType => {\n if (type instanceof GraphQLScalarType || type instanceof GraphQLEnumType)\n return type;\n if (type instanceof GraphQLList || type instanceof GraphQLNonNull)\n return innerType(type.ofType);\n throw new Error(`Type ${type.toString()} is not implemented`);\n};\n\nasync function executePluralQuery(\n relation: PgTable | PgView,\n columns: Record<string, Column>,\n qb: QB<{ [key: string]: OnchainTable }>,\n args: PluralArgs,\n includeTotalCount: boolean,\n extraConditions: (SQL | undefined)[] = [],\n) {\n const limit = args.limit ?? DEFAULT_LIMIT;\n const offset = args.offset ?? 0;\n\n if (limit > MAX_LIMIT) {\n throw new Error(`Invalid limit. Got ${limit}, expected <=${MAX_LIMIT}.`);\n }\n\n const orderBySchema = buildOrderBySchema(relation, args);\n const orderBy = orderBySchema.map(([columnName, direction]) => {\n const column = columns[columnName];\n if (column === undefined) {\n throw new Error(\n `Unknown column \"${columnName}\" used in orderBy argument`,\n );\n }\n return direction === \"asc\" ? asc(column) : desc(column);\n });\n const orderByReversed = orderBySchema.map(([columnName, direction]) => {\n const column = columns[columnName];\n if (column === undefined) {\n throw new Error(\n `Unknown column \"${columnName}\" used in orderBy argument`,\n );\n }\n return direction === \"asc\" ? desc(column) : asc(column);\n });\n\n const whereConditions = buildWhereConditions(args.where, columns);\n\n const after = args.after ?? null;\n const before = args.before ?? null;\n\n if (after !== null && before !== null) {\n throw new Error(\"Cannot specify both before and after cursors.\");\n }\n if (after !== null && offset > 0) {\n throw new Error(\"Cannot specify both after cursor and offset.\");\n }\n if (before !== null && offset > 0) {\n throw new Error(\"Cannot specify both before cursor and offset.\");\n }\n\n let startCursor = null;\n let endCursor = null;\n let hasPreviousPage = false;\n let hasNextPage = false;\n\n const totalCountPromise = includeTotalCount\n ? qb\n .wrap((db) =>\n db\n .select({ count: count() })\n .from(relation)\n .where(and(...whereConditions, ...extraConditions)),\n )\n .then((rows) => rows[0]?.count ?? null)\n : Promise.resolve(null);\n\n // Neither cursors are specified, apply the order conditions and execute.\n if (after === null && before === null) {\n const [rows, totalCount] = await Promise.all([\n qb.raw\n .select()\n .from(relation)\n .where(and(...whereConditions, ...extraConditions))\n .orderBy(...orderBy)\n .limit(limit + 1)\n .offset(offset),\n totalCountPromise,\n ]);\n\n if (rows.length === limit + 1) {\n rows.pop();\n hasNextPage = true;\n }\n\n if (offset === 0) {\n startCursor =\n rows.length > 0 ? encodeCursor(orderBySchema, rows[0]!) : null;\n endCursor =\n rows.length > 0\n ? encodeCursor(orderBySchema, rows[rows.length - 1]!)\n : null;\n } else {\n hasPreviousPage = true;\n }\n\n return {\n items: rows,\n totalCount,\n pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor },\n };\n }\n\n if (after !== null) {\n // User specified an 'after' cursor.\n const cursorObject = decodeCursor(after);\n const cursorCondition = buildCursorCondition(\n columns,\n orderBySchema,\n \"after\",\n cursorObject,\n );\n\n const [rows, totalCount] = await Promise.all([\n qb.raw\n .select()\n .from(relation)\n .where(and(...whereConditions, cursorCondition, ...extraConditions))\n .orderBy(...orderBy)\n .limit(limit + 2)\n .offset(offset),\n totalCountPromise,\n ]);\n\n if (rows.length === 0) {\n return {\n items: rows,\n totalCount,\n pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor },\n };\n }\n\n // If the cursor of the first returned record equals the `after` cursor,\n // `hasPreviousPage` is true. Remove that record.\n if (encodeCursor(orderBySchema, rows[0]!) === after) {\n rows.shift();\n hasPreviousPage = true;\n } else {\n // Otherwise, remove the last record.\n rows.pop();\n }\n\n // Now if the length of the records is still equal to limit + 1,\n // there is a next page.\n if (rows.length === limit + 1) {\n rows.pop();\n hasNextPage = true;\n }\n\n // Now calculate the cursors.\n startCursor =\n rows.length > 0 ? encodeCursor(orderBySchema, rows[0]!) : null;\n endCursor =\n rows.length > 0\n ? encodeCursor(orderBySchema, rows[rows.length - 1]!)\n : null;\n\n return {\n items: rows,\n totalCount,\n pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor },\n };\n }\n\n // User specified a 'before' cursor.\n const cursorObject = decodeCursor(before!);\n const cursorCondition = buildCursorCondition(\n columns,\n orderBySchema,\n \"before\",\n cursorObject,\n );\n\n // Reverse the order by conditions to get the previous page,\n // then reverse the results back to the original order.\n const [rows, totalCount] = await Promise.all([\n qb.raw\n .select()\n .from(relation)\n .where(and(...whereConditions, cursorCondition, ...extraConditions))\n .orderBy(...orderByReversed)\n .limit(limit + 2)\n .offset(offset)\n .then((rows) => rows.reverse()),\n totalCountPromise,\n ]);\n\n if (rows.length === 0) {\n return {\n items: rows,\n totalCount,\n pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor },\n };\n }\n\n // If the cursor of the last returned record equals the `before` cursor,\n // `hasNextPage` is true. Remove that record.\n if (encodeCursor(orderBySchema, rows[rows.length - 1]!) === before) {\n rows.pop();\n hasNextPage = true;\n } else {\n // Otherwise, remove the first record.\n rows.shift();\n }\n\n // Now if the length of the records is equal to limit + 1, we know\n // there is a previous page.\n if (rows.length === limit + 1) {\n rows.shift();\n hasPreviousPage = true;\n }\n\n // Now calculate the cursors.\n startCursor = rows.length > 0 ? encodeCursor(orderBySchema, rows[0]!) : null;\n endCursor =\n rows.length > 0\n ? encodeCursor(orderBySchema, rows[rows.length - 1]!)\n : null;\n\n return {\n items: rows,\n totalCount,\n pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor },\n };\n}\n\nconst conditionSuffixes = {\n universal: [\"\", \"_not\"],\n singular: [\"_in\", \"_not_in\"],\n plural: [\"_has\", \"_not_has\"],\n numeric: [\"_gt\", \"_lt\", \"_gte\", \"_lte\"],\n string: [\n \"_contains\",\n \"_not_contains\",\n \"_starts_with\",\n \"_ends_with\",\n \"_not_starts_with\",\n \"_not_ends_with\",\n ],\n} as const;\n\nconst conditionSuffixesByLengthDesc = Object.values(conditionSuffixes)\n .flat()\n .sort((a, b) => b.length - a.length);\n\nfunction buildWhereConditions(\n where: Record<string, any> | undefined,\n columns: Record<string, Column>,\n) {\n const conditions: (SQL | undefined)[] = [];\n\n if (where === undefined) return conditions;\n\n for (const [whereKey, rawValue] of Object.entries(where)) {\n // Handle the `AND` and `OR` operators\n if (whereKey === \"AND\" || whereKey === \"OR\") {\n if (!Array.isArray(rawValue)) {\n throw new Error(\n `Invalid query: Expected an array for the ${whereKey} operator. Got: ${rawValue}`,\n );\n }\n\n const nestedConditions = rawValue.flatMap((subWhere) =>\n buildWhereConditions(subWhere, columns),\n );\n\n if (nestedConditions.length > 0) {\n conditions.push(\n whereKey === \"AND\"\n ? and(...nestedConditions)\n : or(...nestedConditions),\n );\n }\n continue;\n }\n\n // Search for a valid filter suffix, traversing the list from longest to shortest\n // to avoid ambiguity between cases like `_not_in` and `_in`.\n const conditionSuffix = conditionSuffixesByLengthDesc.find((s) =>\n whereKey.endsWith(s),\n );\n if (conditionSuffix === undefined) {\n throw new Error(\n `Invariant violation: Condition suffix not found for where key ${whereKey}`,\n );\n }\n\n // Remove the condition suffix and use the remaining string as the column name.\n const columnName = whereKey.slice(\n 0,\n whereKey.length - conditionSuffix.length,\n );\n\n // Validate that the column name is present in the table.\n const column = columns[columnName];\n if (column === undefined) {\n throw new Error(\n `Invalid query: Where clause contains unknown column ${columnName}`,\n );\n }\n\n switch (conditionSuffix) {\n case \"\":\n if (column.columnType === \"PgArray\") {\n conditions.push(\n and(\n arrayContains(column, rawValue),\n arrayContained(column, rawValue),\n ),\n );\n } else {\n if (rawValue === null) {\n conditions.push(isNull(column));\n } else {\n conditions.push(eq(column, rawValue));\n }\n }\n break;\n case \"_not\":\n if (column.columnType === \"PgArray\") {\n conditions.push(\n not(\n and(\n arrayContains(column, rawValue),\n arrayContained(column, rawValue),\n )!,\n ),\n );\n } else {\n if (rawValue === null) {\n conditions.push(isNotNull(column));\n } else {\n conditions.push(ne(column, rawValue));\n }\n }\n break;\n case \"_in\":\n conditions.push(inArray(column, rawValue));\n break;\n case \"_not_in\":\n conditions.push(notInArray(column, rawValue));\n break;\n case \"_has\":\n conditions.push(arrayContains(column, [rawValue]));\n break;\n case \"_not_has\":\n conditions.push(not(arrayContains(column, [rawValue])));\n break;\n case \"_gt\":\n conditions.push(gt(column, rawValue));\n break;\n case \"_lt\":\n conditions.push(lt(column, rawValue));\n break;\n case \"_gte\":\n conditions.push(gte(column, rawValue));\n break;\n case \"_lte\":\n conditions.push(lte(column, rawValue));\n break;\n case \"_contains\":\n conditions.push(like(column, `%${rawValue}%`));\n break;\n case \"_not_contains\":\n conditions.push(notLike(column, `%${rawValue}%`));\n break;\n case \"_starts_with\":\n conditions.push(like(column, `${rawValue}%`));\n break;\n case \"_ends_with\":\n conditions.push(like(column, `%${rawValue}`));\n break;\n case \"_not_starts_with\":\n conditions.push(notLike(column, `${rawValue}%`));\n break;\n case \"_not_ends_with\":\n conditions.push(notLike(column, `%${rawValue}`));\n break;\n default:\n never(conditionSuffix);\n }\n }\n\n return conditions;\n}\n\nfunction buildOrderBySchema(relation: PgTable | PgView, args: PluralArgs) {\n // If the user-provided order by does not include the ALL of the ID columns,\n // add any missing ID columns to the end of the order by clause (asc).\n // This ensures a consistent sort order to unblock cursor pagination.\n const userDirection = args.orderDirection ?? \"asc\";\n const userColumns: [string, \"asc\" | \"desc\"][] =\n args.orderBy !== undefined ? [[args.orderBy, userDirection]] : [];\n\n if (is(relation, PgView)) {\n return userColumns;\n }\n\n const pkColumns = getPrimaryKeyColumns(relation).map(({ js }) => [\n js,\n userDirection,\n ]);\n\n const missingPkColumns = pkColumns.filter(\n (pkColumn) =>\n !userColumns.some((userColumn) => userColumn[0] === pkColumn[0]),\n ) as [string, \"asc\" | \"desc\"][];\n return [...userColumns, ...missingPkColumns];\n}\n\nfunction encodeCursor(\n orderBySchema: [string, \"asc\" | \"desc\"][],\n row: { [k: string]: unknown },\n): string {\n const cursorObject = Object.fromEntries(\n orderBySchema.map(([columnName, _]) => [columnName, row[columnName]]),\n );\n return encodeRowFragment(cursorObject);\n}\nfunction decodeCursor(cursor: string): { [k: string]: unknown } {\n return decodeRowFragment(cursor);\n}\n\nfunction encodeRowFragment(rowFragment: { [k: string]: unknown }): string {\n return Buffer.from(superjson.stringify(rowFragment)).toString(\"base64\");\n}\nfunction decodeRowFragment(encodedRowFragment: string): {\n [k: string]: unknown;\n} {\n return superjson.parse(Buffer.from(encodedRowFragment, \"base64\").toString());\n}\n\nfunction buildCursorCondition(\n columns: Record<string, Column>,\n orderBySchema: [string, \"asc\" | \"desc\"][],\n direction: \"after\" | \"before\",\n cursorObject: { [k: string]: unknown },\n): SQL | undefined {\n const cursorColumns = orderBySchema.map(([columnName, orderDirection]) => {\n const column = columns[columnName];\n if (column === undefined)\n throw new Error(\n `Unknown column \"${columnName}\" used in orderBy argument`,\n );\n\n const value = cursorObject[columnName];\n\n let comparator: typeof gt | typeof lt;\n let comparatorOrEquals: typeof gte | typeof lte;\n if (direction === \"after\") {\n [comparator, comparatorOrEquals] =\n orderDirection === \"asc\" ? [gt, gte] : [lt, lte];\n } else {\n [comparator, comparatorOrEquals] =\n orderDirection === \"asc\" ? [lt, lte] : [gt, gte];\n }\n\n return { column, value, comparator, comparatorOrEquals };\n });\n\n const buildCondition = (index: number): SQL | undefined => {\n if (index === cursorColumns.length - 1) {\n const { column, value, comparatorOrEquals } = cursorColumns[index]!;\n return comparatorOrEquals(column, value);\n }\n\n const currentColumn = cursorColumns[index]!;\n const nextCondition = buildCondition(index + 1);\n\n return or(\n currentColumn.comparator(currentColumn.column, currentColumn.value),\n and(eq(currentColumn.column, currentColumn.value), nextCondition),\n );\n };\n\n return buildCondition(0);\n}\n\nexport function buildDataLoaderCache(qb: QB) {\n const dataLoaderMap = new Map<\n TableRelationalConfig,\n DataLoader<string, any> | undefined\n >();\n return ({ table }: { table: TableRelationalConfig }) => {\n const baseQuery = (qb as QB<{ [key: string]: OnchainTable }>).raw.query[\n table.tsName\n ];\n if (baseQuery === undefined)\n throw new Error(\n `Internal error: Unknown table \"${table.tsName}\" in data loader cache`,\n );\n\n let dataLoader = dataLoaderMap.get(table);\n if (dataLoader === undefined) {\n dataLoader = new DataLoader(\n async (encodedIds) => {\n const decodedRowFragments = encodedIds.map(decodeRowFragment);\n\n // The decoded row fragments should be valid `where` objects\n // which use the `eq` object shorthand for each primary key column.\n const idConditions = decodedRowFragments.map((decodedRowFragment) =>\n and(...buildWhereConditions(decodedRowFragment, table.columns)),\n );\n\n const rows = await baseQuery.findMany({\n where: or(...idConditions),\n limit: encodedIds.length,\n });\n\n // Now, we need to order the rows coming out of the database to match\n // the order of the IDs passed in. To accomplish this, we need to do\n // a comparison of the decoded row PK fragments with the database rows.\n // This is tricky because the decoded row PK fragments are not normalized,\n // so some comparisons will fail (eg for our PgHex column type).\n // To fix this, we need to normalize the values before doing the comparison.\n return (\n decodedRowFragments\n // Normalize the decoded row fragments\n .map((fragment) =>\n Object.fromEntries(\n Object.entries(fragment).map(([col, val]) => {\n const column = table.columns[col];\n if (column === undefined) {\n throw new Error(\n `Unknown column '${table.tsName}.${col}' used in dataloader row ID fragment`,\n );\n }\n return [col, normalizeColumn(column, val, false)];\n }),\n ),\n )\n // Find the database row corresponding to each normalized row fragment\n .map((fragment) =>\n rows.find((row) =>\n Object.entries(fragment).every(\n ([col, val]) => row[col] === val,\n ),\n ),\n )\n );\n },\n { maxBatchSize: 1_000 },\n );\n dataLoaderMap.set(table, dataLoader);\n }\n\n return dataLoader;\n };\n}\n\nfunction getColumnTsName(column: Column) {\n const tableColumns = getTableColumns(column.table);\n return Object.entries(tableColumns).find(\n ([_, c]) => c.name === column.name,\n )![0];\n}\n\n/**\n * Returns `true` if the query includes a specific field.\n * Does not consider nested selections; only works one \"layer\" deep.\n */\nfunction selectionIncludesField(\n info: GraphQLResolveInfo,\n fieldName: string,\n): boolean {\n for (const fieldNode of info.fieldNodes) {\n for (const selection of fieldNode.selectionSet?.selections ?? []) {\n if (selection.kind === \"Field\" && selection.name.value === fieldName) {\n return true;\n }\n }\n }\n return false;\n}\n","// Modified from https://github.com/taion/graphql-type-json/blob/master/src/index.js\nimport {\n type GraphQLScalarLiteralParser,\n GraphQLScalarType,\n Kind,\n type ObjectValueNode,\n type ValueNode,\n print,\n} from \"graphql\";\n\nexport const GraphQLJSON = new GraphQLScalarType({\n name: \"JSON\",\n description:\n \"The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).\",\n serialize: (x) => x,\n parseValue: (x) => x,\n parseLiteral: (ast, variables) => {\n if (ast.kind !== Kind.OBJECT) {\n throw new TypeError(\n `JSONObject cannot represent non-object value: ${print(ast)}`,\n );\n }\n\n return parseObject(ast, variables);\n },\n});\n\nconst parseLiteral = (\n ast: ValueNode,\n variables: Parameters<GraphQLScalarType[\"parseLiteral\"]>[1],\n): ReturnType<GraphQLScalarLiteralParser<unknown>> => {\n switch (ast.kind) {\n case Kind.STRING:\n case Kind.BOOLEAN:\n return ast.value;\n case Kind.INT:\n case Kind.FLOAT:\n return Number.parseFloat(ast.value);\n case Kind.OBJECT:\n return parseObject(ast, variables);\n case Kind.LIST:\n return ast.values.map((n) => parseLiteral(n, variables));\n case Kind.NULL:\n return null;\n case Kind.VARIABLE:\n return variables ? variables[ast.name.value] : undefined;\n default:\n throw new TypeError(`JSON cannot represent value: ${print(ast)}`);\n }\n};\n\nconst parseObject = (\n ast: ObjectValueNode,\n variables: Parameters<GraphQLScalarType[\"parseLiteral\"]>[1],\n) => {\n const value = Object.create(null);\n ast.fields.forEach((field) => {\n value[field.name.value] = parseLiteral(field.value, variables);\n });\n\n return value;\n};\n","export { createConfig } from \"@/config/index.js\";\nexport { factory } from \"@/config/address.js\";\nexport type {\n Block,\n Log,\n Transaction,\n TransactionReceipt,\n} from \"@/types/eth.js\";\nexport type { Virtual } from \"@/types/virtual.js\";\nexport {\n type MergeAbis,\n type ReplaceBigInts,\n mergeAbis,\n loadBalance,\n rateLimit,\n replaceBigInts,\n} from \"@ponder/utils\";\n\nimport type { Config } from \"@/config/index.js\";\nimport type { Prettify } from \"./types/utils.js\";\n\nexport type ContractConfig = Prettify<Config[\"contracts\"][string]>;\nexport type ChainConfig = Prettify<Config[\"chains\"][string]>;\nexport type BlockConfig = Prettify<Config[\"blocks\"][string]>;\nexport type DatabaseConfig = Prettify<Config[\"database\"]>;\n\nexport type { CreateConfigReturnType } from \"@/config/index.js\";\nexport type { GetEventFilter } from \"@/config/eventFilter.js\";\nexport type { AddressConfig } from \"@/config/address.js\";\n\nexport {\n onchainTable,\n onchainView,\n onchainEnum,\n primaryKey,\n hex,\n bigint,\n} from \"@/drizzle/onchain.js\";\n\nexport type {\n AnyPgColumn,\n PgColumn,\n ExtraConfigColumn,\n PgColumnBuilder,\n PgColumnBuilderBase,\n PgEnumColumnBuilder,\n PgEnumColumnBuilderInitial,\n PgTable,\n PgTableExtraConfig,\n PgTableWithColumns,\n PgTextConfig,\n TableConfig,\n} from \"drizzle-orm/pg-core\";\n\nexport type {\n OnchainTable,\n BuildExtraConfigColumns,\n PgColumnsBuilders,\n PrimaryKeyBuilder,\n OnchainEnum,\n} from \"@/drizzle/onchain.js\";\n\nexport type { ReadonlyDrizzle } from \"@/types/db.js\";\n\nexport { client } from \"@/client/index.js\";\n\nexport { graphql } from \"@/graphql/middleware.js\";\n\nexport {\n sql,\n eq,\n gt,\n gte,\n lt,\n lte,\n ne,\n isNull,\n isNotNull,\n inArray,\n notInArray,\n exists,\n notExists,\n between,\n notBetween,\n like,\n notLike,\n ilike,\n notIlike,\n not,\n asc,\n desc,\n and,\n or,\n count,\n countDistinct,\n avg,\n avgDistinct,\n sum,\n sumDistinct,\n max,\n min,\n relations,\n} from \"drizzle-orm\";\n\nexport {\n bigint as int8,\n boolean,\n char,\n cidr,\n date,\n doublePrecision,\n inet,\n integer,\n interval,\n json,\n jsonb,\n line,\n macaddr,\n macaddr8,\n numeric,\n point,\n real,\n smallint,\n text,\n time,\n timestamp,\n uuid,\n varchar,\n index,\n uniqueIndex,\n alias,\n foreignKey,\n union,\n unionAll,\n intersect,\n intersectAll,\n except,\n exceptAll,\n} from \"drizzle-orm/pg-core\";\n","import { onchainTable, primaryKey } from \"ponder\";\n\n/** DEX factory contract (e.g. PulseX V2). */\nexport const factory = onchainTable(\"factory\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n initCodeHash: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId] }),\n}));\n\n/** ERC-20 token with on-chain metadata. */\nexport const token = onchainTable(\"token\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n name: t.text(),\n symbol: t.text(),\n decimals: t.integer().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId] }),\n}));\n\n/** DEX trading pair — references factory + both tokens. Reserves updated on every Sync. */\nexport const pair = onchainTable(\"pair\", (t) => ({\n address: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n factory: t.hex().notNull(),\n token0: t.hex().notNull(),\n token1: t.hex().notNull(),\n reserve0: t.bigint().notNull(),\n reserve1: t.bigint().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.address, table.chainId] }),\n}));\n\n/** ERC-20 Transfer event — scoped to token + chain. */\nexport const transfer = onchainTable(\"transfer\", (t) => ({\n txHash: t.hex().notNull(),\n logIndex: t.integer().notNull(),\n chainId: t.bigint().notNull(),\n token: t.hex().notNull(),\n from: t.hex().notNull(),\n to: t.hex().notNull(),\n value: t.bigint().notNull(),\n blockNumber: t.bigint().notNull(),\n blockTimestamp: t.bigint().notNull(),\n isBurn: t.boolean().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.txHash, table.logIndex, table.chainId] }),\n}));\n\n/** Daily burn aggregates — scoped to token + chain. */\nexport const burnStat = onchainTable(\"burnStat\", (t) => ({\n token: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n timestamp: t.bigint().notNull(),\n amount: t.bigint().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.token, table.chainId, table.timestamp] }),\n}));\n\n/**\n * Daily inaccessible token aggregates — tracks all transfers to addresses\n * that make tokens permanently inaccessible (burns, precompiles, dead, etc.).\n * One row per (token, chainId, category, dayTimestamp).\n */\nexport const inaccessibleStat = onchainTable(\"inaccessibleStat\", (t) => ({\n token: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n category: t.text().notNull(), // 'burn' | 'dead' | 'pls369' | 'contract' | 'precompile'\n timestamp: t.bigint().notNull(),\n amount: t.bigint().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.token, table.chainId, table.category, table.timestamp] }),\n}));\n\n/** Raw price tick — one row per Sync event per market.\n * price: bigint scaled by PRICE_PRECISION (10^18).\n * orderId: packed hex [blockTimestamp(8)][blockNumber(8)][txIndex(4)][logIndex(4)][chainId(4)] = 28 bytes. */\nexport const priceTick = onchainTable(\"priceTick\", (t) => ({\n pair: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n txHash: t.hex().notNull(),\n logIndex: t.integer().notNull(),\n blockNumber: t.bigint().notNull(),\n timestamp: t.bigint().notNull(),\n token: t.hex().notNull(),\n baseCurrency: t.hex().notNull(),\n price: t.bigint().notNull(),\n source: t.text().notNull(),\n orderId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.pair, table.chainId, table.txHash, table.logIndex] }),\n}));\n\n/** OHLC price candle — aggregated per market per resolution bucket.\n * All price fields are bigint scaled by PRICE_PRECISION (10^18).\n * Each (pair, chainId, resolution, timestamp) is one candle for one market. */\nexport const tokenPrice = onchainTable(\"tokenPrice\", (t) => ({\n pair: t.hex().notNull(),\n chainId: t.bigint().notNull(),\n resolution: t.text().notNull(), // \"minute\" | \"hour\" | \"day\"\n timestamp: t.bigint().notNull(),\n token: t.hex().notNull(),\n baseCurrency: t.text().notNull(),\n open: t.bigint().notNull(),\n high: t.bigint().notNull(),\n low: t.bigint().notNull(),\n close: t.bigint().notNull(),\n source: t.text().notNull(),\n orderId: t.hex().notNull(),\n}), (table) => ({\n pk: primaryKey({ columns: [table.pair, table.chainId, table.resolution, table.timestamp] }),\n}));\n","/**\n * @fileoverview Deposit model and UI presentation logic.\n *\n * The `Deposit` class wraps raw Ponder deposit data and provides:\n * - Formatted display values (amounts, rates, addresses)\n * - Computed properties (remaining liquidity, status, events)\n * - Helper methods for UI rendering\n *\n * @remarks\n * This is the primary data model used throughout the UI for deposit\n * information. It handles both V2 and V3 deposit structures.\n *\n * @see {@link depositStatuses} for status enum from @provex/utils\n * @see {@link PonderDeposit} for the raw data type\n */\n\nimport type { ConversionRateInfo, ProviderRates } from '@provex/utils/conversionRates'\nimport { calculateEffectiveMinimum, verifierGetsKey, providerKeyToContractId, type ProviderKey, type SubProviderKey } from '@provex/utils/payment'\nimport { tokenByAddress } from '@provex/utils/tokens'\nimport { formatUnits } from '@provex/utils/units'\nimport type { TokenInfo } from '@provex/utils/tokens'\nimport { SUPPORTED_CURRENCIES, currencyById, type Currency } from '@provex/utils/currencies'\nimport partition from 'lodash/partition'\nimport { type Hex } from 'viem'\nimport type { ChainId } from '@provex/utils/chain'\nimport { depositStatuses, type DepositStatus } from '@provex/utils/deposit'\nimport { orderId } from '@provex/utils/ids'\nimport type { PonderDeposit } from './ponderQueries'\n\n/**\n * Extracted element types from PonderDeposit arrays.\n * These provide type-safe access to individual records from ponder queries.\n */\nexport type PonderDepositReceived = PonderDeposit['depositReceiveds'][number]\nexport type PonderDepositWithdrawn = PonderDeposit['depositWithdrawns'][number]\nexport type PonderDepositClosed = PonderDeposit['depositCloseds'][number]\nexport type PonderDepositCurrencyAdded = PonderDeposit['depositCurrencyAddeds'][number]\nexport type PonderDepositVerifierAdded = PonderDeposit['depositVerifierAddeds'][number]\nexport type PonderDepositConversionRateUpdated = PonderDeposit['depositConversionRateUpdateds'][number]\nexport type PonderIntentSignaled = PonderDeposit['intentSignaleds'][number]\nexport type PonderIntentPruned = PonderDeposit['intentPruneds'][number]\nexport type PonderIntentFulfilled = PonderDeposit['intentFulfilleds'][number]\nexport type PonderDepositIntentAmountRangeUpdated = PonderDeposit['depositIntentAmountRangeUpdateds'][number]\nexport type PonderDepositFundsAdded = PonderDeposit['depositFundsAddeds'][number]\nexport type PonderDepositRetainOnEmptyUpdated = PonderDeposit['depositRetainOnEmptyUpdateds'][number]\nexport type PonderParticipant = NonNullable<PonderDeposit['owner']>\nexport type PonderTransaction = NonNullable<PonderDeposit['transaction']>\n\n// Type aliases for backward compatibility (replacing GraphQL types)\nexport type DepositReceived = PonderDepositReceived\nexport type DepositWithdrawn = PonderDepositWithdrawn\nexport type DepositClosed = PonderDepositClosed\nexport type DepositCurrencyAdded = PonderDepositCurrencyAdded\nexport type DepositVerifierAdded = PonderDepositVerifierAdded\nexport type DepositConversionRateUpdated = PonderDepositConversionRateUpdated\nexport type IntentSignaled = PonderIntentSignaled\nexport type IntentPruned = PonderIntentPruned\nexport type IntentFulfilled = PonderIntentFulfilled\nexport type Participant = PonderParticipant\nexport type Transaction = PonderTransaction\n\n/**\n * Type for deposit data from Ponder SQL queries\n */\nexport type DepositInput = PonderDeposit\n\nexport { depositStatuses, type DepositStatus }\n\nexport interface DepositStatusConfig {\n label: string\n color: string\n tooltip: string\n}\n\nexport const depositStatusConfigs = {\n [depositStatuses.ACTIVE]: {\n label: 'Active',\n color: 'green',\n tooltip: 'Available for exchanges up to the remaining amount',\n },\n [depositStatuses.CLOSED]: {\n label: 'Closed',\n color: 'gray',\n tooltip: 'No longer accepting exchanges',\n },\n [depositStatuses.WITHDRAWN]: {\n label: 'Withdrawn',\n color: 'gray',\n tooltip: 'Deposit has been fully withdrawn and closed',\n },\n [depositStatuses.UNDERFUNDED]: {\n label: 'Underfunded',\n color: 'orange',\n tooltip: 'Deposit is underfunded',\n },\n [depositStatuses.PAUSED]: {\n label: 'Paused',\n color: 'yellow',\n tooltip: 'Deposit is paused and not accepting new intents',\n },\n} as Record<DepositStatus, DepositStatusConfig>\n\n/**\n * Calculate derived status based on events and amounts.\n *\n * Status priority:\n * 1. CLOSED - deposit was explicitly closed\n * 2. WITHDRAWN - deposit was fully withdrawn (remaining = 0) with withdrawal events\n * 3. UNDERFUNDED - remaining balance is below minimum thresholds\n * 4. ACTIVE - deposit can accept exchanges\n *\n * Note: Partial withdrawals (depositWithdrawns with remaining > 0) do NOT\n * automatically make a deposit WITHDRAWN. Status depends on remaining balance.\n */\nexport function calculateDepositStatus(\n deposit: Deposit,\n tokenInfo: TokenInfo,\n providerRates?: ProviderRates<ConversionRateInfo>\n): DepositStatus {\n // Check for terminal states first\n if (deposit.depositCloseds.length) {\n return depositStatuses.CLOSED\n }\n\n // Only mark as WITHDRAWN if there are withdrawal events AND remaining is 0\n // Partial withdrawals should show as active/underfunded based on remaining balance\n const remainingWeiBigInt = BigInt(deposit.remaining)\n if (deposit.depositWithdrawns.length && remainingWeiBigInt === 0n) {\n return depositStatuses.WITHDRAWN\n }\n\n // Get effective minimum (considering payment provider limits)\n const { userMinAmountWei: userMinWeiBigInt, effectiveMinAmountWei } = calculateEffectiveMinimum(\n deposit.chainId,\n deposit.minAmount,\n tokenInfo,\n providerRates\n )\n\n // Check if deposit is underfunded using bigint comparison\n const isUserMinExceeded = userMinWeiBigInt > remainingWeiBigInt\n const isEffectiveMinExceeded = effectiveMinAmountWei > remainingWeiBigInt\n if (isUserMinExceeded || isEffectiveMinExceeded) {\n return depositStatuses.UNDERFUNDED\n }\n\n // Default to active state\n return depositStatuses.ACTIVE\n}\n\nexport interface FormattedNumbers {\n remaining: string\n minAmount: string\n maxAmount: string\n effectiveMinAmount: string\n effectiveMaxAmount: string\n profit?: string\n}\n\nexport class Deposit {\n public depositReceiveds: PonderDepositReceived[] = []\n public depositWithdrawns: PonderDepositWithdrawn[] = []\n public depositCloseds: PonderDepositClosed[] = []\n public depositCurrencyAddeds: PonderDepositCurrencyAdded[] = []\n public depositVerifierAddeds: PonderDepositVerifierAdded[] = []\n public depositConversionRateUpdateds: PonderDepositConversionRateUpdated[] = []\n public depositIntentAmountRangeUpdateds: PonderDepositIntentAmountRangeUpdated[] = []\n public depositFundsAddeds: PonderDepositFundsAdded[] = []\n public depositRetainOnEmptyUpdateds: PonderDepositRetainOnEmptyUpdated[] = []\n public intentSignaleds: PonderIntentSignaled[] = []\n public intentPruneds: PonderIntentPruned[] = []\n public intentFulfilleds: PonderIntentFulfilled[] = []\n private _transaction: PonderTransaction | null = null\n /**\n * Pre-computed locked funds amount, injected by useMatchableDeposits\n * when full intent data isn't fetched. Null means \"use intent-based calculation\".\n */\n private _computedLockedFunds: bigint | null = null\n private _computedReclaimableFunds: bigint | null = null\n private _resolvedViaUnlock: Set<string> = new Set()\n\n constructor(public deposit: DepositInput) {\n this.depositReceiveds = deposit.depositReceiveds\n this.depositWithdrawns = deposit.depositWithdrawns\n this.depositCloseds = deposit.depositCloseds\n this.depositCurrencyAddeds = deposit.depositCurrencyAddeds\n this.depositVerifierAddeds = deposit.depositVerifierAddeds\n this.depositConversionRateUpdateds = deposit.depositConversionRateUpdateds\n this.depositIntentAmountRangeUpdateds = deposit.depositIntentAmountRangeUpdateds ?? []\n this.depositFundsAddeds = deposit.depositFundsAddeds ?? []\n this.depositRetainOnEmptyUpdateds = deposit.depositRetainOnEmptyUpdateds ?? []\n this.intentSignaleds = deposit.intentSignaleds\n this.intentPruneds = deposit.intentPruneds\n this.intentFulfilleds = deposit.intentFulfilleds\n this._transaction = deposit.transaction ?? null\n\n const computedLocked = (deposit as Record<string, unknown>)._computedLockedFunds\n if (computedLocked !== undefined && computedLocked !== null) {\n this._computedLockedFunds = BigInt(computedLocked as bigint)\n }\n const computedReclaimable = (deposit as Record<string, unknown>)._computedReclaimableFunds\n if (computedReclaimable !== undefined && computedReclaimable !== null) {\n this._computedReclaimableFunds = BigInt(computedReclaimable as bigint)\n }\n const resolvedViaUnlock = (deposit as Record<string, unknown>)._resolvedViaUnlock\n if (Array.isArray(resolvedViaUnlock)) {\n this._resolvedViaUnlock = new Set(resolvedViaUnlock as string[])\n }\n }\n\n /**\n * Access a base property from the deposit data.\n */\n access<K extends keyof PonderDeposit>(key: K): PonderDeposit[K] {\n const value = (this.deposit as Record<string, unknown>)[key]\n if (value === undefined) {\n throw new Error(`Deposit does not have a ${key}`)\n }\n return value as PonderDeposit[K]\n }\n\n /**\n * Get the deposit ID (localId) by parsing from the orderId.\n * This is the on-chain numeric ID within the escrow contract.\n */\n get depositId() {\n const depositOrderId = this.access('depositId')\n return orderId.deposit.parse(depositOrderId as Hex).depositId\n }\n\n /**\n * Get the local deposit ID (the actual numeric ID within the escrow contract).\n * This is the ID to use when building URLs or referencing the deposit.\n * This comes from the `localId` field directly.\n */\n get localId(): bigint {\n const localId = (this.deposit as Record<string, unknown>).localId\n if (localId !== undefined) {\n return BigInt(localId as bigint)\n }\n // Fallback to parsing from depositId\n return this.depositId\n }\n get logId() {\n return this.access('logId')\n }\n get transaction() {\n return this._transaction ?? this.access('transaction')\n }\n get block() {\n return this.transaction?.block ?? null\n }\n get timestamp() {\n const block = this.block\n if (!block) {\n // Fallback: use the deposit's transactionId to estimate timestamp\n // For list views where block isn't loaded, return current date as fallback\n return new Date()\n }\n return new Date(Number(block.timestamp) * 1000)\n }\n get endTimestamp() {\n if (this.status === depositStatuses.ACTIVE || this.status === depositStatuses.UNDERFUNDED) {\n return null\n }\n const timestamp = this.depositCloseds[0]?.transaction?.block?.timestamp ?? this.depositWithdrawns[0]?.transaction?.block?.timestamp\n return timestamp ? new Date(Number(timestamp) * 1000) : null\n }\n get transactionId() {\n return this.access('transactionId')\n }\n get participantAddress() {\n return this.access('participantAddress')\n }\n get owner() {\n return this.access('owner')\n }\n get orderId() {\n return this.access('orderId')\n }\n get minAmount() {\n return BigInt(this.access('minAmount'))\n }\n get maxAmount() {\n return BigInt(this.access('maxAmount'))\n }\n get remaining() {\n return BigInt(this.access('remaining'))\n }\n get deposited() {\n return BigInt(this.access('deposited'))\n }\n /** High-water mark of remaining balance from depositStats. Falls back to deposited if unavailable. */\n get maxRemaining(): bigint {\n const stats = (this.deposit as Record<string, unknown>).depositStats as { maxRemaining?: bigint } | null\n if (stats?.maxRemaining) return BigInt(stats.maxRemaining)\n return this.deposited\n }\n /**\n * Get the total amount withdrawn from this deposit.\n * Sum of all depositWithdrawn event amounts.\n */\n get totalWithdrawn(): bigint {\n return this.depositWithdrawns.reduce(\n (sum, withdrawal) => sum + BigInt(withdrawal.amount),\n 0n\n )\n }\n get token() {\n return tokenByAddress(this.chainId, this.access('token'))\n }\n /**\n * Returns the token info or a stub with 18 decimals for unknown tokens.\n * Use this when a non-null TokenInfo is required for calculations.\n */\n get tokenOrStub(): TokenInfo {\n const tokenInfo = this.token\n if (tokenInfo) return tokenInfo\n const address = this.access('token')\n return {\n address,\n decimals: 18,\n symbol: 'UNKNOWN',\n name: 'Unknown Token',\n chainId: this.chainId,\n }\n }\n get status() {\n return this.access('status') as DepositStatus\n }\n get chainId() {\n return Number(this.access('chainId')) as ChainId\n }\n /**\n * Get the escrow contract address for this deposit.\n */\n get escrow(): Hex {\n const escrow = (this.deposit as Record<string, unknown>).escrow\n if (!escrow) {\n throw new Error('Escrow not available on this deposit')\n }\n return escrow as Hex\n }\n\n /**\n * Get whether the deposit should remain open when balance reaches zero.\n * V3 only - V2 deposits always return false.\n */\n get retainOnEmpty(): boolean {\n const value = (this.deposit as Record<string, unknown>).retainOnEmpty\n return value === true\n }\n\n /**\n * Get whether the deposit is accepting new intents.\n * V3 only - V2 deposits always return true (no pause functionality).\n */\n get acceptingIntents(): boolean {\n const value = (this.deposit as Record<string, unknown>).acceptingIntents\n return value === true\n }\n\n /**\n * Check if an intent is expired based on its on-chain expiryTime from fundsLocked.\n * Falls back to timestamp-based calculation if expiryTime is not available.\n * @param intent - The intent signaled record with optional fundsLocked relation\n * @returns true if the intent has expired\n */\n isIntentExpired(intent: PonderIntentSignaled): boolean {\n const currentTime = Math.floor(Date.now() / 1000)\n\n // Use on-chain expiryTime from fundsLocked if available\n const fundsLocked = (intent as PonderIntentSignaled & { fundsLocked?: { expiryTime: bigint } }).fundsLocked\n if (fundsLocked?.expiryTime) {\n return currentTime > Number(fundsLocked.expiryTime)\n }\n\n // Fallback: intent without fundsLocked is considered expired (shouldn't happen in normal flow)\n return true\n }\n\n /**\n * Get the expiry time for an intent from its fundsLocked record.\n * @param intent - The intent signaled record with optional fundsLocked relation\n * @returns The expiry timestamp in seconds, or null if not available\n */\n getIntentExpiryTime(intent: PonderIntentSignaled): bigint | null {\n const fundsLocked = (intent as PonderIntentSignaled & { fundsLocked?: { expiryTime: bigint } }).fundsLocked\n return fundsLocked?.expiryTime ?? null\n }\n\n // Get unpruned intents partitioned into active and expired\n get unprunedIntents() {\n // Create sets for efficient lookup\n const prunedIntentHashes = new Set(this.intentPruneds.map(pruned => pruned.intentHash))\n const fulfilledIntentHashes = new Set(this.intentFulfilleds.map(f => f.intentHash))\n\n // Filter out resolved intents (pruned, fulfilled, or unlocked via cancellation)\n const unprunedIntents = this.intentSignaleds.filter(intent => {\n if (prunedIntentHashes.has(intent.intentHash)) return false\n if (fulfilledIntentHashes.has(intent.intentHash)) return false\n if (this._resolvedViaUnlock.has(intent.intentHash)) return false\n return true\n })\n\n // Partition into active and expired based on on-chain expiryTime\n const [activeIntents, expiredIntents] = partition(unprunedIntents, intent => {\n return !this.isIntentExpired(intent)\n })\n\n return { active: activeIntents, expired: expiredIntents }\n }\n\n // Calculate locked funds — prefer pre-computed value from useMatchableDeposits,\n // fall back to intent-based calculation for deposit detail pages\n get lockedFunds() {\n if (this._computedLockedFunds !== null) {\n return this._computedLockedFunds\n }\n return this.unprunedIntents.active.reduce((total, intent) => {\n return total + BigInt(intent.amount)\n }, 0n)\n }\n\n // Funds locked by expired intents that would be freed on next interaction\n // (signalIntent, withdrawDeposit, pruneExpiredIntents all auto-prune)\n get reclaimableFunds() {\n if (this._computedReclaimableFunds !== null) {\n return this._computedReclaimableFunds\n }\n return this.unprunedIntents.expired.reduce((total, intent) => {\n return total + BigInt(intent.amount)\n }, 0n)\n }\n\n // Available funds: unlocked remaining + reclaimable expired locks - active locks\n get availableFunds() {\n return this.remaining + this.reclaimableFunds - this.lockedFunds\n }\n\n get effectiveMinAmount() {\n const { effectiveMinAmountWei } = calculateEffectiveMinimum(\n this.chainId,\n this.minAmount,\n this.tokenOrStub,\n this.currentConversionRates\n )\n return effectiveMinAmountWei\n }\n get effectiveMaxAmount() {\n const maxAmount = this.maxAmount\n const availableFunds = this.availableFunds\n if (availableFunds >= maxAmount) {\n return maxAmount\n }\n return availableFunds\n }\n get currentConversionRates(): ProviderRates<ConversionRateInfo> {\n const chainId = this.chainId\n return this.depositConversionRateUpdateds.reduce((acc, item) => {\n const { currency, verifier } = item\n const verifierKey = verifierGetsKey(chainId, verifier)\n const map = acc.get(verifierKey) ?? new Map()\n map.set(currency, item)\n acc.set(verifierKey, map)\n return acc\n }, new Map() as ProviderRates<ConversionRateInfo>)\n }\n get historicalConversionRates(): ProviderRates<ConversionRateInfo[]> {\n const chainId = this.chainId\n return this.depositConversionRateUpdateds.reduce((acc, item) => {\n const { currency, verifier } = item\n const verifierKey = verifierGetsKey(chainId, verifier)\n const map = acc.get(verifierKey) ?? new Map()\n const list = map.get(currency) ?? []\n list.push(item)\n map.set(currency, list)\n acc.set(verifierKey, map)\n return acc\n }, new Map() as ProviderRates<ConversionRateInfo[]>)\n }\n get formattedNumbers() {\n const { decimals } = this.tokenOrStub\n const formattedNumbers: FormattedNumbers = {\n remaining: formatUnits(this.access('remaining'), { decimals, truncateDecimals: 2 }),\n minAmount: formatUnits(this.access('minAmount'), { decimals, truncateDecimals: 2 }),\n maxAmount: formatUnits(this.access('maxAmount'), { decimals, truncateDecimals: 2 }),\n effectiveMinAmount: formatUnits(this.effectiveMinAmount, { decimals, truncateDecimals: 2 }),\n effectiveMaxAmount: formatUnits(this.effectiveMaxAmount, { decimals, truncateDecimals: 2 }),\n }\n return formattedNumbers\n }\n canAcceptAmount(amount: bigint): boolean {\n return amount <= this.availableFunds && amount >= this.effectiveMinAmount && amount <= this.maxAmount\n }\n get usdConversionRates() {\n const providerRates = this.currentConversionRates\n const usdContractId = SUPPORTED_CURRENCIES.USD.contractId!\n const usdRates = new Map<ProviderKey | SubProviderKey, ConversionRateInfo>()\n for (const [providerKey, currencyMap] of providerRates.entries()) {\n const usd = currencyMap.get(usdContractId)\n if (usd) {\n usdRates.set(providerKey, usd)\n }\n }\n return usdRates\n }\n get lowestUsdConversionRate() {\n const usdRates = this.usdConversionRates\n let currentRate: null | ConversionRateInfo = null\n for (const [, rate] of usdRates.entries()) {\n if (!rate) continue\n if (!rate.value) continue\n if (!currentRate || BigInt(currentRate.value) < BigInt(rate.value)) {\n currentRate = rate\n }\n }\n return currentRate\n }\n get primaryConversionRate() {\n const lowestUsdRate = this.lowestUsdConversionRate\n if (lowestUsdRate) {\n return lowestUsdRate\n }\n for (const currencyMap of this.currentConversionRates.values()) {\n for (const rate of currencyMap.values()) {\n return rate\n }\n }\n return null\n }\n get paymentProviders() {\n return new Set(this.depositCurrencyAddeds.map(added => verifierGetsKey(this.chainId, added.verifier)))\n }\n /**\n * Provider + currency combinations from the denormalized deposit arrays.\n * Groups currencies by provider key for compact display.\n *\n * Returns a Map: ProviderKey → Currency[] (e.g., \"revolut\" → [EUR, USD])\n */\n get providerCurrencies(): Map<ProviderKey | SubProviderKey, Currency[]> {\n const verifiers = (this.deposit as Record<string, unknown>).depositConversionRateVerifiers as Hex[] | undefined\n const currencies = (this.deposit as Record<string, unknown>).depositConversionRateCurrencies as Hex[] | undefined\n if (!verifiers?.length || !currencies?.length) return new Map()\n\n const result = new Map<ProviderKey | SubProviderKey, Currency[]>()\n for (const verifierHex of verifiers) {\n const providerKey = verifierGetsKey(this.chainId, verifierHex)\n if (result.has(providerKey)) continue\n const currencyList = currencies\n .map(c => currencyById.get(c.toLowerCase() as Hex))\n .filter((c): c is Currency => c !== undefined)\n result.set(providerKey, currencyList)\n }\n return result\n }\n get profit() {\n // Only calculate profit for USDC + USD transactions (same constraint as analytics)\n const usdContractId = SUPPORTED_CURRENCIES.USD.contractId\n const isUsdcDeposit = this.token?.symbol === 'USDC'\n\n\n // Filter out intents without conversion rate data or non-USD currencies\n const intentsWithRates = this.intentFulfilleds.filter(\n (event): event is typeof event & { depositConversionRateUpdated: NonNullable<typeof event.depositConversionRateUpdated> } =>\n event.depositConversionRateUpdated !== null &&\n event.depositConversionRateUpdated !== undefined &&\n // Only USD fiat currency\n event.fiatCurrency === usdContractId\n )\n\n\n // If not a USDC deposit, profit calculation doesn't apply\n if (!isUsdcDeposit) {\n return {\n profit: 0n,\n nullAmounts: this.intentFulfilleds.length,\n }\n }\n\n const nullAmountsFromMissingRates = this.intentFulfilleds.length - intentsWithRates.length\n\n // Calculate profit for each fulfilled intent\n // Rate = fiat per token * 10^18 (e.g., 1.05 * 10^18 means $1.05 per token)\n // Profit = tokens * (rate - baseRate) / 10^18\n // where baseRate = 10^18 represents 1:1 exchange (valid for USDC/USD)\n const baseRate = 10n ** 18n\n let totalProfit = 0n\n\n for (const event of intentsWithRates) {\n const tokenAmount = BigInt(event.amount)\n const rate = BigInt(event.depositConversionRateUpdated.value)\n // Profit in token terms: how much extra the seller earned above 1:1\n // At rate 1.05, selling 100 tokens gives $105 worth, which is 5% profit = 5 tokens\n const profit = tokenAmount * (rate - baseRate) / baseRate\n totalProfit += profit\n }\n\n\n return {\n profit: totalProfit,\n nullAmounts: nullAmountsFromMissingRates,\n }\n }\n\n getVerifier(key: ProviderKey | SubProviderKey): DepositVerifierAdded | PonderDepositVerifierAdded | null {\n const chainId = this.chainId\n // For v3 deposits, verifier is zeroAddress and paymentMethodId contains the actual identifier\n // For v2 deposits, verifier is the contract address and paymentMethodId is derived from it\n\n // Get the expected contract ID for the provider key (keccak256 hash)\n const expectedContractId = providerKeyToContractId(key).toLowerCase()\n\n return this.depositVerifierAddeds.find(added => {\n // First try matching by verifier (works for v2)\n const v2Match = verifierGetsKey(chainId, added.verifier) === key\n if (v2Match) return true\n // Then try direct comparison of paymentMethodId with expected contract ID (works for v3)\n if ('paymentMethodId' in added && added.paymentMethodId) {\n const directMatch = added.paymentMethodId.toLowerCase() === expectedContractId\n if (directMatch) return true\n // Also try reverse lookup via verifierGetsKey\n const reverseMatch = verifierGetsKey(chainId, added.paymentMethodId) === key\n if (reverseMatch) return true\n }\n return false\n }) ?? null\n }\n\n providerByIntentHash(hash: Hex): ProviderKey | null {\n const signal = this.intentSignaleds.find(intent => intent.intentHash === hash)\n if (!signal) return null\n // Both formats should have verifier (SQL adds it via ponderQueries mapping)\n // Fallback to paymentMethodId for SQL format if verifier wasn't set\n const verifier = 'verifier' in signal && signal.verifier\n ? signal.verifier\n : ('paymentMethodId' in signal ? signal.paymentMethodId : null)\n if (!verifier) return null\n return verifierGetsKey(this.chainId, verifier)\n }\n}\n\n","/**\n * @fileoverview Ponder SQL query helpers for indexer data access.\n *\n * Provides type-safe database queries using Ponder's SQL-over-HTTP client.\n * These functions replace the previous GraphQL-based data fetching.\n *\n * @remarks\n * Key query functions:\n * - `getDepositByCompoundKey` - Fetch deposit with all related data\n * - `getDepositById` - Fetch deposit by serialized key\n * - `getIntentByHash` - Fetch intent by its keccak256 hash\n * - `getUserDeposits` - Fetch all deposits for a wallet address\n * - `getDepositsByPayeeDetails` - Cross-chain deposit lookup\n *\n * All queries use the compound key pattern (escrow + localId + chainId)\n * for unique deposit identification.\n *\n * @see {@link ./ponder} for the client initialization\n * @see {@link @provex/utils/ids} for orderId serialization\n */\nimport { eq, and, desc, sql, inArray, or } from '@ponder/client'\nimport { ponderClient, schema } from './ponder'\nimport { type Hex, concatHex, numberToHex } from 'viem'\n\n/**\n * Ponder's SQL-over-HTTP encodes queries in GET request URLs.\n * Large IN clauses (100+ hex IDs) exceed URL length limits (~8KB).\n * This helper splits the IDs into chunks and runs them in parallel.\n */\nconst MAX_IN_CLAUSE = 50\n\nasync function queryInChunks<T>(\n ids: Hex[],\n fetchChunk: (chunk: Hex[]) => Promise<T[]>\n): Promise<T[]> {\n if (ids.length === 0) return []\n const chunks: Hex[][] = []\n for (let i = 0; i < ids.length; i += MAX_IN_CLAUSE) {\n chunks.push(ids.slice(i, i + MAX_IN_CLAUSE))\n }\n const results = await Promise.all(chunks.map(fetchChunk))\n return results.flat()\n}\nimport type { ChainId, } from '@provex/utils/chain'\nimport { getAllEscrowContracts, type EscrowLocation, } from '@provex/utils/contracts'\nimport { orderId } from '@provex/utils/ids'\nimport { formatUnits } from '@provex/utils/units'\nimport { tokenByAddress } from '@provex/utils/tokens'\nimport { type ProviderKey, paymentVerifierToKey } from '@provex/utils/payment'\n\n/**\n * Inferred type for deposit data returned by getDepositByCompoundKey.\n * This replaces manually-defined SQL types with actual schema inference.\n */\nexport type PonderDeposit = NonNullable<Awaited<ReturnType<typeof getDepositByCompoundKey>>>\n\n/**\n * Get a deposit by its serialized compound key.\n * @param serializedDepositKey - The serialized deposit key from orderId.deposit.serialize()\n * @returns The deposit record or null if not found\n */\nexport async function getDepositById(serializedDepositKey: Hex) {\n const db = ponderClient.db\n\n // Parse the serialized deposit key to extract compound key components\n const { escrow, depositId, chainId } = orderId.deposit.parse(serializedDepositKey)\n\n const deposit = await db\n .select()\n .from(schema.deposit)\n .where(\n and(\n eq(schema.deposit.escrow, escrow),\n eq(schema.deposit.localId, depositId),\n eq(schema.deposit.chainId, BigInt(chainId))\n )\n )\n .limit(1)\n\n return deposit[0] ?? null\n}\n\n/**\n * Get a deposit with all its related data using compound key\n * This fetches all relationships needed by the Deposit class\n */\nexport async function getDepositByCompoundKey(params: {\n escrow: Hex\n localId: bigint\n chainId: bigint\n}) {\n const db = ponderClient.db\n\n // Get the main deposit using compound key\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(and(\n eq(schema.deposit.escrow, params.escrow.toLowerCase() as Hex),\n eq(schema.deposit.localId, params.localId),\n eq(schema.deposit.chainId, params.chainId)\n ))\n .limit(1)\n\n const deposit = deposits[0]\n if (!deposit) return null\n // Fetch all related data in parallel\n const [\n depositReceiveds,\n depositWithdrawns,\n depositCloseds,\n depositCurrencyAddeds,\n depositVerifierAddeds,\n depositConversionRateUpdateds,\n depositDeltas,\n fundsUnlockedAndTransferreds,\n fundsUnlockeds,\n fundsLockeds,\n intentSignaleds,\n intentPruneds,\n intentFulfilleds,\n _transaction,\n depositIntentAmountRangeUpdateds,\n depositFundsAddeds,\n depositRetainOnEmptyUpdateds,\n depositStatsRows,\n ] = await Promise.all([\n // DepositReceived\n db.select().from(schema.depositReceived)\n .where(and(\n eq(schema.depositReceived.depositEscrow, deposit.escrow),\n eq(schema.depositReceived.depositLocalId, deposit.localId),\n eq(schema.depositReceived.depositChainId, deposit.chainId)\n )),\n\n // DepositWithdrawn\n db.select().from(schema.depositWithdrawn)\n .where(and(\n eq(schema.depositWithdrawn.depositEscrow, deposit.escrow),\n eq(schema.depositWithdrawn.depositLocalId, deposit.localId),\n eq(schema.depositWithdrawn.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositWithdrawn.orderId)),\n\n // DepositClosed\n db.select().from(schema.depositClosed)\n .where(and(\n eq(schema.depositClosed.depositEscrow, deposit.escrow),\n eq(schema.depositClosed.depositLocalId, deposit.localId),\n eq(schema.depositClosed.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositClosed.orderId)),\n\n // DepositCurrencyAdded\n db.select().from(schema.depositCurrencyAdded)\n .where(and(\n eq(schema.depositCurrencyAdded.depositEscrow, deposit.escrow),\n eq(schema.depositCurrencyAdded.depositLocalId, deposit.localId),\n eq(schema.depositCurrencyAdded.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositCurrencyAdded.orderId)),\n\n // DepositVerifierAdded\n db.select().from(schema.depositVerifierAdded)\n .where(and(\n eq(schema.depositVerifierAdded.depositEscrow, deposit.escrow),\n eq(schema.depositVerifierAdded.depositLocalId, deposit.localId),\n eq(schema.depositVerifierAdded.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositVerifierAdded.orderId)),\n\n // DepositConversionRateUpdated - fetch ALL rate changes (not just active) for history display\n // The 'active' flag indicates the current rate, but we need full history for events table\n db.select().from(schema.depositConversionRateUpdated)\n .where(and(\n eq(schema.depositConversionRateUpdated.depositEscrow, deposit.escrow),\n eq(schema.depositConversionRateUpdated.depositLocalId, deposit.localId),\n eq(schema.depositConversionRateUpdated.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositConversionRateUpdated.orderId)),\n\n // DepositDelta - amount changes for each event\n db.select().from(schema.depositDelta)\n .where(and(\n eq(schema.depositDelta.depositEscrow, deposit.escrow),\n eq(schema.depositDelta.depositLocalId, deposit.localId),\n eq(schema.depositDelta.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.depositDelta.orderId)),\n\n // FundsUnlockedAndTransferred - to bridge intentFulfilled with depositDelta via intentHash\n db.select().from(schema.fundsUnlockedAndTransferred)\n .where(and(\n eq(schema.fundsUnlockedAndTransferred.depositEscrow, deposit.escrow),\n eq(schema.fundsUnlockedAndTransferred.depositLocalId, deposit.localId),\n eq(schema.fundsUnlockedAndTransferred.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.fundsUnlockedAndTransferred.orderId)),\n\n // FundsUnlocked - cancellation/expiry unlocks (to mark intents as resolved)\n db.select().from(schema.fundsUnlocked)\n .where(and(\n eq(schema.fundsUnlocked.depositEscrow, deposit.escrow),\n eq(schema.fundsUnlocked.depositLocalId, deposit.localId),\n eq(schema.fundsUnlocked.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.fundsUnlocked.orderId)),\n\n // FundsLocked - contains expiryTime for each intent (on-chain expiry timestamp)\n db.select().from(schema.fundsLocked)\n .where(and(\n eq(schema.fundsLocked.depositEscrow, deposit.escrow),\n eq(schema.fundsLocked.depositLocalId, deposit.localId),\n eq(schema.fundsLocked.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.fundsLocked.orderId)),\n\n // IntentSignaled\n db.select().from(schema.intentSignaled)\n .where(and(\n eq(schema.intentSignaled.depositEscrow, deposit.escrow),\n eq(schema.intentSignaled.depositLocalId, deposit.localId),\n eq(schema.intentSignaled.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.intentSignaled.orderId)),\n\n // IntentPruned\n db.select().from(schema.intentPruned)\n .where(and(\n eq(schema.intentPruned.depositEscrow, deposit.escrow),\n eq(schema.intentPruned.depositLocalId, deposit.localId),\n eq(schema.intentPruned.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.intentPruned.orderId)),\n\n // IntentFulfilled\n db.select().from(schema.intentFulfilled)\n .where(and(\n eq(schema.intentFulfilled.depositEscrow, deposit.escrow),\n eq(schema.intentFulfilled.depositLocalId, deposit.localId),\n eq(schema.intentFulfilled.depositChainId, deposit.chainId)\n ))\n .orderBy(desc(schema.intentFulfilled.orderId)),\n\n // Transaction for deposit creation\n db.select().from(schema.transaction)\n .where(eq(schema.transaction.orderId, deposit.transactionId))\n .limit(1),\n\n // DepositIntentAmountRangeUpdated events (from generic event table)\n db.select().from(schema.event)\n .where(and(\n eq(schema.event.depositEscrow, deposit.escrow),\n eq(schema.event.depositLocalId, deposit.localId),\n eq(schema.event.depositChainId, deposit.chainId),\n eq(schema.event.eventName, 'deposit_intent_amount_range_updated')\n ))\n .orderBy(desc(schema.event.orderId)),\n\n // DepositFundsAdded events (from generic event table)\n db.select().from(schema.event)\n .where(and(\n eq(schema.event.depositEscrow, deposit.escrow),\n eq(schema.event.depositLocalId, deposit.localId),\n eq(schema.event.depositChainId, deposit.chainId),\n eq(schema.event.eventName, 'deposit_funds_added')\n ))\n .orderBy(desc(schema.event.orderId)),\n\n // DepositRetainOnEmptyUpdated events (V3 only, from generic event table)\n db.select().from(schema.event)\n .where(and(\n eq(schema.event.depositEscrow, deposit.escrow),\n eq(schema.event.depositLocalId, deposit.localId),\n eq(schema.event.depositChainId, deposit.chainId),\n eq(schema.event.eventName, 'deposit_retain_on_empty_updated')\n ))\n .orderBy(desc(schema.event.orderId)),\n\n // DepositStats (pre-computed aggregate stats, nullable for unindexed deposits)\n db.select().from(schema.depositStats)\n .where(and(\n eq(schema.depositStats.depositEscrow, deposit.escrow),\n eq(schema.depositStats.depositLocalId, deposit.localId),\n eq(schema.depositStats.depositChainId, deposit.chainId)\n ))\n .limit(1),\n ])\n\n // Get blocks for all transactions\n const transactionIds = new Set([\n deposit.transactionId,\n ...depositReceiveds.map(d => d.transactionId),\n ...depositWithdrawns.map(d => d.transactionId),\n ...depositCloseds.map(d => d.transactionId),\n ...depositCurrencyAddeds.map(d => d.transactionId),\n ...depositConversionRateUpdateds.map(d => d.transactionId),\n ...intentSignaleds.map(i => i.transactionId),\n ...intentPruneds.map(i => i.transactionId),\n ...intentFulfilleds.map(i => i.transactionId),\n ...depositIntentAmountRangeUpdateds.map(e => e.transactionId),\n ...depositFundsAddeds.map(e => e.transactionId),\n ...depositRetainOnEmptyUpdateds.map(e => e.transactionId),\n ])\n\n // Get all participant addresses\n const participantAddresses = new Set([\n deposit.participantAddress,\n ...depositReceiveds.map(d => d.participantAddress),\n ...depositWithdrawns.map(d => d.participantAddress),\n ...depositCloseds.map(d => d.participantAddress),\n ...depositCurrencyAddeds.map(d => d.participantAddress),\n ...intentSignaleds.map(i => i.toAddress),\n ...intentPruneds.map(i => i.participantAddress),\n ...intentFulfilleds.map(i => i.participantAddress),\n ...depositIntentAmountRangeUpdateds.map(e => e.participantAddress),\n ...depositFundsAddeds.map(e => e.participantAddress),\n ...depositRetainOnEmptyUpdateds.map(e => e.participantAddress),\n ])\n\n const transactionIdsArray = Array.from(transactionIds)\n const participantAddressesArray = Array.from(participantAddresses)\n\n // Collect intentHashes from fulfilled intents for paymentVerified lookup\n const fulfilledIntentHashes = intentFulfilleds.map(i => i.intentHash)\n\n const [transactions, participants, paymentVerifieds] = await Promise.all([\n queryInChunks(transactionIdsArray, (chunk) =>\n db.select().from(schema.transaction).where(inArray(schema.transaction.orderId, chunk))\n ),\n queryInChunks(participantAddressesArray, (chunk) =>\n db.select().from(schema.participant).where(inArray(schema.participant.address, chunk))\n ),\n // PaymentVerified - fiat payment details for fulfilled intents\n fulfilledIntentHashes.length > 0\n ? queryInChunks(fulfilledIntentHashes, (chunk) =>\n db.select().from(schema.paymentVerified).where(inArray(schema.paymentVerified.intentHash, chunk))\n )\n : Promise.resolve([]),\n ])\n\n const blockIds = transactions.map(t => t.blockId)\n const blocks = await queryInChunks(blockIds, (chunk) =>\n db.select().from(schema.block).where(inArray(schema.block.orderId, chunk))\n )\n\n // Create lookup maps\n const blockMap = new Map(blocks.map(b => [b.orderId, b]))\n const transactionMap = new Map(transactions.map(t => [t.orderId, { ...t, block: blockMap.get(t.blockId) }]))\n const participantMap = new Map(participants.map(p => [p.address, p]))\n\n // Map depositDelta by logId (for depositReceived, depositWithdrawn which share logId)\n const depositDeltaByLogId = new Map(depositDeltas.map(d => [d.logId, d]))\n\n // Map fundsUnlockedAndTransferred by intentHash (to bridge intentFulfilled -> depositDelta)\n const fundsUnlockedByIntentHash = new Map(fundsUnlockedAndTransferreds.map(f => [f.intentHash, f]))\n\n // Map fundsLocked by intentHash (contains on-chain expiryTime for each intent)\n const fundsLockedByIntentHash = new Map(fundsLockeds.map(f => [f.intentHash, f]))\n\n // Map paymentVerified by intentHash (fiat payment details for fulfilled intents)\n const paymentVerifiedByIntentHash = new Map(paymentVerifieds.map(p => [p.intentHash, p]))\n\n // For intentFulfilled, we need to go: intentFulfilled.intentHash -> fundsUnlockedAndTransferred -> depositDelta (via logId)\n const getDepositDeltaForIntent = (intentHash: Hex) => {\n const fundsUnlocked = fundsUnlockedByIntentHash.get(intentHash)\n if (!fundsUnlocked) return undefined\n return depositDeltaByLogId.get(fundsUnlocked.logId)\n }\n\n // Get owner participant\n const owner = participantMap.get(deposit.participantAddress) || null\n\n /**\n * Creates a partial cache key for local Map lookups within this deposit's context.\n * NOT a full compound primary key - deposit fields (escrow, localId, chainId) are already constrained.\n */\n const makePartialCurrencyCacheKey = (paymentMethodId: Hex, currency: Hex): Hex =>\n concatHex([paymentMethodId, currency])\n\n /**\n * Creates a partial cache key for local Map lookups within this deposit's context.\n * NOT a full compound primary key - deposit fields (escrow, localId, chainId) are already constrained.\n */\n const makePartialRateCacheKey = (paymentMethodId: Hex, currency: Hex, changeId: number): Hex =>\n concatHex([paymentMethodId, currency, numberToHex(changeId, { size: 4 })])\n\n /**\n * Build lookup maps for depositCurrencyAdded records by their partial cache key.\n * This allows us to use the actual orderId values instead of synthetic IDs.\n */\n const depositCurrencyAddedByKey = new Map(\n depositCurrencyAddeds.map(d => [makePartialCurrencyCacheKey(d.paymentMethodId, d.currency), d])\n )\n\n /**\n * Get the depositCurrencyAddedId (orderId) for a given paymentMethodId and currency.\n * Returns the actual orderId from the indexed record, falling back to cache key if not found.\n */\n const getDepositCurrencyAddedId = (paymentMethodId: Hex, currency: Hex): Hex => {\n const record = depositCurrencyAddedByKey.get(makePartialCurrencyCacheKey(paymentMethodId, currency))\n return record?.orderId ?? makePartialCurrencyCacheKey(paymentMethodId, currency)\n }\n\n // Build a map of depositConversionRateUpdated by partial cache key for lookup\n const conversionRateByKey = new Map(\n depositConversionRateUpdateds.map(d => [\n makePartialRateCacheKey(d.paymentMethodId, d.currency, d.changeId),\n d\n ])\n )\n\n // Construct deposit with relations (SQL format - direct arrays, not .items)\n // Create the serialized depositId from compound key components\n const depositId = orderId.deposit.serialize({\n escrow: deposit.escrow,\n chainId: deposit.chainId,\n depositId: deposit.localId,\n })\n const result = {\n ...deposit,\n depositId, // Serialized compound key for orderId.deposit.parse()\n owner,\n transaction: transactionMap.get(deposit.transactionId) || null,\n depositReceiveds: depositReceiveds.map(d => ({\n ...d,\n depositId: deposit.orderId,\n transaction: transactionMap.get(d.transactionId),\n participant: participantMap.get(d.participantAddress),\n depositDelta: depositDeltaByLogId.get(d.logId),\n })),\n depositWithdrawns: depositWithdrawns.map(d => ({\n ...d,\n transaction: transactionMap.get(d.transactionId),\n participant: participantMap.get(d.participantAddress),\n depositDelta: depositDeltaByLogId.get(d.logId),\n })),\n depositCloseds: depositCloseds.map(d => ({\n ...d,\n transaction: transactionMap.get(d.transactionId),\n participant: participantMap.get(d.participantAddress),\n })),\n depositCurrencyAddeds: depositCurrencyAddeds.map(d => {\n // Look up the current conversion rate for this currency/payment method\n const currentConversionRateChangeId = d.currentConversionRateChangeId ?? d.currentMinConversionRateChangeId ?? 0\n const rateKey = makePartialRateCacheKey(d.paymentMethodId, d.currency, currentConversionRateChangeId)\n const currentRate = conversionRateByKey.get(rateKey)\n return {\n ...d,\n // Use actual orderId as the depositCurrencyAddedId\n depositCurrencyAddedId: d.orderId,\n transaction: transactionMap.get(d.transactionId),\n participant: participantMap.get(d.participantAddress),\n // Add the current conversion rate for display purposes\n currentDepositConversionRateUpdated: currentRate ? {\n ...currentRate,\n transaction: transactionMap.get(currentRate.transactionId),\n depositConversionRateUpdatedId: currentRate.orderId,\n depositCurrencyAddedId: d.orderId,\n } : null,\n }\n }),\n depositVerifierAddeds,\n depositConversionRateUpdateds: depositConversionRateUpdateds.map(d => ({\n ...d,\n transaction: transactionMap.get(d.transactionId),\n // Use actual orderId for rate, look up depositCurrencyAdded's orderId for the currency reference\n depositConversionRateUpdatedId: d.orderId,\n depositCurrencyAddedId: getDepositCurrencyAddedId(d.paymentMethodId, d.currency),\n depositId, // Serialized compound key for orderId.deposit.parse()\n depositVerifierAddedId: d.paymentMethodId, // verifier ID is just the payment method\n })),\n intentSignaleds: intentSignaleds.map(i => ({\n ...i,\n transaction: transactionMap.get(i.transactionId),\n verifier: i.paymentMethodId,\n participant: participantMap.get(i.toAddress),\n // Include fundsLocked for on-chain expiryTime\n fundsLocked: fundsLockedByIntentHash.get(i.intentHash),\n // Use actual IDs from indexed records\n depositCurrencyAddedId: getDepositCurrencyAddedId(i.paymentMethodId, i.fiatCurrency),\n depositConversionRateUpdatedId: (i.conversionRateChangeId !== null && i.conversionRateChangeId !== undefined)\n ? conversionRateByKey.get(makePartialRateCacheKey(i.paymentMethodId, i.fiatCurrency, i.conversionRateChangeId))?.orderId ?? null\n : null,\n })),\n intentPruneds: intentPruneds.map(i => ({\n ...i,\n depositId: deposit.orderId,\n transaction: transactionMap.get(i.transactionId),\n participant: participantMap.get(i.participantAddress),\n })),\n intentFulfilleds: intentFulfilleds.map(i => {\n // Strategy for getting conversion rate:\n // 1. Use conversionRateChangeId lookup for V2 intents\n // 2. Use intentFulfilled.conversionRate directly (new field) or intentSignaled fallback\n const rateKey = (i.conversionRateChangeId !== null && i.conversionRateChangeId !== undefined)\n ? makePartialRateCacheKey(i.paymentMethodId, i.fiatCurrency, i.conversionRateChangeId)\n : null\n let conversionRate = rateKey ? conversionRateByKey.get(rateKey) ?? null : null\n\n // Fallback: use intentFulfilled.conversionRate directly or intentSignaled for old data\n if (!conversionRate) {\n const intentSignaled = intentSignaleds.find(s => s.intentHash === i.intentHash)\n const rateValue = i.conversionRate ?? intentSignaled?.conversionRate\n if (rateValue) {\n // Create synthetic rate object - contains essential fields for UI (value, currency, verifier)\n // Cast through unknown to bypass type checking since this is a synthetic object\n conversionRate = {\n depositEscrow: deposit.escrow,\n depositLocalId: deposit.localId,\n depositChainId: deposit.chainId,\n paymentMethodId: i.paymentMethodId,\n currency: i.fiatCurrency,\n changeId: -1,\n value: rateValue,\n orderId: '0x' as Hex,\n logId: '0x' as Hex,\n transactionId: '0x' as Hex,\n verifier: i.paymentMethodId,\n active: false,\n transaction: undefined,\n depositConversionRateUpdatedId: '0x' as Hex,\n depositCurrencyAddedId: getDepositCurrencyAddedId(i.paymentMethodId, i.fiatCurrency),\n depositId,\n depositVerifierAddedId: i.paymentMethodId,\n } as unknown as typeof conversionRate\n }\n }\n return {\n ...i,\n transaction: transactionMap.get(i.transactionId),\n depositConversionRateUpdated: conversionRate,\n participant: participantMap.get(i.participantAddress),\n depositDelta: getDepositDeltaForIntent(i.intentHash),\n paymentVerified: paymentVerifiedByIntentHash.get(i.intentHash) ?? null,\n // Use actual IDs from indexed records\n depositCurrencyAddedId: getDepositCurrencyAddedId(i.paymentMethodId, i.fiatCurrency),\n depositConversionRateUpdatedId: conversionRate?.orderId ?? null,\n }\n }),\n depositIntentAmountRangeUpdateds: depositIntentAmountRangeUpdateds.map(e => ({\n ...e,\n transaction: transactionMap.get(e.transactionId),\n participant: participantMap.get(e.participantAddress),\n })),\n depositFundsAddeds: depositFundsAddeds.map(e => ({\n ...e,\n transaction: transactionMap.get(e.transactionId),\n participant: participantMap.get(e.participantAddress),\n depositDelta: depositDeltaByLogId.get(e.logId),\n })),\n depositRetainOnEmptyUpdateds: depositRetainOnEmptyUpdateds.map(e => ({\n ...e,\n transaction: transactionMap.get(e.transactionId),\n participant: participantMap.get(e.participantAddress),\n })),\n depositStats: depositStatsRows[0] ?? null,\n }\n // Attach resolved-via-unlock hashes outside the typed return (not part of PonderDeposit type)\n ;(result as unknown as Record<string, unknown>)._resolvedViaUnlock = fundsUnlockeds.map(u => u.intentHash)\n return result\n}\n\n/**\n * Get deposits for a specific participant (user address).\n * Fetches essential relations needed for filtering and display in list views.\n * Use getDepositByCompoundKey for full data with all relations.\n */\nexport async function getDepositsByParticipant(participantAddress: Hex, chainId?: ChainId) {\n const db = ponderClient.db\n\n const conditions = [eq(schema.deposit.participantAddress, participantAddress)]\n if (chainId) {\n conditions.push(eq(schema.deposit.chainId, BigInt(chainId)))\n }\n\n // Get base deposits\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(and(...conditions))\n .orderBy(desc(schema.deposit.orderId))\n\n if (deposits.length === 0) {\n return []\n }\n\n // Build compound key conditions for all deposits to batch-fetch relations\n const depositConditions = deposits.map(d =>\n and(\n eq(schema.intentFulfilled.depositEscrow, d.escrow),\n eq(schema.intentFulfilled.depositLocalId, d.localId),\n eq(schema.intentFulfilled.depositChainId, d.chainId)\n )\n )\n\n const withdrawnConditions = deposits.map(d =>\n and(\n eq(schema.depositWithdrawn.depositEscrow, d.escrow),\n eq(schema.depositWithdrawn.depositLocalId, d.localId),\n eq(schema.depositWithdrawn.depositChainId, d.chainId)\n )\n )\n\n const closedConditions = deposits.map(d =>\n and(\n eq(schema.depositClosed.depositEscrow, d.escrow),\n eq(schema.depositClosed.depositLocalId, d.localId),\n eq(schema.depositClosed.depositChainId, d.chainId)\n )\n )\n\n const receivedConditions = deposits.map(d =>\n and(\n eq(schema.depositReceived.depositEscrow, d.escrow),\n eq(schema.depositReceived.depositLocalId, d.localId),\n eq(schema.depositReceived.depositChainId, d.chainId)\n )\n )\n\n const conversionRateConditions = deposits.map(d =>\n and(\n eq(schema.depositConversionRateUpdated.depositEscrow, d.escrow),\n eq(schema.depositConversionRateUpdated.depositLocalId, d.localId),\n eq(schema.depositConversionRateUpdated.depositChainId, d.chainId)\n )\n )\n\n const currencyAddedConditions = deposits.map(d =>\n and(\n eq(schema.depositCurrencyAdded.depositEscrow, d.escrow),\n eq(schema.depositCurrencyAdded.depositLocalId, d.localId),\n eq(schema.depositCurrencyAdded.depositChainId, d.chainId)\n )\n )\n\n const signaledConditions = deposits.map(d =>\n and(\n eq(schema.intentSignaled.depositEscrow, d.escrow),\n eq(schema.intentSignaled.depositLocalId, d.localId),\n eq(schema.intentSignaled.depositChainId, d.chainId)\n )\n )\n\n const prunedConditions = deposits.map(d =>\n and(\n eq(schema.intentPruned.depositEscrow, d.escrow),\n eq(schema.intentPruned.depositLocalId, d.localId),\n eq(schema.intentPruned.depositChainId, d.chainId)\n )\n )\n\n // Batch fetch essential relations in parallel (including conversion rates for profit calc)\n // Also fetch transactions and blocks for timestamps\n const transactionIds = deposits.map(d => d.transactionId)\n const [intentFulfilleds, depositWithdrawns, depositCloseds, depositReceiveds, depositConversionRateUpdateds, depositCurrencyAddeds, intentSignaledsAll, intentPrunedsAll, transactions, participants] = await Promise.all([\n db.select().from(schema.intentFulfilled).where(or(...depositConditions)),\n db.select().from(schema.depositWithdrawn).where(or(...withdrawnConditions)),\n db.select().from(schema.depositClosed).where(or(...closedConditions)),\n db.select().from(schema.depositReceived).where(or(...receivedConditions)),\n db.select().from(schema.depositConversionRateUpdated).where(or(...conversionRateConditions)),\n db.select().from(schema.depositCurrencyAdded).where(or(...currencyAddedConditions)),\n db.select().from(schema.intentSignaled).where(or(...signaledConditions)),\n db.select().from(schema.intentPruned).where(or(...prunedConditions)),\n db.select().from(schema.transaction).where(inArray(schema.transaction.orderId, transactionIds)),\n // Fetch participants (owners) for all deposits\n db.select().from(schema.participant).where(eq(schema.participant.address, participantAddress)),\n ])\n\n // Build lookup map for intentSignaled by intentHash (for conversion rate fallback)\n const intentSignaledByHash = new Map(intentSignaledsAll.map(i => [i.intentHash, i]))\n\n // Fetch blocks for transactions\n const blockIds = transactions.map(t => t.blockId)\n const blocks = blockIds.length > 0\n ? await db.select().from(schema.block).where(inArray(schema.block.orderId, blockIds))\n : []\n\n // Build lookup maps for transactions and blocks\n const blockMap = new Map(blocks.map(b => [b.orderId, b]))\n const transactionMap = new Map(transactions.map(t => [t.orderId, { ...t, block: blockMap.get(t.blockId) }]))\n\n // Get the owner (participant) for these deposits\n const owner = participants[0] ?? null\n\n /**\n * Creates a local cache key for currency lookups across multiple deposits.\n * Includes full deposit compound key since we're matching across deposits.\n */\n const makeCurrencyCacheKey = (escrow: Hex, localId: bigint, chainId: bigint, paymentMethodId: Hex, currency: Hex): Hex =>\n concatHex([escrow, numberToHex(localId, { size: 8 }), numberToHex(chainId, { size: 4 }), paymentMethodId, currency])\n\n /**\n * Creates a local cache key for rate lookups across multiple deposits.\n * Includes full deposit compound key since we're matching across deposits.\n */\n const makeRateCacheKey = (escrow: Hex, localId: bigint, chainId: bigint, paymentMethodId: Hex, currency: Hex, changeId: number): Hex =>\n concatHex([escrow, numberToHex(localId, { size: 8 }), numberToHex(chainId, { size: 4 }), paymentMethodId, currency, numberToHex(changeId, { size: 4 })])\n\n // Build lookup map for depositCurrencyAdded by cache key to get actual orderId\n const depositCurrencyAddedByKey = new Map(\n depositCurrencyAddeds.map(d => [\n makeCurrencyCacheKey(d.depositEscrow, d.depositLocalId, d.depositChainId, d.paymentMethodId, d.currency),\n d\n ])\n )\n const getDepositCurrencyAddedId = (escrow: Hex, localId: bigint, chainId: bigint, paymentMethodId: Hex, currency: Hex): Hex => {\n const record = depositCurrencyAddedByKey.get(makeCurrencyCacheKey(escrow, localId, chainId, paymentMethodId, currency))\n return record?.orderId ?? makeCurrencyCacheKey(escrow, localId, chainId, paymentMethodId, currency)\n }\n\n // Build lookup map for depositConversionRateUpdated by cache key\n const conversionRateByKey = new Map(\n depositConversionRateUpdateds.map(d => [\n makeRateCacheKey(d.depositEscrow, d.depositLocalId, d.depositChainId, d.paymentMethodId, d.currency, d.changeId),\n d\n ])\n )\n\n /**\n * Creates a local cache key for grouping records by deposit compound key.\n */\n const makeDepositCacheKey = (escrow: Hex, localId: bigint, chainId: bigint): Hex =>\n concatHex([escrow, numberToHex(localId, { size: 8 }), numberToHex(chainId, { size: 4 })])\n\n const intentsByDeposit = new Map<Hex, typeof intentFulfilleds>()\n for (const intent of intentFulfilleds) {\n const key = makeDepositCacheKey(intent.depositEscrow, intent.depositLocalId, intent.depositChainId)\n const existing = intentsByDeposit.get(key) || []\n existing.push(intent)\n intentsByDeposit.set(key, existing)\n }\n\n const signaledsByDeposit = new Map<Hex, typeof intentSignaledsAll>()\n for (const signaled of intentSignaledsAll) {\n const key = makeDepositCacheKey(signaled.depositEscrow, signaled.depositLocalId, signaled.depositChainId)\n const existing = signaledsByDeposit.get(key) || []\n existing.push(signaled)\n signaledsByDeposit.set(key, existing)\n }\n\n const prunedsByDeposit = new Map<Hex, typeof intentPrunedsAll>()\n for (const pruned of intentPrunedsAll) {\n const key = makeDepositCacheKey(pruned.depositEscrow, pruned.depositLocalId, pruned.depositChainId)\n const existing = prunedsByDeposit.get(key) || []\n existing.push(pruned)\n prunedsByDeposit.set(key, existing)\n }\n\n const withdrawnsByDeposit = new Map<Hex, typeof depositWithdrawns>()\n for (const withdrawn of depositWithdrawns) {\n const key = makeDepositCacheKey(withdrawn.depositEscrow, withdrawn.depositLocalId, withdrawn.depositChainId)\n const existing = withdrawnsByDeposit.get(key) || []\n existing.push(withdrawn)\n withdrawnsByDeposit.set(key, existing)\n }\n\n const closedsByDeposit = new Map<Hex, typeof depositCloseds>()\n for (const closed of depositCloseds) {\n const key = makeDepositCacheKey(closed.depositEscrow, closed.depositLocalId, closed.depositChainId)\n const existing = closedsByDeposit.get(key) || []\n existing.push(closed)\n closedsByDeposit.set(key, existing)\n }\n\n const receivedsByDeposit = new Map<Hex, typeof depositReceiveds>()\n for (const received of depositReceiveds) {\n const key = makeDepositCacheKey(received.depositEscrow, received.depositLocalId, received.depositChainId)\n const existing = receivedsByDeposit.get(key) || []\n existing.push(received)\n receivedsByDeposit.set(key, existing)\n }\n\n // Return deposits with relations (ponder format - arrays for Deposit class detection)\n return deposits.map(deposit => {\n const key = makeDepositCacheKey(deposit.escrow, deposit.localId, deposit.chainId)\n // Create the serialized depositId from compound key components\n const depositId = orderId.deposit.serialize({\n escrow: deposit.escrow,\n chainId: deposit.chainId,\n depositId: deposit.localId,\n })\n return {\n ...deposit,\n depositId,\n owner,\n transaction: transactionMap.get(deposit.transactionId) ?? null,\n // Essential relations for filtering and display\n depositReceiveds: (receivedsByDeposit.get(key) || []).map(r => ({\n ...r,\n depositId: deposit.orderId,\n transaction: undefined,\n participant: undefined,\n depositDelta: undefined,\n })),\n depositWithdrawns: (withdrawnsByDeposit.get(key) || []).map(w => ({\n ...w,\n depositId: deposit.orderId,\n transaction: undefined,\n participant: undefined,\n depositDelta: undefined,\n })),\n depositCloseds: (closedsByDeposit.get(key) || []).map(c => ({\n ...c,\n depositId: deposit.orderId,\n transaction: undefined,\n participant: undefined,\n })),\n intentFulfilleds: (intentsByDeposit.get(key) || []).map(i => {\n // Strategy for getting conversion rate (in order of preference):\n // 1. Use conversionRateChangeId lookup for V2 intents (links to depositConversionRateUpdated)\n // 2. Use intentFulfilled.conversionRate directly (new field, populated for all new intents)\n // 3. Fallback to intentSignaled.conversionRate for old V3 intents (pre-migration)\n const rateKey = (i.conversionRateChangeId !== null && i.conversionRateChangeId !== undefined)\n ? makeRateCacheKey(i.depositEscrow, i.depositLocalId, i.depositChainId, i.paymentMethodId, i.fiatCurrency, i.conversionRateChangeId)\n : null\n let conversionRate = rateKey ? conversionRateByKey.get(rateKey) ?? null : null\n\n // If no rate from changeId lookup, try using the direct conversionRate field or intentSignaled fallback\n if (!conversionRate) {\n // Prefer intentFulfilled.conversionRate (new field), fallback to intentSignaled for old data\n const rateValue = i.conversionRate ?? intentSignaledByHash.get(i.intentHash)?.conversionRate\n if (rateValue) {\n // Create synthetic rate object - contains essential fields for UI (value, currency, verifier)\n // Cast through unknown to bypass type checking since this is a synthetic object\n conversionRate = {\n depositEscrow: i.depositEscrow,\n depositLocalId: i.depositLocalId,\n depositChainId: i.depositChainId,\n paymentMethodId: i.paymentMethodId,\n currency: i.fiatCurrency,\n changeId: -1,\n value: rateValue,\n orderId: '0x' as Hex,\n logId: '0x' as Hex,\n transactionId: '0x' as Hex,\n verifier: i.paymentMethodId,\n active: false,\n transaction: undefined,\n depositConversionRateUpdatedId: '0x' as Hex,\n depositCurrencyAddedId: getDepositCurrencyAddedId(i.depositEscrow, i.depositLocalId, i.depositChainId, i.paymentMethodId, i.fiatCurrency),\n depositId: deposit.orderId,\n depositVerifierAddedId: i.paymentMethodId,\n } as unknown as typeof conversionRate\n }\n }\n return {\n ...i,\n depositId: deposit.orderId,\n transaction: undefined,\n depositConversionRateUpdated: conversionRate,\n participant: undefined,\n depositDelta: undefined,\n paymentVerified: null,\n // Use actual IDs from indexed records\n depositCurrencyAddedId: getDepositCurrencyAddedId(i.depositEscrow, i.depositLocalId, i.depositChainId, i.paymentMethodId, i.fiatCurrency),\n depositConversionRateUpdatedId: conversionRate?.orderId ?? null,\n }\n }),\n intentSignaleds: (signaledsByDeposit.get(key) || []).map(s => ({\n ...s,\n depositId: deposit.orderId,\n transaction: undefined,\n participant: undefined,\n toParticipant: undefined,\n })),\n intentPruneds: (prunedsByDeposit.get(key) || []).map(p => ({\n ...p,\n depositId: deposit.orderId,\n transaction: undefined,\n participant: undefined,\n })),\n // Empty arrays for non-essential relations in list view\n depositCurrencyAddeds: [] as never[],\n depositVerifierAddeds: [] as never[],\n depositConversionRateUpdateds: [] as never[],\n depositIntentAmountRangeUpdateds: [] as never[],\n depositFundsAddeds: [] as never[],\n }\n })\n}\n\n/**\n * Get all verifiers for a deposit by its orderId\n * Returns the depositVerifierAdded records for the deposit\n */\nexport async function getVerifiersByDepositId(depositOrderId: Hex) {\n const db = ponderClient.db\n\n // First get the deposit to extract compound key\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(eq(schema.deposit.orderId, depositOrderId))\n .limit(1)\n\n const deposit = deposits[0]\n if (!deposit) return []\n\n const result = await db\n .select()\n .from(schema.depositVerifierAdded)\n .where(\n and(\n eq(schema.depositVerifierAdded.depositEscrow, deposit.escrow),\n eq(schema.depositVerifierAdded.depositLocalId, deposit.localId),\n eq(schema.depositVerifierAdded.depositChainId, deposit.chainId)\n )\n )\n .orderBy(desc(schema.depositVerifierAdded.orderId))\n\n return result\n}\n\n/**\n * Get payee details for a deposit and payment method.\n * @param serializedDepositKey - The serialized deposit compound key from orderId.deposit.serialize()\n * @param paymentMethodId - The payment method ID (bytes32 hash)\n * @returns The depositVerifierAdded record or null if not found\n */\nexport async function getPayeeDetails(serializedDepositKey: Hex, paymentMethodId: Hex) {\n const db = ponderClient.db\n\n // Validate inputs\n if (!serializedDepositKey) {\n console.error('[ponderQueries] getPayeeDetails: serializedDepositKey is undefined!')\n return null\n }\n if (!paymentMethodId) {\n console.error('[ponderQueries] getPayeeDetails: paymentMethodId is undefined!')\n return null\n }\n\n // Parse the serialized deposit key to extract compound key components\n const { escrow, depositId, chainId } = orderId.deposit.parse(serializedDepositKey)\n\n // Query depositVerifierAdded directly using the compound key\n const result = await db\n .select()\n .from(schema.depositVerifierAdded)\n .where(\n and(\n eq(schema.depositVerifierAdded.depositEscrow, escrow),\n eq(schema.depositVerifierAdded.depositLocalId, depositId),\n eq(schema.depositVerifierAdded.depositChainId, BigInt(chainId)),\n eq(schema.depositVerifierAdded.paymentMethodId, paymentMethodId)\n )\n )\n .limit(1)\n\n return result[0] ?? null\n}\n\n/**\n * Get transaction by hash\n */\nexport async function getTransactionByHash(hash: Hex) {\n const db = ponderClient.db\n\n const result = await db\n .select()\n .from(schema.transaction)\n .where(eq(schema.transaction.hash, hash))\n .limit(1)\n\n return result[0] ?? null\n}\n\n/**\n * Get active deposits (status = 'active')\n */\nexport async function getActiveDeposits(chainId?: ChainId) {\n const db = ponderClient.db\n\n const conditions = [eq(schema.deposit.status, 'active')]\n if (chainId) {\n conditions.push(eq(schema.deposit.chainId, BigInt(chainId)))\n }\n\n return await db\n .select()\n .from(schema.deposit)\n .where(and(...conditions))\n .orderBy(desc(schema.deposit.orderId))\n}\n\n/**\n * Get deposits with conversion rates\n */\nexport async function getDepositsWithRates(params: {\n chainId?: ChainId\n status?: string\n minAmount?: bigint\n maxAmount?: bigint\n currencies?: Hex[]\n}) {\n const db = ponderClient.db\n\n const conditions = []\n\n if (params.status) {\n conditions.push(eq(schema.deposit.status, params.status as any))\n }\n\n if (params.chainId) {\n conditions.push(eq(schema.deposit.chainId, BigInt(params.chainId)))\n }\n\n if (params.minAmount !== undefined) {\n conditions.push(sql`${schema.deposit.remaining} >= ${params.minAmount}`)\n }\n\n if (params.maxAmount !== undefined) {\n conditions.push(sql`${schema.deposit.remaining} <= ${params.maxAmount}`)\n }\n\n if (params.currencies && params.currencies.length > 0) {\n // Filter by currencies in depositConversionRateCurrencies array\n conditions.push(sql`${schema.deposit.depositConversionRateCurrencies} && ARRAY[${params.currencies}]::text[]`)\n }\n\n return await db\n .select()\n .from(schema.deposit)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(schema.deposit.orderId))\n}\n\n/**\n * Get intent signals for a deposit\n * Pass the deposit's orderId\n */\nexport async function getIntentSignals(depositOrderId: Hex) {\n const db = ponderClient.db\n\n // First get deposit compound key\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(eq(schema.deposit.orderId, depositOrderId))\n .limit(1)\n\n const deposit = deposits[0]\n if (!deposit) return []\n\n return await db\n .select()\n .from(schema.intentSignaled)\n .where(\n and(\n eq(schema.intentSignaled.depositEscrow, deposit.escrow),\n eq(schema.intentSignaled.depositLocalId, deposit.localId),\n eq(schema.intentSignaled.depositChainId, deposit.chainId)\n )\n )\n .orderBy(desc(schema.intentSignaled.orderId))\n}\n\n/**\n * Get intent by hash from the indexer, including expiry time via fundsLocked relation.\n *\n * @param intentHash - The intent hash (bytes32)\n * @param chainId - Optional chain ID to filter by (required for cross-chain support)\n * @returns The intent signaled record with fundsLocked relation or null\n *\n * @remarks\n * If chainId is not provided, returns the first intent found with the given hash.\n * For proper cross-chain support, always provide the chainId to avoid ambiguity.\n */\nexport async function getIntentByHash(intentHash: Hex, chainId?: ChainId) {\n const db = ponderClient.db\n\n // Normalize to lowercase - indexer stores hex values in lowercase\n const normalizedHash = intentHash.toLowerCase() as Hex\n\n // Build where clause - include chainId if provided\n const whereClause = chainId\n ? and(\n eq(schema.intentSignaled.intentHash, normalizedHash),\n eq(schema.intentSignaled.depositChainId, BigInt(chainId))\n )\n : eq(schema.intentSignaled.intentHash, normalizedHash)\n\n // Use Ponder's relational query to include fundsLocked with expiryTime\n const intent = await db.query.intentSignaled.findFirst({\n where: whereClause,\n with: {\n fundsLocked: true,\n },\n })\n\n return intent ?? null\n}\n\n/**\n * Get stats for analytics\n */\nexport async function getStats(params: {\n chainId?: ChainId\n startTime?: bigint\n endTime?: bigint\n type?: string\n}) {\n const db = ponderClient.db\n\n const conditions = []\n\n if (params.chainId) {\n conditions.push(eq(schema.stat.chainId, BigInt(params.chainId)))\n }\n\n if (params.startTime !== undefined) {\n conditions.push(sql`${schema.stat.timestamp} >= ${params.startTime}`)\n }\n\n if (params.endTime !== undefined) {\n conditions.push(sql`${schema.stat.timestamp} <= ${params.endTime}`)\n }\n\n if (params.type) {\n conditions.push(eq(schema.stat.event, params.type as any))\n }\n\n return await db\n .select()\n .from(schema.stat)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(schema.stat.timestamp))\n}\n\n/**\n * Represents a location where a deposit with a specific localId exists\n */\nexport type DepositLocation = EscrowLocation & {\n deposit: {\n orderId: Hex\n localId: bigint\n status: string\n remaining: bigint\n }\n}\n\n/**\n * Find all locations where a deposit with a given localId exists.\n * Searches across all escrow contracts on all chains and versions.\n *\n * This is useful when a user navigates to a deposit by ID alone,\n * since the same localId can exist on different escrow contracts.\n *\n * @param localId - The deposit's local ID (numeric ID within an escrow)\n * @returns Array of locations where this deposit exists\n *\n * @example\n * // Find all escrows that have deposit #989\n * const locations = await findDepositLocations(989n)\n * // Returns locations on v2/base, v3/base, etc. if they exist\n */\nexport async function findDepositLocations(localId: bigint): Promise<DepositLocation[]> {\n const db = ponderClient.db\n const escrows = getAllEscrowContracts()\n\n // Build conditions for all escrow/chain combinations\n const conditions = escrows.map(loc =>\n and(\n eq(schema.deposit.escrow, loc.escrow),\n eq(schema.deposit.localId, localId),\n eq(schema.deposit.chainId, BigInt(loc.chainId))\n )\n )\n\n if (conditions.length === 0) {\n return []\n }\n\n // Query for all matching deposits across all escrows\n const deposits = await db\n .select({\n orderId: schema.deposit.orderId,\n localId: schema.deposit.localId,\n escrow: schema.deposit.escrow,\n chainId: schema.deposit.chainId,\n status: schema.deposit.status,\n remaining: schema.deposit.remaining,\n })\n .from(schema.deposit)\n .where(or(...conditions))\n\n // Map results back to escrow locations\n const escrowMap = new Map(\n escrows.map(loc => [`${loc.escrow.toLowerCase()}-${loc.chainId}`, loc])\n )\n\n return deposits.map(deposit => {\n const key = `${deposit.escrow.toLowerCase()}-${deposit.chainId}`\n const location = escrowMap.get(key)!\n return {\n ...location,\n deposit: {\n orderId: deposit.orderId as Hex,\n localId: deposit.localId,\n status: deposit.status,\n remaining: deposit.remaining,\n }\n }\n })\n}\n\n/**\n * User reputation stats for tier calculation.\n * Volume is measured in USDC which is 1:1 with USD.\n */\nexport interface UserReputationStats {\n /** Total fulfilled volume in USDC (6 decimals, 1:1 with USD) */\n fulfilledVolumeUsdc: number\n /** Number of fulfilled intents */\n fulfilledCount: number\n /** Number of late cancellations (pruned >15min after signal) */\n lateCancellations: number\n /** Total intents signaled */\n totalSignaled: number\n /** Total cancelled volume in USDC */\n cancelledVolumeUsdc: number\n}\n\n/**\n * Get user reputation stats for tier calculation.\n * Reads from the pre-computed participantStats table (maintained incrementally\n * by IntentSignaled/Fulfilled/Pruned event handlers) instead of joining\n * across 4+ tables at query time.\n *\n * @param address - User's wallet address\n * @param chainId - Optional chain filter (omit to aggregate across all chains)\n * @returns User reputation stats\n */\nexport async function getUserReputationStats({\n address,\n chainId,\n}: {\n address: Hex\n chainId?: ChainId\n}): Promise<UserReputationStats> {\n const db = ponderClient.db\n const statsConditions = [eq(schema.participantStats.address, address)]\n if (chainId) {\n statsConditions.push(eq(schema.participantStats.chainId, BigInt(chainId)))\n }\n\n // Join intentSignaled (ownerIdx covers ownerAddress+chainId) → intentPruned (isLateCancellation flag)\n // intentSignaled.amount is the source — no need to denormalize onto intentPruned\n const pruneJoinConditions = [\n eq(schema.intentSignaled.ownerAddress, address),\n eq(schema.intentPruned.isLateCancellation, true),\n ]\n if (chainId) {\n pruneJoinConditions.push(eq(schema.intentSignaled.depositChainId, BigInt(chainId)))\n }\n\n const [statsRows, pruneRows] = await Promise.all([\n db.select().from(schema.participantStats).where(and(...statsConditions)),\n db\n .select({ amount: schema.intentSignaled.amount })\n .from(schema.intentSignaled)\n .innerJoin(\n schema.intentPruned,\n and(\n eq(schema.intentSignaled.intentHash, schema.intentPruned.intentHash),\n eq(schema.intentSignaled.depositChainId, schema.intentPruned.depositChainId)\n )\n )\n .where(and(...pruneJoinConditions)),\n ])\n\n // Aggregate pre-computed stats across all chains (or single chain if chainId provided)\n let fulfilledVolume = 0n\n let fulfilledCount = 0\n let lateCancellations = 0\n let totalSignaled = 0\n\n for (const row of statsRows) {\n fulfilledVolume += row.fulfilledVolume\n fulfilledCount += row.fulfilledCount\n lateCancellations += row.lateCancellations\n totalSignaled += row.totalSignaled\n }\n\n // Sum late cancellation amounts — intentSignaled.amount is the source of truth\n const cancelledVolume = pruneRows.reduce((sum, row) => sum + row.amount, 0n)\n\n return {\n fulfilledVolumeUsdc: Number(fulfilledVolume) / 1e6,\n fulfilledCount,\n lateCancellations,\n totalSignaled,\n cancelledVolumeUsdc: Number(cancelledVolume) / 1e6,\n }\n}\n\n/**\n * Get the timestamp of the user's last signaled intent.\n * Cooldowns start from when an intent is signaled, not when it's fulfilled.\n * Reads from participant.lastSignaledAt (maintained by IntentSignaled handler).\n *\n * @param address - User's wallet address\n * @param chainId - Chain ID (only Base for now since cooldowns only apply there)\n * @returns Timestamp in seconds of last signaled intent, or null if none\n */\nexport async function getLastSignaledIntentTimestamp({\n address,\n chainId,\n}: {\n address: Hex\n chainId: ChainId\n}): Promise<bigint | null> {\n const db = ponderClient.db\n\n const result = await db\n .select({ lastSignaledAt: schema.participant.lastSignaledAt })\n .from(schema.participant)\n .where(and(\n eq(schema.participant.address, address),\n eq(schema.participant.chainId, BigInt(chainId))\n ))\n .limit(1)\n\n return result[0]?.lastSignaledAt ?? null\n}\n\n/**\n * Get the timestamp when the user first signaled an intent on a specific chain.\n * Used to display \"Member Since\" date in the user profile.\n * Reads from participant.firstSeenAt (maintained by IntentSignaled handler).\n *\n * @param address - User's wallet address\n * @param chainId - Chain ID to check\n * @returns Date of first signaled intent, or null if none\n */\nexport async function getUserMemberSince({\n address,\n chainId,\n}: {\n address: Hex\n chainId: ChainId\n}): Promise<Date | null> {\n const db = ponderClient.db\n\n const result = await db\n .select({ firstSeenAt: schema.participant.firstSeenAt })\n .from(schema.participant)\n .where(and(\n eq(schema.participant.address, address),\n eq(schema.participant.chainId, BigInt(chainId))\n ))\n .limit(1)\n\n return result[0]?.firstSeenAt ? new Date(Number(result[0].firstSeenAt) * 1000) : null\n}\n\n/**\n * Information about a deposit for cross-chain detection.\n * Used to identify deposits across chains that share the same payment identity.\n */\nexport interface CrossChainDepositInfo {\n /** Escrow contract address */\n escrow: Hex\n /** Local deposit ID within the escrow */\n localId: bigint\n /** Chain ID where this deposit exists */\n chainId: ChainId\n /** Current deposit status */\n status: string\n /** Remaining balance in the deposit */\n remaining: bigint\n /** Payment method ID (keccak256 hash of provider key) */\n paymentMethodId: Hex\n}\n\n/**\n * Verifier input for cross-chain deposit queries.\n * Represents a single payment method on a deposit.\n */\nexport interface VerifierInput {\n payeeDetailsHash: Hex\n paymentMethodId: Hex\n}\n\n/**\n * Get all V3 deposits that share any of the given payee details hashes.\n * Used to detect cross-chain deposits for the same payment identity.\n *\n * Note: Only V3 deposits are considered. V2 deposits are excluded as they\n * use a different payment verification system.\n *\n * @param verifiers - Array of verifier inputs (payeeDetailsHash + paymentMethodId pairs)\n * @returns Array of V3 deposit info across all chains matching any of the payee details\n */\nexport async function getDepositsByPayeeDetails({\n verifiers,\n}: {\n verifiers: VerifierInput[]\n}): Promise<CrossChainDepositInfo[]> {\n const db = ponderClient.db\n if (verifiers.length === 0) {\n return []\n }\n\n // Build OR conditions for each verifier (match payeeDetailsHash AND paymentMethodId)\n const verifierConditions = verifiers.map(v =>\n and(\n eq(schema.depositVerifierAdded.payeeDetailsHash, v.payeeDetailsHash),\n eq(schema.depositVerifierAdded.paymentMethodId, v.paymentMethodId)\n )\n )\n\n // Query depositVerifierAdded records matching any of the verifiers\n const verifierRecords = await db\n .select({\n depositEscrow: schema.depositVerifierAdded.depositEscrow,\n depositLocalId: schema.depositVerifierAdded.depositLocalId,\n depositChainId: schema.depositVerifierAdded.depositChainId,\n paymentMethodId: schema.depositVerifierAdded.paymentMethodId,\n })\n .from(schema.depositVerifierAdded)\n .where(or(...verifierConditions))\n\n if (verifierRecords.length === 0) {\n return []\n }\n\n // Build conditions to fetch deposit details for all matching records\n // Only include V3 deposits - V2 uses a different payment verification system\n const depositConditions = verifierRecords.map(v =>\n and(\n eq(schema.deposit.escrow, v.depositEscrow),\n eq(schema.deposit.localId, v.depositLocalId),\n eq(schema.deposit.chainId, v.depositChainId),\n eq(schema.deposit.version, 'v3')\n )\n )\n\n // Fetch deposit details (status, remaining) - only V3 deposits\n const deposits = await db\n .select({\n escrow: schema.deposit.escrow,\n localId: schema.deposit.localId,\n chainId: schema.deposit.chainId,\n status: schema.deposit.status,\n remaining: schema.deposit.remaining,\n })\n .from(schema.deposit)\n .where(or(...depositConditions))\n\n // Create a map for quick lookup of deposit details\n const depositMap = new Map(\n deposits.map(d => [\n `${d.escrow.toLowerCase()}-${d.localId}-${d.chainId}`,\n d\n ])\n )\n\n // Join verifier records with deposit details and deduplicate by deposit ID\n // Use a Set to track unique deposits (same deposit shouldn't appear multiple times\n // even if it has multiple payment methods like zelle-chase, zelle-bofa, etc.)\n const uniqueDeposits = new Map<string, CrossChainDepositInfo>()\n\n for (const v of verifierRecords) {\n const key = `${v.depositEscrow.toLowerCase()}-${v.depositLocalId}-${v.depositChainId}`\n const deposit = depositMap.get(key)\n if (!deposit) continue\n\n // Only add if we haven't seen this deposit yet\n if (!uniqueDeposits.has(key)) {\n uniqueDeposits.set(key, {\n escrow: deposit.escrow,\n localId: deposit.localId,\n chainId: Number(deposit.chainId) as ChainId,\n status: deposit.status,\n remaining: deposit.remaining,\n paymentMethodId: v.paymentMethodId,\n })\n }\n }\n\n return Array.from(uniqueDeposits.values())\n}\n\n/**\n * Order history item for user transaction history display.\n * Represents a single intent at any lifecycle stage.\n */\nexport interface OrderHistoryItem {\n /** Unique order identifier */\n orderId: string\n /** When the intent was signaled */\n timestamp: Date\n /** Current status of the order */\n status: 'signaled' | 'fulfilled' | 'cancelled' | 'expired'\n /** Amount in crypto (formatted string) */\n amountCrypto: string\n /** Amount in fiat currency (formatted string) */\n amountFiat: string\n /** Crypto token symbol (e.g., \"USDC\") */\n tokenSymbol: string\n /** Fiat currency code (e.g., \"USD\") */\n currencyCode: string\n /** Payment provider key for icon display */\n providerKey: ProviderKey\n /** Chain where the order occurred */\n chainId: ChainId\n /** Associated deposit ID for navigation */\n depositId: string\n /** Transaction hash for blockchain explorer link */\n transactionHash: string\n /** Deposit escrow address */\n escrow: Hex\n /** Deposit local ID */\n localId: bigint\n}\n\n/**\n * Get user's order history (intents signaled, fulfilled, and pruned).\n * Queries across all chains and returns chronologically ordered results.\n *\n * @param address - User's wallet address\n * @param limit - Maximum number of orders to return (default 50)\n * @param offset - Number of orders to skip for pagination (default 0)\n * @returns Array of order history items\n */\nexport async function getUserOrderHistory({\n address,\n limit = 50,\n offset = 0,\n status,\n}: {\n address: Hex\n limit?: number\n offset?: number\n /** Filter by lifecycle status. Omit to return all statuses. */\n status?: 'fulfilled' | 'cancelled' | 'expired' | 'signaled'\n}): Promise<OrderHistoryItem[]> {\n const db = ponderClient.db\n\n const baseCondition = eq(schema.intentSignaled.ownerAddress, address)\n const whereClause = status\n ? and(baseCondition, eq(schema.intentSignaled.status, status))\n : baseCondition\n\n // Query intentSignaled events for this user.\n // Status is stored directly on intentSignaled (updated by IntentFulfilled/IntentPruned handlers),\n // so we only need the deposit inner join for token/currency info.\n const intents = await db\n .select({\n intentHash: schema.intentSignaled.intentHash,\n timestamp: schema.intentSignaled.timestamp,\n amount: schema.intentSignaled.amount,\n toAddress: schema.intentSignaled.toAddress,\n transactionId: schema.intentSignaled.transactionId,\n status: schema.intentSignaled.status,\n depositEscrow: schema.intentSignaled.depositEscrow,\n depositLocalId: schema.intentSignaled.depositLocalId,\n depositChainId: schema.intentSignaled.depositChainId,\n depositToken: schema.deposit.token,\n depositPaymentMethodId: schema.intentSignaled.paymentMethodId,\n })\n .from(schema.intentSignaled)\n .innerJoin(\n schema.deposit,\n and(\n eq(schema.intentSignaled.depositEscrow, schema.deposit.escrow),\n eq(schema.intentSignaled.depositLocalId, schema.deposit.localId),\n eq(schema.intentSignaled.depositChainId, schema.deposit.chainId)\n )\n )\n .where(whereClause)\n .orderBy(desc(schema.intentSignaled.timestamp))\n .limit(limit)\n .offset(offset)\n\n // Transform to OrderHistoryItem format\n const results: OrderHistoryItem[] = []\n\n for (const intent of intents) {\n const status = intent.status as OrderHistoryItem['status']\n\n // Get token info for formatting\n const chainId = Number(intent.depositChainId) as ChainId\n const token = tokenByAddress(chainId, intent.depositToken)\n\n if (!token) {\n // Skip if token not found\n continue\n }\n\n // Format crypto amount\n const amountCrypto = formatUnits(intent.amount, { decimals: token.decimals })\n\n // Get payment method ID as hex string and convert to provider key\n const paymentMethodIdHex = intent.depositPaymentMethodId\n const providerKeyMap = paymentVerifierToKey(chainId)\n const providerKey = providerKeyMap.get(paymentMethodIdHex.toLowerCase()) ?? 'manual'\n\n // For now, use a simple 1:1 conversion for fiat amount\n // In production, you'd want to use actual conversion rates\n const amountFiat = amountCrypto\n\n // Generate order ID using deposit compound key\n const orderIdStr = orderId.deposit.serialize({\n escrow: intent.depositEscrow,\n depositId: intent.depositLocalId,\n chainId,\n })\n\n results.push({\n orderId: orderIdStr,\n timestamp: new Date(Number(intent.timestamp) * 1000),\n status,\n amountCrypto,\n amountFiat,\n tokenSymbol: token.symbol,\n currencyCode: 'USD', // Default to USD for now\n providerKey,\n chainId,\n depositId: orderIdStr,\n transactionHash: intent.transactionId,\n escrow: intent.depositEscrow,\n localId: intent.depositLocalId,\n })\n }\n\n return results\n}\n","/**\n * @fileoverview Hook for fetching deposits that match a buyer's criteria.\n *\n * Queries the indexer for active V3 deposits that:\n * - Support the specified payment method\n * - Support the specified fiat currency\n * - Have sufficient liquidity for the requested amount\n * - Are accepting intents\n *\n * @remarks\n * This is the primary hook for the deposit selection flow. It filters\n * deposits by payment method and currency, then ranks them by conversion\n * rate to help buyers find the best deals.\n *\n * @see {@link useBestRate} for just the best rate without full deposit data\n */\n\nimport { useMemo, useCallback } from 'react'\nimport { Deposit } from '../lib/deposits'\nimport type { PonderDeposit } from '../lib/ponderQueries'\nimport { ponderClient, schema } from '../lib/ponder'\nimport { and, eq, desc, sql } from '@ponder/client'\nimport type { TokenInfo } from '@provex/utils/tokens'\nimport { Currency, SUPPORTED_CURRENCIES } from '@provex/utils/currencies'\nimport { parseUnits } from '@provex/utils/units'\nimport { providerConfigs, providerKeyToContractId, type ProviderKey, type SubProviderKey } from '@provex/utils/payment'\nimport { convertCurrencyToTokenOutput } from '@provex/utils/conversionRates'\nimport { orderId } from '@provex/utils/ids'\nimport type { Hex } from 'viem'\nimport { useAsyncData } from './useAsyncData'\n\n/**\n * Default polling interval for deposit updates (5 seconds).\n * This ensures the UI stays responsive to on-chain changes.\n */\nconst DEFAULT_REFETCH_INTERVAL_MS = 5_000\n\n/**\n * Options for the useMatchableDeposits hook.\n */\ninterface UseMatchableDepositsOptions {\n token: TokenInfo\n paymentMethod: ProviderKey\n currency?: Currency\n /** Polling interval in milliseconds (default: 5000ms) */\n refetchIntervalMs?: number\n}\n\ninterface MatchableDeposit {\n deposit: Deposit\n rate: bigint\n availableAmount: bigint\n}\n\n/**\n * Fetches matchable deposits from the indexer.\n * Extracted as a standalone async function for use with useAsyncData.\n */\nasync function fetchMatchableDeposits({\n token,\n paymentMethod,\n currency,\n}: {\n token: TokenInfo\n paymentMethod: ProviderKey\n currency: Currency\n}): Promise<Deposit[]> {\n const db = ponderClient.db\n\n // Get all payment method identifiers for filtering (v3 hash + v2 verifier addresses)\n // Also include sub-providers (e.g., zelle-chase, zelle-bofa, zelle-citi for zelle)\n const paymentConfig = providerConfigs(token.chainId)[paymentMethod]\n const paymentMethodIds = [\n providerKeyToContractId(paymentMethod).toLowerCase(), // V3: keccak256 hash\n ...paymentConfig.v2Verifiers.map(v => v.toLowerCase()), // V2: verifier contract addresses\n // Include sub-provider identifiers (contract IDs and v2 verifiers)\n ...Array.from(paymentConfig.subProviders).flatMap(subProvider => [\n providerKeyToContractId(subProvider.key).toLowerCase(),\n ...subProvider.v2Verifiers(token.chainId).map(v => v.toLowerCase()),\n ]),\n ]\n\n const depositsData = await db\n .select()\n .from(schema.deposit)\n .where(\n and(\n eq(schema.deposit.chainId, BigInt(token.chainId)),\n eq(schema.deposit.status, 'active' as never),\n eq(schema.deposit.acceptingIntents, true),\n sql`\"deposit\".\"version\" = 'v3'`,\n eq(schema.deposit.token, token.address.toLowerCase() as Hex),\n sql`${currency.contractId.toLowerCase()} = ANY(${schema.deposit.depositConversionRateCurrencies})`\n )\n )\n .orderBy(desc(schema.deposit.orderId))\n\n // Client-side filter by payment method\n const paymentMethodIdSet = new Set(paymentMethodIds)\n const filteredDepositsData = depositsData.filter(d => {\n const verifiers = d.depositConversionRateVerifiers ?? []\n return verifiers.some(v => paymentMethodIdSet.has(v.toLowerCase()))\n })\n\n if (filteredDepositsData.length === 0) {\n return []\n }\n\n // Build compound keys for fetching related data\n const depositKeys = filteredDepositsData.map(d => ({\n escrow: d.escrow,\n localId: d.localId,\n chainId: d.chainId,\n }))\n\n // Group deposits by escrow to enable efficient IN queries on localId\n // This approach avoids the 431 header size error from large OR clauses\n const depositsByEscrow = new Map<string, { escrow: Hex; chainId: bigint; localIds: bigint[] }>()\n for (const key of depositKeys) {\n const escrowKey = `${key.escrow}-${key.chainId}`\n const existing = depositsByEscrow.get(escrowKey)\n if (existing) {\n existing.localIds.push(key.localId)\n } else {\n depositsByEscrow.set(escrowKey, {\n escrow: key.escrow,\n chainId: key.chainId,\n localIds: [key.localId],\n })\n }\n }\n\n // Batch fetch conversion rates, verifiers, and fund lock data grouped by escrow\n // This reduces query count while keeping request size manageable\n const ratePromises: Promise<typeof schema.depositConversionRateUpdated.$inferSelect[]>[] = []\n const verifierPromises: Promise<typeof schema.depositVerifierAdded.$inferSelect[]>[] = []\n const lockedPromises: Promise<typeof schema.fundsLocked.$inferSelect[]>[] = []\n const unlockedPromises: Promise<typeof schema.fundsUnlocked.$inferSelect[]>[] = []\n const transferredPromises: Promise<typeof schema.fundsUnlockedAndTransferred.$inferSelect[]>[] = []\n\n for (const { escrow, chainId, localIds } of depositsByEscrow.values()) {\n const localIdInClause = sql`${sql.join(localIds.map(id => sql`${id}`), sql`, `)}`\n\n // Query all rates for this escrow's deposits in one query using IN clause\n ratePromises.push(\n db.select()\n .from(schema.depositConversionRateUpdated)\n .where(and(\n eq(schema.depositConversionRateUpdated.depositEscrow, escrow),\n eq(schema.depositConversionRateUpdated.depositChainId, chainId),\n eq(schema.depositConversionRateUpdated.active, true),\n sql`${schema.depositConversionRateUpdated.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n // Query all verifiers for this escrow's deposits in one query using IN clause\n verifierPromises.push(\n db.select()\n .from(schema.depositVerifierAdded)\n .where(and(\n eq(schema.depositVerifierAdded.depositEscrow, escrow),\n eq(schema.depositVerifierAdded.depositChainId, chainId),\n sql`${schema.depositVerifierAdded.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n // Query fund lock/unlock data to compute outstanding locked amounts\n lockedPromises.push(\n db.select()\n .from(schema.fundsLocked)\n .where(and(\n eq(schema.fundsLocked.depositEscrow, escrow),\n eq(schema.fundsLocked.depositChainId, chainId),\n sql`${schema.fundsLocked.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n unlockedPromises.push(\n db.select()\n .from(schema.fundsUnlocked)\n .where(and(\n eq(schema.fundsUnlocked.depositEscrow, escrow),\n eq(schema.fundsUnlocked.depositChainId, chainId),\n sql`${schema.fundsUnlocked.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n transferredPromises.push(\n db.select()\n .from(schema.fundsUnlockedAndTransferred)\n .where(and(\n eq(schema.fundsUnlockedAndTransferred.depositEscrow, escrow),\n eq(schema.fundsUnlockedAndTransferred.depositChainId, chainId),\n sql`${schema.fundsUnlockedAndTransferred.depositLocalId} IN (${localIdInClause})`\n ))\n )\n }\n\n // Execute all queries in parallel\n const [rateResults, verifierResults, lockedResults, unlockedResults, transferredResults] = await Promise.all([\n Promise.all(ratePromises),\n Promise.all(verifierPromises),\n Promise.all(lockedPromises),\n Promise.all(unlockedPromises),\n Promise.all(transferredPromises),\n ])\n\n // Flatten results\n const allConversionRates = rateResults.flat()\n const allVerifiers = verifierResults.flat()\n const allLocked = lockedResults.flat()\n const allUnlocked = unlockedResults.flat()\n const allTransferred = transferredResults.flat()\n\n // Group results by deposit compound key\n const ratesByDeposit = new Map<string, typeof allConversionRates>()\n const verifiersByDeposit = new Map<string, typeof allVerifiers>()\n\n // Initialize empty arrays for each deposit\n for (const d of filteredDepositsData) {\n const key = `${d.escrow}-${d.localId}-${d.chainId}`\n ratesByDeposit.set(key, [])\n verifiersByDeposit.set(key, [])\n }\n\n // Distribute conversion rates to their respective deposits\n for (const rate of allConversionRates) {\n const key = `${rate.depositEscrow}-${rate.depositLocalId}-${rate.depositChainId}`\n const existing = ratesByDeposit.get(key)\n if (existing) {\n existing.push(rate)\n }\n }\n\n // Distribute verifiers to their respective deposits\n for (const verifier of allVerifiers) {\n const key = `${verifier.depositEscrow}-${verifier.depositLocalId}-${verifier.depositChainId}`\n const existing = verifiersByDeposit.get(key)\n if (existing) {\n existing.push(verifier)\n }\n }\n\n // Compute outstanding locked amounts per deposit, split into:\n // - active: non-expired, unresolved — genuinely unavailable\n // - reclaimable: expired, unresolved — freed on next interaction (signalIntent auto-prunes)\n const resolvedIntentHashes = new Set([\n ...allUnlocked.map(u => u.intentHash),\n ...allTransferred.map(t => t.intentHash),\n ])\n const currentTimestamp = BigInt(Math.floor(Date.now() / 1000))\n const lockedAmountByDeposit = new Map<string, bigint>()\n const reclaimableAmountByDeposit = new Map<string, bigint>()\n\n for (const lock of allLocked) {\n if (resolvedIntentHashes.has(lock.intentHash)) continue\n\n const key = `${lock.depositEscrow}-${lock.depositLocalId}-${lock.depositChainId}`\n if (lock.expiryTime <= currentTimestamp) {\n const current = reclaimableAmountByDeposit.get(key) ?? 0n\n reclaimableAmountByDeposit.set(key, current + lock.amount)\n } else {\n const current = lockedAmountByDeposit.get(key) ?? 0n\n lockedAmountByDeposit.set(key, current + lock.amount)\n }\n }\n\n // Create Deposit objects with their relationships\n return filteredDepositsData.map(deposit => {\n const key = `${deposit.escrow}-${deposit.localId}-${deposit.chainId}`\n const rates = ratesByDeposit.get(key) ?? []\n const verifiers = verifiersByDeposit.get(key) ?? []\n\n // Create the serialized depositId from compound key components\n const depositId = orderId.deposit.serialize({\n escrow: deposit.escrow,\n chainId: deposit.chainId,\n depositId: deposit.localId,\n })\n\n // Create a PonderDeposit-compatible object with the required relationships\n const depositWithRelations = {\n ...deposit,\n depositId,\n owner: null,\n transaction: null,\n depositReceiveds: [],\n depositWithdrawns: [],\n depositCloseds: [],\n depositCurrencyAddeds: [],\n depositVerifierAddeds: verifiers,\n depositConversionRateUpdateds: rates,\n depositIntentAmountRangeUpdateds: [],\n depositFundsAddeds: [],\n // Build minimal intent stubs from fund lock/unlock/transfer data for HitRateReadout\n intentSignaleds: allLocked\n .filter(l => `${l.depositEscrow}-${l.depositLocalId}-${l.depositChainId}` === key)\n .map(l => ({ intentHash: l.intentHash, fundsLocked: { expiryTime: l.expiryTime } })),\n intentPruneds: allUnlocked\n .filter(u => `${u.depositEscrow}-${u.depositLocalId}-${u.depositChainId}` === key)\n .map(u => ({ intentHash: u.intentHash })),\n intentFulfilleds: allTransferred\n .filter(t => `${t.depositEscrow}-${t.depositLocalId}-${t.depositChainId}` === key)\n .map(t => ({ intentHash: t.intentHash })),\n depositRetainOnEmptyUpdateds: [],\n _computedLockedFunds: lockedAmountByDeposit.get(key) ?? 0n,\n _computedReclaimableFunds: reclaimableAmountByDeposit.get(key) ?? 0n,\n } as unknown as PonderDeposit\n\n return new Deposit(depositWithRelations)\n })\n}\n\n/**\n * Get the best (lowest) conversion rate for a deposit across the main provider and all\n * sub-providers (e.g., zelle-chase, zelle-bofa for zelle).\n *\n * Returns the minimum rate so that display and sort order are always consistent —\n * both reflect the best deal available from this deposit regardless of which\n * sub-provider happens to be listed first in the config.\n *\n * Returns 0n when the deposit has no rate for the given payment method / currency.\n */\nexport const getRate = ({\n deposit,\n paymentMethod,\n currency\n}: {\n deposit: Deposit | null | undefined,\n paymentMethod: ProviderKey | SubProviderKey,\n currency: Currency\n}): bigint => {\n if (!deposit) return 0n\n\n const paymentConfig = providerConfigs(deposit.chainId)[paymentMethod as ProviderKey]\n // paymentMethod may be a SubProviderKey (e.g. 'zelle-chase') which has no top-level config entry —\n // in that case there are no further sub-providers to expand, so the key itself is the only candidate.\n const candidateKeys = [paymentMethod, ...Array.from(paymentConfig?.subProviders ?? []).map(sp => sp.key)]\n\n let minRate: bigint | null = null\n for (const key of candidateKeys) {\n const value = deposit.currentConversionRates.get(key as ProviderKey)?.get(currency.contractId)?.value\n if (value) {\n const rate = BigInt(value)\n if (minRate === null || rate < minRate) {\n minRate = rate\n }\n }\n }\n\n return minRate ?? 0n\n}\n\nexport function useMatchableDeposits(options: UseMatchableDepositsOptions) {\n const {\n token,\n currency = SUPPORTED_CURRENCIES.USD,\n paymentMethod,\n refetchIntervalMs = DEFAULT_REFETCH_INTERVAL_MS,\n } = options\n\n // Use useAsyncData for proper loading state semantics:\n // - isLoading: true only during initial fetch (no data yet)\n // - isUpdating: true during background refetch (data already exists)\n // - loading: backward compat (isLoading || isUpdating)\n const {\n data,\n error,\n isLoading,\n isUpdating,\n loading,\n refetch,\n } = useAsyncData(\n () => fetchMatchableDeposits({ token, paymentMethod, currency }),\n [token.address, token.chainId, currency.contractId, paymentMethod],\n { refetchInterval: refetchIntervalMs }\n )\n\n // Memoize deposits to maintain stable reference when data is null\n const deposits = useMemo(() => data ?? [], [data])\n\n // Function to filter deposits by amount - returns sorted array from lowest to highest rate\n const filterDepositsByAmount = useCallback((amountInInt: bigint): Deposit[] => {\n if (!amountInInt || !currency) return []\n\n const matchable: MatchableDeposit[] = []\n\n for (const deposit of deposits) {\n // getRate returns 0n when this deposit has no rate for the selected payment method / currency\n const rate = getRate({ deposit, paymentMethod, currency })\n if (rate === 0n) continue\n\n const amountToken = convertCurrencyToTokenOutput({\n token,\n currency,\n currencyAmountInt: amountInInt,\n rate,\n })\n\n if (deposit.canAcceptAmount(amountToken)) {\n matchable.push({ deposit, rate, availableAmount: deposit.availableFunds })\n }\n }\n\n // Sort by best rate (lowest rate is best for buyer)\n return matchable.sort((a, b) => {\n if (a.rate < b.rate) return -1\n if (a.rate > b.rate) return 1\n if (a.deposit.depositId < b.deposit.depositId) return -1\n if (a.deposit.depositId > b.deposit.depositId) return 1\n return 0\n }).map(m => m.deposit)\n }, [deposits, currency, paymentMethod, token.chainId])\n\n return {\n deposits,\n /** @deprecated Use isLoading for initial load, isUpdating for background refresh */\n loading,\n /** True during initial fetch when no data exists yet */\n isLoading,\n /** True during background refetch when data already exists */\n isUpdating,\n error,\n refetch,\n filterDepositsByAmount,\n // Function that takes amount and returns filtered results\n // eslint-disable-next-line react-hooks/exhaustive-deps\n getMatchableDeposits: useCallback((amountInInt: bigint | null | string) => {\n if (typeof amountInInt === 'string') {\n amountInInt = parseUnits(amountInInt, { decimals: currency?.decimals || 2 })\n }\n if (!amountInInt) return []\n return filterDepositsByAmount(amountInInt)\n }, [filterDepositsByAmount, currency]),\n }\n}\n","/**\n * @fileoverview Generic async data fetching hook with loading states.\n *\n * A lightweight alternative to React Query for simpler use cases.\n * Provides clear loading/updating states and automatic polling.\n *\n * @remarks\n * **Loading vs Updating:**\n * - `isLoading`: True on initial fetch (no data yet) - show skeleton\n * - `isUpdating`: True on background refetch (data exists) - show subtle indicator\n *\n * This distinction allows UIs to avoid flashing loading states during\n * background polling while still showing proper initial loading states.\n *\n * @see {@link useBestRate} for example usage\n */\n\nimport { useState, useEffect, useCallback, useRef, type DependencyList } from 'react'\n\n/**\n * Options for the useAsyncData hook.\n */\nexport interface UseAsyncDataOptions {\n /**\n * Polling interval in milliseconds.\n * If set, data will be automatically refetched at this interval.\n * The interval is cleared on unmount to prevent memory leaks.\n */\n refetchInterval?: number\n\n /**\n * If false, the fetch will not run.\n * Useful for conditional fetching based on dependencies being ready.\n * @default true\n */\n enabled?: boolean\n}\n\n/**\n * Result returned by the useAsyncData hook.\n * @template T - The type of data returned by the fetch function\n */\nexport interface UseAsyncDataResult<T> {\n /**\n * The fetched data, or null if not yet loaded or if fetch failed.\n * Data is preserved across refetches - only cleared on dependency changes.\n */\n data: T | null\n\n /**\n * Error message if the fetch failed, null otherwise.\n * Cleared on successful fetch.\n */\n error: string | null\n\n /**\n * True during the initial fetch when no data exists yet.\n * Use this to show a full loading skeleton/spinner.\n * \n * `isLoading = isFetching && data === null`\n */\n isLoading: boolean\n\n /**\n * True during a background refetch when data already exists.\n * Use this to show a subtle update indicator while keeping existing data visible.\n * \n * `isUpdating = isFetching && data !== null`\n */\n isUpdating: boolean\n\n /**\n * Backward compatibility flag.\n * True if either isLoading or isUpdating is true.\n * \n * `loading = isLoading || isUpdating`\n */\n loading: boolean\n\n /**\n * Manually trigger a refetch.\n * Can be called to refresh data on user action.\n */\n refetch: () => Promise<void>\n}\n\n/**\n * A hook for fetching async data with proper loading state semantics.\n * \n * Unlike naive implementations that set `loading=true` on every fetch,\n * this hook distinguishes between:\n * - `isLoading`: Initial load with no data (show skeleton)\n * - `isUpdating`: Background refresh with existing data (show subtle indicator)\n * \n * This prevents UI flicker during polling/refetch operations.\n * \n * @template T - The type of data returned by the fetch function\n * @param fetchFn - Async function that fetches and returns the data\n * @param deps - Dependencies that trigger a refetch when changed\n * @param options - Configuration options (refetchInterval, enabled)\n * @returns Object containing data, error, loading states, and refetch function\n * \n * @example\n * ```typescript\n * const { data, isLoading, isUpdating, error, refetch } = useAsyncData(\n * async () => {\n * const response = await fetch('/api/deposits')\n * return response.json()\n * },\n * [userId],\n * { refetchInterval: 5000, enabled: !!userId }\n * )\n * \n * if (isLoading) return <Skeleton />\n * if (error && !data) return <ErrorState error={error} />\n * \n * return (\n * <Box opacity={isUpdating ? 0.7 : 1}>\n * <DataTable data={data} />\n * {isUpdating && <Spinner size=\"xs\" />}\n * </Box>\n * )\n * ```\n */\nexport function useAsyncData<T>(\n fetchFn: () => Promise<T>,\n deps: DependencyList,\n options: UseAsyncDataOptions = {}\n): UseAsyncDataResult<T> {\n const { refetchInterval, enabled = true } = options\n\n // Core state\n const [data, setData] = useState<T | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [isFetching, setIsFetching] = useState(false)\n\n // Track fetch ID to handle race conditions (stale closures)\n const fetchIdRef = useRef(0)\n \n // Track if component is mounted to prevent state updates after unmount\n const isMountedRef = useRef(true)\n\n /**\n * Core fetch function that handles the async operation.\n * Uses fetch ID to detect and ignore stale responses.\n */\n const executeFetch = useCallback(async () => {\n if (!enabled) return\n\n // Increment fetch ID to track this specific fetch\n const currentFetchId = ++fetchIdRef.current\n\n setIsFetching(true)\n // Don't clear error on refetch - only clear on success\n\n try {\n const result = await fetchFn()\n\n // Check if this fetch is still the latest one (race condition guard)\n if (currentFetchId !== fetchIdRef.current) {\n return\n }\n\n // Check if component is still mounted\n if (!isMountedRef.current) {\n return\n }\n\n setData(result)\n setError(null)\n } catch (err) {\n // Check if this fetch is still the latest one\n if (currentFetchId !== fetchIdRef.current) {\n return\n }\n\n // Check if component is still mounted\n if (!isMountedRef.current) {\n return\n }\n\n const errorMessage = err instanceof Error ? err.message : 'An error occurred'\n setError(errorMessage)\n // Don't clear data on error - preserve last successful data\n } finally {\n // Only update fetching state if this is still the latest fetch\n if (currentFetchId === fetchIdRef.current && isMountedRef.current) {\n setIsFetching(false)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, ...deps])\n\n // Initial fetch and refetch on dependency changes.\n // Preserve existing data during refetches — clearing it causes downstream\n // components to flash empty (e.g., deposit list disappears for a frame).\n // The isUpdating state signals \"background refresh\" without losing data.\n useEffect(() => {\n setError(null)\n void executeFetch()\n }, [executeFetch])\n\n // Set up polling interval if configured\n useEffect(() => {\n if (!refetchInterval || !enabled) {\n return\n }\n\n const intervalId = setInterval(() => {\n void executeFetch()\n }, refetchInterval)\n\n return () => {\n clearInterval(intervalId)\n }\n }, [refetchInterval, enabled, executeFetch])\n\n // Cleanup on unmount\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n // Compute derived loading states\n const isLoading = isFetching && data === null\n const isUpdating = isFetching && data !== null\n const loading = isLoading || isUpdating\n\n return {\n data,\n error,\n isLoading,\n isUpdating,\n loading,\n refetch: executeFetch,\n }\n}\n","/**\n * @fileoverview Hook for fetching the best (lowest) conversion rate.\n *\n * Queries the indexer for active V3 deposits with sufficient liquidity\n * and returns the deposit with the most favorable exchange rate.\n *\n * @remarks\n * Used on the main buy page to show users the best available rate\n * before they select a specific deposit. Only considers deposits with:\n * - At least $20 USD equivalent liquidity\n * - Active status and acceptingIntents = true\n * - V3 escrow version\n *\n * @see {@link useMatchableDeposits} for fetching deposits with specific filters\n */\n\nimport { SUPPORTED_CURRENCIES } from '@provex/utils/currencies'\nimport { getDefaultToken } from '@provex/utils/tokens'\nimport { parseUnits, formatUnits } from '@provex/utils/units'\nimport type { ChainId } from '@provex/utils/chain'\nimport { ponderClient, schema } from '../lib/ponder'\nimport { eq, and, sql, desc } from '@ponder/client'\nimport { useAsyncData } from './useAsyncData'\n\n/**\n * Information about the best available conversion rate.\n */\nexport interface BestRateInfo {\n rate: number\n depositId: string\n remainingAmount: string\n currency: string\n verifier: string\n formattedRate: string\n}\n\nexport interface UseBestRateReturn {\n bestRate: BestRateInfo | null\n /** @deprecated Use isLoading for initial load, isUpdating for background refresh */\n loading: boolean\n /** True during initial fetch when no data exists yet */\n isLoading: boolean\n /** True during background refetch when data already exists */\n isUpdating: boolean\n error: string | null\n}\n\nconst MINIMUM_LIQUIDITY_USD = 20 // $20 minimum\nconst REFETCH_INTERVAL_MS = 15_000 // 15 seconds — quotes are user-facing, can't be stale\n\n/**\n * Fetches the best (lowest) conversion rate from active deposits.\n * Extracted as a standalone async function for use with useAsyncData.\n */\nasync function fetchBestRate(chainId: ChainId): Promise<BestRateInfo | null> {\n const currency = SUPPORTED_CURRENCIES.USD\n const token = getDefaultToken(chainId)\n\n // Convert minimum liquidity to token wei (USDC has 6 decimals)\n const minLiquidityInt = parseUnits(MINIMUM_LIQUIDITY_USD.toString(), { decimals: token.decimals })\n\n let bestRateInfo: BestRateInfo | null = null\n let lowestRate = Infinity\n\n const db = ponderClient.db\n\n // Get active v3 deposits with sufficient liquidity and matching currency\n // Also filter by acceptingIntents flag (backend validation for min amount vs remaining)\n // Only v3 deposits are supported for buy flows\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(\n and(\n eq(schema.deposit.chainId, BigInt(chainId)),\n eq(schema.deposit.status, 'active'),\n sql`\"deposit\".\"version\" = 'v3'`,\n eq(schema.deposit.acceptingIntents, true),\n sql`${schema.deposit.remaining} >= ${minLiquidityInt}`,\n sql`${currency.contractId} = ANY(${schema.deposit.depositConversionRateCurrencies})`\n )\n )\n .orderBy(desc(schema.deposit.orderId))\n\n if (deposits.length === 0) {\n return null\n }\n\n // Batch fetch conversion rates for all deposits in a single query\n // Group by escrow for efficient IN clause queries\n const depositsByEscrow = new Map<string, { escrow: typeof deposits[0]['escrow']; chainId: bigint; localIds: bigint[] }>()\n for (const deposit of deposits) {\n const escrowKey = `${deposit.escrow}-${deposit.chainId}`\n const existing = depositsByEscrow.get(escrowKey)\n if (existing) {\n existing.localIds.push(deposit.localId)\n } else {\n depositsByEscrow.set(escrowKey, {\n escrow: deposit.escrow,\n chainId: deposit.chainId,\n localIds: [deposit.localId],\n })\n }\n }\n\n // Batch query all conversion rates\n const ratePromises = Array.from(depositsByEscrow.values()).map(({ escrow, chainId: cId, localIds }) =>\n db.select()\n .from(schema.depositConversionRateUpdated)\n .where(\n and(\n eq(schema.depositConversionRateUpdated.depositEscrow, escrow),\n eq(schema.depositConversionRateUpdated.depositChainId, cId),\n eq(schema.depositConversionRateUpdated.currency, currency.contractId as never),\n eq(schema.depositConversionRateUpdated.active, true),\n sql`${schema.depositConversionRateUpdated.depositLocalId} IN (${sql.join(localIds.map(id => sql`${id}`), sql`, `)})`\n )\n )\n )\n\n const rateResults = await Promise.all(ratePromises)\n const allRates = rateResults.flat()\n\n // Create lookup map for rates by deposit key\n const ratesByDeposit = new Map<string, typeof allRates[0]>()\n for (const rate of allRates) {\n const key = `${rate.depositEscrow}-${rate.depositLocalId}-${rate.depositChainId}`\n // Keep the latest rate (highest changeId)\n const existing = ratesByDeposit.get(key)\n if (!existing || rate.changeId > existing.changeId) {\n ratesByDeposit.set(key, rate)\n }\n }\n\n // Find best rate from batched results\n for (const deposit of deposits) {\n const remaining = BigInt(deposit.remaining)\n const key = `${deposit.escrow}-${deposit.localId}-${deposit.chainId}`\n const rateUpdate = ratesByDeposit.get(key)\n\n if (!rateUpdate) {\n continue\n }\n\n // Convert rate from wei (18 decimals) to decimal for comparison\n const rateValue = BigInt(rateUpdate.value)\n const rateDecimal = Number(formatUnits(rateValue, { decimals: 18 }))\n\n // Find the LOWEST rate (best for buyers)\n if (rateDecimal < lowestRate && rateDecimal > 0) {\n lowestRate = rateDecimal\n bestRateInfo = {\n rate: rateDecimal,\n depositId: deposit.orderId,\n remainingAmount: formatUnits(remaining, { decimals: token.decimals, truncateDecimals: 2 }),\n currency: rateUpdate.currency,\n verifier: rateUpdate.verifier,\n formattedRate: formatUnits(rateValue, { decimals: 18, truncateDecimals: 2, padDecimals: 2 }),\n }\n }\n }\n\n return bestRateInfo\n}\n\nexport function useBestRate(chainId: ChainId): UseBestRateReturn {\n // Use useAsyncData for proper loading state semantics:\n // - isLoading: true only during initial fetch (no data yet)\n // - isUpdating: true during background refetch (data already exists)\n // - loading: backward compat (isLoading || isUpdating)\n const {\n data: bestRate,\n error,\n isLoading,\n isUpdating,\n loading,\n } = useAsyncData(\n () => fetchBestRate(chainId),\n [chainId],\n { refetchInterval: REFETCH_INTERVAL_MS }\n )\n\n return {\n bestRate,\n loading,\n isLoading,\n isUpdating,\n error,\n }\n}\n","/**\n * @fileoverview Hook for fetching aggregated monthly statistics.\n *\n * Queries the indexer for time-bucketed statistics (deposits, withdrawals,\n * exchanges) across different time resolutions (hour, day, month).\n *\n * @remarks\n * Used by the analytics dashboard to display volume charts, provider\n * breakdowns, and currency distributions.\n *\n * @see {@link MonthlyStatsContext} for the provider that caches this data\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { getPaymentMethodName, verifierGetsKey, type ProviderKey } from '@provex/utils/payment'\nimport { orderId } from '@provex/utils/ids'\nimport type { Hex } from 'viem'\nimport { ponderClient, schema } from '../lib/ponder'\nimport type { TimeResolutionKey } from '@provex/utils/time'\n\nexport type { TimeResolutionKey }\n\n/**\n * Statistics record type matching the ponder schema.\n * Used for tracking deposits, withdrawals, and exchanges over time.\n */\nexport interface Stat {\n orderId: string\n type: string // 'hour' | 'day' | 'month'\n event: string // 'deposit' | 'withdrawal' | 'exchange'\n action: string // Mapped from event for compatibility\n amount: bigint\n currency: string | null\n token: string\n verifier: string\n chainId: bigint\n timestamp: bigint\n}\nimport { and, desc, inArray, eq } from '@ponder/client'\nimport { getLatestContract } from '@provex/utils/contracts'\nimport { chains, type ChainId } from '@provex/utils/chain'\nimport { interval } from '@provex/utils/time'\nimport { statAction, isStatAction } from '@provex/utils/stats'\n\n// Cache interface for individual fetchStats requests\ninterface CachedStatsResponse {\n data: Promise<{ stats: { items: Stat[], pageInfo: { hasNextPage: boolean, endCursor: string | null } } }>\n timestamp: number\n}\n\n// Cache interface for final aggregated results\ninterface CachedMonthlyStatsResponse {\n monthlyStats: MonthlyStatsEntry[]\n statsByTime: StatsByTimeEntry[]\n orderedLists: OrderedLists\n timestamp: number\n}\n\n// Cache interface for liquidity baseline data\ninterface CachedLiquidityBaselineResponse {\n baseline: bigint\n currentPeriodStats: Stat[]\n statsByTime: StatsByTimeEntry[]\n timestamp: number\n}\n\n// Module-level cache storage for fetchStats requests\nconst statsRequestCache = new Map<string, CachedStatsResponse>()\n\n// Module-level cache storage for final aggregated results\nconst monthlyStatsCache = new Map<string, CachedMonthlyStatsResponse>()\n\n// Module-level cache storage for liquidity baseline data\nconst liquidityBaselineCache = new Map<string, CachedLiquidityBaselineResponse>()\n\nconst CACHE_EXPIRATION_MS = interval.second * 10\n\n// Generate cache key for fetchStats requests\nfunction generateStatsRequestCacheKey({\n chainIds,\n after,\n resolution,\n lowerBoundTimestamp,\n upperBoundTimestamp,\n}: {\n chainIds: number[]\n after?: string\n resolution: string\n lowerBoundTimestamp: number\n upperBoundTimestamp?: number\n}): string {\n const chainKey = chainIds.length === 0\n ? 'all-chains'\n : chainIds.slice().sort((a, b) => a - b).join(',')\n\n const timeRange = upperBoundTimestamp\n ? `${lowerBoundTimestamp}-${upperBoundTimestamp}`\n : `${lowerBoundTimestamp}-end`\n\n return `${chainKey}:${resolution}:${timeRange}:${after || 'start'}`\n}\n\n// Generate cache key for final monthly stats results (without pagination cursor)\nfunction generateMonthlyStatsCacheKey({\n chainIds,\n resolution,\n}: {\n chainIds: number[]\n resolution: string\n}): string {\n const chainKey = chainIds.slice().sort((a, b) => a - b).join(',')\n return `${chainKey}:${resolution}`\n}\n\n// Generate cache key for liquidity baseline data\nfunction generateLiquidityBaselineCacheKey({\n chainIds,\n targetTimestamp,\n resolution,\n}: {\n chainIds: number[]\n targetTimestamp: number\n resolution: string\n}): string {\n const chainKey = chainIds.slice().sort((a, b) => a - b).join(',')\n return `${chainKey}:${resolution}:${targetTimestamp}`\n}\n\n// Function to clear all caches\nexport function clearStatsRequestCache(): void {\n statsRequestCache.clear()\n monthlyStatsCache.clear()\n liquidityBaselineCache.clear()\n}\n\n// Type for aggregated monthly stats per currency/token-verifier combination\nexport interface MonthlyStatsEntry {\n currency?: string // Fiat currency (USD, EUR, CAD, etc.)\n token: string // Crypto token (USDC, etc.)\n verifier: string\n verifierName: string\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n totalFees: bigint // Protocol and referrer fees (tracked but not subtracted from netAmount as they remain in escrow)\n totalDust: bigint // Dust collected and transferred to dust recipient (subtracted from netAmount)\n totalVolume: bigint // sum of all activity\n netAmount: bigint // deposits - withdrawals - exchanges - dust (fees NOT subtracted as they remain in escrow until collected)\n}\n\n// Type for time-based grouped data\nexport interface StatsByTimeEntry {\n timeKey: string // Full ISO string (YYYY-MM-DDTHH:mm:ss.sssZ) - can be grouped by day, month, or hour as needed\n exchangeAmount: bigint\n withdrawalAmount: bigint\n depositAmount: bigint\n feeAmount: bigint // Protocol and referrer fees (tracked but not subtracted from netAmount as they remain in escrow)\n dustAmount: bigint // Dust collected and transferred to dust recipient (subtracted from netAmount)\n totalVolume: bigint // sum of all activity\n netAmount: bigint // deposits - withdrawals - exchanges - dust (fees NOT subtracted as they remain in escrow until collected)\n}\n\n// Ordered lists based on monthly stats\nexport interface OrderedLists {\n // Currency-based ordering (fiat currencies like USD, EUR, CAD)\n currenciesByVolume: Array<{\n currency: string\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n }>\n currenciesByNetLiquidity: Array<{\n currency: string\n netAmount: bigint\n totalVolume: bigint\n }>\n\n // Token-based ordering (crypto tokens like USDC)\n tokensByVolume: Array<{\n token: string\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n }>\n tokensByNetLiquidity: Array<{\n token: string\n netAmount: bigint\n totalVolume: bigint\n }>\n\n // Verifier ordering remains the same\n verifiersByVolume: Array<{\n verifier: ProviderKey\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n }>\n verifiersByNetLiquidity: Array<{\n verifier: ProviderKey\n netAmount: bigint\n totalVolume: bigint\n }>\n}\n\nexport interface UseMonthlyStatsReturn {\n monthlyStats: MonthlyStatsEntry[]\n statsByTime: StatsByTimeEntry[]\n orderedLists: OrderedLists\n /** @deprecated Use isLoading for initial load, isUpdating for background refresh */\n loading: boolean\n /** True during initial fetch when no data exists yet */\n isLoading: boolean\n /** True during background refetch when data already exists */\n isUpdating: boolean\n error: string | null\n hasData: boolean\n}\n\n/**\n * Fetch stats data with automatic caching\n * Results are cached per unique combination of chainIds, after cursor, resolution, and time bounds\n * Cache expires after 10 seconds\n */\nexport const fetchStats = async ({\n chainIds = [],\n lowerBoundTimestamp,\n upperBoundTimestamp,\n after,\n resolution = 'month',\n}: {\n chainIds?: ChainId[],\n lowerBoundTimestamp: number,\n upperBoundTimestamp?: number,\n after: string | undefined,\n resolution?: TimeResolutionKey,\n}) => {\n // Build where clause with chainId filtering if chainIds array is not empty\n const whereClause: {\n type: TimeResolutionKey\n OR?: { chainId: number, token: string }[]\n timestamp_gte?: number\n timestamp_lt?: number\n } = {\n type: resolution,\n timestamp_gte: lowerBoundTimestamp / 1_000,\n }\n\n if (upperBoundTimestamp) {\n whereClause.timestamp_lt = upperBoundTimestamp / 1_000\n }\n\n // Add chainId filtering if chainIds array is not empty\n const cIds = chainIds.length > 0 ? chainIds : chains.map(c => c.id)\n whereClause.OR = cIds.map(chainId => ({\n chainId: chainId,\n token: getLatestContract(chainId, 'usdc')!.toLowerCase(),\n }))\n\n // Generate cache key for this specific request\n const cacheKey = generateStatsRequestCacheKey({\n chainIds: cIds,\n after,\n resolution,\n lowerBoundTimestamp,\n upperBoundTimestamp\n })\n\n // Check if we have valid cached data\n const cachedResponse = statsRequestCache.get(cacheKey)\n const now = Date.now()\n const isValidCache = cachedResponse && (now - cachedResponse.timestamp) < CACHE_EXPIRATION_MS\n if (isValidCache) {\n return cachedResponse.data\n }\n\n const data = (async () => {\n const db = ponderClient.db\n\n // Get USDC token addresses for filtering\n const tokenAddresses = cIds.map(chainId => getLatestContract(chainId, 'usdc')!.toLowerCase())\n\n // Build where conditions\n const conditions = []\n\n // Filter by resolution type (hour, day, month)\n conditions.push(eq(schema.stat.type, resolution))\n\n if (chainIds.length > 0) {\n conditions.push(inArray(schema.stat.chainId, chainIds.map(id => BigInt(id))))\n }\n\n if (tokenAddresses.length > 0) {\n conditions.push(inArray(schema.stat.token, tokenAddresses as any))\n }\n\n const statsData = await db\n .select()\n .from(schema.stat)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(schema.stat.orderId))\n .limit(1000)\n\n // Map Ponder results to Stat type (event → action mapping)\n const mappedStats = statsData.map(stat => ({\n ...stat,\n action: stat.event, // Map event to action for compatibility\n })) as unknown as Stat[]\n\n return {\n stats: {\n items: mappedStats,\n pageInfo: {\n hasNextPage: false,\n endCursor: null\n }\n }\n }\n })()\n\n // Cache the response\n statsRequestCache.set(cacheKey, {\n data,\n timestamp: now,\n })\n\n return data\n}\n\n/**\n * Convert stat orderId timestamp to milliseconds for JavaScript Date.\n * Uses orderId.stat.parse from @provex/utils/ids.\n */\nconst orderIdToTimestamp = (id: string): number =>\n Number(orderId.stat.parse(id as Hex).timestamp * 1000n)\n\n/**\n * Group stats by time periods\n * @param stats - Array of stats to group\n * @returns Array of StatsByTimeEntry grouped by time\n */\nconst groupStatsByTime = (stats: Stat[]): StatsByTimeEntry[] => {\n const timeAggregationMap = new Map<string, StatsByTimeEntry>()\n\n stats.forEach(stat => {\n const { action, amount, orderId, timestamp: statTimestamp } = stat\n const amountBigInt = amount\n\n // Group by time using full ISO string\n // For monthly stats, use the timestamp property; for detailed stats, use orderId\n let timestamp: number\n if (statTimestamp !== null && statTimestamp !== undefined) {\n // Monthly stats have a timestamp property\n timestamp = Number(statTimestamp) * 1000\n } else {\n // Detailed stats use orderId for timestamp extraction\n timestamp = orderIdToTimestamp(orderId)\n }\n\n const date = new Date(timestamp)\n const timeKey = date.toISOString() // Full ISO string: YYYY-MM-DDTHH:mm:ss.sssZ\n\n let timeEntry = timeAggregationMap.get(timeKey)\n if (!timeEntry) {\n timeEntry = {\n timeKey,\n exchangeAmount: 0n,\n withdrawalAmount: 0n,\n depositAmount: 0n,\n feeAmount: 0n,\n dustAmount: 0n,\n totalVolume: 0n,\n netAmount: 0n\n }\n timeAggregationMap.set(timeKey, timeEntry)\n }\n\n // Aggregate time-based amounts by action type\n switch (action) {\n case statAction.deposit:\n timeEntry.depositAmount += amountBigInt\n break\n case statAction.withdrawal:\n timeEntry.withdrawalAmount += amountBigInt\n break\n case statAction.exchange:\n timeEntry.exchangeAmount += amountBigInt\n break\n case statAction.fee:\n timeEntry.feeAmount += amountBigInt\n break\n case statAction.dust:\n timeEntry.dustAmount += amountBigInt\n break\n }\n\n // Update time-based derived values\n // Note: fees are tracked but NOT subtracted from netAmount as they remain in escrow until collected\n // Dust IS subtracted because it's transferred out of escrow to the dust recipient\n timeEntry.totalVolume = timeEntry.depositAmount + timeEntry.withdrawalAmount + timeEntry.exchangeAmount + timeEntry.feeAmount + timeEntry.dustAmount\n timeEntry.netAmount = timeEntry.depositAmount - timeEntry.withdrawalAmount - timeEntry.exchangeAmount - timeEntry.dustAmount\n })\n\n return Array.from(timeAggregationMap.values())\n .sort((a, b) => a.timeKey.localeCompare(b.timeKey)) // Sort by time key ascending\n}\n\n/**\n * Fetch baseline liquidity by getting monthly stats before target month and detailed stats from target month start\n * This approach is more efficient: use aggregated monthly data for history, detailed data for current period\n */\nexport const fetchLiquidityBaseline = async ({\n chainIds = [],\n targetTimestamp,\n resolution = 'day',\n}: {\n chainIds?: ChainId[]\n targetTimestamp: number\n resolution?: TimeResolutionKey\n}): Promise<{ baseline: bigint, currentPeriodStats: Stat[], statsByTime: StatsByTimeEntry[] }> => {\n const cIds = chainIds.length > 0 ? chainIds : chains.map(c => c.id)\n\n // Calculate the start of the month containing the target timestamp\n const targetDate = new Date(targetTimestamp)\n const monthStart = new Date(targetDate.getUTCFullYear(), targetDate.getUTCMonth(), 1)\n const monthStartTimestamp = new Date(`${monthStart.getUTCFullYear()}-${(monthStart.getUTCMonth() + 1).toString().padStart(2, '0')}-01T00:00:00.000Z`).getTime()\n\n // Generate cache key for this specific request\n const cacheKey = generateLiquidityBaselineCacheKey({\n chainIds: cIds,\n targetTimestamp,\n resolution\n })\n\n // Check if we have valid cached data\n const cachedResponse = liquidityBaselineCache.get(cacheKey)\n const now = Date.now()\n const isValidCache = cachedResponse && (now - cachedResponse.timestamp) < CACHE_EXPIRATION_MS\n if (isValidCache) {\n return cachedResponse\n }\n\n try {\n // 1. Fetch all monthly stats before the target month for baseline calculation\n const monthlyData = await fetchStats({\n chainIds: cIds,\n after: undefined,\n resolution: 'month',\n lowerBoundTimestamp: 0, // Get all monthly data from the beginning\n upperBoundTimestamp: monthStartTimestamp,\n })\n\n // Filter monthly stats to only include those before the target month for baseline calculation\n const allStatsForTimeGrouping = monthlyData.stats.items.filter(stat => {\n return Number(stat.timestamp) * 1000 < monthStartTimestamp && isStatAction(stat.action)\n })\n\n // Calculate baseline from monthly stats\n const baseline = allStatsForTimeGrouping.reduce((acc: bigint, stat: Stat) => {\n let amount = stat.amount\n if (stat.action === statAction.withdrawal || stat.action === statAction.exchange) {\n amount = amount * -1n\n }\n return acc + amount\n }, 0n)\n\n // 2. Fetch detailed stats for the current period (from month start onwards)\n const currentPeriodStats: Stat[] = []\n let hasNextPage = true\n let after: string | undefined = undefined\n let iterations = 0\n const maxIterations = 50\n let previousCursor: string | undefined = undefined\n const seenCursors = new Set<string>()\n\n while (hasNextPage && iterations < maxIterations) {\n iterations++\n\n const detailedData = await fetchStats({\n lowerBoundTimestamp: monthStartTimestamp,\n chainIds: cIds,\n after,\n resolution,\n })\n\n const batch = detailedData.stats.items\n if (batch.length === 0) break\n\n // Filter to only include stats from the target month onwards\n const relevantStats = batch.filter(stat => {\n const statTimestamp = orderIdToTimestamp(stat.orderId)\n return statTimestamp >= monthStartTimestamp && isStatAction(stat.action)\n })\n\n currentPeriodStats.push(...relevantStats)\n\n // Check if we've gone too far back (before month start)\n const oldestInBatch = batch[batch.length - 1]\n if (oldestInBatch && orderIdToTimestamp(oldestInBatch.orderId) < monthStartTimestamp) {\n break\n }\n\n hasNextPage = detailedData.stats.pageInfo.hasNextPage\n const newCursor = detailedData.stats.pageInfo.endCursor || undefined\n\n // Prevent infinite loops by checking if cursor is advancing and not repeating\n if (hasNextPage && (newCursor === previousCursor || (newCursor && seenCursors.has(newCursor)))) {\n console.warn('Liquidity baseline pagination cursor not advancing or repeating, breaking pagination loop to prevent infinite loop')\n break\n }\n\n if (newCursor) {\n seenCursors.add(newCursor)\n }\n\n previousCursor = after\n after = newCursor\n }\n\n const result = {\n baseline,\n currentPeriodStats,\n statsByTime: groupStatsByTime(currentPeriodStats)\n }\n\n // Cache the result\n liquidityBaselineCache.set(cacheKey, {\n ...result,\n timestamp: now\n })\n\n return result\n\n } catch (error) {\n console.error('Error fetching liquidity baseline:', error)\n return {\n baseline: 0n,\n currentPeriodStats: [],\n statsByTime: []\n }\n }\n}\n\n/**\n * Fetch comprehensive stats data for charts and analysis\n * This function consolidates the fetching logic to avoid duplicate API calls\n */\nexport const fetchComprehensiveStats = async ({\n chainIds = [],\n lowerBoundTimestamp,\n resolution = 'day',\n}: {\n chainIds?: ChainId[]\n lowerBoundTimestamp: number\n resolution?: TimeResolutionKey\n}): Promise<{ baseline: bigint, allStats: Stat[], statsByTime: StatsByTimeEntry[] }> => {\n const cIds = chainIds.length > 0 ? chainIds : chains.map(c => c.id)\n\n // First, get the baseline and current period stats\n const { baseline, currentPeriodStats } = await fetchLiquidityBaseline({\n chainIds: cIds,\n targetTimestamp: lowerBoundTimestamp,\n resolution,\n })\n\n // If we need additional stats beyond what fetchLiquidityBaseline provides,\n // fetch them in a single consolidated request\n const allStats: Stat[] = [...currentPeriodStats]\n\n // Check if we need to fetch additional stats for the specific time window\n const needsAdditionalStats = currentPeriodStats.length === 0 ||\n currentPeriodStats.some(stat => orderIdToTimestamp(stat.orderId) < lowerBoundTimestamp)\n\n if (needsAdditionalStats) {\n let hasNextPage = true\n let after: string | undefined = undefined\n let iterations = 0\n const maxIterations = 50\n let previousCursor: string | undefined = undefined\n const seenCursors = new Set<string>()\n\n while (hasNextPage && iterations < maxIterations) {\n iterations++\n\n const data = await fetchStats({\n chainIds: cIds,\n after,\n resolution,\n lowerBoundTimestamp,\n })\n\n const batch = data.stats.items\n if (batch.length === 0) break\n\n // Filter to stats within the display window\n const windowStats = batch.filter(stat => {\n const timestamp = orderIdToTimestamp(stat.orderId)\n return timestamp >= lowerBoundTimestamp\n })\n\n allStats.push(...windowStats)\n\n // Check if we've gone past the window\n if (batch.length > 0) {\n const item = batch[batch.length - 1]\n if (item && orderIdToTimestamp(item.orderId) < lowerBoundTimestamp) {\n break\n }\n }\n\n hasNextPage = data.stats.pageInfo.hasNextPage\n const newCursor = data.stats.pageInfo.endCursor || undefined\n\n // Prevent infinite loops by checking if cursor is advancing and not repeating\n if (hasNextPage && (newCursor === previousCursor || (newCursor && seenCursors.has(newCursor)))) {\n console.warn('Comprehensive stats pagination cursor not advancing or repeating, breaking pagination loop to prevent infinite loop')\n break\n }\n\n if (newCursor) {\n seenCursors.add(newCursor)\n }\n\n previousCursor = after\n after = newCursor\n }\n }\n\n // Remove duplicates and sort chronologically\n const uniqueStats = Array.from(\n new Map(allStats.map(stat => [stat.orderId, stat])).values()\n ).sort((a, b) => {\n const timestampA = orderIdToTimestamp(a.orderId)\n const timestampB = orderIdToTimestamp(b.orderId)\n return timestampA - timestampB\n })\n\n return {\n baseline,\n allStats: uniqueStats,\n statsByTime: groupStatsByTime(uniqueStats)\n }\n}\n\n/**\n * Hook for fetching and processing monthly statistics data\n * @param chainIds - Array of chain IDs to filter by. If empty, includes all chain IDs.\n * @returns Monthly stats data, ordered lists, loading state, error state, and refetch function\n */\nexport function useMonthlyStats({\n chainIds,\n}: {\n chainIds: ChainId[]\n}): UseMonthlyStatsReturn {\n const [monthlyStats, setMonthlyStats] = useState<MonthlyStatsEntry[]>([])\n const [statsByTime, setStatsByTime] = useState<StatsByTimeEntry[]>([])\n const [orderedLists, setOrderedLists] = useState<OrderedLists>({\n currenciesByVolume: [],\n currenciesByNetLiquidity: [],\n tokensByVolume: [],\n tokensByNetLiquidity: [],\n verifiersByVolume: [],\n verifiersByNetLiquidity: []\n })\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n // Memoize chainIds to prevent unnecessary re-renders\n // Use spread to avoid mutating the original array with sort()\n const memoizedChainIds = useMemo(() => chainIds, [JSON.stringify([...chainIds].sort((a, b) => a - b))])\n\n const fetchMonthlyStats = useCallback(async (chainIds: ChainId[]) => {\n // No concurrent fetch check needed - the cache mechanism in fetchStats handles deduplication\n try {\n setLoading(true)\n setError(null)\n\n // Check cache for final aggregated results first\n const monthlyStatsCacheKey = generateMonthlyStatsCacheKey({\n chainIds,\n resolution: 'month'\n })\n const cachedMonthlyStats = monthlyStatsCache.get(monthlyStatsCacheKey)\n const now = Date.now()\n const isValidMonthlyStatsCache = cachedMonthlyStats &&\n (now - cachedMonthlyStats.timestamp) < CACHE_EXPIRATION_MS\n\n if (isValidMonthlyStatsCache) {\n setMonthlyStats(cachedMonthlyStats.monthlyStats)\n setStatsByTime(cachedMonthlyStats.statsByTime)\n setOrderedLists(cachedMonthlyStats.orderedLists)\n return\n }\n\n const allStats: Stat[] = []\n let hasNextPage = true\n let after: string | undefined = undefined\n let currentIteration = 0\n const maxIterations = 100\n\n // Fetch all monthly stats data with pagination\n let previousCursor: string | undefined = undefined\n const seenCursors = new Set<string>()\n\n while (hasNextPage && currentIteration < maxIterations) {\n currentIteration++\n\n const data = await fetchStats({\n chainIds,\n after,\n resolution: 'month',\n lowerBoundTimestamp: 0, // Get all monthly data from the beginning\n })\n const batch = data.stats.items\n if (batch.length === 0) {\n break\n }\n\n allStats.push(...batch)\n\n hasNextPage = data.stats.pageInfo.hasNextPage\n const newCursor = data.stats.pageInfo.endCursor || undefined\n\n // Prevent infinite loops by checking if cursor is advancing and not repeating\n if (hasNextPage && (newCursor === previousCursor || (newCursor && seenCursors.has(newCursor)))) {\n console.warn('Pagination cursor not advancing or repeating, breaking pagination loop to prevent infinite loop')\n break\n }\n\n if (newCursor) {\n seenCursors.add(newCursor)\n }\n\n previousCursor = after\n after = newCursor\n\n if (!hasNextPage) {\n break\n }\n }\n\n // Log if we hit max iterations (potential infinite loop protection)\n if (currentIteration >= maxIterations) {\n console.warn(`Monthly stats pagination hit max iterations (${maxIterations}), there may be a pagination issue`)\n }\n\n // Process and aggregate the stats\n const aggregationMap = new Map<string, MonthlyStatsEntry>()\n\n allStats.forEach(stat => {\n const { currency, token, verifier, action, amount } = stat\n const amountBigInt = amount\n\n // Create key using both currency and token for unique identification\n const key = `${currency || 'null'}-${token}-${verifier}`\n\n // Get or create entry for this currency/token-verifier combination\n let entry = aggregationMap.get(key)\n if (!entry) {\n entry = {\n currency: currency || undefined,\n token,\n verifier,\n verifierName: getPaymentMethodName(null, verifier) || 'Unknown',\n totalDeposits: 0n,\n totalWithdrawals: 0n,\n totalExchanges: 0n,\n totalFees: 0n,\n totalDust: 0n,\n totalVolume: 0n,\n netAmount: 0n\n }\n aggregationMap.set(key, entry)\n }\n\n // Aggregate amounts by action type\n switch (action) {\n case statAction.deposit:\n entry.totalDeposits += amountBigInt\n break\n case statAction.withdrawal:\n entry.totalWithdrawals += amountBigInt\n break\n case statAction.exchange:\n entry.totalExchanges += amountBigInt\n break\n case statAction.fee:\n entry.totalFees += amountBigInt\n break\n case statAction.dust:\n entry.totalDust += amountBigInt\n break\n }\n\n // Update derived values\n // Note: fees are tracked but NOT subtracted from netAmount as they remain in escrow until collected\n // Dust IS subtracted because it's transferred out of escrow to the dust recipient\n entry.totalVolume = entry.totalDeposits + entry.totalWithdrawals + entry.totalExchanges + entry.totalFees + entry.totalDust\n entry.netAmount = entry.totalDeposits - entry.totalWithdrawals - entry.totalExchanges - entry.totalDust\n })\n\n const processedStats = Array.from(aggregationMap.values())\n const processedStatsByTime = groupStatsByTime(allStats)\n\n // Create ordered lists for currencies (fiat)\n const currencyAggregation = new Map<string, {\n currency: string\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n netAmount: bigint\n }>()\n\n // Create ordered lists for tokens (crypto)\n const tokenAggregation = new Map<string, {\n token: string\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n netAmount: bigint\n }>()\n\n // Create ordered lists for verifiers\n const verifierAggregation = new Map<ProviderKey, {\n verifier: ProviderKey\n verifierAddress: string\n totalVolume: bigint\n totalDeposits: bigint\n totalWithdrawals: bigint\n totalExchanges: bigint\n netAmount: bigint\n }>()\n\n // Aggregate by currency, token, and verifier\n processedStats.forEach(entry => {\n // Aggregate by currency (fiat) - only if currency exists\n if (entry.currency) {\n const currencyKey = entry.currency\n let currencyEntry = currencyAggregation.get(currencyKey)\n if (!currencyEntry) {\n currencyEntry = {\n currency: entry.currency,\n totalVolume: 0n,\n totalDeposits: 0n,\n totalWithdrawals: 0n,\n totalExchanges: 0n,\n netAmount: 0n\n }\n currencyAggregation.set(currencyKey, currencyEntry)\n }\n currencyEntry.totalDeposits += entry.totalDeposits\n currencyEntry.totalWithdrawals += entry.totalWithdrawals\n currencyEntry.totalExchanges += entry.totalExchanges\n currencyEntry.totalVolume += entry.totalVolume\n currencyEntry.netAmount += entry.netAmount\n }\n\n // Aggregate by token (crypto)\n const tokenKey = entry.token\n let tokenEntry = tokenAggregation.get(tokenKey)\n if (!tokenEntry) {\n tokenEntry = {\n token: entry.token,\n totalVolume: 0n,\n totalDeposits: 0n,\n totalWithdrawals: 0n,\n totalExchanges: 0n,\n netAmount: 0n\n }\n tokenAggregation.set(tokenKey, tokenEntry)\n }\n tokenEntry.totalDeposits += entry.totalDeposits\n tokenEntry.totalWithdrawals += entry.totalWithdrawals\n tokenEntry.totalExchanges += entry.totalExchanges\n tokenEntry.totalVolume += entry.totalVolume\n tokenEntry.netAmount += entry.netAmount\n\n // Aggregate by verifier\n const verifierKey = verifierGetsKey(null, entry.verifier)\n let verifierEntry = verifierAggregation.get(verifierKey)\n if (!verifierEntry) {\n verifierEntry = {\n verifier: verifierKey,\n verifierAddress: entry.verifier,\n totalVolume: 0n,\n totalDeposits: 0n,\n totalWithdrawals: 0n,\n totalExchanges: 0n,\n netAmount: 0n\n }\n verifierAggregation.set(verifierKey, verifierEntry)\n }\n verifierEntry.totalDeposits += entry.totalDeposits\n verifierEntry.totalWithdrawals += entry.totalWithdrawals\n verifierEntry.totalExchanges += entry.totalExchanges\n verifierEntry.totalVolume += entry.totalVolume\n verifierEntry.netAmount += entry.netAmount\n })\n\n // Create ordered lists\n const newOrderedLists: OrderedLists = {\n currenciesByVolume: Array.from(currencyAggregation.values())\n .sort((a, b) => b.totalVolume > a.totalVolume ? 1 : -1),\n\n currenciesByNetLiquidity: Array.from(currencyAggregation.values())\n .sort((a, b) => b.netAmount > a.netAmount ? 1 : -1),\n\n tokensByVolume: Array.from(tokenAggregation.values())\n .sort((a, b) => b.totalExchanges > a.totalExchanges ? 1 : -1),\n\n tokensByNetLiquidity: Array.from(tokenAggregation.values())\n .sort((a, b) => b.netAmount > a.netAmount ? 1 : -1),\n\n verifiersByVolume: Array.from(verifierAggregation.values())\n .sort((a, b) => b.totalExchanges > a.totalExchanges ? 1 : -1),\n\n verifiersByNetLiquidity: Array.from(verifierAggregation.values())\n .sort((a, b) => b.netAmount > a.netAmount ? 1 : -1)\n }\n\n // Cache the final aggregated results\n monthlyStatsCache.set(monthlyStatsCacheKey, {\n monthlyStats: processedStats,\n statsByTime: processedStatsByTime,\n orderedLists: newOrderedLists,\n timestamp: now\n })\n\n setMonthlyStats(processedStats)\n setStatsByTime(processedStatsByTime)\n setOrderedLists(newOrderedLists)\n } catch (err) {\n console.error('Error fetching monthly stats:', err)\n setError(err instanceof Error ? err.message : 'Failed to fetch monthly stats')\n // Don't re-throw the error to prevent infinite loops\n } finally {\n setLoading(false)\n }\n }, [])\n\n // Fetch when chainIds changes - caching is handled by fetchStats\n useEffect(() => {\n fetchMonthlyStats(memoizedChainIds)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [memoizedChainIds])\n\n // Derive loading state semantics:\n // - isLoading: true only during initial fetch (no data yet)\n // - isUpdating: true during background refetch (data already exists)\n const hasData = monthlyStats.length > 0 || statsByTime.length > 0\n const isLoading = loading && !hasData\n const isUpdating = loading && hasData\n\n return {\n monthlyStats,\n statsByTime,\n orderedLists,\n loading,\n isLoading,\n isUpdating,\n error,\n hasData,\n }\n}\n","/**\n * @fileoverview Ponder adapter — implements IndexerAdapter for @provex/react.\n *\n * This is the default data source for Provex apps. It wraps the Ponder SQL\n * client and existing query functions into the IndexerAdapter interface\n * that @provex/react hooks consume.\n *\n * @example\n * ```tsx\n * import { createPonderAdapter } from '@provex/indexer-client'\n * import { ProvexProvider } from '@provex/react'\n *\n * const indexer = createPonderAdapter({ indexerUrl: 'https://indexer.provex.com' })\n *\n * <ProvexProvider indexer={indexer} config={...}>\n * <App />\n * </ProvexProvider>\n * ```\n */\n\nimport type { Hex } from 'viem'\nimport type { ChainId } from '@provex/utils/chain'\nimport { chains } from '@provex/utils/chain'\nimport { ponderClient, schema } from './lib/ponder'\nimport {\n getDepositById,\n getTransactionByHash,\n getIntentByHash,\n getUserReputationStats,\n getLastSignaledIntentTimestamp,\n} from './lib/ponderQueries'\nimport { and, eq, desc, sql } from '@ponder/client'\n\n/**\n * Re-export the IndexerAdapter type so consumers can type their own\n * implementations without importing from @provex/react directly.\n */\nexport type {\n IndexerAdapter,\n IndexedDeposit,\n IndexedVerifier,\n IndexedIntent,\n ReputationData,\n PaginationOptions,\n PaginatedResult,\n} from '@provex/react'\n\nimport type {\n IndexerAdapter,\n IndexedDeposit,\n IndexedVerifier,\n IndexedIntent,\n ReputationData,\n PaginatedResult,\n} from '@provex/react'\n\n/**\n * Create an IndexerAdapter backed by a Ponder SQL-over-HTTP client.\n *\n * This is the reference implementation of IndexerAdapter. Third-party\n * developers can implement the same interface against The Graph, a REST\n * API, or direct RPC calls.\n */\nexport function createPonderAdapter(): IndexerAdapter {\n return {\n // ─── Deposit Discovery ──────────────────────────────────\n\n async getMatchableDeposits({\n chainId,\n token,\n currencyId,\n pagination,\n }): Promise<PaginatedResult<IndexedDeposit>> {\n const db = ponderClient.db\n const limit = pagination?.limit ?? 100\n\n // Main deposit query\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(\n and(\n eq(schema.deposit.chainId, BigInt(chainId)),\n eq(schema.deposit.status, 'active'),\n sql`\"deposit\".\"version\" = 'v3'`,\n eq(schema.deposit.acceptingIntents, true),\n eq(schema.deposit.token, token.toLowerCase() as Hex),\n sql`${currencyId.toLowerCase()} = ANY(${schema.deposit.depositConversionRateCurrencies})`\n )\n )\n .orderBy(desc(schema.deposit.orderId))\n .limit(limit + 1) // Fetch one extra to detect next page\n\n const hasNextPage = deposits.length > limit\n const page = hasNextPage ? deposits.slice(0, limit) : deposits\n\n if (page.length === 0) {\n return { items: [], nextCursor: null }\n }\n\n // Group deposits by escrow for batch queries\n const depositsByEscrow = new Map<string, { escrow: Hex; chainId: bigint; localIds: bigint[] }>()\n for (const deposit of page) {\n const escrowKey = `${deposit.escrow}-${deposit.chainId}`\n const existing = depositsByEscrow.get(escrowKey)\n if (existing) {\n existing.localIds.push(deposit.localId)\n } else {\n depositsByEscrow.set(escrowKey, {\n escrow: deposit.escrow,\n chainId: deposit.chainId,\n localIds: [deposit.localId],\n })\n }\n }\n\n // Batch fetch all related data in parallel\n const ratePromises: Promise<typeof schema.depositConversionRateUpdated.$inferSelect[]>[] = []\n const verifierPromises: Promise<typeof schema.depositVerifierAdded.$inferSelect[]>[] = []\n const lockedPromises: Promise<typeof schema.fundsLocked.$inferSelect[]>[] = []\n const unlockedPromises: Promise<typeof schema.fundsUnlocked.$inferSelect[]>[] = []\n const transferredPromises: Promise<typeof schema.fundsUnlockedAndTransferred.$inferSelect[]>[] = []\n\n for (const { escrow, chainId: cId, localIds } of depositsByEscrow.values()) {\n const localIdInClause = sql`${sql.join(localIds.map(id => sql`${id}`), sql`, `)}`\n\n ratePromises.push(\n db.select()\n .from(schema.depositConversionRateUpdated)\n .where(and(\n eq(schema.depositConversionRateUpdated.depositEscrow, escrow),\n eq(schema.depositConversionRateUpdated.depositChainId, cId),\n eq(schema.depositConversionRateUpdated.active, true),\n sql`${schema.depositConversionRateUpdated.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n verifierPromises.push(\n db.select()\n .from(schema.depositVerifierAdded)\n .where(and(\n eq(schema.depositVerifierAdded.depositEscrow, escrow),\n eq(schema.depositVerifierAdded.depositChainId, cId),\n sql`${schema.depositVerifierAdded.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n lockedPromises.push(\n db.select()\n .from(schema.fundsLocked)\n .where(and(\n eq(schema.fundsLocked.depositEscrow, escrow),\n eq(schema.fundsLocked.depositChainId, cId),\n sql`${schema.fundsLocked.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n unlockedPromises.push(\n db.select()\n .from(schema.fundsUnlocked)\n .where(and(\n eq(schema.fundsUnlocked.depositEscrow, escrow),\n eq(schema.fundsUnlocked.depositChainId, cId),\n sql`${schema.fundsUnlocked.depositLocalId} IN (${localIdInClause})`\n ))\n )\n\n transferredPromises.push(\n db.select()\n .from(schema.fundsUnlockedAndTransferred)\n .where(and(\n eq(schema.fundsUnlockedAndTransferred.depositEscrow, escrow),\n eq(schema.fundsUnlockedAndTransferred.depositChainId, cId),\n sql`${schema.fundsUnlockedAndTransferred.depositLocalId} IN (${localIdInClause})`\n ))\n )\n }\n\n const [rateResults, verifierResults, lockedResults, unlockedResults, transferredResults] = await Promise.all([\n Promise.all(ratePromises),\n Promise.all(verifierPromises),\n Promise.all(lockedPromises),\n Promise.all(unlockedPromises),\n Promise.all(transferredPromises),\n ])\n\n const allRates = rateResults.flat()\n const allVerifiers = verifierResults.flat()\n const allLocked = lockedResults.flat()\n const allUnlocked = unlockedResults.flat()\n const allTransferred = transferredResults.flat()\n\n // Resolve locks: build set of resolved intent hashes\n const resolvedIntentHashes = new Set([\n ...allUnlocked.map(u => u.intentHash),\n ...allTransferred.map(t => t.intentHash),\n ])\n\n const currentTimestamp = BigInt(Math.floor(Date.now() / 1000))\n\n // Build lookup maps keyed by deposit compound key\n const ratesByDeposit = new Map<string, typeof allRates>()\n const verifiersByDeposit = new Map<string, typeof allVerifiers>()\n const lockedByDeposit = new Map<string, bigint>()\n const reclaimableByDeposit = new Map<string, bigint>()\n\n for (const d of page) {\n const key = `${d.escrow}-${d.localId}-${d.chainId}`\n ratesByDeposit.set(key, [])\n verifiersByDeposit.set(key, [])\n }\n\n for (const rate of allRates) {\n const key = `${rate.depositEscrow}-${rate.depositLocalId}-${rate.depositChainId}`\n ratesByDeposit.get(key)?.push(rate)\n }\n\n for (const verifier of allVerifiers) {\n const key = `${verifier.depositEscrow}-${verifier.depositLocalId}-${verifier.depositChainId}`\n verifiersByDeposit.get(key)?.push(verifier)\n }\n\n for (const lock of allLocked) {\n if (resolvedIntentHashes.has(lock.intentHash)) continue\n const key = `${lock.depositEscrow}-${lock.depositLocalId}-${lock.depositChainId}`\n if (lock.expiryTime <= currentTimestamp) {\n reclaimableByDeposit.set(key, (reclaimableByDeposit.get(key) ?? 0n) + lock.amount)\n } else {\n lockedByDeposit.set(key, (lockedByDeposit.get(key) ?? 0n) + lock.amount)\n }\n }\n\n // Assemble IndexedDeposit objects\n const items: IndexedDeposit[] = page.map(deposit => {\n const key = `${deposit.escrow}-${deposit.localId}-${deposit.chainId}`\n const rates = ratesByDeposit.get(key) ?? []\n const verifiers = verifiersByDeposit.get(key) ?? []\n const locked = lockedByDeposit.get(key) ?? 0n\n const reclaimable = reclaimableByDeposit.get(key) ?? 0n\n\n // Build conversion rate map: paymentMethodId → currencyId → value\n const conversionRates = new Map<string, Map<string, bigint>>()\n for (const rate of rates) {\n const methodKey = rate.verifier.toLowerCase()\n let currencyMap = conversionRates.get(methodKey)\n if (!currencyMap) {\n currencyMap = new Map()\n conversionRates.set(methodKey, currencyMap)\n }\n const existing = currencyMap.get(rate.currency.toLowerCase())\n // Keep latest rate (highest changeId)\n if (!existing || rate.value > existing) {\n currencyMap.set(rate.currency.toLowerCase(), rate.value)\n }\n }\n\n // Build payment method ID set\n const paymentMethodIds = new Set(verifiers.map(v => v.paymentMethodId.toLowerCase()))\n\n // Build verifier records\n const indexedVerifiers: IndexedVerifier[] = verifiers.map(v => ({\n paymentMethodId: v.paymentMethodId,\n payeeDetailsHash: v.payeeDetailsHash,\n intentGatingService: v.intentGatingService,\n active: v.active,\n }))\n\n return {\n escrow: deposit.escrow,\n localId: deposit.localId,\n chainId: Number(deposit.chainId) as ChainId,\n participantAddress: deposit.participantAddress,\n token: deposit.token,\n remaining: deposit.remaining,\n deposited: deposit.deposited,\n minAmount: deposit.minAmount,\n maxAmount: deposit.maxAmount,\n status: deposit.status,\n acceptingIntents: deposit.acceptingIntents,\n availableFunds: deposit.remaining + reclaimable - locked,\n conversionRates,\n paymentMethodIds,\n verifiers: indexedVerifiers,\n }\n })\n\n const lastItem = page[page.length - 1]\n const nextCursor = hasNextPage && lastItem ? lastItem.orderId : null\n\n return { items, nextCursor }\n },\n\n // ─── Single Deposit ───────────────────────────────────\n\n async getDepositWithVerifiers({ escrow, localId, chainId }) {\n const db = ponderClient.db\n\n const deposits = await db\n .select()\n .from(schema.deposit)\n .where(and(\n eq(schema.deposit.escrow, escrow.toLowerCase() as Hex),\n eq(schema.deposit.localId, localId),\n eq(schema.deposit.chainId, BigInt(chainId))\n ))\n .limit(1)\n\n const deposit = deposits[0]\n if (!deposit) return null\n\n const verifiers = await db\n .select()\n .from(schema.depositVerifierAdded)\n .where(and(\n eq(schema.depositVerifierAdded.depositEscrow, deposit.escrow),\n eq(schema.depositVerifierAdded.depositLocalId, deposit.localId),\n eq(schema.depositVerifierAdded.depositChainId, deposit.chainId)\n ))\n\n return {\n escrow: deposit.escrow,\n localId: deposit.localId,\n chainId: Number(deposit.chainId) as ChainId,\n participantAddress: deposit.participantAddress,\n token: deposit.token,\n remaining: deposit.remaining,\n deposited: deposit.deposited,\n minAmount: deposit.minAmount,\n maxAmount: deposit.maxAmount,\n status: deposit.status,\n acceptingIntents: deposit.acceptingIntents,\n availableFunds: deposit.remaining, // Single deposit view doesn't compute locks\n conversionRates: new Map(),\n paymentMethodIds: new Set(verifiers.map(v => v.paymentMethodId.toLowerCase())),\n verifiers: verifiers.map(v => ({\n paymentMethodId: v.paymentMethodId,\n payeeDetailsHash: v.payeeDetailsHash,\n intentGatingService: v.intentGatingService,\n active: v.active,\n })),\n }\n },\n\n // ─── Intent Lifecycle ─────────────────────────────────\n\n async getIntent({ intentHash, chainId }) {\n const db = ponderClient.db\n const normalizedHash = intentHash.toLowerCase() as Hex\n\n // Get intent with fundsLocked\n const intent = await getIntentByHash(normalizedHash, chainId)\n if (!intent) return null\n\n // Get status: check fulfilled, pruned, signaled\n const [fulfilled, pruned] = await Promise.all([\n db.select().from(schema.intentFulfilled).where(eq(schema.intentFulfilled.intentHash, normalizedHash)).limit(1),\n db.select().from(schema.intentPruned).where(eq(schema.intentPruned.intentHash, normalizedHash)).limit(1),\n ])\n\n let status: IndexedIntent['status'] = 'signalled'\n let prunedAt: bigint | null = null\n\n if (fulfilled.length > 0) {\n status = 'fulfilled'\n } else if (pruned.length > 0) {\n status = 'pruned'\n // Look up pruned timestamp\n const prunedRecord = pruned[0]\n if (prunedRecord) {\n const txResult = await db\n .select({ blockId: schema.transaction.blockId })\n .from(schema.transaction)\n .where(eq(schema.transaction.orderId, prunedRecord.transactionId))\n .limit(1)\n\n const txRecord = txResult[0]\n if (txRecord) {\n const blockResult = await db\n .select({ timestamp: schema.block.timestamp })\n .from(schema.block)\n .where(eq(schema.block.orderId, txRecord.blockId))\n .limit(1)\n\n prunedAt = blockResult[0]?.timestamp ?? null\n }\n }\n }\n\n return {\n intentHash: intent.intentHash,\n ownerAddress: intent.ownerAddress,\n toAddress: intent.toAddress,\n escrow: intent.escrow,\n depositLocalId: intent.depositLocalId,\n amount: intent.amount,\n timestamp: intent.timestamp,\n paymentMethodId: intent.paymentMethodId,\n fiatCurrency: intent.fiatCurrency,\n conversionRate: intent.conversionRate,\n expiryTime: (intent as Record<string, unknown>).fundsLocked\n ? ((intent as Record<string, unknown>).fundsLocked as { expiryTime: bigint }).expiryTime\n : null,\n status,\n prunedAt,\n }\n },\n\n // ─── Payee Details ────────────────────────────────────\n\n async getPayeeDetailsHash({ escrow, localId, chainId, paymentMethodId }) {\n const db = ponderClient.db\n\n const result = await db\n .select({ payeeDetailsHash: schema.depositVerifierAdded.payeeDetailsHash })\n .from(schema.depositVerifierAdded)\n .where(\n and(\n eq(schema.depositVerifierAdded.depositEscrow, escrow.toLowerCase() as Hex),\n eq(schema.depositVerifierAdded.depositLocalId, localId),\n eq(schema.depositVerifierAdded.depositChainId, BigInt(chainId)),\n eq(schema.depositVerifierAdded.paymentMethodId, paymentMethodId.toLowerCase() as Hex)\n )\n )\n .limit(1)\n\n return result[0]?.payeeDetailsHash ?? null\n },\n\n // ─── Reputation ───────────────────────────────────────\n\n async getUserReputation({ address, chainId }): Promise<ReputationData> {\n const stats = await getUserReputationStats({ address, chainId })\n\n // Get last signaled timestamps per chain\n const lastSignaledAt: Partial<Record<ChainId, bigint>> = {}\n const chainIds = chainId ? [chainId] : chains.map(c => c.id) as ChainId[]\n\n const timestamps = await Promise.all(\n chainIds.map(async (cId) => {\n const ts = await getLastSignaledIntentTimestamp({ address, chainId: cId })\n return { chainId: cId, timestamp: ts }\n })\n )\n\n for (const { chainId: cId, timestamp } of timestamps) {\n if (timestamp !== null) {\n lastSignaledAt[cId] = timestamp\n }\n }\n\n return {\n fulfilledVolumeUsdc: stats.fulfilledVolumeUsdc,\n fulfilledCount: stats.fulfilledCount,\n lateCancellations: stats.lateCancellations,\n lastSignaledAt,\n }\n },\n\n // ─── Post-Tx Sync ─────────────────────────────────────\n\n getTransactionByHash,\n getDepositById,\n }\n}\n"],"mappings":"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AI,KAAK,WAAW,CAAC,EAAE,UAAU,KAAK,SAAQ,CAAE,IAAI,CAAA;IACpD,GAAI,KAAK,eAAe,CAAA;IACxB,GAAI,KAAK,cAAc,CAAC,KAAK,WAAW,IAAI,CAAA;IAC5C,GAAI,KAAK,iBAAiB,CAAA;IAC1B,GAAI,KAAK,aAAa,CAAC,EAAE,YAAY,KAAK,WAAU,CAAE,IAAI,CAAA;;;AAI9D,IAAM,YAAY,IAAI,IACpB;EACE,GAAG,MAAM,KAAK,WAAW,OAAM,CAAE;EACjC;EACA;EACA,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAiLpC,IAAM,gBAAgB,oBAAI,IAAI;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;;;ACx7CD,SAEE,gBAAAC,eACA,aACA,SACA,cACK;AACP,SAIE,eACA,UACA,eACK;;;ACzBP,IAAI,mBAAmB,OAAO;;;ACC9B,IAAI,YAAY,OAAO,SAAS,UAA0B,uBAAO,OAAO,IAAI,MAAM;AAChF,QAAM,EAAE,MAAM,OAAO,MAAM,MAAM,IAAI;AACrC,QAAM,UAAU,mBAAmB,cAAc,QAAQ,IAAI,UAAU,QAAQ;AAC/E,QAAM,cAAc,QAAQ,IAAI,cAAc;AAC9C,MAAI,aAAa,WAAW,qBAAqB,KAAK,aAAa,WAAW,mCAAmC,GAAG;AAClH,WAAO,cAAc,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC;AACV;AACA,eAAe,cAAc,SAAS,SAAS;AAC7C,QAAM,WAAW,MAAM,QAAQ,SAAS;AACxC,MAAI,UAAU;AACZ,WAAO,0BAA0B,UAAU,OAAO;AAAA,EACpD;AACA,SAAO,CAAC;AACV;AACA,SAAS,0BAA0B,UAAU,SAAS;AACpD,QAAM,OAAuB,uBAAO,OAAO,IAAI;AAC/C,WAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,UAAM,uBAAuB,QAAQ,OAAO,IAAI,SAAS,IAAI;AAC7D,QAAI,CAAC,sBAAsB;AACzB,WAAK,GAAG,IAAI;AAAA,IACd,OAAO;AACL,6BAAuB,MAAM,KAAK,KAAK;AAAA,IACzC;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,KAAK;AACf,WAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7C,YAAM,uBAAuB,IAAI,SAAS,GAAG;AAC7C,UAAI,sBAAsB;AACxB,kCAA0B,MAAM,KAAK,KAAK;AAC1C,eAAO,KAAK,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AACA,IAAI,yBAAyB,CAAC,MAAM,KAAK,UAAU;AACjD,MAAI,KAAK,GAAG,MAAM,QAAQ;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG,CAAC,GAAG;AAC5B;AACA,WAAK,GAAG,EAAE,KAAK,KAAK;AAAA,IACtB,OAAO;AACL,WAAK,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,KAAK;AAAA,IAC/B;AAAA,EACF,OAAO;AACL,QAAI,CAAC,IAAI,SAAS,IAAI,GAAG;AACvB,WAAK,GAAG,IAAI;AAAA,IACd,OAAO;AACL,WAAK,GAAG,IAAI,CAAC,KAAK;AAAA,IACpB;AAAA,EACF;AACF;AACA,IAAI,4BAA4B,CAAC,MAAM,KAAK,UAAU;AACpD,MAAI,aAAa;AACjB,QAAM,OAAO,IAAI,MAAM,GAAG;AAC1B,OAAK,QAAQ,CAAC,MAAMC,WAAU;AAC5B,QAAIA,WAAU,KAAK,SAAS,GAAG;AAC7B,iBAAW,IAAI,IAAI;AAAA,IACrB,OAAO;AACL,UAAI,CAAC,WAAW,IAAI,KAAK,OAAO,WAAW,IAAI,MAAM,YAAY,MAAM,QAAQ,WAAW,IAAI,CAAC,KAAK,WAAW,IAAI,aAAa,MAAM;AACpI,mBAAW,IAAI,IAAoB,uBAAO,OAAO,IAAI;AAAA,MACvD;AACA,mBAAa,WAAW,IAAI;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;;;ACfA,IAAI,YAAY,CAAC,KAAK,YAAY;AAChC,MAAI;AACF,WAAO,QAAQ,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO,IAAI,QAAQ,yBAAyB,CAACC,WAAU;AACrD,UAAI;AACF,eAAO,QAAQA,MAAK;AAAA,MACtB,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;AA2DA,IAAI,aAAa,CAAC,UAAU;AAC1B,MAAI,CAAC,OAAO,KAAK,KAAK,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,GAAG,MAAM,IAAI;AAC7B,YAAQ,MAAM,QAAQ,OAAO,GAAG;AAAA,EAClC;AACA,SAAO,MAAM,QAAQ,GAAG,MAAM,KAAK,UAAU,OAAO,mBAAmB,IAAI;AAC7E;AACA,IAAI,iBAAiB,CAAC,KAAK,KAAK,aAAa;AAC3C,MAAI;AACJ,MAAI,CAAC,YAAY,OAAO,CAAC,OAAO,KAAK,GAAG,GAAG;AACzC,QAAI,YAAY,IAAI,QAAQ,IAAI,GAAG,IAAI,CAAC;AACxC,QAAI,cAAc,IAAI;AACpB,kBAAY,IAAI,QAAQ,IAAI,GAAG,IAAI,CAAC;AAAA,IACtC;AACA,WAAO,cAAc,IAAI;AACvB,YAAM,kBAAkB,IAAI,WAAW,YAAY,IAAI,SAAS,CAAC;AACjE,UAAI,oBAAoB,IAAI;AAC1B,cAAM,aAAa,YAAY,IAAI,SAAS;AAC5C,cAAM,WAAW,IAAI,QAAQ,KAAK,UAAU;AAC5C,eAAO,WAAW,IAAI,MAAM,YAAY,aAAa,KAAK,SAAS,QAAQ,CAAC;AAAA,MAC9E,WAAW,mBAAmB,MAAM,MAAM,eAAe,GAAG;AAC1D,eAAO;AAAA,MACT;AACA,kBAAY,IAAI,QAAQ,IAAI,GAAG,IAAI,YAAY,CAAC;AAAA,IAClD;AACA,cAAU,OAAO,KAAK,GAAG;AACzB,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,CAAC;AACjB,cAAY,OAAO,KAAK,GAAG;AAC3B,MAAI,WAAW,IAAI,QAAQ,KAAK,CAAC;AACjC,SAAO,aAAa,IAAI;AACtB,UAAM,eAAe,IAAI,QAAQ,KAAK,WAAW,CAAC;AAClD,QAAI,aAAa,IAAI,QAAQ,KAAK,QAAQ;AAC1C,QAAI,aAAa,gBAAgB,iBAAiB,IAAI;AACpD,mBAAa;AAAA,IACf;AACA,QAAI,OAAO,IAAI;AAAA,MACb,WAAW;AAAA,MACX,eAAe,KAAK,iBAAiB,KAAK,SAAS,eAAe;AAAA,IACpE;AACA,QAAI,SAAS;AACX,aAAO,WAAW,IAAI;AAAA,IACxB;AACA,eAAW;AACX,QAAI,SAAS,IAAI;AACf;AAAA,IACF;AACA,QAAI;AACJ,QAAI,eAAe,IAAI;AACrB,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ,IAAI,MAAM,aAAa,GAAG,iBAAiB,KAAK,SAAS,YAAY;AAC7E,UAAI,SAAS;AACX,gBAAQ,WAAW,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,UAAU;AACZ,UAAI,EAAE,QAAQ,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,CAAC,IAAI;AACpD,gBAAQ,IAAI,IAAI,CAAC;AAAA,MACnB;AACA;AACA,cAAQ,IAAI,EAAE,KAAK,KAAK;AAAA,IAC1B,OAAO;AACL,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF;AACA,SAAO,MAAM,QAAQ,GAAG,IAAI;AAC9B;AACA,IAAI,gBAAgB;AACpB,IAAI,iBAAiB,CAAC,KAAK,QAAQ;AACjC,SAAO,eAAe,KAAK,KAAK,IAAI;AACtC;AACA,IAAI,sBAAsB;;;ACpM1B,IAAI,wBAAwB,CAAC,QAAQ,UAAU,KAAK,mBAAmB;AACvE,IAAI,cAAc,MAAM;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,YAAY,CAAC;AAAA,EACb,YAAY,SAAS,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG;AACnD,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA,EACA,MAAM,KAAK;AACT,WAAO,MAAM,KAAK,iBAAiB,GAAG,IAAI,KAAK,qBAAqB;AAAA,EACtE;AAAA,EACA,iBAAiB,KAAK;AACpB,UAAM,WAAW,KAAK,aAAa,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC,EAAE,GAAG;AAC7D,UAAM,QAAQ,KAAK,eAAe,QAAQ;AAC1C,WAAO,SAAS,KAAK,KAAK,KAAK,IAAI,sBAAsB,KAAK,IAAI;AAAA,EACpE;AAAA,EACA,uBAAuB;AACrB,UAAM,UAAU,CAAC;AACjB,UAAM,OAAO,OAAO,KAAK,KAAK,aAAa,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC,CAAC;AACjE,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,KAAK,eAAe,KAAK,aAAa,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC;AAC/E,UAAI,UAAU,QAAQ;AACpB,gBAAQ,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,sBAAsB,KAAK,IAAI;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,eAAe,UAAU;AACvB,WAAO,KAAK,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,QAAQ,IAAI;AAAA,EACjE;AAAA,EACA,MAAM,KAAK;AACT,WAAO,cAAc,KAAK,KAAK,GAAG;AAAA,EACpC;AAAA,EACA,QAAQ,KAAK;AACX,WAAO,eAAe,KAAK,KAAK,GAAG;AAAA,EACrC;AAAA,EACA,OAAO,MAAM;AACX,QAAI,MAAM;AACR,aAAO,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK;AAAA,IACvC;AACA,UAAM,aAAa,CAAC;AACpB,SAAK,IAAI,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,iBAAW,GAAG,IAAI;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,MAAM,UAAU,SAAS;AACvB,WAAO,KAAK,UAAU,eAAe,MAAM,UAAU,MAAM,OAAO;AAAA,EACpE;AAAA,EACA,cAAc,CAAC,QAAQ;AACrB,UAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,UAAM,aAAa,UAAU,GAAG;AAChC,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,UAAM,eAAe,OAAO,KAAK,SAAS,EAAE,CAAC;AAC7C,QAAI,cAAc;AAChB,aAAO,UAAU,YAAY,EAAE,KAAK,CAAC,SAAS;AAC5C,YAAI,iBAAiB,QAAQ;AAC3B,iBAAO,KAAK,UAAU,IAAI;AAAA,QAC5B;AACA,eAAO,IAAI,SAAS,IAAI,EAAE,GAAG,EAAE;AAAA,MACjC,CAAC;AAAA,IACH;AACA,WAAO,UAAU,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,EACnC;AAAA,EACA,OAAO;AACL,WAAO,KAAK,YAAY,MAAM,EAAE,KAAK,CAACC,UAAS,KAAK,MAAMA,KAAI,CAAC;AAAA,EACjE;AAAA,EACA,OAAO;AACL,WAAO,KAAK,YAAY,MAAM;AAAA,EAChC;AAAA,EACA,cAAc;AACZ,WAAO,KAAK,YAAY,aAAa;AAAA,EACvC;AAAA,EACA,OAAO;AACL,WAAO,KAAK,YAAY,MAAM;AAAA,EAChC;AAAA,EACA,WAAW;AACT,WAAO,KAAK,YAAY,UAAU;AAAA,EACpC;AAAA,EACA,iBAAiB,QAAQ,MAAM;AAC7B,SAAK,eAAe,MAAM,IAAI;AAAA,EAChC;AAAA,EACA,MAAM,QAAQ;AACZ,WAAO,KAAK,eAAe,MAAM;AAAA,EACnC;AAAA,EACA,IAAI,MAAM;AACR,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EACA,KAAK,gBAAgB,IAAI;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,gBAAgB;AAClB,WAAO,KAAK,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,KAAK;AAAA,EACxD;AAAA,EACA,IAAI,YAAY;AACd,WAAO,KAAK,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,KAAK,EAAE,KAAK,UAAU,EAAE;AAAA,EAC3E;AACF;;;AC7GA,IAAI,aAAa,OAAO;AACxB,IAAI,kBAAkB,IAAI,IAAI,aAAa;;;ACLrC,IAAO,kBAAP,MAAsB;EAA5B,cAAA;AACE,SAAA,aAAa,oBAAI,IAAG;AACpB,SAAA,aAAa,oBAAI,IAAG;EAmBtB;EAjBE,IAAI,KAAQ,OAAQ;AAClB,SAAK,WAAW,IAAI,KAAK,KAAK;AAC9B,SAAK,WAAW,IAAI,OAAO,GAAG;EAChC;EAEA,SAAS,KAAM;AACb,WAAO,KAAK,WAAW,IAAI,GAAG;EAChC;EAEA,WAAW,OAAQ;AACjB,WAAO,KAAK,WAAW,IAAI,KAAK;EAClC;EAEA,QAAK;AACH,SAAK,WAAW,MAAK;AACrB,SAAK,WAAW,MAAK;EACvB;;;;AClBI,IAAO,WAAP,MAAe;EAGnB,YAA6B,oBAAoC;AAApC,SAAA,qBAAA;AAFrB,SAAA,KAAK,IAAI,gBAAe;EAEoC;EAEpE,SAAS,OAAU,YAAmB;AACpC,QAAI,KAAK,GAAG,WAAW,KAAK,GAAG;AAC7B;;AAGF,QAAI,CAAC,YAAY;AACf,mBAAa,KAAK,mBAAmB,KAAK;;AAG5C,SAAK,GAAG,IAAI,YAAY,KAAK;EAC/B;EAEA,QAAK;AACH,SAAK,GAAG,MAAK;EACf;EAEA,cAAc,OAAQ;AACpB,WAAO,KAAK,GAAG,WAAW,KAAK;EACjC;EAEA,SAAS,YAAkB;AACzB,WAAO,KAAK,GAAG,SAAS,UAAU;EACpC;;;;ACrBI,IAAO,gBAAP,cAA6B,SAAe;EAChD,cAAA;AACE,UAAM,OAAK,EAAE,IAAI;AAGX,SAAA,sBAAsB,oBAAI,IAAG;EAFrC;EAIA,SAAS,OAAc,SAAkC;AACvD,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,QAAQ,YAAY;AACtB,aAAK,oBAAoB,IAAI,OAAO,QAAQ,UAAU;;AAGxD,YAAM,SAAS,OAAO,QAAQ,UAAU;WACnC;AACL,YAAM,SAAS,OAAO,OAAO;;EAEjC;EAEA,gBAAgB,OAAY;AAC1B,WAAO,KAAK,oBAAoB,IAAI,KAAK;EAC3C;;;;AC7BF,SAAS,YAAe,QAAyB;AAC/C,MAAI,YAAY,QAAQ;AAEtB,WAAO,OAAO,OAAO,MAAM;;AAG7B,QAAM,SAAc,CAAA;AAGpB,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,eAAe,GAAG,GAAG;AAC9B,aAAO,KAAK,OAAO,GAAG,CAAC;;;AAI3B,SAAO;AACT;AAEM,SAAU,KACd,QACA,WAA4B;AAE5B,QAAM,SAAS,YAAY,MAAM;AACjC,MAAI,UAAU,QAAQ;AAEpB,WAAO,OAAO,KAAK,SAAS;;AAG9B,QAAM,iBAAiB;AAEvB,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,UAAM,QAAQ,eAAe,CAAC;AAC9B,QAAI,UAAU,KAAK,GAAG;AACpB,aAAO;;;AAIX,SAAO;AACT;AAEM,SAAU,QACd,QACA,KAAgC;AAEhC,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC;AAClE;AAEM,SAAU,SAAY,KAAU,OAAQ;AAC5C,SAAO,IAAI,QAAQ,KAAK,MAAM;AAChC;AAEM,SAAU,QACd,QACA,WAA4B;AAE5B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,UAAU,KAAK,GAAG;AACpB,aAAO;;;AAIX,SAAO;AACT;;;ACrDM,IAAO,4BAAP,MAAgC;EAAtC,cAAA;AACU,SAAA,cAA0D,CAAA;EAepE;EAbE,SAAiC,aAAmC;AAClE,SAAK,YAAY,YAAY,IAAI,IAAI;EACvC;EAEA,eAAkB,GAAI;AACpB,WAAO,KAAK,KAAK,aAAa,iBAC5B,YAAY,aAAa,CAAC,CAAC;EAE/B;EAEA,WAAW,MAAY;AACrB,WAAO,KAAK,YAAY,IAAI;EAC9B;;;;ACzBF,IAAM,UAAU,CAAC,YACf,OAAO,UAAU,SAAS,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE;AAE9C,IAAM,cAAc,CAAC,YAC1B,OAAO,YAAY;AAEd,IAAM,SAAS,CAAC,YAAkC,YAAY;AAE9D,IAAM,gBAAgB,CAC3B,YACqC;AACrC,MAAI,OAAO,YAAY,YAAY,YAAY;AAAM,WAAO;AAC5D,MAAI,YAAY,OAAO;AAAW,WAAO;AACzC,MAAI,OAAO,eAAe,OAAO,MAAM;AAAM,WAAO;AAEpD,SAAO,OAAO,eAAe,OAAO,MAAM,OAAO;AACnD;AAEO,IAAM,gBAAgB,CAAC,YAC5B,cAAc,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW;AAErD,IAAM,UAAU,CAAC,YACtB,MAAM,QAAQ,OAAO;AAEhB,IAAM,WAAW,CAAC,YACvB,OAAO,YAAY;AAEd,IAAM,WAAW,CAAC,YACvB,OAAO,YAAY,YAAY,CAAC,MAAM,OAAO;AAExC,IAAM,YAAY,CAAC,YACxB,OAAO,YAAY;AAEd,IAAM,WAAW,CAAC,YACvB,mBAAmB;AAEd,IAAM,QAAQ,CAAC,YACpB,mBAAmB;AAEd,IAAM,QAAQ,CAAC,YACpB,mBAAmB;AAEd,IAAM,WAAW,CAAC,YACvB,QAAQ,OAAO,MAAM;AAEhB,IAAM,SAAS,CAAC,YACrB,mBAAmB,QAAQ,CAAC,MAAM,QAAQ,QAAO,CAAE;AAE9C,IAAM,UAAU,CAAC,YACtB,mBAAmB;AAEd,IAAM,aAAa,CAAC,YACzB,OAAO,YAAY,YAAY,MAAM,OAAO;AAEvC,IAAM,cAAc,CACzB,YAEA,UAAU,OAAO,KACjB,OAAO,OAAO,KACd,YAAY,OAAO,KACnB,SAAS,OAAO,KAChB,SAAS,OAAO,KAChB,SAAS,OAAO;AAEX,IAAM,WAAW,CAAC,YACvB,OAAO,YAAY;AAEd,IAAM,aAAa,CAAC,YACzB,YAAY,YAAY,YAAY;AAe/B,IAAM,eAAe,CAAC,YAC3B,YAAY,OAAO,OAAO,KAAK,EAAE,mBAAmB;AAE/C,IAAM,QAAQ,CAAC,YAAiC,mBAAmB;;;ACnFnE,IAAM,YAAY,CAAC,QACxB,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,OAAO,KAAK;AAE1C,IAAM,gBAAgB,CAAC,SAC5B,KACG,IAAI,MAAM,EACV,IAAI,SAAS,EACb,KAAK,GAAG;AAEN,IAAM,YAAY,CAAC,QAAyB,gBAAwB;AACzE,QAAM,SAAmB,CAAA;AAEzB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAIC,QAAO,OAAO,OAAO,CAAC;AAE1B,QAAI,CAAC,eAAeA,UAAS,MAAM;AACjC,YAAM,UAAU,OAAO,OAAO,IAAI,CAAC;AACnC,UAAI,YAAY,MAAM;AACpB,mBAAW;AACX;AACA;iBACS,YAAY,KAAK;AAC1B,cAAM,MAAM,cAAc;;;AAI9B,UAAM,eAAeA,UAAS,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAM;AAC/D,QAAI,cAAc;AAChB,iBAAW;AACX;AACA;;AAGF,UAAM,iBAAiBA,UAAS;AAChC,QAAI,gBAAgB;AAClB,aAAO,KAAK,OAAO;AACnB,gBAAU;AACV;;AAGF,eAAWA;;AAGb,QAAM,cAAc;AACpB,SAAO,KAAK,WAAW;AAEvB,SAAO;AACT;;;ACbA,SAAS,qBACP,cACA,YACA,WACA,aAA8C;AAE9C,SAAO;IACL;IACA;IACA;IACA;;AAEJ;AAEA,IAAM,cAAc;EAClB,qBACE,aACA,aACA,MAAM,MACN,MAAM,MAAS;EAEjB,qBACE,UACA,UACA,OAAK,EAAE,SAAQ,GACf,OAAI;AACF,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,OAAO,CAAC;;AAGjB,YAAQ,MAAM,+BAA+B;AAE7C,WAAO;EACT,CAAC;EAEH,qBACE,QACA,QACA,OAAK,EAAE,YAAW,GAClB,OAAK,IAAI,KAAK,CAAC,CAAC;EAGlB,qBACE,SACA,SACA,CAAC,GAAG,cAAa;AACf,UAAM,YAAiB;MACrB,MAAM,EAAE;MACR,SAAS,EAAE;;AAGb,QAAI,WAAW,GAAG;AAChB,gBAAU,QAAQ,EAAE;;AAGtB,cAAU,kBAAkB,QAAQ,UAAO;AACzC,gBAAU,IAAI,IAAK,EAAU,IAAI;IACnC,CAAC;AAED,WAAO;EACT,GACA,CAAC,GAAG,cAAa;AACf,UAAM,IAAI,IAAI,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAK,CAAE;AACjD,MAAE,OAAO,EAAE;AACX,MAAE,QAAQ,EAAE;AAEZ,cAAU,kBAAkB,QAAQ,UAAO;AACxC,QAAU,IAAI,IAAI,EAAE,IAAI;IAC3B,CAAC;AAED,WAAO;EACT,CAAC;EAGH,qBACE,UACA,UACA,OAAK,KAAK,GACV,WAAQ;AACN,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,YAAY,GAAG,CAAC;AAClD,UAAM,QAAQ,MAAM,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;AACpD,WAAO,IAAI,OAAO,MAAM,KAAK;EAC/B,CAAC;EAGH;IACE;IACA;;;IAGA,OAAK,CAAC,GAAG,EAAE,OAAM,CAAE;IACnB,OAAK,IAAI,IAAI,CAAC;EAAC;EAEjB,qBACE,OACA,OACA,OAAK,CAAC,GAAG,EAAE,QAAO,CAAE,GACpB,OAAK,IAAI,IAAI,CAAC,CAAC;EAGjB,qBACE,CAAC,MAAmB,WAAW,CAAC,KAAK,WAAW,CAAC,GACjD,UACA,OAAI;AACF,QAAI,WAAW,CAAC,GAAG;AACjB,aAAO;;AAGT,QAAI,IAAI,GAAG;AACT,aAAO;WACF;AACL,aAAO;;EAEX,GACA,MAAM;EAGR,qBACE,CAAC,MAAmB,MAAM,KAAK,IAAI,MAAM,WACzC,UACA,MAAK;AACH,WAAO;EACT,GACA,MAAM;EAGR,qBACE,OACA,OACA,OAAK,EAAE,SAAQ,GACf,OAAK,IAAI,IAAI,CAAC,CAAC;;AAInB,SAAS,wBACP,cACA,YACA,WACA,aAAoD;AAEpD,SAAO;IACL;IACA;IACA;IACA;;AAEJ;AAEA,IAAM,aAAa,wBACjB,CAAC,GAAG,cAA0B;AAC5B,MAAI,SAAS,CAAC,GAAG;AACf,UAAM,eAAe,CAAC,CAAC,UAAU,eAAe,cAAc,CAAC;AAC/D,WAAO;;AAET,SAAO;AACT,GACA,CAAC,GAAG,cAAa;AACf,QAAM,aAAa,UAAU,eAAe,cAAc,CAAC;AAC3D,SAAO,CAAC,UAAU,UAAW;AAC/B,GACA,OAAK,EAAE,aACP,CAAC,GAAG,GAAG,cAAa;AAClB,QAAM,QAAQ,UAAU,eAAe,SAAS,EAAE,CAAC,CAAC;AACpD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,sCAAsC;;AAExD,SAAO;AACT,CAAC;AAGH,IAAM,oBAAoB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAA8C,CAAC,KAAK,SAAQ;AAC5D,MAAI,KAAK,IAAI,IAAI;AACjB,SAAO;AACT,GAAG,CAAA,CAAE;AAEL,IAAM,iBAAiB,wBACrB,cACA,OAAK,CAAC,eAAe,EAAE,YAAY,IAAI,GACvC,OAAK,CAAC,GAAG,CAAC,GACV,CAAC,GAAG,MAAK;AACP,QAAM,OAAO,kBAAkB,EAAE,CAAC,CAAC;AAEnC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,2CAA2C;;AAG7D,SAAO,IAAI,KAAK,CAAC;AACnB,CAAC;AAGG,SAAU,4BACd,gBACA,WAAoB;AAEpB,MAAI,gBAAgB,aAAa;AAC/B,UAAM,eAAe,CAAC,CAAC,UAAU,cAAc,cAC7C,eAAe,WAAW;AAE5B,WAAO;;AAET,SAAO;AACT;AAEA,IAAM,YAAY,wBAChB,6BACA,CAAC,OAAO,cAAa;AACnB,QAAM,aAAa,UAAU,cAAc,cAAc,MAAM,WAAW;AAC1E,SAAO,CAAC,SAAS,UAAW;AAC9B,GACA,CAAC,OAAO,cAAa;AACnB,QAAM,eAAe,UAAU,cAAc,gBAC3C,MAAM,WAAW;AAEnB,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,GAAG,MAAK;;AAGnB,QAAM,SAAc,CAAA;AACpB,eAAa,QAAQ,UAAO;AAC1B,WAAO,IAAI,IAAI,MAAM,IAAI;EAC3B,CAAC;AACD,SAAO;AACT,GACA,CAAC,GAAG,GAAG,cAAa;AAClB,QAAM,QAAQ,UAAU,cAAc,SAAS,EAAE,CAAC,CAAC;AAEnD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MACR,wCAAwC,EAAE,CAAC,CAAC,mFAAmF;;AAInI,SAAO,OAAO,OAAO,OAAO,OAAO,MAAM,SAAS,GAAG,CAAC;AACxD,CAAC;AAGH,IAAM,aAAa,wBACjB,CAAC,OAAO,cAA2B;AACjC,SAAO,CAAC,CAAC,UAAU,0BAA0B,eAAe,KAAK;AACnE,GACA,CAAC,OAAO,cAAa;AACnB,QAAM,cAAc,UAAU,0BAA0B,eACtD,KAAK;AAEP,SAAO,CAAC,UAAU,YAAY,IAAI;AACpC,GACA,CAAC,OAAO,cAAa;AACnB,QAAM,cAAc,UAAU,0BAA0B,eACtD,KAAK;AAEP,SAAO,YAAY,UAAU,KAAK;AACpC,GACA,CAAC,GAAG,GAAG,cAAa;AAClB,QAAM,cAAc,UAAU,0BAA0B,WAAW,EAAE,CAAC,CAAC;AACvE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,4CAA4C;;AAE9D,SAAO,YAAY,YAAY,CAAC;AAClC,CAAC;AAGH,IAAM,iBAAiB,CAAC,WAAW,YAAY,YAAY,cAAc;AAElE,IAAM,iBAAiB,CAC5B,OACA,cACoD;AACpD,QAAM,0BAA0B,QAAQ,gBAAgB,UACtD,KAAK,aAAa,OAAO,SAAS,CAAC;AAErC,MAAI,yBAAyB;AAC3B,WAAO;MACL,OAAO,wBAAwB,UAAU,OAAgB,SAAS;MAClE,MAAM,wBAAwB,WAAW,OAAO,SAAS;;;AAI7D,QAAM,uBAAuB,QAAQ,aAAa,UAChD,KAAK,aAAa,OAAO,SAAS,CAAC;AAGrC,MAAI,sBAAsB;AACxB,WAAO;MACL,OAAO,qBAAqB,UAAU,OAAgB,SAAS;MAC/D,MAAM,qBAAqB;;;AAI/B,SAAO;AACT;AAEA,IAAM,0BAAiE,CAAA;AACvE,YAAY,QAAQ,UAAO;AACzB,0BAAwB,KAAK,UAAU,IAAI;AAC7C,CAAC;AAEM,IAAM,mBAAmB,CAC9BC,OACA,MACA,cACE;AACF,MAAI,QAAQ,IAAI,GAAG;AACjB,YAAQ,KAAK,CAAC,GAAG;MACf,KAAK;AACH,eAAO,WAAW,YAAYA,OAAM,MAAM,SAAS;MACrD,KAAK;AACH,eAAO,UAAU,YAAYA,OAAM,MAAM,SAAS;MACpD,KAAK;AACH,eAAO,WAAW,YAAYA,OAAM,MAAM,SAAS;MACrD,KAAK;AACH,eAAO,eAAe,YAAYA,OAAM,MAAM,SAAS;MACzD;AACE,cAAM,IAAI,MAAM,6BAA6B,IAAI;;SAEhD;AACL,UAAM,iBAAiB,wBAAwB,IAAI;AACnD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,6BAA6B,IAAI;;AAGnD,WAAO,eAAe,YAAYA,OAAe,SAAS;;AAE9D;;;AC/WA,IAAM,YAAY,CAAC,OAAiC,MAAkB;AACpE,MAAI,IAAI,MAAM;AAAM,UAAM,IAAI,MAAM,qBAAqB;AACzD,QAAM,OAAO,MAAM,KAAI;AACvB,SAAO,IAAI,GAAG;AACZ,SAAK,KAAI;AACT;;AAGF,SAAO,KAAK,KAAI,EAAG;AACrB;AAEA,SAAS,aAAa,MAAyB;AAC7C,MAAI,SAAS,MAAM,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,wCAAwC;;AAE1D,MAAI,SAAS,MAAM,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,wCAAwC;;AAE1D,MAAI,SAAS,MAAM,aAAa,GAAG;AACjC,UAAM,IAAI,MAAM,0CAA0C;;AAE9D;AAEO,IAAM,UAAU,CAAC,QAAgB,SAAqC;AAC3E,eAAa,IAAI;AAEjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,MAAM,MAAM,GAAG;AACjB,eAAS,UAAU,QAAQ,CAAC,GAAG;eACtB,MAAM,MAAM,GAAG;AACxB,YAAM,MAAM,CAAC;AACb,YAAM,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,IAAI,QAAQ;AAExC,YAAM,WAAW,UAAU,QAAQ,GAAG;AACtC,cAAQ,MAAM;QACZ,KAAK;AACH,mBAAS;AACT;QACF,KAAK;AACH,mBAAS,OAAO,IAAI,QAAQ;AAC5B;;WAEC;AACL,eAAU,OAAe,GAAG;;;AAIhC,SAAO;AACT;AAEO,IAAM,UAAU,CACrB,QACA,MACA,WACO;AACP,eAAa,IAAI;AAEjB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,OAAO,MAAM;;AAGtB,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,QAAQ,MAAM,GAAG;AACnB,YAAMC,SAAQ,CAAC;AACf,eAAS,OAAOA,MAAK;eACZ,cAAc,MAAM,GAAG;AAChC,eAAS,OAAO,GAAG;eACV,MAAM,MAAM,GAAG;AACxB,YAAM,MAAM,CAAC;AACb,eAAS,UAAU,QAAQ,GAAG;eACrB,MAAM,MAAM,GAAG;AACxB,YAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,UAAI,OAAO;AACT;;AAGF,YAAM,MAAM,CAAC;AACb,YAAM,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,IAAI,QAAQ;AAExC,YAAM,WAAW,UAAU,QAAQ,GAAG;AACtC,cAAQ,MAAM;QACZ,KAAK;AACH,mBAAS;AACT;QACF,KAAK;AACH,mBAAS,OAAO,IAAI,QAAQ;AAC5B;;;;AAKR,QAAM,UAAU,KAAK,KAAK,SAAS,CAAC;AAEpC,MAAI,QAAQ,MAAM,GAAG;AACnB,WAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC;aACjC,cAAc,MAAM,GAAG;AAChC,WAAO,OAAO,IAAI,OAAO,OAAO,OAAO,CAAC;;AAG1C,MAAI,MAAM,MAAM,GAAG;AACjB,UAAM,WAAW,UAAU,QAAQ,CAAC,OAAO;AAC3C,UAAM,WAAW,OAAO,QAAQ;AAChC,QAAI,aAAa,UAAU;AACzB,aAAO,OAAO,QAAQ;AACtB,aAAO,IAAI,QAAQ;;;AAIvB,MAAI,MAAM,MAAM,GAAG;AACjB,UAAM,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,WAAW,UAAU,QAAQ,GAAG;AAEtC,UAAM,OAAO,CAAC,YAAY,IAAI,QAAQ;AACtC,YAAQ,MAAM;MACZ,KAAK,OAAO;AACV,cAAM,SAAS,OAAO,QAAQ;AAC9B,eAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ,CAAC;AAEvC,YAAI,WAAW,UAAU;AACvB,iBAAO,OAAO,QAAQ;;AAExB;;MAGF,KAAK,SAAS;AACZ,eAAO,IAAI,UAAU,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC;AACjD;;;;AAKN,SAAO;AACT;;;ACjHA,IAAM,oBAAoB,CAACC,aAAoBA,WAAU;AAEzD,SAAS,SACP,MACAC,SACAD,UACA,SAAmB,CAAA,GAAE;AAErB,MAAI,CAAC,MAAM;AACT;;AAGF,QAAM,cAAc,kBAAkBA,QAAO;AAC7C,MAAI,CAAC,QAAQ,IAAI,GAAG;AAClB,YAAQ,MAAM,CAAC,SAAS,QACtB,SAAS,SAASC,SAAQD,UAAS;MACjC,GAAG;MACH,GAAG,UAAU,KAAK,WAAW;KAC9B,CAAC;AAEJ;;AAGF,QAAM,CAAC,WAAW,QAAQ,IAAI;AAC9B,MAAI,UAAU;AACZ,YAAQ,UAAU,CAAC,OAAO,QAAO;AAC/B,eAAS,OAAOC,SAAQD,UAAS;QAC/B,GAAG;QACH,GAAG,UAAU,KAAK,WAAW;OAC9B;IACH,CAAC;;AAGH,EAAAC,QAAO,WAAW,MAAM;AAC1B;AAEM,SAAU,sBACd,OACA,aACAD,UACA,WAAoB;AAEpB,WACE,aACA,CAAC,MAAM,SAAQ;AACb,YAAQ,QAAQ,OAAO,MAAM,OAAK,iBAAiB,GAAG,MAAM,SAAS,CAAC;EACxE,GACAA,QAAO;AAGT,SAAO;AACT;AAEM,SAAU,oCACd,OACA,aACAA,UAAe;AAEf,QAAM,cAAc,kBAAkBA,QAAO;AAC7C,WAAS,MAAM,gBAA0B,MAAY;AACnD,UAAM,SAAS,QAAQ,OAAO,UAAU,MAAM,WAAW,CAAC;AAE1D,mBACG,IAAI,CAAAE,UAAQ,UAAUA,OAAM,WAAW,CAAC,EACxC,QAAQ,yBAAsB;AAC7B,cAAQ,QAAQ,OAAO,qBAAqB,MAAM,MAAM;IAC1D,CAAC;EACL;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,CAAC,MAAM,KAAK,IAAI;AACtB,SAAK,QAAQ,mBAAgB;AAC3B,cAAQ,QACN,OACA,UAAU,eAAe,WAAW,GACpC,MAAM,KAAK;IAEf,CAAC;AAED,QAAI,OAAO;AACT,cAAQ,OAAO,KAAK;;SAEjB;AACL,YAAQ,aAAa,KAAK;;AAG5B,SAAO;AACT;AAEA,IAAM,SAAS,CAAC,QAAa,cAC3B,cAAc,MAAM,KACpB,QAAQ,MAAM,KACd,MAAM,MAAM,KACZ,MAAM,MAAM,KACZ,QAAQ,MAAM,KACd,4BAA4B,QAAQ,SAAS;AAE/C,SAAS,YAAY,QAAa,MAAa,YAA6B;AAC1E,QAAM,cAAc,WAAW,IAAI,MAAM;AAEzC,MAAI,aAAa;AACf,gBAAY,KAAK,IAAI;SAChB;AACL,eAAW,IAAI,QAAQ,CAAC,IAAI,CAAC;;AAEjC;AAYM,SAAU,uCACd,aACA,QAAe;AAEf,QAAM,SAAmC,CAAA;AACzC,MAAI,oBAA0C;AAE9C,cAAY,QAAQ,WAAQ;AAC1B,QAAI,MAAM,UAAU,GAAG;AACrB;;AAMF,QAAI,CAAC,QAAQ;AACX,cAAQ,MACL,IAAI,UAAQ,KAAK,IAAI,MAAM,CAAC,EAC5B,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;;AAGvC,UAAM,CAAC,oBAAoB,GAAG,cAAc,IAAI;AAEhD,QAAI,mBAAmB,WAAW,GAAG;AACnC,0BAAoB,eAAe,IAAI,aAAa;WAC/C;AACL,aAAO,cAAc,kBAAkB,CAAC,IAAI,eAAe,IACzD,aAAa;;EAGnB,CAAC;AAED,MAAI,mBAAmB;AACrB,QAAI,cAAc,MAAM,GAAG;AACzB,aAAO,CAAC,iBAAiB;WACpB;AACL,aAAO,CAAC,mBAAmB,MAAM;;SAE9B;AACL,WAAO,cAAc,MAAM,IAAI,SAAY;;AAE/C;AAEO,IAAM,SAAS,CACpB,QACA,YACA,WACA,QACA,OAAc,CAAA,GACd,oBAA2B,CAAA,GAC3B,cAAc,oBAAI,IAAG,MACX;AACV,QAAM,YAAY,YAAY,MAAM;AAEpC,MAAI,CAAC,WAAW;AACd,gBAAY,QAAQ,MAAM,UAAU;AAEpC,UAAM,OAAO,YAAY,IAAI,MAAM;AACnC,QAAI,MAAM;AAER,aAAO,SACH;QACE,kBAAkB;UAEpB;;;AAIR,MAAI,CAAC,OAAO,QAAQ,SAAS,GAAG;AAC9B,UAAMC,eAAc,eAAe,QAAQ,SAAS;AAEpD,UAAMC,UAAiBD,eACnB;MACE,kBAAkBA,aAAY;MAC9B,aAAa,CAACA,aAAY,IAAI;QAEhC;MACE,kBAAkB;;AAExB,QAAI,CAAC,WAAW;AACd,kBAAY,IAAI,QAAQC,OAAM;;AAEhC,WAAOA;;AAGT,MAAI,SAAS,mBAAmB,MAAM,GAAG;AAEvC,WAAO;MACL,kBAAkB;;;AAItB,QAAM,uBAAuB,eAAe,QAAQ,SAAS;AAC7D,QAAM,cAAc,sBAAsB,SAAS;AAEnD,QAAM,mBAAwB,QAAQ,WAAW,IAAI,CAAA,IAAK,CAAA;AAC1D,QAAM,mBAAyD,CAAA;AAE/D,UAAQ,aAAa,CAAC,OAAOC,WAAS;AACpC,QACEA,WAAU,eACVA,WAAU,iBACVA,WAAU,aACV;AACA,YAAM,IAAI,MACR,qBAAqBA,MAAK,0EAA0E;;AAIxG,UAAM,kBAAkB,OACtB,OACA,YACA,WACA,QACA,CAAC,GAAG,MAAMA,MAAK,GACf,CAAC,GAAG,mBAAmB,MAAM,GAC7B,WAAW;AAGb,qBAAiBA,MAAK,IAAI,gBAAgB;AAE1C,QAAI,QAAQ,gBAAgB,WAAW,GAAG;AACxC,uBAAiB,UAAUA,MAAK,CAAC,IAAI,gBAAgB;eAC5C,cAAc,gBAAgB,WAAW,GAAG;AACrD,cAAQ,gBAAgB,aAAa,CAAC,MAAM,QAAO;AACjD,yBAAiB,UAAUA,MAAK,IAAI,MAAM,GAAG,IAAI;MACnD,CAAC;;EAEL,CAAC;AAED,QAAM,SAAiB,cAAc,gBAAgB,IACjD;IACE;IACA,aAAa,CAAC,CAAC,uBACX,CAAC,qBAAqB,IAAI,IAC1B;MAEN;IACE;IACA,aAAa,CAAC,CAAC,uBACX,CAAC,qBAAqB,MAAM,gBAAgB,IAC5C;;AAEV,MAAI,CAAC,WAAW;AACd,gBAAY,IAAI,QAAQ,MAAM;;AAGhC,SAAO;AACT;;;ACnSO,SAASC,SAAQ,SAAS;AAC7B,SAAO,OAAO,UAAU,SAAS,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE;AAC9D;;;ACDO,SAASC,SAAQ,SAAS;AAC7B,SAAOC,SAAQ,OAAO,MAAM;AAChC;;;ACCO,SAASC,eAAc,SAAS;AACnC,MAAIC,SAAQ,OAAO,MAAM;AACrB,WAAO;AACX,QAAM,YAAY,OAAO,eAAe,OAAO;AAC/C,SAAO,CAAC,CAAC,aAAa,UAAU,gBAAgB,UAAU,cAAc,OAAO;AACnF;;;ACTA,SAAS,WAAW,OAAO,KAAK,QAAQ,gBAAgB,sBAAsB;AAC1E,QAAM,WAAW,CAAC,EAAE,qBAAqB,KAAK,gBAAgB,GAAG,IAC3D,eACA;AACN,MAAI,aAAa;AACb,UAAM,GAAG,IAAI;AACjB,MAAI,wBAAwB,aAAa,iBAAiB;AACtD,WAAO,eAAe,OAAO,KAAK;AAAA,MAC9B,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAClB,CAAC;AAAA,EACL;AACJ;AAeO,SAAS,KAAK,QAAQ,UAAU,CAAC,GAAG;AACvC,MAAIC,SAAQ,MAAM,GAAG;AACjB,WAAO,OAAO,IAAI,CAAC,SAAS,KAAK,MAAM,OAAO,CAAC;AAAA,EACnD;AACA,MAAI,CAACC,eAAc,MAAM,GAAG;AACxB,WAAO;AAAA,EACX;AACA,QAAM,QAAQ,OAAO,oBAAoB,MAAM;AAC/C,QAAM,UAAU,OAAO,sBAAsB,MAAM;AACnD,SAAO,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC,OAAO,QAAQ;AAEjD,QAAI,QAAQ;AACR,aAAO;AACX,QAAID,SAAQ,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,GAAG;AACxD,aAAO;AAAA,IACX;AACA,UAAM,MAAM,OAAO,GAAG;AACtB,UAAM,SAAS,KAAK,KAAK,OAAO;AAChC,eAAW,OAAO,KAAK,QAAQ,QAAQ,QAAQ,aAAa;AAC5D,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AACT;;;ACpCA,IAAqB,YAArB,MAA8B;;;;EAS5B,YAAY,EACV,SAAS,MAAK,IAGZ,CAAA,GAAE;AA8DG,SAAA,gBAAgB,IAAI,cAAa;AAKjC,SAAA,iBAAiB,IAAI,SAAiB,OAAK,EAAE,eAAe,EAAE;AAK9D,SAAA,4BAA4B,IAAI,0BAAyB;AAWzD,SAAA,oBAA8B,CAAA;AAlFrC,SAAK,SAAS;EAChB;EAEA,UAAU,QAAsB;AAC9B,UAAM,aAAa,oBAAI,IAAG;AAC1B,UAAM,SAAS,OAAO,QAAQ,YAAY,MAAM,KAAK,MAAM;AAC3D,UAAM,MAAuB;MAC3B,MAAM,OAAO;;AAGf,QAAI,OAAO,aAAa;AACtB,UAAI,OAAO;QACT,GAAG,IAAI;QACP,QAAQ,OAAO;;;AAInB,UAAM,sBAAsB,uCAC1B,YACA,KAAK,MAAM;AAEb,QAAI,qBAAqB;AACvB,UAAI,OAAO;QACT,GAAG,IAAI;QACP,uBAAuB;;;AAI3B,QAAI,IAAI;AAAM,UAAI,KAAK,IAAI;AAE3B,WAAO;EACT;EAEA,YAAyB,SAA0B,SAA+B;AAChF,UAAM,EAAE,MAAAE,OAAM,KAAI,IAAK;AAEvB,QAAI,SAAY,SAAS,UAAUA,QAAO,KAAKA,KAAI;AAEnD,QAAI,MAAM,QAAQ;AAChB,eAAS,sBAAsB,QAAQ,KAAK,QAAQ,KAAK,KAAK,GAAG,IAAI;;AAGvE,QAAI,MAAM,uBAAuB;AAC/B,eAAS,oCACP,QACA,KAAK,uBACL,KAAK,KAAK,CAAC;;AAIf,WAAO;EACT;EAEA,UAAU,QAAsB;AAC9B,WAAO,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC;EAC9C;EAEA,MAAmB,QAAc;AAC/B,WAAO,KAAK,YAAY,KAAK,MAAM,MAAM,GAAG,EAAE,SAAS,KAAI,CAAE;EAC/D;EAGA,cAAc,GAAU,SAAkC;AACxD,SAAK,cAAc,SAAS,GAAG,OAAO;EACxC;EAGA,eAAe,GAAW,YAAmB;AAC3C,SAAK,eAAe,SAAS,GAAG,UAAU;EAC5C;EAGA,eACE,aACA,MAAY;AAEZ,SAAK,0BAA0B,SAAS;MACtC;MACA,GAAG;KACJ;EACH;EAGA,mBAAmB,OAAe;AAChC,SAAK,kBAAkB,KAAK,GAAG,KAAK;EACtC;;AAEe,UAAA,kBAAkB,IAAI,UAAS;AACvC,UAAA,YAAY,UAAU,gBAAgB,UAAU,KACrD,UAAU,eAAe;AAEpB,UAAA,cAAc,UAAU,gBAAgB,YAAY,KACzD,UAAU,eAAe;AAEpB,UAAA,YAAY,UAAU,gBAAgB,UAAU,KACrD,UAAU,eAAe;AAEpB,UAAA,QAAQ,UAAU,gBAAgB,MAAM,KAC7C,UAAU,eAAe;AAEpB,UAAA,gBAAgB,UAAU,gBAAgB,cAAc,KAC7D,UAAU,eAAe;AAEpB,UAAA,iBAAiB,UAAU,gBAAgB,eAAe,KAC/D,UAAU,eAAe;AAEpB,UAAA,iBAAiB,UAAU,gBAAgB,eAAe,KAC/D,UAAU,eAAe;AAEpB,UAAA,kBAAkB,UAAU,gBAAgB,gBAAgB,KACjE,UAAU,eAAe;AAMtB,IAAM,YAAY,UAAU;AAC5B,IAAM,cAAc,UAAU;AAE9B,IAAM,YAAY,UAAU;AAC5B,IAAM,QAAQ,UAAU;AAExB,IAAM,gBAAgB,UAAU;AAChC,IAAM,iBAAiB,UAAU;AACjC,IAAM,iBAAiB,UAAU;AACjC,IAAM,kBAAkB,UAAU;;;AC1JlC,SAAS,UAAU,WAAW,SAAS;AAC5C,QAAM,mBAAmB,QAAQ,SAAS;AAE1C,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACF;;;ACFO,SAAS,aAAa,OAAO;AAClC,SAAO,OAAO,SAAS,YAAY,UAAU;AAC/C;;;ACNO,SAAS,UAAU,WAAW,SAAS;AAC5C,QAAM,mBAAmB,QAAQ,SAAS;AAE1C,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI;AAAA,MACR,WAAW,OAAO,UAAU;AAAA,IAC9B;AAAA,EACF;AACF;;;ACPA,IAAM,aAAa;AASZ,SAAS,YAAY,QAAQ,UAAU;AAC5C,MAAI,gBAAgB;AACpB,MAAIC,QAAO;AAEX,aAAWC,UAAS,OAAO,KAAK,SAAS,UAAU,GAAG;AACpD,WAAOA,OAAM,UAAU,YAAY,UAAU,KAAK;AAElD,QAAIA,OAAM,SAAS,UAAU;AAC3B;AAAA,IACF;AAEA,oBAAgBA,OAAM,QAAQA,OAAM,CAAC,EAAE;AACvC,IAAAD,SAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,MAAAA;AAAA,IACA,QAAQ,WAAW,IAAI;AAAA,EACzB;AACF;;;ACxBO,SAAS,cAAc,UAAU;AACtC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY,SAAS,QAAQ,SAAS,KAAK;AAAA,EAC7C;AACF;AAKO,SAAS,oBAAoB,QAAQ,gBAAgB;AAC1D,QAAM,wBAAwB,OAAO,eAAe,SAAS;AAC7D,QAAM,OAAO,GAAG,SAAS,qBAAqB,IAAI,OAAO;AACzD,QAAM,YAAY,eAAe,OAAO;AACxC,QAAM,aAAa,OAAO,eAAe,OAAO;AAChD,QAAM,UAAU,eAAe,OAAO;AACtC,QAAM,eAAe,eAAe,SAAS,IAAI,wBAAwB;AACzE,QAAM,YAAY,eAAe,SAAS;AAC1C,QAAM,cAAc,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,SAAS;AAAA;AAC1D,QAAM,QAAQ,KAAK,MAAM,cAAc;AACvC,QAAM,eAAe,MAAM,SAAS;AAEpC,MAAI,aAAa,SAAS,KAAK;AAC7B,UAAM,eAAe,KAAK,MAAM,YAAY,EAAE;AAC9C,UAAM,mBAAmB,YAAY;AACrC,UAAM,WAAW,CAAC;AAElB,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,IAAI;AAChD,eAAS,KAAK,aAAa,MAAM,GAAG,IAAI,EAAE,CAAC;AAAA,IAC7C;AAEA,WACE,cACA,mBAAmB;AAAA,MACjB,CAAC,GAAG,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,MAC5B,GAAG,SAAS,MAAM,GAAG,eAAe,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC;AAAA,MACtE,CAAC,KAAK,IAAI,SAAS,gBAAgB,CAAC;AAAA,MACpC,CAAC,KAAK,SAAS,eAAe,CAAC,CAAC;AAAA,IAClC,CAAC;AAAA,EAEL;AAEA,SACE,cACA,mBAAmB;AAAA;AAAA,IAEjB,CAAC,GAAG,UAAU,CAAC,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,IACzC,CAAC,GAAG,OAAO,MAAM,YAAY;AAAA,IAC7B,CAAC,KAAK,IAAI,SAAS,SAAS,CAAC;AAAA,IAC7B,CAAC,GAAG,UAAU,CAAC,MAAM,MAAM,YAAY,CAAC,CAAC;AAAA,EAC3C,CAAC;AAEL;AAEA,SAAS,mBAAmB,OAAO;AACjC,QAAM,gBAAgB,MAAM,OAAO,CAAC,CAAC,GAAGE,KAAI,MAAMA,UAAS,MAAS;AACpE,QAAM,SAAS,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO,MAAM,CAAC;AACzE,SAAO,cACJ,IAAI,CAAC,CAAC,QAAQA,KAAI,MAAM,OAAO,SAAS,MAAM,KAAKA,QAAO,MAAMA,QAAO,GAAG,EAC1E,KAAK,IAAI;AACd;;;AC1DA,SAAS,oBAAoB,MAAM;AACjC,QAAM,WAAW,KAAK,CAAC;AAEvB,MAAI,YAAY,QAAQ,UAAU,YAAY,YAAY,UAAU;AAClE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,KAAK,CAAC;AAAA,MACd,WAAW,KAAK,CAAC;AAAA,MACjB,MAAM,KAAK,CAAC;AAAA,MACZ,eAAe,KAAK,CAAC;AAAA,MACrB,YAAY,KAAK,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAQO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8CtC,YAAY,YAAY,SAAS;AAC/B,QAAI,aAAa,iBAAiB;AAElC,UAAM,EAAE,OAAO,QAAQ,WAAW,MAAM,eAAe,WAAW,IAChE,oBAAoB,OAAO;AAC7B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO,SAAS,QAAQ,SAAS,SAAS,OAAO;AACtD,SAAK,gBACH,kBAAkB,QAAQ,kBAAkB,SACxC,gBACA;AAEN,SAAK,QAAQ;AAAA,MACX,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI;AAAA,IACnD;AACA,UAAM,gBAAgB;AAAA,OACnB,cAAc,KAAK,WAAW,QAAQ,gBAAgB,SACnD,SACA,YAAY,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,OAAO,CAAC,QAAQ,OAAO,IAAI;AAAA,IACrE;AAEA,SAAK,SACH,WAAW,QAAQ,WAAW,SAC1B,SACA,kBAAkB,QAAQ,kBAAkB,SAC5C,UACC,kBAAkB,cAAc,CAAC,OAAO,QACzC,oBAAoB,SACpB,SACA,gBAAgB;AACtB,SAAK,YACH,cAAc,QAAQ,cAAc,SAChC,YACA,kBAAkB,QAAQ,kBAAkB,SAC5C,SACA,cAAc,IAAI,CAAC,QAAQ,IAAI,KAAK;AAC1C,SAAK,YACH,aAAa,SACT,UAAU,IAAI,CAAC,QAAQ,YAAY,QAAQ,GAAG,CAAC,IAC/C,kBAAkB,QAAQ,kBAAkB,SAC5C,SACA,cAAc,IAAI,CAAC,QAAQ,YAAY,IAAI,QAAQ,IAAI,KAAK,CAAC;AACnE,UAAM,qBAAqB;AAAA,MACzB,kBAAkB,QAAQ,kBAAkB,SACxC,SACA,cAAc;AAAA,IACpB,IACI,kBAAkB,QAAQ,kBAAkB,SAC1C,SACA,cAAc,aAChB;AACJ,SAAK,cACF,OACC,eAAe,QAAQ,eAAe,SAClC,aACA,wBAAwB,QAAQ,SAAS,SAC3C,OACA,uBAAO,OAAO,IAAI;AAGxB,WAAO,iBAAiB,MAAM;AAAA,MAC5B,SAAS;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACJ,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,QACL,YAAY;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,QACN,YAAY;AAAA,MACd;AAAA,MACA,WAAW;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA,eAAe;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAKD,QACE,kBAAkB,QAClB,kBAAkB,UAClB,cAAc,OACd;AACA,aAAO,eAAe,MAAM,SAAS;AAAA,QACnC,OAAO,cAAc;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,WAAW,MAAM,mBAAmB;AAClC,YAAM,kBAAkB,MAAM,aAAY;AAAA,IAC5C,OAAO;AACL,aAAO,eAAe,MAAM,SAAS;AAAA,QACnC,OAAO,MAAM,EAAE;AAAA,QACf,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EAEF;AAAA,EAEA,KAAK,OAAO,WAAW,IAAI;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,QAAI,SAAS,KAAK;AAElB,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,KAAK,OAAO;AAC7B,YAAI,KAAK,KAAK;AACZ,oBAAU,SAAS,cAAc,KAAK,GAAG;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,WAAW,KAAK,UAAU,KAAK,WAAW;AACxC,iBAAW,YAAY,KAAK,WAAW;AACrC,kBAAU,SAAS,oBAAoB,KAAK,QAAQ,QAAQ;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,UAAM,iBAAiB;AAAA,MACrB,SAAS,KAAK;AAAA,IAChB;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,qBAAe,YAAY,KAAK;AAAA,IAClC;AAEA,QAAI,KAAK,QAAQ,MAAM;AACrB,qBAAe,OAAO,KAAK;AAAA,IAC7B;AAEA,QAAI,KAAK,cAAc,QAAQ,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,GAAG;AACtE,qBAAe,aAAa,KAAK;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,OAAO;AAC/B,SAAO,UAAU,UAAa,MAAM,WAAW,IAAI,SAAY;AACjE;;;ACpHO,IAAM,oBAAoB;AAAA,EAC/B,MAAM,CAAC;AAAA,EACP,UAAU,CAAC,aAAa;AAAA,EACxB,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB,CAAC,YAAY,QAAQ,gBAAgB,YAAY;AAAA,EACrE,UAAU,CAAC,MAAM;AAAA,EACjB,cAAc,CAAC,YAAY;AAAA,EAC3B,OAAO,CAAC,SAAS,QAAQ,aAAa,cAAc,cAAc;AAAA,EAClE,UAAU,CAAC,QAAQ,OAAO;AAAA,EAC1B,gBAAgB,CAAC,QAAQ,YAAY;AAAA,EACrC,gBAAgB,CAAC,iBAAiB,cAAc,cAAc;AAAA,EAC9D,oBAAoB;AAAA,IAClB;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU,CAAC;AAAA,EACX,YAAY,CAAC;AAAA,EACb,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAAA,EACf,WAAW,CAAC;AAAA,EACZ,WAAW,CAAC;AAAA,EACZ,WAAW,CAAC,QAAQ;AAAA,EACpB,aAAa,CAAC,QAAQ;AAAA,EACtB,aAAa,CAAC,QAAQ,OAAO;AAAA,EAC7B,WAAW,CAAC,QAAQ,WAAW;AAAA,EAC/B,WAAW,CAAC,MAAM;AAAA,EAClB,UAAU,CAAC,MAAM;AAAA,EACjB,aAAa,CAAC,MAAM;AAAA,EACpB,kBAAkB,CAAC,eAAe,cAAc,gBAAgB;AAAA,EAChE,yBAAyB,CAAC,MAAM;AAAA,EAChC,sBAAsB,CAAC,eAAe,QAAQ,YAAY;AAAA,EAC1D,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,CAAC,eAAe,QAAQ,aAAa,QAAQ,YAAY;AAAA,EAC1E,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,yBAAyB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,qBAAqB,CAAC,eAAe,QAAQ,cAAc,OAAO;AAAA,EAClE,oBAAoB,CAAC,eAAe,QAAQ,cAAc,QAAQ;AAAA,EAClE,qBAAqB,CAAC,eAAe,QAAQ,YAAY;AAAA,EACzD,2BAA2B,CAAC,eAAe,QAAQ,cAAc,QAAQ;AAAA,EACzE,qBAAqB,CAAC,eAAe,QAAQ,aAAa,WAAW;AAAA,EACrE,iBAAiB,CAAC,cAAc,gBAAgB;AAAA,EAChD,qBAAqB,CAAC,QAAQ,YAAY;AAAA,EAC1C,qBAAqB,CAAC,QAAQ,cAAc,cAAc,QAAQ;AAAA,EAClE,wBAAwB,CAAC,QAAQ,cAAc,cAAc,QAAQ;AAAA,EACrE,oBAAoB,CAAC,QAAQ,cAAc,OAAO;AAAA,EAClD,mBAAmB,CAAC,QAAQ,cAAc,QAAQ;AAAA,EAClD,0BAA0B,CAAC,QAAQ,cAAc,QAAQ;AAC3D;AACA,IAAM,aAAa,IAAI,IAAI,OAAO,KAAK,iBAAiB,CAAC;AAKlD,SAAS,OAAO,WAAW;AAChC,QAAM,YACJ,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU;AAClE,SAAO,OAAO,cAAc,YAAY,WAAW,IAAI,SAAS;AAClE;AAGA,IAAI;AAAA,CAEH,SAAUC,oBAAmB;AAC5B,EAAAA,mBAAkB,OAAO,IAAI;AAC7B,EAAAA,mBAAkB,UAAU,IAAI;AAChC,EAAAA,mBAAkB,cAAc,IAAI;AACtC,GAAG,sBAAsB,oBAAoB,CAAC,EAAE;;;AC1MhD,IAAI;AAAA,CAEH,SAAUC,OAAM;AACf,EAAAA,MAAK,MAAM,IAAI;AACf,EAAAA,MAAK,UAAU,IAAI;AACnB,EAAAA,MAAK,sBAAsB,IAAI;AAC/B,EAAAA,MAAK,qBAAqB,IAAI;AAC9B,EAAAA,MAAK,eAAe,IAAI;AACxB,EAAAA,MAAK,OAAO,IAAI;AAChB,EAAAA,MAAK,UAAU,IAAI;AACnB,EAAAA,MAAK,iBAAiB,IAAI;AAC1B,EAAAA,MAAK,iBAAiB,IAAI;AAC1B,EAAAA,MAAK,qBAAqB,IAAI;AAC9B,EAAAA,MAAK,UAAU,IAAI;AACnB,EAAAA,MAAK,KAAK,IAAI;AACd,EAAAA,MAAK,OAAO,IAAI;AAChB,EAAAA,MAAK,QAAQ,IAAI;AACjB,EAAAA,MAAK,SAAS,IAAI;AAClB,EAAAA,MAAK,MAAM,IAAI;AACf,EAAAA,MAAK,MAAM,IAAI;AACf,EAAAA,MAAK,MAAM,IAAI;AACf,EAAAA,MAAK,QAAQ,IAAI;AACjB,EAAAA,MAAK,cAAc,IAAI;AACvB,EAAAA,MAAK,WAAW,IAAI;AACpB,EAAAA,MAAK,YAAY,IAAI;AACrB,EAAAA,MAAK,WAAW,IAAI;AACpB,EAAAA,MAAK,eAAe,IAAI;AACxB,EAAAA,MAAK,mBAAmB,IAAI;AAC5B,EAAAA,MAAK,2BAA2B,IAAI;AACpC,EAAAA,MAAK,wBAAwB,IAAI;AACjC,EAAAA,MAAK,wBAAwB,IAAI;AACjC,EAAAA,MAAK,kBAAkB,IAAI;AAC3B,EAAAA,MAAK,wBAAwB,IAAI;AACjC,EAAAA,MAAK,2BAA2B,IAAI;AACpC,EAAAA,MAAK,uBAAuB,IAAI;AAChC,EAAAA,MAAK,sBAAsB,IAAI;AAC/B,EAAAA,MAAK,uBAAuB,IAAI;AAChC,EAAAA,MAAK,8BAA8B,IAAI;AACvC,EAAAA,MAAK,sBAAsB,IAAI;AAC/B,EAAAA,MAAK,kBAAkB,IAAI;AAC3B,EAAAA,MAAK,uBAAuB,IAAI;AAChC,EAAAA,MAAK,uBAAuB,IAAI;AAChC,EAAAA,MAAK,0BAA0B,IAAI;AACnC,EAAAA,MAAK,sBAAsB,IAAI;AAC/B,EAAAA,MAAK,qBAAqB,IAAI;AAC9B,EAAAA,MAAK,6BAA6B,IAAI;AACxC,GAAG,SAAS,OAAO,CAAC,EAAE;;;ACzCf,SAAS,aAAa,MAAM;AACjC,SAAO,SAAS,KAAU,SAAS;AACrC;AASO,SAAS,QAAQ,MAAM;AAC5B,SAAO,QAAQ,MAAU,QAAQ;AACnC;AAYO,SAAS,SAAS,MAAM;AAC7B,SACG,QAAQ,MAAU,QAAQ;AAAA,EAC1B,QAAQ,MAAU,QAAQ;AAE/B;AAUO,SAAS,YAAY,MAAM;AAChC,SAAO,SAAS,IAAI,KAAK,SAAS;AACpC;AAWO,SAAS,eAAe,MAAM;AACnC,SAAO,SAAS,IAAI,KAAK,QAAQ,IAAI,KAAK,SAAS;AACrD;;;AC2EO,SAAS,iBAAiB,OAAO,SAAS;AAC/C,QAAM,eAAe,MAAM,QAAQ,QAAQ,OAAO;AAElD,QAAM,QAAQ,aAAa,MAAM,cAAc;AAC/C,QAAM,eAAe,MAAM,WAAW;AAEtC,QAAM,sBACJ,MAAM,SAAS,KACf,MACG,MAAM,CAAC,EACP,MAAM,CAACC,UAASA,MAAK,WAAW,KAAK,aAAaA,MAAK,WAAW,CAAC,CAAC,CAAC;AAE1E,QAAM,0BAA0B,aAAa,SAAS,OAAO;AAE7D,QAAM,mBAAmB,MAAM,SAAS,GAAG,KAAK,CAAC;AACjD,QAAM,mBAAmB,MAAM,SAAS,IAAI;AAC5C,QAAM,uBAAuB,oBAAoB;AACjD,QAAM,uBACJ,EAAE,YAAY,QAAQ,YAAY,UAAU,QAAQ;AAAA,GACnD,CAAC,gBACA,MAAM,SAAS,MACf,wBACA,uBACA;AACJ,MAAI,SAAS;AAEb,QAAM,qBAAqB,gBAAgB,aAAa,MAAM,WAAW,CAAC,CAAC;AAE3E,MAAK,wBAAwB,CAAC,sBAAuB,qBAAqB;AACxE,cAAU;AAAA,EACZ;AAEA,YAAU;AAEV,MAAI,wBAAwB,sBAAsB;AAChD,cAAU;AAAA,EACZ;AAEA,SAAO,QAAQ,SAAS;AAC1B;;;ACjLA,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAKrB,SAAS,QAAQ,OAAO;AAC7B,SAAO,YAAY,OAAO,CAAC,CAAC;AAC9B;AAEA,SAAS,YAAY,OAAO,YAAY;AACtC,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,UAAU,KAAK;AAAA,IAE7B,KAAK;AACH,aAAO,MAAM,OAAO,aAAa,MAAM,IAAI,MAAM;AAAA,IAEnD,KAAK;AACH,aAAO,kBAAkB,OAAO,UAAU;AAAA,IAE5C;AACE,aAAO,OAAO,KAAK;AAAA,EACvB;AACF;AAEA,SAAS,kBAAkB,OAAO,sBAAsB;AACtD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,SAAS,KAAK,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,GAAG,sBAAsB,KAAK;AAElD,MAAI,WAAW,KAAK,GAAG;AACrB,UAAM,YAAY,MAAM,OAAO;AAE/B,QAAI,cAAc,OAAO;AACvB,aAAO,OAAO,cAAc,WACxB,YACA,YAAY,WAAW,UAAU;AAAA,IACvC;AAAA,EACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,WAAO,YAAY,OAAO,UAAU;AAAA,EACtC;AAEA,SAAO,aAAa,OAAO,UAAU;AACvC;AAEA,SAAS,WAAW,OAAO;AACzB,SAAO,OAAO,MAAM,WAAW;AACjC;AAEA,SAAS,aAAa,QAAQ,YAAY;AACxC,QAAM,UAAU,OAAO,QAAQ,MAAM;AAErC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,qBAAqB;AAC3C,WAAO,MAAM,aAAa,MAAM,IAAI;AAAA,EACtC;AAEA,QAAM,aAAa,QAAQ;AAAA,IACzB,CAAC,CAAC,KAAK,KAAK,MAAM,MAAM,OAAO,YAAY,OAAO,UAAU;AAAA,EAC9D;AACA,SAAO,OAAO,WAAW,KAAK,IAAI,IAAI;AACxC;AAEA,SAAS,YAAY,OAAO,YAAY;AACtC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,qBAAqB;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,IAAI,kBAAkB,MAAM,MAAM;AACnD,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,QAAQ,CAAC;AAEf,WAAS,IAAI,GAAG,IAAI,KAAK,EAAE,GAAG;AAC5B,UAAM,KAAK,YAAY,MAAM,CAAC,GAAG,UAAU,CAAC;AAAA,EAC9C;AAEA,MAAI,cAAc,GAAG;AACnB,UAAM,KAAK,iBAAiB;AAAA,EAC9B,WAAW,YAAY,GAAG;AACxB,UAAM,KAAK,OAAO,SAAS,aAAa;AAAA,EAC1C;AAEA,SAAO,MAAM,MAAM,KAAK,IAAI,IAAI;AAClC;AAEA,SAAS,aAAa,QAAQ;AAC5B,QAAM,MAAM,OAAO,UAAU,SAC1B,KAAK,MAAM,EACX,QAAQ,cAAc,EAAE,EACxB,QAAQ,MAAM,EAAE;AAEnB,MAAI,QAAQ,YAAY,OAAO,OAAO,gBAAgB,YAAY;AAChE,UAAM,OAAO,OAAO,YAAY;AAEhC,QAAI,OAAO,SAAS,YAAY,SAAS,IAAI;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC/GA,IAAM,eACJ,WAAW;AACX,QAAQ,IAAI,aAAa;AAQpB,IAAM;AAAA;AAAA;AAAA,EAGX,eACI,SAASC,YAAW,OAAO,aAAa;AACtC,WAAO,iBAAiB;AAAA,EAC1B,IACA,SAASA,YAAW,OAAO,aAAa;AACtC,QAAI,iBAAiB,aAAa;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAI;AAGJ,YAAM,YAAY,YAAY,UAAU,OAAO,WAAW;AAC1D,YAAM;AAAA;AAAA,QACJ,OAAO,eAAe,QAClB,MAAM,OAAO,WAAW,KACvB,qBAAqB,MAAM,iBAAiB,QAC7C,uBAAuB,SACvB,SACA,mBAAmB;AAAA;AAEzB,UAAI,cAAc,gBAAgB;AAChC,cAAM,mBAAmB,QAAQ,KAAK;AACtC,cAAM,IAAI,MAAM,cAAc,SAAS,KAAK,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAWtD;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;;;ACxDN,IAAM,kBAAkB;AAKjB,SAAS,WAAW,UAAU,WAAW;AAC9C,QAAM,CAAC,YAAY,cAAc,IAAI,YACjC,CAAC,UAAU,SAAS,IACpB,CAAC,QAAW,QAAQ;AACxB,MAAI,UAAU;AAEd,MAAI,YAAY;AACd,eAAW,aAAa;AAAA,EAC1B;AAEA,QAAM,cAAc,eAAe,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;AAEtD,UAAQ,YAAY,QAAQ;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,IAET,KAAK;AACH,aAAO,UAAU,YAAY,CAAC,IAAI;AAAA,IAEpC,KAAK;AACH,aAAO,UAAU,YAAY,CAAC,IAAI,SAAS,YAAY,CAAC,IAAI;AAAA,EAChE;AAEA,QAAM,WAAW,YAAY,MAAM,GAAG,eAAe;AACrD,QAAM,WAAW,SAAS,IAAI;AAC9B,SAAO,UAAU,SAAS,KAAK,IAAI,IAAI,UAAU,WAAW;AAC9D;;;AC5BO,SAAS,aAAa,GAAG;AAC9B,SAAO;AACT;;;ACsBO,SAAS,OAAO,MAAM,OAAO;AAClC,QAAM,SAAS,uBAAO,OAAO,IAAI;AAEjC,aAAW,QAAQ,MAAM;AACvB,WAAO,MAAM,IAAI,CAAC,IAAI;AAAA,EACxB;AAEA,SAAO;AACT;;;AClBO,SAAS,UAAU,MAAM,OAAO,OAAO;AAC5C,QAAM,SAAS,uBAAO,OAAO,IAAI;AAEjC,aAAW,QAAQ,MAAM;AACvB,WAAO,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;;;ACrBO,SAAS,SAAS,KAAK,IAAI;AAChC,QAAM,SAAS,uBAAO,OAAO,IAAI;AAEjC,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,WAAO,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG;AAAA,EAChC;AAEA,SAAO;AACT;;;ACLO,SAAS,eAAe,MAAM,MAAM;AACzC,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,SAAO,SAAS,KAAK,UAAU,SAAS,KAAK,QAAQ;AACnD,QAAI,QAAQ,KAAK,WAAW,MAAM;AAClC,QAAI,QAAQ,KAAK,WAAW,MAAM;AAElC,QAAIC,SAAQ,KAAK,KAAKA,SAAQ,KAAK,GAAG;AACpC,UAAI,OAAO;AAEX,SAAG;AACD,UAAE;AACF,eAAO,OAAO,KAAK,QAAQ;AAC3B,gBAAQ,KAAK,WAAW,MAAM;AAAA,MAChC,SAASA,SAAQ,KAAK,KAAK,OAAO;AAElC,UAAI,OAAO;AAEX,SAAG;AACD,UAAE;AACF,eAAO,OAAO,KAAK,QAAQ;AAC3B,gBAAQ,KAAK,WAAW,MAAM;AAAA,MAChC,SAASA,SAAQ,KAAK,KAAK,OAAO;AAElC,UAAI,OAAO,MAAM;AACf,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM;AACf,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,OAAO;AACjB,eAAO;AAAA,MACT;AAEA,UAAI,QAAQ,OAAO;AACjB,eAAO;AAAA,MACT;AAEA,QAAE;AACF,QAAE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,KAAK,SAAS,KAAK;AAC5B;AACA,IAAM,UAAU;AAChB,IAAM,UAAU;AAEhB,SAASA,SAAQ,MAAM;AACrB,SAAO,CAAC,MAAM,IAAI,KAAK,WAAW,QAAQ,QAAQ;AACpD;;;ACtDO,SAAS,eAAe,OAAO,SAAS;AAC7C,QAAM,oBAAoB,uBAAO,OAAO,IAAI;AAC5C,QAAM,kBAAkB,IAAI,gBAAgB,KAAK;AACjD,QAAM,YAAY,KAAK,MAAM,MAAM,SAAS,GAAG,IAAI;AAEnD,aAAW,UAAU,SAAS;AAC5B,UAAM,WAAW,gBAAgB,QAAQ,QAAQ,SAAS;AAE1D,QAAI,aAAa,QAAW;AAC1B,wBAAkB,MAAM,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,iBAAiB,EAAE,KAAK,CAAC,GAAG,MAAM;AACnD,UAAM,eAAe,kBAAkB,CAAC,IAAI,kBAAkB,CAAC;AAC/D,WAAO,iBAAiB,IAAI,eAAe,eAAe,GAAG,CAAC;AAAA,EAChE,CAAC;AACH;AAgBA,IAAM,kBAAN,MAAsB;AAAA,EACpB,YAAY,OAAO;AACjB,SAAK,SAAS;AACd,SAAK,kBAAkB,MAAM,YAAY;AACzC,SAAK,cAAc,cAAc,KAAK,eAAe;AACrD,SAAK,QAAQ;AAAA,MACX,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,KAAK,CAAC;AAAA,MAClC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,KAAK,CAAC;AAAA,MAClC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,QAAQ,QAAQ,WAAW;AACzB,QAAI,KAAK,WAAW,QAAQ;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,OAAO,YAAY;AAE3C,QAAI,KAAK,oBAAoB,iBAAiB;AAC5C,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,cAAc,eAAe;AACrC,QAAI,IAAI,KAAK;AAEb,QAAI,EAAE,SAAS,EAAE,QAAQ;AACvB,YAAM,MAAM;AACZ,UAAI;AACJ,UAAI;AAAA,IACN;AAEA,UAAM,UAAU,EAAE;AAClB,UAAM,UAAU,EAAE;AAElB,QAAI,UAAU,UAAU,WAAW;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK;AAElB,aAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,WAAK,CAAC,EAAE,CAAC,IAAI;AAAA,IACf;AAEA,aAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,YAAM,QAAQ,MAAM,IAAI,KAAK,CAAC;AAC9B,YAAM,aAAa,KAAK,IAAI,CAAC;AAC7B,UAAI,eAAgB,WAAW,CAAC,IAAI;AAEpC,eAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,cAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,YAAI,cAAc,KAAK;AAAA,UACrB,MAAM,CAAC,IAAI;AAAA;AAAA,UACX,WAAW,IAAI,CAAC,IAAI;AAAA;AAAA,UACpB,MAAM,IAAI,CAAC,IAAI;AAAA;AAAA,QACjB;AAEA,YAAI,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG;AAEpE,gBAAM,qBAAqB,MAAM,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAClD,wBAAc,KAAK,IAAI,aAAa,qBAAqB,CAAC;AAAA,QAC5D;AAEA,YAAI,cAAc,cAAc;AAC9B,yBAAe;AAAA,QACjB;AAEA,mBAAW,CAAC,IAAI;AAAA,MAClB;AAEA,UAAI,eAAe,WAAW;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,UAAU,CAAC,EAAE,OAAO;AAC1C,WAAO,YAAY,YAAY,WAAW;AAAA,EAC5C;AACF;AAEA,SAAS,cAAc,KAAK;AAC1B,QAAM,YAAY,IAAI;AACtB,QAAM,QAAQ,IAAI,MAAM,SAAS;AAEjC,WAAS,IAAI,GAAG,IAAI,WAAW,EAAE,GAAG;AAClC,UAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;;;ACjIO,SAAS,SAAS,KAAK;AAC5B,MAAI,OAAO,MAAM;AACf,WAAO,uBAAO,OAAO,IAAI;AAAA,EAC3B;AAEA,MAAI,OAAO,eAAe,GAAG,MAAM,MAAM;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,uBAAO,OAAO,IAAI;AAE9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,GAAG,IAAI;AAAA,EACb;AAEA,SAAO;AACT;;;ACZO,SAAS,YAAY,KAAK;AAC/B,SAAO,IAAI,IAAI,QAAQ,eAAe,eAAe,CAAC;AACxD;AAEA,IAAM,gBAAgB;AAEtB,SAAS,gBAAgB,KAAK;AAC5B,SAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC;AAC1C;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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","names":["DataLoader","index","index","index","Symbol","Symbol","Symbol","isObjectLike","isObjectLike","isObjectLike","isArray","Buffer","isObjectLike","isTypedArray","isArray","isTypedArray","isType","index","collection","eq","eq","index","index","index","index","Map","index","Map","index","Map","index","index","index","othValue","Uint8Array","index","index","Symbol","Uint8Array","eq","index","isArray","index","index","DataView","Promise","Set","WeakMap","DataView","Map","Promise","Set","WeakMap","isArray","isTypedArray","isObjectLike","index","isObjectLike","isSymbol","isArray","isSymbol","match","index","Symbol","isArray","isSymbol","isArray","isSymbol","index","isArray","index","isArray","isArray","partition","block","getTableName","entityKind","PgColumn","PgColumnBuilder","_a","PgColumn","entityKind","_b","entityKind","PgColumn","PgColumnBuilder","_a","PgColumn","entityKind","_b","entityKind","PgColumn","PgColumnBuilder","_a","PgColumn","entityKind","_b","PgColumnBuilder","entityKind","PgColumn","entityKind","entityKind","PgColumn","PgColumnBuilder","_a","PgColumn","entityKind","_b","name","getTableName","index","match","text","char","json","index","version","walker","path","transformed","result","index","getType","isArray","getType","isPlainObject","getType","isArray","isPlainObject","json","line","match","line","OperationTypeNode","Kind","line","instanceOf","isDigit","inArray","index","alias","parseValue","getTableConfig","toSnakeCase","PgColumn","PgTable","getViewConfig","pgSchema","pgTable","asc","parseType","toSnakeCase","getTableColumns","getTableName","SQL","and","eq","getTableColumns","is","isNull","PgEnumColumn","PgView","getViewConfig","isPgEnum","sql","eq","gt","gte","lt","lte","ne","isNull","isNotNull","inArray","notInArray","like","notLike","not","asc","desc","and","or","count","bigint","integer","json","jsonb","text","varchar","index","index","block","ponder_schema_exports","factory","tokenPrice","factory","tokenPrice","ponder_schema_exports","deposit","block","timestamp","sum","fundsLocked","partition","verifier","event","eq","and","desc","sql","inArray","or","orderId","formatUnits","tokenByAddress","deposit","and","eq","desc","inArray","fundsUnlocked","intentSignaled","or","chainId","sql","sum","status","token","useCallback","and","eq","desc","sql","SUPPORTED_CURRENCIES","providerKeyToContractId","orderId","token","paymentMethod","providerKeyToContractId","and","eq","sql","desc","verifier","deposit","orderId","SUPPORTED_CURRENCIES","useCallback","SUPPORTED_CURRENCIES","parseUnits","formatUnits","eq","and","sql","desc","SUPPORTED_CURRENCIES","token","parseUnits","and","eq","sql","desc","deposit","formatUnits","useState","useEffect","useCallback","useMemo","verifierGetsKey","orderId","and","desc","inArray","eq","interval","stat","orderId","timestamp","date","useState","useMemo","useCallback","chainIds","token","verifier","verifierGetsKey","useEffect","chains","and","eq","desc","sql","token","deposit","verifier","status","chains","timestamp"]}
|