@xyo-network/chain-api 1.17.0 → 1.17.2

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.
@@ -1,2 +1,3 @@
1
+ export * from './model.ts';
1
2
  export * from './server/index.ts';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
@@ -259,10 +259,11 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
259
259
  import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
260
260
  import { assertEx as assertEx2 } from "@xylabs/sdk-js";
261
261
  import { asArchivistInstance as asArchivistInstance2 } from "@xyo-network/archivist-model";
262
+ import { initPendingBlockArchivist, initPendingTransactionArchivist } from "@xyo-network/chain-orchestration";
262
263
  import { NodeXyoViewer } from "@xyo-network/chain-rpc";
263
264
  import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
264
265
  import { StepSizes } from "@xyo-network/xl1-protocol";
265
- import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer } from "@xyo-network/xl1-protocol-sdk";
266
+ import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
266
267
  import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
267
268
  import { Semaphore } from "async-mutex";
268
269
  async function chainArchivistFromNode(node) {
@@ -272,9 +273,8 @@ async function chainArchivistFromNode(node) {
272
273
  return chainArchivist;
273
274
  }
274
275
  __name(chainArchivistFromNode, "chainArchivistFromNode");
275
- var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
276
+ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
276
277
  const { node } = app;
277
- const runner = new NodeXyoRunner(node);
278
278
  const finalizedArchivist = await chainArchivistFromNode(node);
279
279
  const balancesStepSummaryContext = {
280
280
  head: stakedChainContext.head,
@@ -293,6 +293,8 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
293
293
  const networkStakeViewer = await SimpleNetworkStakeViewer.create({
294
294
  context: stakedChainContext
295
295
  });
296
+ const pendingBlocksArchivist = await initPendingBlockArchivist(context);
297
+ const pendingTransactionsArchivist = await initPendingTransactionArchivist(context);
296
298
  console.log("Initializing SimpleNetworkStakeViewer...");
297
299
  assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
298
300
  console.log("Initialized SimpleNetworkStakeViewer.");
@@ -328,6 +330,13 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
328
330
  console.log("Initializing SimpleStepViewer...");
329
331
  assertEx2(await stepViewer.start(), () => "Failed to start SimpleStepViewer");
330
332
  console.log("Initialized SimpleStepViewer.");
333
+ const mempoolViewer = await SimpleMempoolViewer.create({
334
+ pendingBlocksArchivist,
335
+ pendingTransactionsArchivist
336
+ });
337
+ console.log("Initializing SimpleMempoolViewer...");
338
+ assertEx2(await mempoolViewer.start(), () => "Failed to start SimpleMempoolViewer");
339
+ console.log("Initialized SimpleMempoolViewer.");
331
340
  const viewer = await NodeXyoViewer.create({
332
341
  node,
333
342
  rewardMultipliers: RewardMultipliers,
@@ -337,11 +346,18 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
337
346
  networkStakeViewer,
338
347
  accountBalanceViewer,
339
348
  stepViewer,
340
- transfersSummaryContext
349
+ transfersSummaryContext,
350
+ mempoolViewer
341
351
  });
342
352
  console.log("Initializing NodeXyoViewer...");
343
353
  assertEx2(await viewer.start(), () => "Failed to start NodeXyoViewer");
344
354
  console.log("Initialized NodeXyoViewer.");
355
+ const runner = await NodeXyoRunner.create({
356
+ node
357
+ });
358
+ console.log("Initializing NodeXyoRunner...");
359
+ assertEx2(await runner.start(), () => "Failed to start NodeXyoRunner");
360
+ console.log("Initialized NodeXyoRunner.");
345
361
  const connection = new XyoBaseConnection({
346
362
  runner,
347
363
  viewer
@@ -356,14 +372,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
356
372
  }, "addRpcRoutes");
357
373
 
358
374
  // src/server/routes/addRoutes.ts
359
- var addRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
360
- await addRpcRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
375
+ var addRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
376
+ await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
361
377
  addDataLakeRoutes(app);
362
378
  addNodeRoutes(app);
363
379
  }, "addRoutes");
364
380
 
365
381
  // src/server/app.ts
