@xyo-network/chain-api 1.7.11 → 1.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  XYO Layer One API
12
12
 
13
- ## Documentation
13
+
14
14
 
15
15
  ## Reference
16
16
 
@@ -5,7 +5,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
5
5
  import { customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler, standardErrors, standardResponses } from "@xylabs/express";
6
6
  import compression from "compression";
7
7
  import cors from "cors";
8
- import express from "express";
8
+ import express2 from "express";
9
9
 
10
10
  // src/server/instrumentation.ts
11
11
  import { registerInstrumentations } from "@opentelemetry/instrumentation";
@@ -173,8 +173,95 @@ var addNodeRoutes = /* @__PURE__ */ __name((app) => {
173
173
  });
174
174
  }, "addNodeRoutes");
175
175
 
176
- // src/server/routes/rpc/routes/addRpcRoutes.ts
176
+ // src/server/routes/dataLake/archivistMiddleware.ts
177
177
  import { setRawResponseFormat } from "@xylabs/express";
178
+ import { asHash, isHash } from "@xylabs/hex";
179
+ import { isDefined } from "@xylabs/typeof";
180
+ import { asArchivistInstance } from "@xyo-network/archivist-model";
181
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
182
+ import { isAnyPayload } from "@xyo-network/payload-model";
183
+ import express from "express";
184
+ var resolveArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdentifier) => {
185
+ const mod = await node.resolve(archivistModuleIdentifier);
186
+ return asArchivistInstance(mod, {
187
+ required: true
188
+ });
189
+ }, "resolveArchivist");
190
+ var archivistInstance;
191
+ var getArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdentifier) => {
192
+ if (isDefined(archivistInstance)) return archivistInstance;
193
+ archivistInstance = await resolveArchivist(node, archivistModuleIdentifier);
194
+ return archivistInstance;
195
+ }, "getArchivist");
196
+ var archivistMiddleware = /* @__PURE__ */ __name((options) => {
197
+ const { node, archivistModuleIdentifier } = options;
198
+ const router = express.Router({
199
+ mergeParams: true
200
+ });
201
+ router.post("/insert", async (req, res) => {
202
+ setRawResponseFormat(res);
203
+ const body = Array.isArray(req.body) ? req.body : [
204
+ req.body
205
+ ];
206
+ const payloads = (await PayloadBuilder.hashPairs(body)).map((p) => p[0]);
207
+ const archivist = await getArchivist(node, archivistModuleIdentifier);
208
+ const result = await archivist.insert(payloads);
209
+ res.status(200).json(result);
210
+ });
211
+ router.get("/next", async (req, res) => {
212
+ setRawResponseFormat(res);
213
+ const cursor = isHash(req.query.cursor) ? asHash(req.query.cursor) : void 0;
214
+ const limit = isDefined(req.query.limit) ? Number(req.query.limit) : void 0;
215
+ const open = isDefined(req.query.open) ? Boolean(req.query.open) : void 0;
216
+ const order = req.query.order === "asc" ? "asc" : "desc";
217
+ const options2 = {
218
+ limit,
219
+ open,
220
+ order,
221
+ cursor
222
+ };
223
+ const archivist = await getArchivist(node, archivistModuleIdentifier);
224
+ const result = await archivist.next(options2);
225
+ res.status(200).json(result);
226
+ });
227
+ router.post("/next", async (req, res) => {
228
+ setRawResponseFormat(res);
229
+ const options2 = req.body;
230
+ const archivist = await getArchivist(node, archivistModuleIdentifier);
231
+ const result = await (isDefined(options2) ? archivist.next(options2) : archivist.next());
232
+ res.status(200).json(result);
233
+ });
234
+ router.get("/get/:hash", async (req, res) => {
235
+ setRawResponseFormat(res);
236
+ const { hash: rawHash } = req.params;
237
+ const hash = asHash(rawHash);
238
+ if (isDefined(hash)) {
239
+ const archivist = await getArchivist(node, archivistModuleIdentifier);
240
+ const [payload] = await archivist.get([
241
+ hash
242
+ ]);
243
+ if (isAnyPayload(payload)) {
244
+ res.json(payload);
245
+ return;
246
+ }
247
+ }
248
+ res.status(400).send();
249
+ });
250
+ return router;
251
+ }, "archivistMiddleware");
252
+
253
+ // src/server/routes/dataLake/addDataLakeRoutes.ts
254
+ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
255
+ const { node } = app;
256
+ const archivistModuleIdentifier = "Chain:Finalized";
257
+ app.use("/chain", archivistMiddleware({
258
+ node,
259
+ archivistModuleIdentifier
260
+ }));
261
+ }, "addDataLakeRoutes");
262
+
263
+ // src/server/routes/rpc/routes/addRpcRoutes.ts
264
+ import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
178
265
  import { NodeXyoViewer } from "@xyo-network/chain-rpc";
179
266
  import { NodeXyoRunner, rpcEngineFromProvider, XyoConnection } from "@xyo-network/xl1-rpc";
