@xyo-network/chain-api 1.17.2 → 1.17.6

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.
@@ -31,7 +31,7 @@ import { isModuleName } from "@xyo-network/module-model";
31
31
  import { StatusCodes } from "http-status-codes";
32
32
  var handler = /* @__PURE__ */ __name(async (req, res, next) => {
33
33
  const { address: moduleIdentifier } = req.params;
34
- const { node } = req.app;
34
+ const { node } = req.app.context;
35
35
  const address = asAddress(moduleIdentifier);
36
36
  if (isDefined(address)) {
37
37
  let mod = node.address === address ? node : await node.resolve(address, {
@@ -94,7 +94,7 @@ var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
94
94
  next();
95
95
  }, "returnError");
96
96
  const { address } = req.params;
97
- const { node } = req.app;
97
+ const { node } = req.app.context;
98
98
  const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
99
99
  if (!isAddress(address)) {
100
100
  return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
@@ -154,7 +154,7 @@ var postAddress = asyncHandler2(handler2);
154
154
 
155
155
  // src/server/routes/address/addNodeRoutes.ts
156
156
  var addNodeRoutes = /* @__PURE__ */ __name((app) => {
157
- const defaultModule = app.node;
157
+ const defaultModule = app.context.node;
158
158
  const address = defaultModule.address;
159
159
  const defaultModuleEndpoint = `/${address}`;
160
160
  app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
@@ -247,7 +247,7 @@ var archivistMiddleware = /* @__PURE__ */ __name((options) => {
247
247
 
248
248
  // src/server/routes/dataLake/addDataLakeRoutes.ts
249
249
  var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
250
- const { node } = app;
250
+ const { node } = app.context;
251
251
  const archivistModuleIdentifier = "Chain:Finalized";
252
252
  app.use("/chain", archivistMiddleware({
253
253
  node,
@@ -259,11 +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
+ import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from "@xyo-network/chain-orchestration";
263
263
  import { NodeXyoViewer } from "@xyo-network/chain-rpc";
264
264
  import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
265
265
  import { StepSizes } from "@xyo-network/xl1-protocol";
266
- import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
266
+ import { NetworkStakeStepRewardsViewerMoniker, RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
267
267
  import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
268
268
  import { Semaphore } from "async-mutex";
269
269
  async function chainArchivistFromNode(node) {
@@ -273,8 +273,9 @@ async function chainArchivistFromNode(node) {
273
273
  return chainArchivist;
274
274
  }
275
275
  __name(chainArchivistFromNode, "chainArchivistFromNode");
276
- var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
277
- const { node } = app;
276
+ var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
277
+ const { context } = app;
278
+ const { node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config } = context;
278
279
  const finalizedArchivist = await chainArchivistFromNode(node);
279
280
  const balancesStepSummaryContext = {
280
281
  head: stakedChainContext.head,
@@ -293,8 +294,8 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
293
294
  const networkStakeViewer = await SimpleNetworkStakeViewer.create({
294
295
  context: stakedChainContext
295
296
  });
296
- const pendingBlocksArchivist = await initPendingBlockArchivist(context);
297
- const pendingTransactionsArchivist = await initPendingTransactionArchivist(context);
297
+ const pendingBlocksArchivist = await initPendingBlocksArchivist(context);
298
+ const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context);
298
299
  console.log("Initializing SimpleNetworkStakeViewer...");
299
300
  assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
300
301
  console.log("Initialized SimpleNetworkStakeViewer.");
@@ -321,6 +322,7 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
321
322
  assertEx2(await stepRewardsByPositionViewer.start(), () => "Failed to start SimpleStepRewardsByPositionViewer");
322
323
  console.log("Initialized SimpleStepRewardsByPositionViewer.");
323
324
  const networkStakeStepRewardsViewer = {
325
+ moniker: NetworkStakeStepRewardsViewerMoniker,
324
326
  position: stepRewardsByPositionViewer
325
327
  };
326
328
  const stepViewer = await SimpleStepViewer.create({
@@ -340,7 +342,7 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
340
342
  const viewer = await NodeXyoViewer.create({
341
343
  node,
342
344
  rewardMultipliers: RewardMultipliers,
343
- initRewardsCache,
345
+ initRewardsCache: config.api.initRewardsCache,
344
346
  blockViewer,
345
347
  context: stakedChainContext,
346
348
  networkStakeViewer,
@@ -372,14 +374,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
372
374
  }, "addRpcRoutes");
373
375
 
374
376
  // src/server/routes/addRoutes.ts
375
- var addRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
376
- await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
377
+ var addRoutes = /* @__PURE__ */ __name(async (app) => {
378
+ await addRpcRoutes(app);
377
379
  addDataLakeRoutes(app);
378
380
  addNodeRoutes(app);
379
381
  }, "addRoutes");
380
382
 
381
383
  // src/server/app.ts
382
- var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
384
+ var getApp = /* @__PURE__ */ __name(async (context) => {
383
385
  addInstrumentation();
384
386
  const app = express2();
385
387
  app.set("etag", false);
@@ -393,39 +395,37 @@ var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, b
393
395
  disableExpressDefaultPoweredByHeader(app);
394
396
  app.use(customPoweredByHeader);
395
397
  disableCaseSensitiveRouting(app);
396
- app.node = node;
397
- await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
398
+ app.context = context;
399
+ await addRoutes(app);
398
400
  app.use(standardErrors);
399
401
  return app;
400
402
  }, "getApp");
401
403
 
402
404
  // src/server/server.ts
403
405
  import { assertEx as assertEx3 } from "@xylabs/sdk-js";
404
- import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
406
+ import { buildTelemetryConfig, createProducerChainStakeIntentBlock, initBalanceSummaryMap, initHealthEndpoints, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initStatusReporter, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
405
407
  import { createGenesisBlock } from "@xyo-network/chain-protocol";
408
+ import { initTelemetry } from "@xyo-network/chain-telemetry";
409
+ import { startupSpanAsync } from "@xyo-network/chain-utils";
406
410
  import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
407
- import { findMostRecentBlock, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
411
+ import { findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer as SimpleBlockViewer2, SimpleMempoolRunner, SimpleMempoolViewer as SimpleMempoolViewer2 } from "@xyo-network/xl1-protocol-sdk";
408
412
  var hostname = "::";
409
413
  async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
410
414
  const chainMap = readPayloadMapFromStore(chainArchivist);
411
- const payloads = await chainArchivist.next();
415
+ const payloads = await chainArchivist.next({
416
+ limit: 1
417
+ });
412
418
  if (payloads.length === 0) {
413
419
  logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
414
420
  const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
415
421
  const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
416
- await chainArchivist.insert([
417
- ...block0[1].flat(),
418
- block0[0]
419
- ]);
422
+ await chainArchivist.insert(flattenHydratedBlock(block0));
420
423
  console.log("[API] Genesis block created and inserted into chain archivist");
421
424
  const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([
422
425
  0,
423
426
  1e4
424
427
  ], true));
425
- await chainArchivist.insert([
426
- ...block1[1].flat(),
427
- block1[0]
428
- ]);
428
+ await chainArchivist.insert(flattenHydratedBlock(block1));
429
429
  console.log(`[API] Producer declared: ${producerAccount.address}`);
430
430
  }
431
431
  return chainMap;
@@ -449,43 +449,60 @@ function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chai
449
449
  }
450
450
  __name(initStakedChainContextRead, "initStakedChainContextRead");
451
451
  async function getServer(context) {
452
- const { config, logger, node: providedNode } = context;
452
+ const { config, node: providedNode } = context;
453
453
  const { port } = context.config.api;
454
- const wallet = await initServerWallet({
455
- config,
454
+ const logger = assertEx3(context.logger, () => "Logger is required to init server");
455
+ const statusReporter = initStatusReporter({
456
456
  logger
457
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({
458
+ await startupSpanAsync("initHealthEndpoints", () => initHealthEndpoints({
464
459
  config,
465
- logger
466
- }), () => "Transfer Summary Map not initialized");
467
- const { node, chainArchivist } = await initServerNode({
460
+ logger,
461
+ statusReporter
462
+ }));
463
+ const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
464
+ const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
465
+ const initContext = {
468
466
  config,
469
467
  logger,
468
+ statusReporter,
469
+ meterProvider,
470
+ traceProvider
471
+ };
472
+ const wallet = await initServerWallet(initContext);
473
+ const stakeViewer = await initStakeViewer(initContext);
474
+ const balancesSummaryMap = assertEx3(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
475
+ const transfersSummaryMap = assertEx3(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
476
+ const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
477
+ ...initContext,
470
478
  wallet,
471
479
  node: providedNode,
472
480
  transfersSummaryMap,
473
481
  balancesSummaryMap
474
482
  });
475
483
  const chainId = stakeViewer.chainId;
476
- const producerAccount = await initProducerAccount({
477
- config,
478
- logger
484
+ const mempoolViewer = await SimpleMempoolViewer2.create({
485
+ ...initContext,
486
+ pendingTransactionsArchivist,
487
+ pendingBlocksArchivist
479
488
  });
489
+ assertEx3(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
490
+ const mempoolRunner = await SimpleMempoolRunner.create({
491
+ ...initContext,
492
+ pendingTransactionsArchivist,
493
+ pendingBlocksArchivist
494
+ });
495
+ assertEx3(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
496
+ const producerAccount = await initProducerAccount(initContext);
480
497
  const chainMap = await initChainMap({
481
498
  ...context,
482
- chainArchivist,
499
+ chainArchivist: writableChainArchivist,
483
500
  chainId,
484
501
  producerAccount
485
502
  });
486
503
  const stakedChainContext = initStakedChainContextRead({
487
504
  ...context,
488
- chainArchivist,
505
+ chainArchivist: readonlyChainArchivist,
489
506
  chainId,
490
507
  chainMap,
491
508
  stakeViewer
@@ -494,10 +511,25 @@ async function getServer(context) {
494
511
  await Promise.all(mods.map((mod) => {
495
512
  return mod.start?.() ?? (() => true);
496
513
  }));
497
- const app = await getApp(node, {
514
+ const blockViewer = await SimpleBlockViewer2.create({
515
+ context: stakedChainContext,
516
+ finalizedArchivist: readonlyChainArchivist
517
+ });
518
+ assertEx3(await blockViewer.start(), () => "Failed to start BlockViewer");
519
+ const blk = await blockViewer.currentBlock();
520
+ assertEx3(blk, () => "No blocks found after initialization");
521
+ console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
522
+ const apiContext = {
523
+ ...initContext,
524
+ node,
498
525
  config,
499
- logger
500
- }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache);
526
+ stakedChainContext,
527
+ mempoolViewer,
528
+ mempoolRunner,
529
+ balancesSummaryMap,
530
+ transfersSummaryMap
531
+ };
532
+ const app = await getApp(apiContext);
501
533
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
502
534
  server.setTimeout(2e4);
503
535
  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 { 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"]}
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 compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from './ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): 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.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.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.context\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.context\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.context\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 { initPendingBlocksArchivist, initPendingTransactionsArchivist } 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 { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalanceStepSummaryContext,\n NetworkStakeStepRewardsViewer,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NetworkStakeStepRewardsViewerMoniker,\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\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) => {\n const { context } = app\n const {\n node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,\n } = context\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 initPendingBlocksArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionsArchivist(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 = {\n moniker: NetworkStakeStepRewardsViewerMoniker,\n position: stepRewardsByPositionViewer,\n }\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: config.api.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 { 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) => {\n await addRpcRoutes(app)\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 buildTelemetryConfig,\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initStatusReporter, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\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, SimpleBlockViewerParams, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport type { ApiContext } from './ApiContext.ts'\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({ limit: 1 })\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(flattenHydratedBlock(block0))\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(flattenHydratedBlock(block1))\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\n// eslint-disable-next-line max-statements\nexport async function getServer(context: GetServerContext) {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n config, logger, statusReporter, meterProvider, traceProvider,\n }\n\n const wallet = await initServerWallet(initContext)\n const stakeViewer = await initStakeViewer(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const mempoolViewer = await SimpleMempoolViewer.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = await SimpleMempoolRunner.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n const producerAccount = await initProducerAccount(initContext)\n\n const chainMap = await initChainMap({\n ...context, chainArchivist: writableChainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist: readonlyChainArchivist, 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 blockViewer = await SimpleBlockViewer.create({\n context: stakedChainContext,\n finalizedArchivist: readonlyChainArchivist,\n } satisfies SimpleBlockViewerParams)\n\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const apiContext: ApiContext = {\n ...initContext,\n node,\n config,\n stakedChainContext,\n mempoolViewer,\n mempoolRunner,\n balancesSummaryMap,\n transfersSummaryMap,\n }\n\n const app = await getApp(apiContext)\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","context","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","context","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","context","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","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","initPendingBlocksArchivist","initPendingTransactionsArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","NetworkStakeStepRewardsViewerMoniker","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","stakedChainContext","balancesSummaryMap","transfersSummaryMap","config","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlocksArchivist","pendingTransactionsArchivist","initPendingTransactionsArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","moniker","NetworkStakeStepRewardsViewerMoniker","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","initRewardsCache","api","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","buildTelemetryConfig","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initHealthEndpoints","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initStatusReporter","initTransferSummaryMap","createGenesisBlock","initTelemetry","startupSpanAsync","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","flattenHydratedBlock","readPayloadMapFromStore","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","limit","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flattenHydratedBlock","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","mempoolViewer","SimpleMempoolViewer","create","start","mempoolRunner","SimpleMempoolRunner","initProducerAccount","stakedChainContext","mods","resolve","Promise","all","map","mod","blockViewer","SimpleBlockViewer","finalizedArchivist","blk","currentBlock","info","apiContext","app","getApp","server","listen","setTimeout"]}
@@ -0,0 +1,14 @@
1
+ import type { NodeInstance } from '@xyo-network/node-model';
2
+ import type { WithStorageMeta } from '@xyo-network/payload-model';
3
+ import type { BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
4
+ import type { AppContext } from '../model.ts';
5
+ export interface ApiContext extends AppContext {
6
+ balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
7
+ config: Config;
8
+ mempoolRunner: MempoolRunner;
9
+ mempoolViewer: MempoolViewer;
10
+ node: NodeInstance;
11
+ stakedChainContext: StakedChainContextRead;
12
+ transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
13
+ }
14
+ //# sourceMappingURL=ApiContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../../src/server/ApiContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAC1F,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
@@ -1,7 +1,4 @@
1
- import type { NodeInstance } from '@xyo-network/node-model';
2
- import type { WithStorageMeta } from '@xyo-network/payload-model';
3
- import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
4
1
  import type { Express } from '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>;
2
+ import type { ApiContext } from './ApiContext.ts';
3
+ export declare const getApp: (context: ApiContext) => Promise<Express>;
7
4
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAIjD,eAAO,MAAM,MAAM,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,OAAO,CAiBjE,CAAA"}
@@ -1,11 +1,4 @@
1
+ export * from './ApiContext.ts';
1
2
  export * from './app.ts';
2
3
  export * from './server.ts';
3
- import type { NodeInstance } from '@xyo-network/node-model';
4
- declare global {
5
- namespace Express {
6
- interface Application {
7
- node: NodeInstance;
8
- }
9
- }
10
- }
11
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,WAAW;YACnB,IAAI,EAAE,YAAY,CAAA;SACnB;KACF;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
@@ -1,6 +1,3 @@
1
- import type { WithStorageMeta } from '@xyo-network/payload-model';
2
- import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
3
1
  import type { Express } from 'express';
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>;
2
+ export declare const addRoutes: (app: Express) => Promise<void>;
6
3
  //# 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;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
+ {"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,kBAKb,CAAA"}
@@ -1,6 +1,3 @@
1
- import type { WithStorageMeta } from '@xyo-network/payload-model';
2
- import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
3
1
  import type { Express } from 'express';
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>;
2
+ export declare const addRpcRoutes: (app: Express) => Promise<void>;
6
3
  //# 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":"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
+ {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAWtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBA0Gb,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;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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAkBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAM3D,OAAO,KAAK,EACV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAWtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA+CD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GA8FxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.17.2",
3
+ "version": "1.17.6",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -52,22 +52,24 @@
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.50",
56
- "@xylabs/sdk-js": "~5.0.50",
55
+ "@xylabs/express": "~5.0.51",
56
+ "@xylabs/sdk-js": "~5.0.51",
57
57
  "@xyo-network/archivist-model": "~5.2.17",
58
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",
59
+ "@xyo-network/chain-orchestration": "workspace:~",
60
+ "@xyo-network/chain-protocol": "workspace:~",
61
+ "@xyo-network/chain-rpc": "workspace:~",
62
+ "@xyo-network/chain-telemetry": "workspace:~",
63
+ "@xyo-network/chain-utils": "workspace:~",
64
+ "@xyo-network/chain-viewers": "workspace:~",
63
65
  "@xyo-network/module-abstract": "~5.2.17",
64
66
  "@xyo-network/module-model": "~5.2.17",
65
67
  "@xyo-network/node-model": "~5.2.17",
66
68
  "@xyo-network/payload-builder": "~5.2.17",
67
69
  "@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",
70
+ "@xyo-network/xl1-protocol": "~1.14.17",
71
+ "@xyo-network/xl1-protocol-sdk": "workspace:~",
72
+ "@xyo-network/xl1-rpc": "workspace:~",
71
73
  "async-mutex": "~0.5.0",
72
74
  "compression": "~1.8.1",
73
75
  "cors": "~2.8.5",
@@ -80,8 +82,8 @@
80
82
  "@types/cors": "~2.8.19",
81
83
  "@types/express": "5.0.6",
82
84
  "@types/express-serve-static-core": "~5.1.0",
83
- "@types/node": "~24.10.1",
84
- "@xylabs/sdk-js": "~5.0.50",
85
+ "@types/node": "~24.10.3",
86
+ "@xylabs/sdk-js": "~5.0.51",
85
87
  "@xylabs/ts-scripts-yarn3": "~7.2.8",
86
88
  "@xylabs/tsconfig": "~7.2.8",
87
89
  "@xyo-network/account": "~5.2.17",
@@ -89,11 +91,11 @@
89
91
  "@xyo-network/archivist-abstract": "~5.2.17",
90
92
  "@xyo-network/bios-model": "~7.2.0",
91
93
  "@xyo-network/boundwitness-builder": "~5.2.17",
92
- "@xyo-network/chain-services": "~1.17.2",
94
+ "@xyo-network/chain-services": "workspace:~",
93
95
  "@xyo-network/module-abstract-mongodb": "~5.2.17",
94
96
  "@xyo-network/module-model-mongodb": "~5.2.17",
95
97
  "@xyo-network/node-memory": "~5.2.17",
96
- "@xyo-network/xl1-protocol": "~1.14.16",
98
+ "@xyo-network/xl1-protocol": "~1.14.17",
97
99
  "dotenv": "~17.2.3",
98
100
  "eslint": "^9.39.1",
99
101
  "nodemon": "~3.1.11",
@@ -109,4 +111,4 @@
109
111
  "publishConfig": {
110
112
  "access": "restricted"
111
113
  }
112
- }
114
+ }
@@ -0,0 +1,13 @@
1
+ export * from './app.ts'
2
+ export * from './server.ts'
3
+
4
+ import type { ApiContext } from './ApiContext.ts'
5
+
6
+ declare global {
7
+
8
+ namespace Express {
9
+ interface Application {
10
+ context: ApiContext
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ import type { NodeInstance } from '@xyo-network/node-model'
2
+ import type { WithStorageMeta } from '@xyo-network/payload-model'
3
+ import type {
4
+ BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead,
5
+ TransfersStepSummary,
6
+ } from '@xyo-network/xl1-protocol-sdk'
7
+
8
+ import type { AppContext } from '../model.ts'
9
+
10
+ export interface ApiContext extends AppContext {
11
+ balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
12
+ config: Config
13
+ mempoolRunner: MempoolRunner
14
+ mempoolViewer: MempoolViewer
15
+ node: NodeInstance
16
+ stakedChainContext: StakedChainContextRead
17
+ transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>
18
+ }
package/src/server/app.ts CHANGED
@@ -8,29 +8,16 @@ import {
8
8
  standardErrors,
9
9
  standardResponses,
10
10
  } from '@xylabs/express'
11
- import type { NodeInstance } from '@xyo-network/node-model'
12
- import type { WithStorageMeta } from '@xyo-network/payload-model'
13
- import type {
14
- BalancesStepSummary,
15
- MapType, StakedChainContextRead, TransfersStepSummary,
16
- } from '@xyo-network/xl1-protocol-sdk'
17
11
  import compression from 'compression'
18
12
  import cors from 'cors'
19
13
  import type { Express } from 'express'
20
14
  import express from 'express'
21
15
 
22
- import type { AppContext } from '../model.ts'
16
+ import type { ApiContext } from './ApiContext.ts'
23
17
  import { addInstrumentation } from './instrumentation.ts'
24
18
  import { addRoutes } from './routes/index.ts'
25
19
 
26
- export const getApp = async (
27
- node: NodeInstance,
28
- context: AppContext,
29
- transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
30
- balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
31
- stakedChainContext: StakedChainContextRead,
32
- initRewardsCache?: boolean,
33
- ): Promise<Express> => {
20
+ export const getApp = async (context: ApiContext): Promise<Express> => {
34
21
  addInstrumentation()
35
22
  const app = express()
36
23
  app.set('etag', false)
@@ -43,8 +30,8 @@ export const getApp = async (
43
30
  disableExpressDefaultPoweredByHeader(app)
44
31
  app.use(customPoweredByHeader)
45
32
  disableCaseSensitiveRouting(app)
46
- app.node = node
47
- await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
33
+ app.context = context
34
+ await addRoutes(app)
48
35
  app.use(standardErrors)
49
36
  return app
50
37
  }
@@ -1,13 +1,3 @@
1
+ export * from './ApiContext.ts'
1
2
  export * from './app.ts'
2
3
  export * from './server.ts'
3
-
4
- import type { NodeInstance } from '@xyo-network/node-model'
5
-
6
- declare global {
7
- // eslint-disable-next-line @typescript-eslint/no-namespace
8
- namespace Express {
9
- interface Application {
10
- node: NodeInstance
11
- }
12
- }
13
- }
@@ -1,24 +1,13 @@
1
- import type { WithStorageMeta } from '@xyo-network/payload-model'
2
- import type {
3
- BalancesStepSummary,
4
- MapType, StakedChainContextRead, TransfersStepSummary,
5
- } from '@xyo-network/xl1-protocol-sdk'
6
1
  import type { Express } from 'express'
7
2
 
8
- import type { AppContext } from '../../model.ts'
9
3
  import { addNodeRoutes } from './address/index.ts'
10
4
  import { addDataLakeRoutes } from './dataLake/index.ts'
11
5
  import { addRpcRoutes } from './rpc/index.ts'
12
6
 
13
7
  export const addRoutes = async (
14
8
  app: Express,
15
- context: AppContext,
16
- transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
17
- balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
18
- stakedChainContext: StakedChainContextRead,
19
- initRewardsCache?: boolean,
20
9
  ) => {
21
- await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
10
+ await addRpcRoutes(app)
22
11
  addDataLakeRoutes(app)
23
12
  addNodeRoutes(app)
24
13
  }
@@ -5,7 +5,7 @@ import { getAddress } from './get/index.ts'
5
5
  import { postAddress } from './post/index.ts'
6
6
 
7
7
  export const addNodeRoutes = (app: Express) => {
8
- const defaultModule = app.node
8
+ const defaultModule = app.context.node
9
9
  const address = defaultModule.address
10
10
  const defaultModuleEndpoint = `/${address}`
11
11
  app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))
@@ -9,7 +9,7 @@ import type { AddressPathParams } from '../AddressPathParams.ts'
9
9
 
10
10
  const handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {
11
11
  const { address: moduleIdentifier } = req.params
12
- const { node } = req.app
12
+ const { node } = req.app.context
13
13
  const address = asAddress(moduleIdentifier)
14
14
  if (isDefined(address)) {
15
15
  let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))
@@ -26,7 +26,7 @@ const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError
26
26
  }
27
27
 
28
28
  const { address } = req.params
29
- const { node } = req.app
29
+ const { node } = req.app.context
30
30
  const [bw, payloads] = Array.isArray(req.body) ? req.body : []
31
31
  if (!isAddress(address)) {
32
32
  return returnError(StatusCodes.BAD_REQUEST, 'Missing address')
@@ -3,7 +3,7 @@ import type { Express } from 'express'
3
3
  import { archivistMiddleware } from './archivistMiddleware.ts'
4
4
 
5
5
  export const addDataLakeRoutes = (app: Express) => {
6
- const { node } = app
6
+ const { node } = app.context
7
7
  const archivistModuleIdentifier = 'Chain:Finalized'
8
8
  app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))
9
9
  }
@@ -1,21 +1,20 @@
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
+ import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from '@xyo-network/chain-orchestration'
5
5
  import { NodeXyoViewer } from '@xyo-network/chain-rpc'
6
6
  import {
7
7
  SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
8
8
  } from '@xyo-network/chain-viewers'
9
9
  import type { NodeInstance } from '@xyo-network/node-model'
10
- import type { WithStorageMeta } from '@xyo-network/payload-model'
11
10
  import { StepSizes } from '@xyo-network/xl1-protocol'
12
11
  import type {
13
- BalancesStepSummary,
14
12
  BalanceStepSummaryContext,
15
- MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,
13
+ NetworkStakeStepRewardsViewer,
16
14
  TransfersStepSummaryContext,
17
15
  } from '@xyo-network/xl1-protocol-sdk'
18
16
  import {
17
+ NetworkStakeStepRewardsViewerMoniker,
19
18
  RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
20
19
  SimpleMempoolViewer,
21
20
  } from '@xyo-network/xl1-protocol-sdk'
@@ -25,8 +24,6 @@ import {
25
24
  import { Semaphore } from 'async-mutex'
26
25
  import type { Express } from 'express'
27
26
 
28
- import type { AppContext } from '../../../../model.ts'
29
-
30
27
  async function chainArchivistFromNode(node: NodeInstance) {
31
28
  const chainArchivist = assertEx(asArchivistInstance(
32
29
  await node.resolve('Chain:Validated'),
@@ -38,13 +35,11 @@ async function chainArchivistFromNode(node: NodeInstance) {
38
35
  // eslint-disable-next-line max-statements
39
36
  export const addRpcRoutes = async (
40
37
  app: Express,
41
- context: AppContext,
42
- transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
43
- balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
44
- stakedChainContext: StakedChainContextRead,
45
- initRewardsCache?: boolean,
46
38
  ) => {
47
- const { node } = app
39
+ const { context } = app
40
+ const {
41
+ node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,
42
+ } = context
48
43
 
49
44
  const finalizedArchivist = await chainArchivistFromNode(node)
50
45
 
@@ -65,8 +60,8 @@ export const addRpcRoutes = async (
65
60
  } satisfies TransfersStepSummaryContext
66
61
 
67
62
  const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
68
- const pendingBlocksArchivist = await initPendingBlockArchivist(context)
69
- const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)
63
+ const pendingBlocksArchivist = await initPendingBlocksArchivist(context)
64
+ const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)
70
65
 
71
66
  console.log('Initializing SimpleNetworkStakeViewer...')
72
67
  assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
@@ -97,7 +92,10 @@ export const addRpcRoutes = async (
97
92
  assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')
98
93
  console.log('Initialized SimpleStepRewardsByPositionViewer.')
99
94
 
100
- const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }
95
+ const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {
96
+ moniker: NetworkStakeStepRewardsViewerMoniker,
97
+ position: stepRewardsByPositionViewer,
98
+ }
101
99
  const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })
102
100
 
103
101
  console.log('Initializing SimpleStepViewer...')
@@ -113,7 +111,7 @@ export const addRpcRoutes = async (
113
111
  const viewer = await NodeXyoViewer.create({
114
112
  node,
115
113
  rewardMultipliers: RewardMultipliers,
116
- initRewardsCache,
114
+ initRewardsCache: config.api.initRewardsCache,
117
115
  blockViewer,
118
116
  context: stakedChainContext,
119
117
  networkStakeViewer,
@@ -4,14 +4,18 @@ import type { AccountInstance } from '@xyo-network/account-model'
4
4
  import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
5
  import type { ConfigContext } from '@xyo-network/chain-orchestration'
6
6
  import {
7
+ buildTelemetryConfig,
7
8
  createProducerChainStakeIntentBlock,
8
9
  initBalanceSummaryMap,
10
+ initHealthEndpoints,
9
11
  initProducerAccount,
10
12
  initServerNode,
11
13
  initServerWallet,
12
- initStakeViewer, initTransferSummaryMap,
14
+ initStakeViewer, initStatusReporter, initTransferSummaryMap,
13
15
  } from '@xyo-network/chain-orchestration'
14
16
  import { createGenesisBlock } from '@xyo-network/chain-protocol'
17
+ import { initTelemetry } from '@xyo-network/chain-telemetry'
18
+ import { startupSpanAsync } from '@xyo-network/chain-utils'
15
19
  import type { NodeInstance } from '@xyo-network/node-model'
16
20
  import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
17
21
  import type { ChainId } from '@xyo-network/xl1-protocol'
@@ -19,11 +23,14 @@ import {
19
23
  asXL1, asXL1BlockRange, XL1Amount,
20
24
  } from '@xyo-network/xl1-protocol'
21
25
  import type {
22
- Config, PayloadMapRead, StakedChainContextRead,
26
+ Config, PayloadMapRead, SimpleBlockViewerParams, StakedChainContextRead,
23
27
  StakeViewer,
24
28
  } from '@xyo-network/xl1-protocol-sdk'
25
- import { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
29
+ import {
30
+ findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
31
+ } from '@xyo-network/xl1-protocol-sdk'
26
32
 
33
+ import type { ApiContext } from './ApiContext.ts'
27
34
  import { getApp } from './app.ts'
28
35
 
29
36
  const hostname = '::'
@@ -44,16 +51,16 @@ async function initChainMap({
44
51
  }>) {
45
52
  const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
46
53
 
47
- const payloads = await chainArchivist.next()
54
+ const payloads = await chainArchivist.next({ limit: 1 })
48
55
 
49
56
  if (payloads.length === 0) {
50
57
  logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
51
58
  const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
52
59
  const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
53
- await chainArchivist.insert([...block0[1].flat(), block0[0]])
60
+ await chainArchivist.insert(flattenHydratedBlock(block0))
54
61
  console.log('[API] Genesis block created and inserted into chain archivist')
55
62
  const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
56
- await chainArchivist.insert([...block1[1].flat(), block1[0]])
63
+ await chainArchivist.insert(flattenHydratedBlock(block1))
57
64
  console.log(`[API] Producer declared: ${producerAccount.address}`)
58
65
  }
59
66
 
@@ -79,20 +86,37 @@ function initStakedChainContextRead({
79
86
  } satisfies StakedChainContextRead
80
87
  }
81
88
 
89
+ // eslint-disable-next-line max-statements
82
90
  export async function getServer(context: GetServerContext) {
83
- const {
84
- config, logger, node: providedNode,
85
- } = context
91
+ const { config, node: providedNode } = context
86
92
  const { port } = context.config.api
87
- const wallet = await initServerWallet({ config, logger })
88
- const stakeViewer = await initStakeViewer(config, logger)
89
93
 
90
- const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')
91
- const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
94
+ const logger = assertEx(context.logger, () => 'Logger is required to init server')
92
95
 
93
- const { node, chainArchivist } = await initServerNode({
94
- config,
95
- logger,
96
+ const statusReporter = initStatusReporter({ logger })
97
+
98
+ await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({
99
+ config, logger, statusReporter,
100
+ }))
101
+
102
+ const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')
103
+
104
+ const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
105
+
106
+ const initContext = {
107
+ config, logger, statusReporter, meterProvider, traceProvider,
108
+ }
109
+
110
+ const wallet = await initServerWallet(initContext)
111
+ const stakeViewer = await initStakeViewer(initContext)
112
+
113
+ const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
114
+ const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
115
+
116
+ const {
117
+ node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
118
+ } = await initServerNode({
119
+ ...initContext,
96
120
  wallet,
97
121
  node: providedNode,
98
122
  transfersSummaryMap,
@@ -101,13 +125,28 @@ export async function getServer(context: GetServerContext) {
101
125
 
102
126
  const chainId = stakeViewer.chainId
103
127
 
104
- const producerAccount = await initProducerAccount({ config, logger })
128
+ const mempoolViewer = await SimpleMempoolViewer.create({
129
+ ...initContext,
130
+ pendingTransactionsArchivist,
131
+ pendingBlocksArchivist,
132
+ })
133
+ assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')
134
+
135
+ const mempoolRunner = await SimpleMempoolRunner.create({
136
+ ...initContext,
137
+ pendingTransactionsArchivist,
138
+ pendingBlocksArchivist,
139
+ })
140
+ assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')
141
+
142
+ const producerAccount = await initProducerAccount(initContext)
143
+
105
144
  const chainMap = await initChainMap({
106
- ...context, chainArchivist, chainId, producerAccount,
145
+ ...context, chainArchivist: writableChainArchivist, chainId, producerAccount,
107
146
  })
108
147
 
109
148
  const stakedChainContext = initStakedChainContextRead({
110
- ...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
149
+ ...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
111
150
  })
112
151
 
113
152
  const mods = await node.resolve('*')
@@ -115,7 +154,30 @@ export async function getServer(context: GetServerContext) {
115
154
  return mod.start?.() ?? (() => true)
116
155
  }))
117
156
 
118
- const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
157
+ const blockViewer = await SimpleBlockViewer.create({
158
+ context: stakedChainContext,
159
+ finalizedArchivist: readonlyChainArchivist,
160
+ } satisfies SimpleBlockViewerParams)
161
+
162
+ assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
163
+
164
+ const blk = await blockViewer.currentBlock()
165
+ assertEx(blk, () => 'No blocks found after initialization')
166
+
167
+ console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
168
+
169
+ const apiContext: ApiContext = {
170
+ ...initContext,
171
+ node,
172
+ config,
173
+ stakedChainContext,
174
+ mempoolViewer,
175
+ mempoolRunner,
176
+ balancesSummaryMap,
177
+ transfersSummaryMap,
178
+ }
179
+
180
+ const app = await getApp(apiContext)
119
181
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
120
182
  server.setTimeout(20_000)
121
183
  return server