366
- var getApp = /* @__PURE__ */ __name(async (node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
382
+ var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
367
383
  addInstrumentation();
368
384
  const app = express2();
369
385
  app.set("etag", false);
@@ -378,51 +394,23 @@ var getApp = /* @__PURE__ */ __name(async (node, transfersSummaryMap, balancesSu
378
394
  app.use(customPoweredByHeader);
379
395
  disableCaseSensitiveRouting(app);
380
396
  app.node = node;
381
- await addRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
397
+ await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
382
398
  app.use(standardErrors);
383
399
  return app;
384
400
  }, "getApp");
385
401
 
386
402
  // src/server/server.ts
387
403
  import { assertEx as assertEx3 } from "@xylabs/sdk-js";
388
- import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initChainStakeViewer, initProducerAccount, initServerNode, initServerWallet, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
404
+ import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
389
405
  import { createGenesisBlock } from "@xyo-network/chain-protocol";
390
406
  import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
391
407
  import { findMostRecentBlock, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
392
408
  var hostname = "::";
393
- async function getServer(context) {
394
- const { config, logger, node: providedNode } = context;
395
- const { port } = context.config.api;
396
- const wallet = await initServerWallet({
397
- config,
398
- logger
399
- });
400
- const stakeChainViewer = await initChainStakeViewer(config, logger);
401
- const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
402
- config,
403
- logger
404
- }), () => "Balance Summary Map not initialized");
405
- const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
406
- config,
407
- logger
408
- }), () => "Transfer Summary Map not initialized");
409
- const { node, chainArchivist } = await initServerNode({
410
- config,
411
- logger,
412
- wallet,
413
- node: providedNode,
414
- transfersSummaryMap,
415
- balancesSummaryMap
416
- });
409
+ async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
417
410
  const chainMap = readPayloadMapFromStore(chainArchivist);
418
411
  const payloads = await chainArchivist.next();
419
412
  if (payloads.length === 0) {
420
413
  logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
421
- const producerAccount = await initProducerAccount({
422
- config,
423
- logger
424
- });
425
- const chainId = stakeChainViewer.chainId;
426
414
  const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
427
415
  const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
428
416
  await chainArchivist.insert([
@@ -440,9 +428,13 @@ async function getServer(context) {
440
428
  ]);
441
429
  console.log(`[API] Producer declared: ${producerAccount.address}`);
442
430
  }
443
- const stakedChainContext = {
444
- chainId: stakeChainViewer.chainId,
445
- stake: stakeChainViewer,
431
+ return chainMap;
432
+ }
433
+ __name(initChainMap, "initChainMap");
434
+ function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chainMap }) {
435
+ return {
436
+ chainId,
437
+ stake: stakeViewer,
446
438
  store: {
447
439
  chainMap
448
440
  },
@@ -454,11 +446,58 @@ async function getServer(context) {
454
446
  ];
455
447
  }, "head")
456
448
  };
449
+ }
450
+ __name(initStakedChainContextRead, "initStakedChainContextRead");
451
+ async function getServer(context) {
452
+ const { config, logger, node: providedNode } = context;
453
+ const { port } = context.config.api;
454
+ const wallet = await initServerWallet({
455
+ config,
456
+ logger
457
+ });
458
+ const stakeViewer = await initStakeViewer(config, logger);
459
+ const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
460
+ config,
461
+ logger
462
+ }), () => "Balance Summary Map not initialized");
463
+ const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
464
+ config,
465
+ logger
466
+ }), () => "Transfer Summary Map not initialized");
467
+ const { node, chainArchivist } = await initServerNode({
468
+ config,
469
+ logger,
470
+ wallet,
471
+ node: providedNode,
472
+ transfersSummaryMap,
473
+ balancesSummaryMap
474
+ });
475
+ const chainId = stakeViewer.chainId;
476
+ const producerAccount = await initProducerAccount({
477
+ config,
478
+ logger
479
+ });
480
+ const chainMap = await initChainMap({
481
+ ...context,
482
+ chainArchivist,
483
+ chainId,
484
+ producerAccount
485
+ });
486
+ const stakedChainContext = initStakedChainContextRead({
487
+ ...context,
488
+ chainArchivist,
489
+ chainId,
490
+ chainMap,
491
+ stakeViewer
492
+ });
457
493
  const mods = await node.resolve("*");