180
267
  var addRpcRoutes = /* @__PURE__ */ __name((app) => {
@@ -187,7 +274,7 @@ var addRpcRoutes = /* @__PURE__ */ __name((app) => {
187
274
  });
188
275
  const engine = rpcEngineFromProvider(provider);
189
276
  app.post("/rpc", (req, res) => {
190
- setRawResponseFormat(res);
277
+ setRawResponseFormat2(res);
191
278
  engine.handle(req.body, (_, rpcResponse) => {
192
279
  res.json(rpcResponse);
193
280
  });
@@ -197,13 +284,14 @@ var addRpcRoutes = /* @__PURE__ */ __name((app) => {
197
284
  // src/server/routes/addRoutes.ts
198
285
  var addRoutes = /* @__PURE__ */ __name((app) => {
199
286
  addRpcRoutes(app);
287
+ addDataLakeRoutes(app);
200
288
  addNodeRoutes(app);
201
289
  }, "addRoutes");
202
290
 
203
291
  // src/server/app.ts
204
292
  var getApp = /* @__PURE__ */ __name((node) => {
205
293
  addInstrumentation();
206
- const app = express();
294
+ const app = express2();
207
295
  app.set("etag", false);
208
296
  app.use(cors());
209
297
  app.use(compression());
@@ -223,7 +311,7 @@ var getApp = /* @__PURE__ */ __name((node) => {
223
311
 
224
312
  // src/server/server.ts
225
313
  import { assertEx as assertEx5 } from "@xylabs/assert";
226
- import { isDefined as isDefined2, isString } from "@xylabs/typeof";
314
+ import { isDefined as isDefined3, isString } from "@xylabs/typeof";
227
315
  import { boot } from "@xyo-network/bios";
228
316
  import { HDWallet } from "@xyo-network/wallet";
229
317
 
@@ -231,7 +319,7 @@ import { HDWallet } from "@xyo-network/wallet";
231
319
  import { assertEx as assertEx4 } from "@xylabs/assert";
232
320
  import { asAddress as asAddress3, ZERO_ADDRESS } from "@xylabs/hex";
233
321
  import { BaseMongoSdk } from "@xylabs/mongo";
234
- import { isDefined } from "@xylabs/typeof";
322
+ import { isDefined as isDefined2 } from "@xylabs/typeof";
235
323
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
236
324
  import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
237
325
  import { ViewArchivist } from "@xyo-network/archivist-view";
@@ -325,7 +413,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
325
413
  port: 9465
326
414
  }
327
415
  });
328
- if (isDefined(logger)) AbstractModule.defaultLogger = logger;
416
+ if (isDefined2(logger)) AbstractModule.defaultLogger = logger;
329
417
  const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
330
418
  const locator = new ModuleFactoryLocator();
331
419
  let summaryMap = /* @__PURE__ */ new Map();
@@ -361,7 +449,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
361
449
  statusReporter,
362
450
  summaryRepository
363
451
  }));
364
- const chainId = isDefined(config.chain.id) ? assertEx4(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
452
+ const chainId = isDefined2(config.chain.id) ? assertEx4(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
365
453
  locator.register(HeadValidationDiviner.factory({
366
454
  traceProvider,
367
455
  meterProvider,
@@ -643,7 +731,7 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
643
731
  const { config, logger, node } = context;
644
732
  const { mnemonic, port } = context.config.api;
645
733
  const bios = await boot();
646
- const seedPhrase = isDefined2(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
734
+ const seedPhrase = isDefined3(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
647
735
  const wallet = await HDWallet.fromPhrase(seedPhrase);
648
736
  const nodeContext = {
649
737
  wallet,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/manifest/getLocator.ts","../../src/driver/mongo/MongoMap.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress, toAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (address !== undefined) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = toAddress(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport {\n asAddress, isAddress,\n toAddress,\n} from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) || []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n NodeXyoRunner, rpcEngineFromProvider,\n XyoConnection,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new XyoConnection({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addNodeRoutes(app)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined, isString } from '@xylabs/typeof'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[API] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const {\n config, logger, node,\n } = context\n const { mnemonic, port } = context.config.api\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const app = getApp(node ?? await getNode(nodeContext))\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asAddress, ZERO_ADDRESS } from '@xylabs/hex'\nimport type { Logger } from '@xylabs/logger'\nimport { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { isDefined } from '@xylabs/typeof'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport {\n AddressBalanceDivinerV2, ArchivistSyncDiviner, balanceSummaryRepositoryFromMap, HeadValidationDiviner,\n} from '@xyo-network/chain-modules'\nimport type { MapType } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport type { BalancesStepSummary, Config } from '@xyo-network/xl1-protocol-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-protocol-sdk'\n\nimport { MongoMap } from '../driver/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-api',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // Initialize with an in-memory map for backing the summary repository\n let summaryMap: MapType<Hash, WithStorageMeta<BalancesStepSummary>> = new Map<Hash, WithStorageMeta<BalancesStepSummary>>()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n\n // Use a persistent MongoMap for the summary repository if MongoDB is configured\n const sdk = new BaseMongoSdk<WithStorageMeta<BalancesStepSummary>>({ ...payloadSdkConfig, collection: 'balance_summary_map' })\n summaryMap = await MongoMap.create<MongoMap<Hash, WithStorageMeta<BalancesStepSummary>>>({ sdk })\n }\n\n const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap)\n locator.register(AddressBalanceDivinerV2.factory<AddressBalanceDivinerV2>({\n traceProvider, meterProvider, statusReporter, summaryRepository,\n }))\n\n const chainId = isDefined(config.chain.id)\n ? assertEx(asAddress(config.chain.id), () => 'chain.id must be an Address')\n : ZERO_ADDRESS\n locator.register(HeadValidationDiviner.factory<HeadValidationDiviner>({\n traceProvider,\n meterProvider,\n statusReporter,\n chainId,\n }))\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ArchivistSyncDiviner.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n return locator\n}\n","import { assertEx } from '@xylabs/assert'\nimport {\n AbstractCreatable, creatable, CreatableParams,\n} from '@xylabs/creatable'\nimport { BaseMongoSdk } from '@xylabs/mongo'\nimport { isNull } from '@xylabs/typeof'\nimport { AsynchronousMap } from '@xyo-network/chain-protocol'\nimport {\n Document, Filter, OptionalUnlessRequiredId, WithId,\n} from 'mongodb'\n\nexport interface MongoMapParams<TData extends Document = Document> extends CreatableParams {\n sdk: BaseMongoSdk<TData>\n}\n\nfunction stripMongoId<V extends Document>(doc: WithId<V>): V {\n const { _id, ...rest } = doc\n return rest as unknown as V\n}\n\n@creatable()\nexport class MongoMap<K = string, V extends Document = Document>\n extends AbstractCreatable<MongoMapParams<V>>\n implements AsynchronousMap<K, V> {\n get sdk(): BaseMongoSdk<V> {\n return assertEx(this.params.sdk, () => 'No sdk specified')\n }\n\n async clear(): Promise<void> {\n await this.sdk.deleteMany({})\n }\n\n async delete(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const result = await this.sdk.deleteOne(filter)\n return result.deletedCount > 0\n }\n\n async get(id: K): Promise<V | undefined> {\n const filter = { _id: id } as Filter<V>\n const doc = await this.sdk.findOne(filter)\n return isNull(doc) ? undefined : stripMongoId(doc)\n }\n\n async has(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const exists = await this.sdk.findOne(filter)\n return isNull(exists) ? false : true\n }\n\n async set(id: K, data: V): Promise<this> {\n const filter = { _id: id } as Filter<V>\n const value = { ...data, _id: id } as OptionalUnlessRequiredId<V>\n await this.sdk.replaceOne(filter, value, { upsert: true })\n return this\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n // TODO: Ensure index\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"Validated\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Submissions\",\n \"targetModuleFunction\": \"divine\"\n }\n ],\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 10000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"AddressBalancePollingSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"AddressBalanceDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Submissions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"name\": \"Finalized\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"Chain:Validated\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Validated\",\n \"targetModuleFunction\": \"divine\"\n }\n ]\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/2\",\n \"name\": \"PendingTransactions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"payloadSdkConfig\": {\n \"collection\": \"pending_bundles\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\n]\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","assertEx","asyncHandler","asAddress","toAddress","isModuleIdentifierPart","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","toAddress","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","NodeXyoViewer","NodeXyoRunner","rpcEngineFromProvider","XyoConnection","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","XyoConnection","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addNodeRoutes","getApp","node","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","assertEx","asAddress","ZERO_ADDRESS","BaseMongoSdk","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","AddressBalanceDivinerV2","ArchivistSyncDiviner","balanceSummaryRepositoryFromMap","HeadValidationDiviner","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","hasMongoConfig","assertEx","AbstractCreatable","creatable","isNull","stripMongoId","doc","_id","rest","MongoMap","AbstractCreatable","sdk","assertEx","params","clear","deleteMany","delete","id","filter","result","deleteOne","deletedCount","get","findOne","isNull","undefined","has","exists","set","data","value","replaceOne","upsert","startHandler","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","summaryMap","Map","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","sdk","BaseMongoSdk","collection","MongoMap","create","summaryRepository","balanceSummaryRepositoryFromMap","AddressBalanceDivinerV2","chainId","chain","id","assertEx","asAddress","ZERO_ADDRESS","HeadValidationDiviner","MemoryArchivist","MemorySentinel","ViewArchivist","ArchivistSyncDiviner","ManifestWrapper","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","node","port","boot","isDefined","wallet","fromPhrase","nodeContext","app","getApp","getNode","server","listen","setTimeout"]}
1
+ {"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/manifest/getLocator.ts","../../src/driver/mongo/MongoMap.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport { asAddress, toAddress } from '@xylabs/hex'\nimport { isModuleIdentifierPart } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: rawAddress } = req.params\n const { node } = req.app\n const address = asAddress(rawAddress)\n if (address !== undefined) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleIdentifierPart(rawAddress)) {\n const moduleIdentifier = toAddress(rawAddress)\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n const moduleAddress = assertEx(mod?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${moduleAddress}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { assertEx } from '@xylabs/assert'\nimport { asyncHandler } from '@xylabs/express'\nimport {\n asAddress, isAddress,\n toAddress,\n} from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) || []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isHash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport {\n type ArchivistInstance, asArchivistInstance, type NextOptions,\n} from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isHash(req.query.cursor) ? asHash(req.query.cursor) : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: NextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, NextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n NodeXyoRunner, rpcEngineFromProvider,\n XyoConnection,\n} from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = (app: Express) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const viewer = new NodeXyoViewer(node)\n const provider = new XyoConnection({ runner, viewer })\n const engine = rpcEngineFromProvider(provider)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined, isString } from '@xylabs/typeof'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[API] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const {\n config, logger, node,\n } = context\n const { mnemonic, port } = context.config.api\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const app = getApp(node ?? await getNode(nodeContext))\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asAddress, ZERO_ADDRESS } from '@xylabs/hex'\nimport type { Logger } from '@xylabs/logger'\nimport { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { isDefined } from '@xylabs/typeof'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport {\n AddressBalanceDivinerV2, ArchivistSyncDiviner, balanceSummaryRepositoryFromMap, HeadValidationDiviner,\n} from '@xyo-network/chain-modules'\nimport type { MapType } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport type { BalancesStepSummary, Config } from '@xyo-network/xl1-protocol-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-protocol-sdk'\n\nimport { MongoMap } from '../driver/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-api',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9465,\n },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // Initialize with an in-memory map for backing the summary repository\n let summaryMap: MapType<Hash, WithStorageMeta<BalancesStepSummary>> = new Map<Hash, WithStorageMeta<BalancesStepSummary>>()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n\n // Use a persistent MongoMap for the summary repository if MongoDB is configured\n const sdk = new BaseMongoSdk<WithStorageMeta<BalancesStepSummary>>({ ...payloadSdkConfig, collection: 'balance_summary_map' })\n summaryMap = await MongoMap.create<MongoMap<Hash, WithStorageMeta<BalancesStepSummary>>>({ sdk })\n }\n\n const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap)\n locator.register(AddressBalanceDivinerV2.factory<AddressBalanceDivinerV2>({\n traceProvider, meterProvider, statusReporter, summaryRepository,\n }))\n\n const chainId = isDefined(config.chain.id)\n ? assertEx(asAddress(config.chain.id), () => 'chain.id must be an Address')\n : ZERO_ADDRESS\n locator.register(HeadValidationDiviner.factory<HeadValidationDiviner>({\n traceProvider,\n meterProvider,\n statusReporter,\n chainId,\n }))\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ArchivistSyncDiviner.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n return locator\n}\n","import { assertEx } from '@xylabs/assert'\nimport {\n AbstractCreatable, creatable, CreatableParams,\n} from '@xylabs/creatable'\nimport { BaseMongoSdk } from '@xylabs/mongo'\nimport { isNull } from '@xylabs/typeof'\nimport { AsynchronousMap } from '@xyo-network/chain-protocol'\nimport {\n Document, Filter, OptionalUnlessRequiredId, WithId,\n} from 'mongodb'\n\nexport interface MongoMapParams<TData extends Document = Document> extends CreatableParams {\n sdk: BaseMongoSdk<TData>\n}\n\nfunction stripMongoId<V extends Document>(doc: WithId<V>): V {\n const { _id, ...rest } = doc\n return rest as unknown as V\n}\n\n@creatable()\nexport class MongoMap<K = string, V extends Document = Document>\n extends AbstractCreatable<MongoMapParams<V>>\n implements AsynchronousMap<K, V> {\n get sdk(): BaseMongoSdk<V> {\n return assertEx(this.params.sdk, () => 'No sdk specified')\n }\n\n async clear(): Promise<void> {\n await this.sdk.deleteMany({})\n }\n\n async delete(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const result = await this.sdk.deleteOne(filter)\n return result.deletedCount > 0\n }\n\n async get(id: K): Promise<V | undefined> {\n const filter = { _id: id } as Filter<V>\n const doc = await this.sdk.findOne(filter)\n return isNull(doc) ? undefined : stripMongoId(doc)\n }\n\n async has(id: K): Promise<boolean> {\n const filter = { _id: id } as Filter<V>\n const exists = await this.sdk.findOne(filter)\n return isNull(exists) ? false : true\n }\n\n async set(id: K, data: V): Promise<this> {\n const filter = { _id: id } as Filter<V>\n const value = { ...data, _id: id } as OptionalUnlessRequiredId<V>\n await this.sdk.replaceOne(filter, value, { upsert: true })\n return this\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n // TODO: Ensure index\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"Validated\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/2'\",\n \"schema\": \"network.xyo.diviner.chain.head.validation.config\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Submissions\",\n \"targetModuleFunction\": \"divine\"\n }\n ],\n \"inArchivist\": \"Chain:Submissions\",\n \"outArchivist\": \"Chain:Validated\",\n \"name\": \"HeadValidationDiviner\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/3'\",\n \"automations\": [\n {\n \"frequency\": 10000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"ChainValidationSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"HeadValidationDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1'/4'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"AddressBalancePollingSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"AddressBalanceDiviner\",\n \"endPoint\": \"divine\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Submissions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"name\": \"Finalized\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"originArchivist\": \"Chain:Validated\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/3\",\n \"schema\": \"network.xyo.diviner.chain.address.balance.config\",\n \"archivist\": \"Chain:Validated\",\n \"name\": \"AddressBalanceDiviner\",\n \"eventSubscriptions\": [\n {\n \"sourceEvent\": \"inserted\",\n \"sourceModule\": \"Chain:Validated\",\n \"targetModuleFunction\": \"divine\"\n }\n ]\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/2\",\n \"name\": \"PendingTransactions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"payloadSdkConfig\": {\n \"collection\": \"pending_bundles\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\n]\n"],"mappings":";;;;AAAA,SACEA,uBACAC,6BACAC,sCACAC,mBACAC,0BACAC,kBACAC,gBACAC,yBACK;AAEP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,cAAa;;;ACdpB,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AACvC,SAASC,2BAA2B;AAS7B,IAAMC,qBAAqB,6BAAA;AAChC,QAAMC,mBAAmB;IAAC,IAAIC,oBAAAA;IAAuB,IAAIC,uBAAAA;;AACzDC,2BAAyB;IAAEH;EAAiB,CAAA;AAC9C,GAHkC;;;ACVlC,SAASI,eAAAA,oBAAmB;;;ACD5B,SAASC,gBAAgB;AACzB,SAASC,oBAAoB;AAC7B,SAASC,WAAWC,iBAAiB;AACrC,SAASC,8BAA8B;AAGvC,SAASC,mBAAmB;AAI5B,IAAMC,UAAwD,8BAAOC,KAAKC,KAAKC,SAAAA;AAC7E,QAAM,EAAEC,SAASC,WAAU,IAAKJ,IAAIK;AACpC,QAAM,EAAEC,KAAI,IAAKN,IAAIO;AACrB,QAAMJ,UAAUK,UAAUJ,UAAAA;AAC1B,MAAID,YAAYM,QAAW;AACzB,QAAIC,MAAMJ,KAAKH,YAAYA,UAAUG,OAAQ,MAAMA,KAAKK,QAAQR,SAAS;MAAES,WAAW;IAAO,CAAA;AAC7F,QAAIF,KAAK;AACPT,UAAIY,KAAK,MAAMH,IAAII,MAAK,CAAA;AACxB;IACF;EACF;AACA,MAAIC,uBAAuBX,UAAAA,GAAa;AACtC,UAAMY,mBAAmBC,UAAUb,UAAAA;AACnC,UAAMM,MAAM,MAAMJ,KAAKK,QAAQK,kBAAkB;MAAEJ,WAAW;IAAO,CAAA;AACrE,QAAIF,KAAK;AACP,YAAMQ,gBAAgBC,SAAST,KAAKP,SAAS,MAAM,wCAAA;AACnDF,UAAImB,SAASC,YAAYC,mBAAmB,IAAIJ,aAAAA,EAAe;AAC/D;IACF;EACF;AACAhB,OAAK,OAAA;AACP,GArB8D;AAsBvD,IAAMqB,aAAaC,aAAazB,OAAAA;;;AChCvC,SAAS0B,YAAAA,iBAAgB;AACzB,SAASC,gBAAAA,qBAAoB;AAC7B,SACEC,aAAAA,YAAWC,WACXC,aAAAA,kBACK;AAEP,SAASC,2BAAmD;AAC5D,SAASC,0BAA0B;AAInC,SAASC,eAAAA,oBAAmB;;;ACX5B,SAASC,0BAA0B;AAEnC,SAASC,0BAA0B;AAInC,IAAMC,gBAAgB;AAEf,IAAMC,iBAAiB,wBAACC,KAAqBC,KAAcC,IAAuBC,aAAAA;AAGvF,QAAMC,oBACFD,UACEE,KAAKP,aAAAA,EACNQ,OAAqB,CAACC,YAAqCA,SAASC,WAAWC,kBAAAA,EAC/EC,IAAIR,CAAAA,QAAMA,IAAGS,SAAS,KAAK,CAAA;AAEhC,QAAMA,YAAY;IAACT,GAAGS;OAAcP;IAAmBE,OAAOM,CAAAA,YAAWA,QAAQC,SAAS,CAAA;AAC1F,QAAMC,UAAUH,UAAUE,SAAS,IAAIE,OAAOC,YAAYhB,IAAIiB,QAAQP,IAAIF,CAAAA,WAAU;IAACA;IAAQG;GAAU,CAAA,IAAK,CAAC;AAC7G,QAAMO,WAAW;IAAEJ;EAAQ;AAC3B,SAAO;IAAEN,QAAQW;IAAoBD;EAAS;AAChD,GAb8B;;;ADU9B,IAAME,WAAsG,8BAAOC,KAAKC,KAAKC,SAAAA;AAC3H,QAAMC,cAAc,wBAACC,MAAcC,UAAU,qBAAqBC,YAAAA;AAChE,UAAMC,QAAQ,IAAIC,mBAAAA,EAAqBH,QAAQA,OAAAA,EAASC,QAAQA,OAAAA,EAASG,MAAK;AAC9ER,QAAIS,OAAOC,cAAc;AACzBV,QAAIW,OAAOR,IAAAA,EAAMS,KAAKN,KAAAA;AACtBL,SAAAA;EACF,GALoB;AAOpB,QAAM,EAAEY,QAAO,IAAKd,IAAIe;AACxB,QAAM,EAAEC,KAAI,IAAKhB,IAAIiB;AACrB,QAAM,CAACC,IAAIC,QAAAA,IAAYC,MAAMC,QAAQrB,IAAIsB,IAAI,IAAItB,IAAIsB,OAAO,CAAA;AAC5D,MAAI,CAACC,UAAUT,OAAAA,GAAU;AACvB,WAAOX,YAAYqB,aAAYC,aAAa,iBAAA;EAC9C;AAEA,MAAI,CAACP,IAAI;AACP,WAAOf,YAAYqB,aAAYC,aAAa,sBAAA;EAC9C;AAEA,MAAI,CAACC,oBAAoBR,EAAAA,GAAK;AAC5B,WAAOf,YAAYqB,aAAYC,aAAa,4BAAA;EAC9C;AAEA,MAAIE,UAA4B,CAAA;AAChC,QAAMC,oBAAoBC,WAAUf,OAAAA;AACpC,MAAIE,KAAKF,YAAYc,kBAAmBD,WAAU;IAACX;;OAC9C;AACH,UAAMc,eAAeC,WAAUjB,OAAAA;AAC/B,UAAMkB,YAAaF,iBAAiBG,SAAaA,SAAY,MAAMjB,KAAKkB,QAAQJ,cAAc;MAAEK,UAAU;IAAG,CAAA;AAE7G,QAAIH,UAAWL,WAAU;MAACK;;SACrB;AACH,YAAMI,SAAS,MAAMpB,KAAKkB,QAAQpB,SAAS;QAAEuB,WAAW;MAAO,CAAA;AAC/D,UAAID,QAAQ;AACV,cAAME,gBAAgBC,UAASH,QAAQtB,SAAS,MAAM,wCAAA;AACtDb,YAAIuC,SAAShB,aAAYiB,oBAAoB,IAAIH,aAAAA,EAAe;AAChE;MACF,OAAO;AACL,eAAOnC,YAAYqB,aAAYkB,WAAW,oBAAoB;UAAE5B;QAAQ,CAAA;MAC1E;IACF;EACF;AAEA,MAAIa,QAAQgB,SAAS,GAAG;AACtB,UAAMC,MAAMjB,QAAQ,CAAA;AACpB,UAAMkB,cAAcC,eAAeF,KAAK5C,KAAKkB,IAAIC,QAAAA;AACjD,QAAI;AACF,YAAM4B,cAAc,MAAMH,IAAII,MAAM9B,IAAIC,UAAU0B,WAAAA;AAClD5C,UAAIY,KAAKkC,WAAAA;IACX,SAASE,IAAI;AACX,aAAO9C,YAAYqB,aAAY0B,uBAAuB,gBAAgB;QAAE7C,SAAU4C,IAAc5C,WAAW;MAAgB,CAAA;IAC7H;EACF,OAAO;AACL,WAAOF,YAAYqB,aAAYkB,WAAW,oBAAoB;MAAE5B;IAAQ,CAAA;EAC1E;AACF,GAvD4G;AAyDrG,IAAMqC,cAAcC,cAAarD,QAAAA;;;AFtEjC,IAAMsD,gBAAgB,wBAACC,QAAAA;AAC5B,QAAMC,gBAAgBD,IAAIE;AAC1B,QAAMC,UAAUF,cAAcE;AAC9B,QAAMC,wBAAwB,IAAID,OAAAA;AAClCH,MAAIK,IAAI,KAAK,CAACC,MAAMC,QAAQA,IAAIC,SAASC,aAAYC,mBAAmBN,qBAAAA,CAAAA;AACxEJ,MAAIW,KAAK,KAAK,CAACL,MAAMC,QAAQA,IAAIC,SAASC,aAAYG,oBAAoBR,qBAAAA,CAAAA;AAC1EJ,MAAIK,IAAI,aAAaQ,UAAAA;AACrBb,MAAIW,KAAK,aAAaG,WAAAA;AACtBd,MAAIK,IAAI,UAAU,CAACC,MAAMC,QAAAA;AACvBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACAhB,MAAIW,KAAK,UAAU,CAACL,MAAMC,QAAAA;AACxBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACF,GAd6B;;;AIN7B,SAASC,4BAA4B;AACrC,SAASC,QAAQC,cAAc;AAC/B,SAASC,iBAAiB;AAC1B,SAC0BC,2BACnB;AAGP,SAASC,sBAAsB;AAE/B,SAASC,oBAAoB;AAE7B,OAAOC,aAAa;AAGpB,IAAMC,mBAAmB,8BAAOC,MAAoBC,8BAAAA;AAClD,QAAMC,MAAM,MAAMF,KAAKG,QAAQF,yBAAAA;AAC/B,SAAOG,oBAAoBF,KAAK;IAAEG,UAAU;EAAK,CAAA;AACnD,GAHyB;AAKzB,IAAIC;AAEJ,IAAMC,eAAe,8BAAOP,MAAoBC,8BAAAA;AAC9C,MAAIO,UAAUF,iBAAAA,EAAoB,QAAOA;AACzCA,sBAAoB,MAAMP,iBAAiBC,MAAMC,yBAAAA;AACjD,SAAOK;AACT,GAJqB;AAWd,IAAMG,sBAAsB,wBAACC,YAAAA;AAClC,QAAM,EAAEV,MAAMC,0BAAyB,IAAKS;AAC5C,QAAMC,SAASC,QAAQC,OAAO;IAAEC,aAAa;EAAK,CAAA;AAElDH,SAAOI,KAAK,WAAW,OAAOC,KAAKC,QAAAA;AACjCC,yBAAqBD,GAAAA;AACrB,UAAME,OAAOC,MAAMC,QAAQL,IAAIG,IAAI,IAAIH,IAAIG,OAAO;MAACH,IAAIG;;AACvD,UAAMG,YAAY,MAAMC,eAAeC,UAAmBL,IAAAA,GAAOM,IAAIC,CAAAA,MAAKA,EAAE,CAAA,CAAE;AAC9E,UAAMC,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUE,OAAOP,QAAAA;AACtCL,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,SAAS,OAAOhB,KAAoCC,QAAAA;AAC7DC,yBAAqBD,GAAAA;AACrB,UAAMgB,SAASC,OAAOlB,IAAImB,MAAMF,MAAM,IAAIG,OAAOpB,IAAImB,MAAMF,MAAM,IAAII;AACrE,UAAMC,QAAQ9B,UAAUQ,IAAImB,MAAMG,KAAK,IAAIC,OAAOvB,IAAImB,MAAMG,KAAK,IAAID;AACrE,UAAMG,OAAOhC,UAAUQ,IAAImB,MAAMK,IAAI,IAAIC,QAAQzB,IAAImB,MAAMK,IAAI,IAAIH;AACnE,UAAMK,QAAQ1B,IAAImB,MAAMO,UAAU,QAAQ,QAAQ;AAClD,UAAMhC,WAAuB;MAC3B4B;MAAOE;MAAME;MAAOT;IACtB;AACA,UAAMN,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUgB,KAAKjC,QAAAA;AACpCO,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AACAjB,SAAOI,KAAK,SAAS,OAAOC,KAA+CC,QAAAA;AACzEC,yBAAqBD,GAAAA;AACrB,UAAMP,WAAUM,IAAIG;AACpB,UAAMQ,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,OAAOpB,UAAUE,QAAAA,IAAWiB,UAAUgB,KAAKjC,QAAAA,IAAWiB,UAAUgB,KAAI;AACnF1B,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,cAAc,OAAOhB,KAAKC,QAAAA;AACnCC,yBAAqBD,GAAAA;AACrB,UAAM,EAAE2B,MAAMC,QAAO,IAAK7B,IAAI8B;AAC9B,UAAMF,OAAOR,OAAOS,OAAAA;AACpB,QAAIrC,UAAUoC,IAAAA,GAAO;AACnB,YAAMjB,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,YAAM,CAAC8C,OAAAA,IAAW,MAAMpB,UAAUK,IAAI;QAACY;OAAK;AAC5C,UAAII,aAAaD,OAAAA,GAAU;AACzB9B,YAAIc,KAAKgB,OAAAA;AACT;MACF;IACF;AACA9B,QAAIa,OAAO,GAAA,EAAKmB,KAAI;EACtB,CAAA;AAEA,SAAOtC;AACT,GAlDmC;;;AC7B5B,IAAMuC,oBAAoB,wBAACC,QAAAA;AAChC,QAAM,EAAEC,KAAI,IAAKD;AACjB,QAAME,4BAA4B;AAClCF,MAAIG,IAAI,UAAUC,oBAAoB;IAAEH;IAAMC;EAA0B,CAAA,CAAA;AAC1E,GAJiC;;;ACJjC,SAASG,wBAAAA,6BAA4B;AACrC,SAASC,qBAAqB;AAC9B,SACEC,eAAeC,uBACfC,qBACK;AAGA,IAAMC,eAAe,wBAACC,QAAAA;AAC3B,QAAM,EAAEC,KAAI,IAAKD;AACjB,QAAME,SAAS,IAAIC,cAAcF,IAAAA;AACjC,QAAMG,SAAS,IAAIC,cAAcJ,IAAAA;AACjC,QAAMK,WAAW,IAAIC,cAAc;IAAEL;IAAQE;EAAO,CAAA;AACpD,QAAMI,SAASC,sBAAsBH,QAAAA;AAErCN,MAAIU,KAAK,QAAQ,CAACC,KAAKC,QAAAA;AACrBC,IAAAA,sBAAqBD,GAAAA;AACrBJ,WAAOM,OAAOH,IAAII,MAAM,CAACC,GAAGC,gBAAAA;AAC1BL,UAAIM,KAAKD,WAAAA;IACX,CAAA;EACF,CAAA;AACF,GAb4B;;;ACFrB,IAAME,YAAY,wBAACC,QAAAA;AACxBC,eAAaD,GAAAA;AACbE,oBAAkBF,GAAAA;AAClBG,gBAAcH,GAAAA;AAChB,GAJyB;;;ATalB,IAAMI,SAAS,wBAACC,SAAAA;AACrBC,qBAAAA;AACA,QAAMC,MAAMC,SAAAA;AACZD,MAAIE,IAAI,QAAQ,KAAA;AAEhBF,MAAIG,IAAIC,KAAAA,CAAAA;AACRJ,MAAIG,IAAIE,YAAAA,CAAAA;AACRL,MAAIG,IAAIG,gBAAAA;AACRN,MAAIG,IAAII,kBAAkBC,yBAAyB;IAAEC,OAAO;EAAM,CAAA,CAAA,CAAA;AAClET,MAAIG,IAAIO,iBAAAA;AACRC,uCAAqCX,GAAAA;AACrCA,MAAIG,IAAIS,qBAAAA;AACRC,8BAA4Bb,GAAAA;AAC5BA,MAAIF,OAAOA;AACXgB,YAAUd,GAAAA;AACVA,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAjBsB;;;AUnBtB,SAASgB,YAAAA,iBAAgB;AAEzB,SAASC,aAAAA,YAAWC,gBAAgB;AACpC,SAASC,YAAY;AAGrB,SAASC,gBAAgB;;;ACNzB,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,aAAAA,YAAWC,oBAAoB;AAExC,SAASC,oBAAoD;AAC7D,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,uBAAuB;AAChC,SAASC,0BAA0B;AACnC,SAASC,qBAAqB;AAC9B,SACEC,yBAAyBC,sBAAsBC,iCAAiCC,6BAC3E;AAEP,SAASC,qBAAqB;AAC9B,SAASC,gBAAgBC,kCAAkC;AAC3D,SAASC,4BAA4B;AAGrC,SAASC,sBAAsB;AAE/B,SAASC,sBAAsB;;;ACpB/B,SAASC,YAAAA,iBAAgB;AACzB,SACEC,mBAAmBC,iBACd;AAEP,SAASC,cAAc;;;;;;;;AAUvB,SAASC,aAAiCC,KAAc;AACtD,QAAM,EAAEC,KAAK,GAAGC,KAAAA,IAASF;AACzB,SAAOE;AACT;AAHSH;AAMF,IAAMI,WAAN,cACGC,kBAAAA;SAAAA;;;EAER,IAAIC,MAAuB;AACzB,WAAOC,UAAS,KAAKC,OAAOF,KAAK,MAAM,kBAAA;EACzC;EAEA,MAAMG,QAAuB;AAC3B,UAAM,KAAKH,IAAII,WAAW,CAAC,CAAA;EAC7B;EAEA,MAAMC,OAAOC,IAAyB;AACpC,UAAMC,SAAS;MAAEX,KAAKU;IAAG;AACzB,UAAME,SAAS,MAAM,KAAKR,IAAIS,UAAUF,MAAAA;AACxC,WAAOC,OAAOE,eAAe;EAC/B;EAEA,MAAMC,IAAIL,IAA+B;AACvC,UAAMC,SAAS;MAAEX,KAAKU;IAAG;AACzB,UAAMX,MAAM,MAAM,KAAKK,IAAIY,QAAQL,MAAAA;AACnC,WAAOM,OAAOlB,GAAAA,IAAOmB,SAAYpB,aAAaC,GAAAA;EAChD;EAEA,MAAMoB,IAAIT,IAAyB;AACjC,UAAMC,SAAS;MAAEX,KAAKU;IAAG;AACzB,UAAMU,SAAS,MAAM,KAAKhB,IAAIY,QAAQL,MAAAA;AACtC,WAAOM,OAAOG,MAAAA,IAAU,QAAQ;EAClC;EAEA,MAAMC,IAAIX,IAAOY,MAAwB;AACvC,UAAMX,SAAS;MAAEX,KAAKU;IAAG;AACzB,UAAMa,QAAQ;MAAE,GAAGD;MAAMtB,KAAKU;IAAG;AACjC,UAAM,KAAKN,IAAIoB,WAAWb,QAAQY,OAAO;MAAEE,QAAQ;IAAK,CAAA;AACxD,WAAO;EACT;EAEA,MAAeC,eAA8B;AAC3C,UAAM,MAAMA,aAAAA;EAEd;AACF;;;;;;AD3BO,IAAMC,aAAa,8BAAOC,YAAAA;AAC/B,QAAM,EAAEC,QAAQC,OAAM,IAAKF;AAC3B,QAAM,EAAEG,aAAY,IAAKF,OAAOG,WAAWC,QAAQ,CAAC;AACpD,QAAM,EAAEC,eAAeC,cAAa,IAAK,MAAMC,cAAc;IAC3DC,YAAY;MACVC,aAAa;MACbC,gBAAgB;IAClB;IACAR;IACAS,eAAe;MACbC,UAAU;MACVC,MAAM;IACR;EACF,CAAA;AAEA,MAAIC,WAAUb,MAAAA,EAASc,gBAAeC,gBAAgBf;AACtD,QAAMgB,iBAAiBhB,SAAS,IAAIiB,2BAA2BjB,MAAAA,IAAUkB;AAEzE,QAAMC,UAAU,IAAIC,qBAAAA;AAEpB,MAAIC,aAAkE,oBAAIC,IAAAA;AAE1E,QAAMC,cAAcxB,OAAOyB,SAASC;AACpC,MAAIC,eAAeH,WAAAA,GAAc;AAE/B,UAAM,EACJI,kBAAkBC,oBAAoBC,UAAUC,QAAQC,QAAQC,UAAUC,UAAUC,YAAYC,UAAUC,WAAU,IAClHb;AACJ,UAAMc,mBAA8C;MAClDT;MAAoBI;MAAUF;MAAQI;MAAYE;IACpD;AACA,UAAME,SAAyC;MAC7CjC;MAAegC;MAAkBrB;MAAgBZ;IACnD;AAEAe,YAAQoB,SAASC,mBAAmBC,QAAQH,MAAAA,GAASpB,QAAW,IAAA;AAGhE,UAAMwB,MAAM,IAAIC,aAAmD;MAAE,GAAGN;MAAkBO,YAAY;IAAsB,CAAA;AAC5HvB,iBAAa,MAAMwB,SAASC,OAA6D;MAAEJ;IAAI,CAAA;EACjG;AAEA,QAAMK,oBAAoBC,gCAAgC3B,UAAAA;AAC1DF,UAAQoB,SAASU,wBAAwBR,QAAiC;IACxErC;IAAeC;IAAeW;IAAgB+B;EAChD,CAAA,CAAA;AAEA,QAAMG,UAAUrC,WAAUd,OAAOoD,MAAMC,EAAE,IACrCC,UAASC,WAAUvD,OAAOoD,MAAMC,EAAE,GAAG,MAAM,6BAAA,IAC3CG;AACJpC,UAAQoB,SAASiB,sBAAsBf,QAA+B;IACpErC;IACAC;IACAW;IACAkC;EACF,CAAA,CAAA;AACA/B,UAAQoB,SAASkB,gBAAgBhB,QAAQ;IACvCrC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACAG,UAAQoB,SAASmB,eAAejB,QAAQ;IACtCrC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACAG,UAAQoB,SAASoB,cAAclB,QAAQ;IACrCrC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACAG,UAAQoB,SAASqB,qBAAqBnB,QAAQ;IAC5CrC;IAAeC;IAAeW;EAChC,CAAA,CAAA;AACA,SAAOG;AACT,GArE0B;;;AEjC1B,SAAS0C,uBAAuB;;;ACDhC;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW,CAAC;AAAA,QACZ,QAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;ACTO,IAAMC,eAAeC;;;ACJrB,IAAMC,wBAAwB,CAAA;;;ACHrC;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW;AAAA,UACT;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,kBAAoB;AAAA,gBAClB,YAAc;AAAA,cAChB;AAAA,cACA,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,QAAU;AAAA,cACV,oBAAsB;AAAA,gBACpB;AAAA,kBACE,aAAe;AAAA,kBACf,cAAgB;AAAA,kBAChB,sBAAwB;AAAA,gBAC1B;AAAA,cACF;AAAA,cACA,aAAe;AAAA,cACf,cAAgB;AAAA,cAChB,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,aAAe;AAAA,gBACb;AAAA,kBACE,WAAa;AAAA,kBACb,gBAAkB;AAAA,kBAClB,QAAU;AAAA,kBACV,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,aAAe;AAAA,cACf,OAAS;AAAA,gBACP;AAAA,kBACE,KAAO;AAAA,kBACP,UAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,aAAe;AAAA,gBACb;AAAA,kBACE,WAAa;AAAA,kBACb,gBAAkB;AAAA,kBAClB,QAAU;AAAA,kBACV,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,aAAe;AAAA,cACf,OAAS;AAAA,gBACP;AAAA,kBACE,KAAO;AAAA,kBACP,UAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,kBAAoB;AAAA,gBAClB,YAAc;AAAA,cAChB;AAAA,cACA,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,gBAAkB;AAAA,gBAChB;AAAA,gBACA;AAAA,cACF;AAAA,cACA,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,iBAAmB;AAAA,cACnB,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,QAAU;AAAA,cACV,WAAa;AAAA,cACb,MAAQ;AAAA,cACR,oBAAsB;AAAA,gBACpB;AAAA,kBACE,aAAe;AAAA,kBACf,cAAgB;AAAA,kBAChB,sBAAwB;AAAA,gBAC1B;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;ACzIA;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW,CAAC;AAAA,QACZ,QAAU;AAAA,UACR;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,UAAY;AAAA,gBACV,SAAW;AAAA,gBACX,YAAc;AAAA,cAChB;AAAA,cACA,QAAU;AAAA,gBACR,6BAA6B;AAAA,cAC/B;AAAA,cACA,kBAAoB;AAAA,gBAClB,YAAc;AAAA,cAChB;AAAA,cACA,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;AC1BO,IAAMC,oBAAoBC;AAI1B,IAAMC,sBAAsBC;AAI5B,IAAMC,uBAAyC;KACjDJ,kBAAkBK;KAClBH,oBAAoBG;;;;ANGlB,IAAMC,UAAU,8BAAOC,YAAAA;AAC5B,QAAM,EAAEC,OAAM,IAAKD;AACnB,QAAME,UAAU,MAAMC,WAAWH,OAAAA;AACjC,QAAMI,UAAU,IAAIC,gBAAgBC,cAAcL,QAAQC,SAASK,sBAAsBC,qBAAAA;AACzF,QAAM,CAACC,MAAM,GAAGC,UAAAA,IAAc,MAAMN,QAAQO,UAAS;AACrD,MAAID,YAAYE,SAAS,GAAG;AAC1B,UAAMC,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKQ,SAASD,SAAAA,CAAAA,CAAAA;AAC5D,UAAMH,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKS,OAAOF,UAAUG,SAAS,IAAA,CAAA,CAAA;EAC/E;AACA,SAAOV;AACT,GAVuB;;;AHTvB,IAAMW,WAAW;AAIjB,IAAMC,gBAAgB,8BAAOC,MAA6BC,QAAgBC,WAAAA;AACxE,QAAMC,mBAAmB,MAAMH,KAAKI,gBAAgBC,IAAI,IAAA;AACxDH,UAAQI,MAAM,0BAA0BH,gBAAAA,EAAkB;AAC1D,QAAM,EAAEI,SAAQ,IAAKN,OAAOO;AAC5B,MAAIC,SAASN,gBAAAA,KAAqBM,SAASF,QAAAA,GAAW;AACpDL,YAAQQ,KAAK,sFAAA;AACb,UAAMV,KAAKI,gBAAgBO,IAAI,MAAMJ,QAAAA;EACvC,OAAO;AACL,QAAIK;AACJ,QAAIH,SAASF,QAAAA,GAAW;AACtBK,mBAAaL;IACf,OAAO;AACLK,mBAAaC,SAASC,iBAAgB;AACtCZ,cAAQa,IAAI,gGAAA;AACZb,cAAQa,IAAI,mBAAmBH,UAAAA,EAAY;IAC7C;AACA,UAAMZ,KAAKI,gBAAgBO,IAAI,MAAMC,UAAAA;EACvC;AACA,SAAOI,UAAS,MAAMhB,KAAKI,gBAAgBC,IAAI,IAAA,GAAO,MAAM,sCAAA;AAC9D,GAnBsB;AA2Bf,IAAMY,YAAY,8BAAOC,YAAAA;AAC9B,QAAM,EACJjB,QAAQC,QAAQiB,KAAI,IAClBD;AACJ,QAAM,EAAEX,UAAUa,KAAI,IAAKF,QAAQjB,OAAOO;AAC1C,QAAMR,OAAO,MAAMqB,KAAAA;AACnB,QAAMT,aAAaU,WAAUf,QAAAA,IAAYA,WAAW,MAAMR,cAAcC,MAAMC,QAAQC,MAAAA;AACtF,QAAMqB,SAAS,MAAMV,SAASW,WAAWZ,UAAAA;AACzC,QAAMa,cAAc;IAClBF;IAAQrB;IAAQD;EAClB;AACA,QAAMyB,MAAMC,OAAOR,QAAQ,MAAMS,QAAQH,WAAAA,CAAAA;AACzC,QAAMI,SAASH,IAAII,OAAOV,MAAMtB,UAAU,MAAMI,QAAQa,IAAI,oCAAoCjB,QAAAA,IAAYsB,IAAAA,EAAM,CAAA;AAClHS,SAAOE,WAAW,GAAA;AAClB,SAAOF;AACT,GAfyB;","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","assertEx","asyncHandler","asAddress","toAddress","isModuleIdentifierPart","StatusCodes","handler","req","res","next","address","rawAddress","params","node","app","asAddress","undefined","mod","resolve","direction","json","state","isModuleIdentifierPart","moduleIdentifier","toAddress","moduleAddress","assertEx","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","assertEx","asyncHandler","asAddress","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isHash","query","asHash","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","NodeXyoViewer","NodeXyoRunner","rpcEngineFromProvider","XyoConnection","addRpcRoutes","app","node","runner","NodeXyoRunner","viewer","NodeXyoViewer","provider","XyoConnection","engine","rpcEngineFromProvider","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","assertEx","asAddress","ZERO_ADDRESS","BaseMongoSdk","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","AddressBalanceDivinerV2","ArchivistSyncDiviner","balanceSummaryRepositoryFromMap","HeadValidationDiviner","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","hasMongoConfig","assertEx","AbstractCreatable","creatable","isNull","stripMongoId","doc","_id","rest","MongoMap","AbstractCreatable","sdk","assertEx","params","clear","deleteMany","delete","id","filter","result","deleteOne","deletedCount","get","findOne","isNull","undefined","has","exists","set","data","value","replaceOne","upsert","startHandler","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","summaryMap","Map","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","sdk","BaseMongoSdk","collection","MongoMap","create","summaryRepository","balanceSummaryRepositoryFromMap","AddressBalanceDivinerV2","chainId","chain","id","assertEx","asAddress","ZERO_ADDRESS","HeadValidationDiviner","MemoryArchivist","MemorySentinel","ViewArchivist","ArchivistSyncDiviner","ManifestWrapper","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","node","port","boot","isDefined","wallet","fromPhrase","nodeContext","app","getApp","getNode","server","listen","setTimeout"]}
@@ -1 +1 @@
1
- {"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC,eAAO,MAAM,SAAS,GAAI,KAAK,OAAO,SAGrC,CAAA"}
1
+ {"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GAAI,KAAK,OAAO,SAIrC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Express } from 'express';
2
+ export declare const addDataLakeRoutes: (app: Express) => void;
3
+ //# sourceMappingURL=addDataLakeRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDataLakeRoutes.d.ts","sourceRoot":"","sources":["../../../../../src/server/routes/dataLake/addDataLakeRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,eAAO,MAAM,iBAAiB,GAAI,KAAK,OAAO,SAI7C,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { ModuleIdentifier } from '@xyo-network/module-model';
2
+ import type { NodeInstance } from '@xyo-network/node-model';
3
+ import type { Router } from 'express';
4
+ type ArchivistMiddlewareOptions = {
5
+ archivistModuleIdentifier: ModuleIdentifier;
6
+ node: NodeInstance;
7
+ };
8
+ export declare const archivistMiddleware: (options: ArchivistMiddlewareOptions) => Router;
9
+ export {};
10
+ //# sourceMappingURL=archivistMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archivistMiddleware.d.ts","sourceRoot":"","sources":["../../../../../src/server/routes/dataLake/archivistMiddleware.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAI3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAiBrC,KAAK,0BAA0B,GAAG;IAChC,yBAAyB,EAAE,gBAAgB,CAAA;IAC3C,IAAI,EAAE,YAAY,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS,0BAA0B,KAAG,MAkDzE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './addDataLakeRoutes.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/server/routes/dataLake/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.7.11",
3
+ "version": "1.7.13",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -49,58 +49,61 @@
49
49
  "@opentelemetry/instrumentation": "^0.203.0",
50
50
  "@opentelemetry/instrumentation-express": "^0.52.0",
51
51
  "@opentelemetry/instrumentation-http": "^0.203.0",
52
- "@xylabs/assert": "^4.13.21",
53
- "@xylabs/creatable": "^4.13.21",
54
- "@xylabs/express": "^4.13.21",
55
- "@xylabs/hex": "^4.13.21",
56
- "@xylabs/logger": "^4.13.21",
57
- "@xylabs/mongo": "^4.13.21",
58
- "@xylabs/typeof": "^4.13.21",
59
- "@xyo-network/archivist-memory": "^4.1.6",
60
- "@xyo-network/archivist-mongodb": "^4.1.6",
61
- "@xyo-network/archivist-view": "^4.1.6",
52
+ "@xylabs/assert": "^4.13.23",
53
+ "@xylabs/creatable": "^4.13.23",
54
+ "@xylabs/express": "^4.13.23",
55
+ "@xylabs/hex": "^4.13.23",
56
+ "@xylabs/logger": "^4.13.23",
57
+ "@xylabs/mongo": "^4.13.23",
58
+ "@xylabs/typeof": "^4.13.23",
59
+ "@xyo-network/archivist-memory": "^4.1.7",
60
+ "@xyo-network/archivist-model": "^4.1.7",
61
+ "@xyo-network/archivist-mongodb": "^4.1.7",
62
+ "@xyo-network/archivist-view": "^4.1.7",
62
63
  "@xyo-network/bios": "^6.0.5",
63
- "@xyo-network/boundwitness-model": "^4.1.6",
64
- "@xyo-network/chain-modules": "^1.7.11",
65
- "@xyo-network/chain-protocol": "^1.7.11",
66
- "@xyo-network/chain-rpc": "^1.7.11",
67
- "@xyo-network/chain-telemetry": "^1.7.11",
68
- "@xyo-network/manifest-model": "^4.1.6",
69
- "@xyo-network/manifest-wrapper": "^4.1.6",
70
- "@xyo-network/module-abstract": "^4.1.6",
71
- "@xyo-network/module-factory-locator": "^4.1.6",
72
- "@xyo-network/module-model": "^4.1.6",
73
- "@xyo-network/node-model": "^4.1.6",
74
- "@xyo-network/payload-model": "^4.1.6",
75
- "@xyo-network/sentinel-memory": "^4.1.6",
76
- "@xyo-network/wallet": "^4.1.6",
77
- "@xyo-network/wallet-model": "^4.1.6",
78
- "@xyo-network/xl1-protocol-sdk": "^1.7.11",
79
- "@xyo-network/xl1-rpc": "^1.7.11",
64
+ "@xyo-network/boundwitness-model": "^4.1.7",
65
+ "@xyo-network/chain-modules": "^1.7.13",
66
+ "@xyo-network/chain-protocol": "^1.7.13",
67
+ "@xyo-network/chain-rpc": "^1.7.13",
68
+ "@xyo-network/chain-telemetry": "^1.7.13",
69
+ "@xyo-network/manifest-model": "^4.1.7",
70
+ "@xyo-network/manifest-wrapper": "^4.1.7",
71
+ "@xyo-network/module-abstract": "^4.1.7",
72
+ "@xyo-network/module-factory-locator": "^4.1.7",
73
+ "@xyo-network/module-model": "^4.1.7",
74
+ "@xyo-network/node-model": "^4.1.7",
75
+ "@xyo-network/payload-builder": "^4.1.7",
76
+ "@xyo-network/payload-model": "^4.1.7",
77
+ "@xyo-network/sentinel-memory": "^4.1.7",
78
+ "@xyo-network/wallet": "^4.1.7",
79
+ "@xyo-network/wallet-model": "^4.1.7",
80
+ "@xyo-network/xl1-protocol-sdk": "^1.7.13",
81
+ "@xyo-network/xl1-rpc": "^1.7.13",
80
82
  "compression": "^1.8.1",
81
83
  "cors": "^2.8.5",
82
84
  "express": "^5.1.0",
83
85
  "http-status-codes": "^2.3.0",
84
- "mongodb": "^6.17.0"
86
+ "mongodb": "^6.18.0"
85
87
  },
86
88
  "devDependencies": {
87
89
  "@types/compression": "^1.8.1",
88
90
  "@types/cors": "^2.8.19",
89
91
  "@types/express": "5.0.3",
90
- "@types/node": "^24.0.15",
91
- "@xylabs/base": "^4.13.21",
92
- "@xylabs/object": "^4.13.21",
93
- "@xylabs/ts-scripts-yarn3": "^7.0.0",
94
- "@xylabs/tsconfig": "^7.0.0",
95
- "@xyo-network/account": "^4.1.6",
96
- "@xyo-network/account-model": "^4.1.6",
97
- "@xyo-network/archivist-abstract": "^4.1.6",
92
+ "@types/express-serve-static-core": "^5.0.7",
93
+ "@types/node": "^24.1.0",
94
+ "@xylabs/base": "^4.13.23",
95
+ "@xylabs/object": "^4.13.23",
96
+ "@xylabs/ts-scripts-yarn3": "^7.0.1",
97
+ "@xylabs/tsconfig": "^7.0.1",
98
+ "@xyo-network/account": "^4.1.7",
99
+ "@xyo-network/account-model": "^4.1.7",
100
+ "@xyo-network/archivist-abstract": "^4.1.7",
98
101
  "@xyo-network/bios-model": "^6.0.5",
99
- "@xyo-network/boundwitness-builder": "^4.1.6",
100
- "@xyo-network/module-abstract-mongodb": "^4.1.6",
101
- "@xyo-network/module-model-mongodb": "^4.1.6",
102
- "@xyo-network/node-memory": "^4.1.6",
103
- "@xyo-network/xl1-protocol-sdk": "^1.7.11",
102
+ "@xyo-network/boundwitness-builder": "^4.1.7",
103
+ "@xyo-network/module-abstract-mongodb": "^4.1.7",
104
+ "@xyo-network/module-model-mongodb": "^4.1.7",
105
+ "@xyo-network/node-memory": "^4.1.7",
106
+ "@xyo-network/xl1-protocol-sdk": "^1.7.13",
104
107
  "dotenv": "^17.2.0",
105
108
  "knip": "^5.62.0",
106
109
  "nodemon": "^3.1.10",
@@ -1,9 +1,11 @@
1
1
  import type { Express } from 'express'
2
2
 
3
3
  import { addNodeRoutes } from './address/index.ts'
4
+ import { addDataLakeRoutes } from './dataLake/index.ts'
4
5
  import { addRpcRoutes } from './rpc/index.ts'
5
6
 
6
7
  export const addRoutes = (app: Express) => {
7
8
  addRpcRoutes(app)
9
+ addDataLakeRoutes(app)
8
10
  addNodeRoutes(app)
9
11
  }
@@ -0,0 +1,9 @@
1
+ import type { Express } from 'express'
2
+
3
+ import { archivistMiddleware } from './archivistMiddleware.ts'
4
+
5
+ export const addDataLakeRoutes = (app: Express) => {
6
+ const { node } = app
7
+ const archivistModuleIdentifier = 'Chain:Finalized'
8
+ app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))
9
+ }
@@ -0,0 +1,84 @@
1
+ import { setRawResponseFormat } from '@xylabs/express'
2
+ import { asHash, isHash } from '@xylabs/hex'
3
+ import { isDefined } from '@xylabs/typeof'
4
+ import {
5
+ type ArchivistInstance, asArchivistInstance, type NextOptions,
6
+ } from '@xyo-network/archivist-model'
7
+ import type { ModuleIdentifier } from '@xyo-network/module-model'
8
+ import type { NodeInstance } from '@xyo-network/node-model'
9
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
10
+ import type { Payload } from '@xyo-network/payload-model'
11
+ import { isAnyPayload } from '@xyo-network/payload-model'
12
+ import type { Router } from 'express'
13
+ import express from 'express'
14
+ import type { Request } from 'express-serve-static-core'
15
+
16
+ const resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {
17
+ const mod = await node.resolve(archivistModuleIdentifier)
18
+ return asArchivistInstance(mod, { required: true })
19
+ }
20
+
21
+ let archivistInstance: ArchivistInstance | undefined
22
+
23
+ const getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {
24
+ if (isDefined(archivistInstance)) return archivistInstance
25
+ archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)
26
+ return archivistInstance
27
+ }
28
+
29
+ type ArchivistMiddlewareOptions = {
30
+ archivistModuleIdentifier: ModuleIdentifier
31
+ node: NodeInstance
32
+ }
33
+
34
+ export const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {
35
+ const { node, archivistModuleIdentifier } = options
36
+ const router = express.Router({ mergeParams: true })
37
+
38
+ router.post('/insert', async (req, res) => {
39
+ setRawResponseFormat(res)
40
+ const body = Array.isArray(req.body) ? req.body : [req.body]
41
+ const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])
42
+ const archivist = await getArchivist(node, archivistModuleIdentifier)
43
+ const result = await archivist.insert(payloads)
44
+ res.status(200).json(result)
45
+ })
46
+
47
+ router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {
48
+ setRawResponseFormat(res)
49
+ const cursor = isHash(req.query.cursor) ? asHash(req.query.cursor) : undefined
50
+ const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined
51
+ const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined
52
+ const order = req.query.order === 'asc' ? 'asc' : 'desc'
53
+ const options: NextOptions = {
54
+ limit, open, order, cursor,
55
+ }
56
+ const archivist = await getArchivist(node, archivistModuleIdentifier)
57
+ const result = await archivist.next(options)
58
+ res.status(200).json(result)
59
+ })
60
+ router.post('/next', async (req: Request<{}, {}, NextOptions | undefined>, res) => {
61
+ setRawResponseFormat(res)
62
+ const options = req.body
63
+ const archivist = await getArchivist(node, archivistModuleIdentifier)
64
+ const result = await (isDefined(options) ? archivist.next(options) : archivist.next())
65
+ res.status(200).json(result)
66
+ })
67
+
68
+ router.get('/get/:hash', async (req, res) => {
69
+ setRawResponseFormat(res)
70
+ const { hash: rawHash } = req.params
71
+ const hash = asHash(rawHash)
72
+ if (isDefined(hash)) {
73
+ const archivist = await getArchivist(node, archivistModuleIdentifier)
74
+ const [payload] = await archivist.get([hash])
75
+ if (isAnyPayload(payload)) {
76
+ res.json(payload)
77
+ return
78
+ }
79
+ }
80
+ res.status(400).send()
81
+ })
82
+
83
+ return router
84
+ }
@@ -0,0 +1 @@
1
+ export * from './addDataLakeRoutes.ts'