458
494
  await Promise.all(mods.map((mod) => {
459
495
  return mod.start?.() ?? (() => true);
460
496
  }));
461
- const app = await getApp(node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache);
497
+ const app = await getApp(node, {
498
+ config,
499
+ logger
500
+ }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache);
462
501
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
463
502
  server.setTimeout(2e4);
464
503
  return server;
@@ -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/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"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\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 = async (\n node: NodeInstance,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n): Promise<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 await addRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\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 { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } 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: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\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 (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\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, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } 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, isSequence } 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 = isSequence(req.query.cursor) ? 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: ArchivistNextOptions = {\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<{}, {}, ArchivistNextOptions | 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 { assertEx } from '@xylabs/sdk-js'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalancesStepSummary,\n BalanceStepSummaryContext,\n MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\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 { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport 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 = async (\n app: Express,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initChainStakeViewer, initProducerAccount,\n initServerNode,\n initServerWallet,\n initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'\nimport { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeChainViewer = await initChainStakeViewer(config, logger)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const producerAccount = await initProducerAccount({ config, logger })\n const chainId = stakeChainViewer.chainId\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n const stakedChainContext: StakedChainContextRead = {\n chainId: stakeChainViewer.chainId,\n stake: stakeChainViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n }\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n // const chainIterator = await initChainIterator({\n // config,\n // logger,\n // chainMap,\n // head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),\n // })\n\n // const blockViewer = chainIterator\n\n // const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n // context: {\n // chainId: stakedChainContext.chainId,\n // store: stakedChainContext.store,\n // head: stakedChainContext.head,\n // stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n // summaryMap: balanceSummaryMap,\n // },\n // transferContext: {\n // chainId: stakedChainContext.chainId,\n // store: stakedChainContext.store,\n // head: stakedChainContext.head,\n // stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n // summaryMap: transferSummaryMap,\n // },\n // blockViewer,\n // })\n\n // assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n\n const app = await getApp(node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)\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"],"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","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","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","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","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","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","runner","NodeXyoRunner","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","context","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","position","stepViewer","SimpleStepViewer","chainContext","viewer","NodeXyoViewer","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initChainStakeViewer","initProducerAccount","initServerNode","initServerWallet","initTransferSummaryMap","createGenesisBlock","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","readPayloadMapFromStore","hostname","getServer","context","config","logger","node","providedNode","port","api","wallet","initServerWallet","stakeChainViewer","initChainStakeViewer","balancesSummaryMap","assertEx","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","chainArchivist","initServerNode","chainMap","readPayloadMapFromStore","payloads","next","length","warn","producerAccount","initProducerAccount","chainId","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","stakedChainContext","stake","store","head","findMostRecentBlock","_hash","block","mods","resolve","Promise","all","map","mod","start","app","getApp","initRewardsCache","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"],"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 type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { AppContext } from '../model.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n): Promise<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 await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\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 { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } 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: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\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 (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\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, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } 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, isSequence } 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 = isSequence(req.query.cursor) ? 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: ArchivistNextOptions = {\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<{}, {}, ArchivistNextOptions | 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 { assertEx } from '@xylabs/sdk-js'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalancesStepSummary,\n BalanceStepSummaryContext,\n MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../../../model.ts'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n const pendingBlocksArchivist = await initPendingBlockArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })\n\n console.log('Initializing SimpleMempoolViewer...')\n assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')\n console.log('Initialized SimpleMempoolViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n mempoolViewer,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const runner = await NodeXyoRunner.create({ node })\n\n console.log('Initializing NodeXyoRunner...')\n assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')\n console.log('Initialized NodeXyoRunner.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\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 { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../model.ts'\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ConfigContext } from '@xyo-network/chain-orchestration'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type {\n Config, PayloadMapRead, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nasync function initChainMap({\n chainArchivist, chainId, logger, config, producerAccount,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n producerAccount: AccountInstance\n}>) {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n return chainMap\n}\n\nfunction initStakedChainContextRead({\n chainArchivist, chainId, stakeViewer, chainMap,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n chainMap: PayloadMapRead<WithStorageMeta<Payload>>\n stakeViewer: StakeViewer\n}>) {\n return {\n chainId,\n stake: stakeViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n } satisfies StakedChainContextRead\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeViewer = await initStakeViewer(config, logger)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const producerAccount = await initProducerAccount({ config, logger })\n const chainMap = await initChainMap({\n ...context, chainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,\n })\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)\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"],"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","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","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","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","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","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","initPendingBlockArchivist","initPendingTransactionArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlockArchivist","pendingTransactionsArchivist","initPendingTransactionArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initTransferSummaryMap","createGenesisBlock","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","readPayloadMapFromStore","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","initServerNode","initProducerAccount","stakedChainContext","mods","resolve","Promise","all","map","mod","start","app","getApp","initRewardsCache","server","listen","setTimeout"]}
@@ -0,0 +1,5 @@
1
+ import type { BaseContext, Config } from '@xyo-network/xl1-protocol-sdk';
2
+ export interface AppContext extends BaseContext {
3
+ config: Config;
4
+ }
5
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAExE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf"}
@@ -2,5 +2,6 @@ import type { NodeInstance } from '@xyo-network/node-model';
2
2
  import type { WithStorageMeta } from '@xyo-network/payload-model';
3
3
  import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
4
4
  import type { Express } from 'express';
5
- export declare const getApp: (node: NodeInstance, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<Express>;
5
+ import type { AppContext } from '../model.ts';
6
+ export declare const getApp: (node: NodeInstance, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<Express>;
6
7
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAEV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { WithStorageMeta } from '@xyo-network/payload-model';
2
2
  import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
3
3
  import type { Express } from 'express';
4
- export declare const addRoutes: (app: Express, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
4
+ import type { AppContext } from '../../model.ts';
5
+ export declare const addRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
5
6
  //# sourceMappingURL=addRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
1
+ {"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKhD,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { WithStorageMeta } from '@xyo-network/payload-model';
2
2
  import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
3
3
  import type { Express } from 'express';
4
- export declare const addRpcRoutes: (app: Express, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
4
+ import type { AppContext } from '../../../../model.ts';
5
+ export declare const addRpcRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
5
6
  //# sourceMappingURL=addRpcRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,mBAAmB,EAEnB,OAAO,EAAiC,sBAAsB,EAAE,oBAAoB,EAErF,MAAM,+BAA+B,CAAA;AAQtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAWtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAsF3B,CAAA"}
1
+ {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,mBAAmB,EAEnB,OAAO,EAAiC,sBAAsB,EAAE,oBAAoB,EAErF,MAAM,+BAA+B,CAAA;AAStC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAWtD,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAoG3B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAWlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D,OAAO,KAAK,EAAE,MAAM,EAA0B,MAAM,+BAA+B,CAAA;AAQnF,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GAoFxD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAclD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAM3D,OAAO,KAAK,EACV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAQtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA8CD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GAwCxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.17.0",
3
+ "version": "1.17.2",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -52,54 +52,54 @@
52
52
  "@opentelemetry/instrumentation": "~0.208.0",
53
53
  "@opentelemetry/instrumentation-express": "~0.57.0",
54
54
  "@opentelemetry/instrumentation-http": "~0.208.0",
55
- "@xylabs/express": "~5.0.46",
56
- "@xylabs/sdk-js": "~5.0.46",
57
- "@xyo-network/archivist-model": "~5.2.10",
58
- "@xyo-network/boundwitness-model": "~5.2.10",
59
- "@xyo-network/chain-orchestration": "~1.17.0",
60
- "@xyo-network/chain-protocol": "~1.17.0",
61
- "@xyo-network/chain-rpc": "~1.17.0",
62
- "@xyo-network/chain-viewers": "~1.17.0",
63
- "@xyo-network/module-abstract": "~5.2.10",
64
- "@xyo-network/module-model": "~5.2.10",
65
- "@xyo-network/node-model": "~5.2.10",
66
- "@xyo-network/payload-builder": "~5.2.10",
67
- "@xyo-network/payload-model": "~5.2.10",
68
- "@xyo-network/xl1-protocol": "~1.14.15",
69
- "@xyo-network/xl1-protocol-sdk": "~1.17.0",
70
- "@xyo-network/xl1-rpc": "~1.17.0",
55
+ "@xylabs/express": "~5.0.50",
56
+ "@xylabs/sdk-js": "~5.0.50",
57
+ "@xyo-network/archivist-model": "~5.2.17",
58
+ "@xyo-network/boundwitness-model": "~5.2.17",
59
+ "@xyo-network/chain-orchestration": "~1.17.2",
60
+ "@xyo-network/chain-protocol": "~1.17.2",
61
+ "@xyo-network/chain-rpc": "~1.17.2",
62
+ "@xyo-network/chain-viewers": "~1.17.2",
63
+ "@xyo-network/module-abstract": "~5.2.17",
64
+ "@xyo-network/module-model": "~5.2.17",
65
+ "@xyo-network/node-model": "~5.2.17",
66
+ "@xyo-network/payload-builder": "~5.2.17",
67
+ "@xyo-network/payload-model": "~5.2.17",
68
+ "@xyo-network/xl1-protocol": "~1.14.16",
69
+ "@xyo-network/xl1-protocol-sdk": "~1.17.2",
70
+ "@xyo-network/xl1-rpc": "~1.17.2",
71
71
  "async-mutex": "~0.5.0",
72
72
  "compression": "~1.8.1",
73
73
  "cors": "~2.8.5",
74
- "ethers": "~6.15.0",
75
- "express": "~5.1.0",
74
+ "ethers": "^6.16.0",
75
+ "express": "~5.2.1",
76
76
  "http-status-codes": "~2.3.0"
77
77
  },
78
78
  "devDependencies": {
79
79
  "@types/compression": "~1.8.1",
80
80
  "@types/cors": "~2.8.19",
81
- "@types/express": "5.0.5",
81
+ "@types/express": "5.0.6",
82
82
  "@types/express-serve-static-core": "~5.1.0",
83
83
  "@types/node": "~24.10.1",
84
- "@xylabs/sdk-js": "~5.0.46",
84
+ "@xylabs/sdk-js": "~5.0.50",
85
85
  "@xylabs/ts-scripts-yarn3": "~7.2.8",
86
86
  "@xylabs/tsconfig": "~7.2.8",
87
- "@xyo-network/account": "~5.2.10",
88
- "@xyo-network/account-model": "~5.2.10",
89
- "@xyo-network/archivist-abstract": "~5.2.10",
87
+ "@xyo-network/account": "~5.2.17",
88
+ "@xyo-network/account-model": "~5.2.17",
89
+ "@xyo-network/archivist-abstract": "~5.2.17",
90
90
  "@xyo-network/bios-model": "~7.2.0",
91
- "@xyo-network/boundwitness-builder": "~5.2.10",
92
- "@xyo-network/chain-services": "~1.17.0",
93
- "@xyo-network/module-abstract-mongodb": "~5.2.10",
94
- "@xyo-network/module-model-mongodb": "~5.2.10",
95
- "@xyo-network/node-memory": "~5.2.10",
96
- "@xyo-network/xl1-protocol": "~1.14.15",
91
+ "@xyo-network/boundwitness-builder": "~5.2.17",
92
+ "@xyo-network/chain-services": "~1.17.2",
93
+ "@xyo-network/module-abstract-mongodb": "~5.2.17",
94
+ "@xyo-network/module-model-mongodb": "~5.2.17",
95
+ "@xyo-network/node-memory": "~5.2.17",
96
+ "@xyo-network/xl1-protocol": "~1.14.16",
97
97
  "dotenv": "~17.2.3",
98
98
  "eslint": "^9.39.1",
99
99
  "nodemon": "~3.1.11",
100
100
  "tslib": "~2.8.1",
101
101
  "typescript": "~5.9.3",
102
- "vitest": "~4.0.14",
102
+ "vitest": "~4.0.15",
103
103
  "vitest-mock-extended": "~3.1.0"
104
104
  },
105
105
  "engines": {
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
+ export * from './model.ts'
1
2
  export * from './server/index.ts'
package/src/model.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { BaseContext, Config } from '@xyo-network/xl1-protocol-sdk'
2
+
3
+ export interface AppContext extends BaseContext {
4
+ config: Config
5
+ }
package/src/server/app.ts CHANGED
@@ -8,11 +8,9 @@ import {
8
8
  standardErrors,
9
9
  standardResponses,
10
10
  } from '@xylabs/express'
11
- import type { ReadArchivist } from '@xyo-network/archivist-model'
12
11
  import type { NodeInstance } from '@xyo-network/node-model'
13
12
  import type { WithStorageMeta } from '@xyo-network/payload-model'
14
13
  import type {
15
- AccountBalanceViewer,
16
14
  BalancesStepSummary,
17
15
  MapType, StakedChainContextRead, TransfersStepSummary,
18
16
  } from '@xyo-network/xl1-protocol-sdk'
@@ -21,11 +19,13 @@ import cors from 'cors'
21
19
  import type { Express } from 'express'
22
20
  import express from 'express'
23
21
 
22
+ import type { AppContext } from '../model.ts'
24
23
  import { addInstrumentation } from './instrumentation.ts'
25
24
  import { addRoutes } from './routes/index.ts'
26
25
 
27
26
  export const getApp = async (
28
27
  node: NodeInstance,
28
+ context: AppContext,
29
29
  transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
30
30
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
31
31
  stakedChainContext: StakedChainContextRead,
@@ -44,7 +44,7 @@ export const getApp = async (
44
44
  app.use(customPoweredByHeader)
45
45
  disableCaseSensitiveRouting(app)
46
46
  app.node = node
47
- await addRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
47
+ await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
48
48
  app.use(standardErrors)
49
49
  return app
50
50
  }
@@ -5,18 +5,20 @@ import type {
5
5
  } from '@xyo-network/xl1-protocol-sdk'
6
6
  import type { Express } from 'express'
7
7
 
8
+ import type { AppContext } from '../../model.ts'
8
9
  import { addNodeRoutes } from './address/index.ts'
9
10
  import { addDataLakeRoutes } from './dataLake/index.ts'
10
11
  import { addRpcRoutes } from './rpc/index.ts'
11
12
 
12
13
  export const addRoutes = async (
13
14
  app: Express,
15
+ context: AppContext,
14
16
  transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
15
17
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
16
18
  stakedChainContext: StakedChainContextRead,
17
19
  initRewardsCache?: boolean,
18
20
  ) => {
19
- await addRpcRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
21
+ await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
20
22
  addDataLakeRoutes(app)
21
23
  addNodeRoutes(app)
22
24
  }
@@ -1,6 +1,7 @@
1
1
  import { setRawResponseFormat } from '@xylabs/express'
2
2
  import { assertEx } from '@xylabs/sdk-js'
3
3
  import { asArchivistInstance } from '@xyo-network/archivist-model'
4
+ import { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'
4
5
  import { NodeXyoViewer } from '@xyo-network/chain-rpc'
5
6
  import {
6
7
  SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
@@ -16,6 +17,7 @@ import type {
16
17
  } from '@xyo-network/xl1-protocol-sdk'
17
18
  import {
18
19
  RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
20
+ SimpleMempoolViewer,
19
21
  } from '@xyo-network/xl1-protocol-sdk'
20
22
  import {
21
23
  NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,
@@ -23,6 +25,8 @@ import {
23
25
  import { Semaphore } from 'async-mutex'
24
26
  import type { Express } from 'express'
25
27
 
28
+ import type { AppContext } from '../../../../model.ts'
29
+
26
30
  async function chainArchivistFromNode(node: NodeInstance) {
27
31
  const chainArchivist = assertEx(asArchivistInstance(
28
32
  await node.resolve('Chain:Validated'),
@@ -34,13 +38,13 @@ async function chainArchivistFromNode(node: NodeInstance) {
34
38
  // eslint-disable-next-line max-statements
35
39
  export const addRpcRoutes = async (
36
40
  app: Express,
41
+ context: AppContext,
37
42
  transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
38
43
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
39
44
  stakedChainContext: StakedChainContextRead,
40
45
  initRewardsCache?: boolean,
41
46
  ) => {
42
47
  const { node } = app
43
- const runner = new NodeXyoRunner(node)
44
48
 
45
49
  const finalizedArchivist = await chainArchivistFromNode(node)
46
50
 
@@ -61,6 +65,8 @@ export const addRpcRoutes = async (
61
65
  } satisfies TransfersStepSummaryContext
62
66
 
63
67
  const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
68
+ const pendingBlocksArchivist = await initPendingBlockArchivist(context)
69
+ const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)
64
70
 
65
71
  console.log('Initializing SimpleNetworkStakeViewer...')
66
72
  assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
@@ -98,6 +104,12 @@ export const addRpcRoutes = async (
98
104
  assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')
99
105
  console.log('Initialized SimpleStepViewer.')
100
106
 
107
+ const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })
108
+
109
+ console.log('Initializing SimpleMempoolViewer...')
110
+ assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')
111
+ console.log('Initialized SimpleMempoolViewer.')
112
+
101
113
  const viewer = await NodeXyoViewer.create({
102
114
  node,
103
115
  rewardMultipliers: RewardMultipliers,
@@ -108,12 +120,19 @@ export const addRpcRoutes = async (
108
120
  accountBalanceViewer,
109
121
  stepViewer,
110
122
  transfersSummaryContext,
123
+ mempoolViewer,
111
124
  })
112
125
 
113
126
  console.log('Initializing NodeXyoViewer...')
114
127
  assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')
115
128
  console.log('Initialized NodeXyoViewer.')
116
129
 
130
+ const runner = await NodeXyoRunner.create({ node })
131
+
132
+ console.log('Initializing NodeXyoRunner...')
133
+ assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')
134
+ console.log('Initialized NodeXyoRunner.')
135
+
117
136
  const connection = new XyoBaseConnection({ runner, viewer })
118
137
  const engine = rpcEngineFromConnection(connection)
119
138
 
@@ -1,20 +1,27 @@
1
1
  import type { Hash, Logger } from '@xylabs/sdk-js'
2
2
  import { assertEx } from '@xylabs/sdk-js'
3
+ import type { AccountInstance } from '@xyo-network/account-model'
4
+ import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
+ import type { ConfigContext } from '@xyo-network/chain-orchestration'
3
6
  import {
4
7
  createProducerChainStakeIntentBlock,
5
8
  initBalanceSummaryMap,
6
- initChainStakeViewer, initProducerAccount,
9
+ initProducerAccount,
7
10
  initServerNode,
8
11
  initServerWallet,
9
- initTransferSummaryMap,
12
+ initStakeViewer, initTransferSummaryMap,
10
13
  } from '@xyo-network/chain-orchestration'
11
14
  import { createGenesisBlock } from '@xyo-network/chain-protocol'
12
15
  import type { NodeInstance } from '@xyo-network/node-model'
13
16
  import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
17
+ import type { ChainId } from '@xyo-network/xl1-protocol'
14
18
  import {
15
19
  asXL1, asXL1BlockRange, XL1Amount,
16
20
  } from '@xyo-network/xl1-protocol'
17
- import type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'
21
+ import type {
22
+ Config, PayloadMapRead, StakedChainContextRead,
23
+ StakeViewer,
24
+ } from '@xyo-network/xl1-protocol-sdk'
18
25
  import { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
19
26
 
20
27
  import { getApp } from './app.ts'
@@ -28,13 +35,57 @@ interface GetServerContext {
28
35
  node?: NodeInstance
29
36
  }
30
37
 
38
+ async function initChainMap({
39
+ chainArchivist, chainId, logger, config, producerAccount,
40
+ }: ConfigContext<{
41
+ chainArchivist: ArchivistInstance
42
+ chainId: ChainId
43
+ producerAccount: AccountInstance
44
+ }>) {
45
+ const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
46
+
47
+ const payloads = await chainArchivist.next()
48
+
49
+ if (payloads.length === 0) {
50
+ logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
51
+ const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
52
+ const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
53
+ await chainArchivist.insert([...block0[1].flat(), block0[0]])
54
+ console.log('[API] Genesis block created and inserted into chain archivist')
55
+ const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
56
+ await chainArchivist.insert([...block1[1].flat(), block1[0]])
57
+ console.log(`[API] Producer declared: ${producerAccount.address}`)
58
+ }
59
+
60
+ return chainMap
61
+ }
62
+
63
+ function initStakedChainContextRead({
64
+ chainArchivist, chainId, stakeViewer, chainMap,
65
+ }: ConfigContext<{
66
+ chainArchivist: ArchivistInstance
67
+ chainId: ChainId
68
+ chainMap: PayloadMapRead<WithStorageMeta<Payload>>
69
+ stakeViewer: StakeViewer
70
+ }>) {
71
+ return {
72
+ chainId,
73
+ stake: stakeViewer,
74
+ store: { chainMap },
75
+ head: async (): Promise<[Hash, number]> => {
76
+ const head = await findMostRecentBlock(chainArchivist)
77
+ return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
78
+ },
79
+ } satisfies StakedChainContextRead
80
+ }
81
+
31
82
  export async function getServer(context: GetServerContext) {
32
83
  const {
33
84
  config, logger, node: providedNode,
34
85
  } = context
35
86
  const { port } = context.config.api
36
87
  const wallet = await initServerWallet({ config, logger })
37
- const stakeChainViewer = await initChainStakeViewer(config, logger)
88
+ const stakeViewer = await initStakeViewer(config, logger)
38
89
 
39
90
  const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')
40
91
  const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
@@ -48,67 +99,23 @@ export async function getServer(context: GetServerContext) {
48
99
  balancesSummaryMap,
49
100
  })
50
101
 
51
- const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
102
+ const chainId = stakeViewer.chainId
52
103
 
53
- const payloads = await chainArchivist.next()
104
+ const producerAccount = await initProducerAccount({ config, logger })
105
+ const chainMap = await initChainMap({
106
+ ...context, chainArchivist, chainId, producerAccount,
107
+ })
54
108
 
55
- if (payloads.length === 0) {
56
- logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
57
- const producerAccount = await initProducerAccount({ config, logger })
58
- const chainId = stakeChainViewer.chainId
59
- const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
60
- const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
61
- await chainArchivist.insert([...block0[1].flat(), block0[0]])
62
- console.log('[API] Genesis block created and inserted into chain archivist')
63
- const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
64
- await chainArchivist.insert([...block1[1].flat(), block1[0]])
65
- console.log(`[API] Producer declared: ${producerAccount.address}`)
66
- }
109
+ const stakedChainContext = initStakedChainContextRead({
110
+ ...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
111
+ })
67
112
 
68
- const stakedChainContext: StakedChainContextRead = {
69
- chainId: stakeChainViewer.chainId,
70
- stake: stakeChainViewer,
71
- store: { chainMap },
72
- head: async (): Promise<[Hash, number]> => {
73
- const head = await findMostRecentBlock(chainArchivist)
74
- return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
75
- },
76
- }
77
113
  const mods = await node.resolve('*')
78
114
  await Promise.all(mods.map((mod) => {
79
115
  return mod.start?.() ?? (() => true)
80
116
  }))
81
117
 
82
- // const chainIterator = await initChainIterator({
83
- // config,
84
- // logger,
85
- // chainMap,
86
- // head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),
87
- // })
88
-
89
- // const blockViewer = chainIterator
90
-
91
- // const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
92
- // context: {
93
- // chainId: stakedChainContext.chainId,
94
- // store: stakedChainContext.store,
95
- // head: stakedChainContext.head,
96
- // stepSemaphores: StepSizes.map(() => new Semaphore(20)),
97
- // summaryMap: balanceSummaryMap,
98
- // },
99
- // transferContext: {
100
- // chainId: stakedChainContext.chainId,
101
- // store: stakedChainContext.store,
102
- // head: stakedChainContext.head,
103
- // stepSemaphores: StepSizes.map(() => new Semaphore(20)),
104
- // summaryMap: transferSummaryMap,
105
- // },
106
- // blockViewer,
107
- // })
108
-
109
- // assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
110
-
111
- const app = await getApp(node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
118
+ const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
112
119
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
113
120
  server.setTimeout(20_000)
114
121
  return server