@xyo-network/chain-api 1.17.7 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ import type { NodeInstance } from '@xyo-network/node-model';
2
+ import type { WithStorageMeta } from '@xyo-network/payload-model';
3
+ import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
4
+ export interface ApiContext extends CreatableProviderContext {
5
+ balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
6
+ node: NodeInstance;
7
+ transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
8
+ }
9
+ //# sourceMappingURL=ApiContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../src/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,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,MAAM,WAAW,UAAW,SAAQ,wBAAwB;IAC1D,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,EAAE,YAAY,CAAA;IAClB,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
@@ -257,113 +257,12 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
257
257
 
258
258
  // src/server/routes/rpc/routes/addRpcRoutes.ts
259
259
  import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
260
- import { assertEx as assertEx2 } from "@xylabs/sdk-js";
261
- import { asArchivistInstance as asArchivistInstance2 } from "@xyo-network/archivist-model";
262
- import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from "@xyo-network/chain-orchestration";
263
- import { NodeXyoViewer } from "@xyo-network/chain-rpc";
264
- import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
265
- import { StepSizes } from "@xyo-network/xl1-protocol";
266
- import { NetworkStakeStepRewardsViewerMoniker, RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
267
- import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
268
- import { Semaphore } from "async-mutex";
269
- async function chainArchivistFromNode(node) {
270
- const chainArchivist = assertEx2(asArchivistInstance2(await node.resolve("Chain:Validated"), {
271
- required: true
272
- }), () => "FinalizedArchivist not found in node");
273
- return chainArchivist;
274
- }
275
- __name(chainArchivistFromNode, "chainArchivistFromNode");
260
+ import { XyoConnectionMoniker } from "@xyo-network/xl1-protocol-sdk";
261
+ import { rpcEngineFromConnection } from "@xyo-network/xl1-rpc";
276
262
  var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
277
263
  const { context } = app;
278
- const { node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config } = context;
279
- const finalizedArchivist = await chainArchivistFromNode(node);
280
- const balancesStepSummaryContext = {
281
- head: stakedChainContext.head,
282
- stepSemaphores: StepSizes.map(() => new Semaphore(20)),
283
- store: stakedChainContext.store,
284
- chainId: stakedChainContext.chainId,
285
- summaryMap: balancesSummaryMap
286
- };
287
- const transfersSummaryContext = {
288
- head: stakedChainContext.head,
289
- stepSemaphores: StepSizes.map(() => new Semaphore(20)),
290
- store: stakedChainContext.store,
291
- chainId: stakedChainContext.chainId,
292
- summaryMap: transfersSummaryMap
293
- };
294
- const networkStakeViewer = await SimpleNetworkStakeViewer.create({
295
- context: stakedChainContext
296
- });
297
- const pendingBlocksArchivist = await initPendingBlocksArchivist(context);
298
- const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context);
299
- console.log("Initializing SimpleNetworkStakeViewer...");
300
- assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
301
- console.log("Initialized SimpleNetworkStakeViewer.");
302
- const blockViewer = await SimpleBlockViewer.create({
303
- context: stakedChainContext,
304
- finalizedArchivist
305
- });
306
- console.log("Initializing SimpleBlockViewer...");
307
- assertEx2(await blockViewer.start(), () => "Failed to start SimpleBlockViewer");
308
- console.log("Initialized SimpleBlockViewer.");
309
- const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
310
- blockViewer,
311
- context: balancesStepSummaryContext,
312
- transfersSummaryContext
313
- });
314
- console.log("Initializing SimpleAccountBalanceViewer...");
315
- assertEx2(await accountBalanceViewer.start(), () => "Failed to start SimpleAccountBalanceViewer");
316
- console.log("Initialized SimpleAccountBalanceViewer.");
317
- const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
318
- context: stakedChainContext,
319
- rewardMultipliers: RewardMultipliers
320
- });
321
- console.log("Initializing SimpleStepRewardsByPositionViewer...");
322
- assertEx2(await stepRewardsByPositionViewer.start(), () => "Failed to start SimpleStepRewardsByPositionViewer");
323
- console.log("Initialized SimpleStepRewardsByPositionViewer.");
324
- const networkStakeStepRewardsViewer = {
325
- moniker: NetworkStakeStepRewardsViewerMoniker,
326
- position: stepRewardsByPositionViewer
327
- };
328
- const stepViewer = await SimpleStepViewer.create({
329
- chainContext: stakedChainContext,
330
- networkStakeStepRewardsViewer
331
- });
332
- console.log("Initializing SimpleStepViewer...");
333
- assertEx2(await stepViewer.start(), () => "Failed to start SimpleStepViewer");
334
- console.log("Initialized SimpleStepViewer.");
335
- const mempoolViewer = await SimpleMempoolViewer.create({
336
- pendingBlocksArchivist,
337
- pendingTransactionsArchivist
338
- });
339
- console.log("Initializing SimpleMempoolViewer...");
340
- assertEx2(await mempoolViewer.start(), () => "Failed to start SimpleMempoolViewer");
341
- console.log("Initialized SimpleMempoolViewer.");
342
- const viewer = await NodeXyoViewer.create({
343
- node,
344
- rewardMultipliers: RewardMultipliers,
345
- initRewardsCache: config.api.initRewardsCache,
346
- blockViewer,
347
- context: stakedChainContext,
348
- networkStakeViewer,
349
- accountBalanceViewer,
350
- stepViewer,
351
- transfersSummaryContext,
352
- mempoolViewer
353
- });
354
- console.log("Initializing NodeXyoViewer...");
355
- assertEx2(await viewer.start(), () => "Failed to start NodeXyoViewer");
356
- console.log("Initialized NodeXyoViewer.");
357
- const runner = await NodeXyoRunner.create({
358
- node
359
- });
360
- console.log("Initializing NodeXyoRunner...");
361
- assertEx2(await runner.start(), () => "Failed to start NodeXyoRunner");
362
- console.log("Initialized NodeXyoRunner.");
363
- const connection = new XyoBaseConnection({
364
- runner,
365
- viewer
366
- });
264
+ const { locator } = context;
265
+ const connection = await locator.getInstance(XyoConnectionMoniker);
367
266
  const engine = rpcEngineFromConnection(connection);
368
267
  app.post("/rpc", (req, res) => {
369
268
  setRawResponseFormat2(res);
@@ -402,56 +301,21 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
402
301
  }, "getApp");
403
302
 
404
303
  // src/server/server.ts
405
- import { assertEx as assertEx3 } from "@xylabs/sdk-js";
406
- import { buildTelemetryConfig, createProducerChainStakeIntentBlock, initBalanceSummaryMap, initHealthEndpoints, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initStatusReporter, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
407
- import { createGenesisBlock } from "@xyo-network/chain-protocol";
304
+ import { assertEx as assertEx2 } from "@xylabs/sdk-js";
305
+ import { Account } from "@xyo-network/account";
306
+ import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
307
+ import { createBootstrapHead } from "@xyo-network/chain-services";
408
308
  import { initTelemetry } from "@xyo-network/chain-telemetry";
409
309
  import { startupSpanAsync } from "@xyo-network/chain-utils";
410
- import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
411
- import { findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer as SimpleBlockViewer2, SimpleMempoolRunner, SimpleMempoolViewer as SimpleMempoolViewer2 } from "@xyo-network/xl1-protocol-sdk";
310
+ import { asAttoXL1, StepSizes } from "@xyo-network/xl1-protocol";
311
+ import { AccountBalanceViewerMoniker, BlockViewerMoniker, findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
312
+ import { buildLocalProviderLocator } from "@xyo-network/xl1-providers";
313
+ import { Semaphore } from "async-mutex";
412
314
  var hostname = "::";
413
- async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
414
- const chainMap = readPayloadMapFromStore(chainArchivist);
415
- const payloads = await chainArchivist.next({
416
- limit: 1
417
- });
418
- if (payloads.length === 0) {
419
- logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
420
- const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
421
- const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
422
- await chainArchivist.insert(flattenHydratedBlock(block0));
423
- console.log("[API] Genesis block created and inserted into chain archivist");
424
- const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([
425
- 0,
426
- 1e4
427
- ], true));
428
- await chainArchivist.insert(flattenHydratedBlock(block1));
429
- console.log(`[API] Producer declared: ${producerAccount.address}`);
430
- }
431
- return chainMap;
432
- }
433
- __name(initChainMap, "initChainMap");
434
- function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chainMap }) {
435
- return {
436
- chainId,
437
- stake: stakeViewer,
438
- store: {
439
- chainMap
440
- },
441
- head: /* @__PURE__ */ __name(async () => {
442
- const head = await findMostRecentBlock(chainArchivist);
443
- return [
444
- assertEx3(head?._hash, () => "No head found in chainArchivist"),
445
- head?.block ?? 0
446
- ];
447
- }, "head")
448
- };
449
- }
450
- __name(initStakedChainContextRead, "initStakedChainContextRead");
451
315
  async function getServer(context) {
452
316
  const { config, node: providedNode } = context;
453
317
  const { port } = context.config.api;
454
- const logger = assertEx3(context.logger, () => "Logger is required to init server");
318
+ const logger = assertEx2(context.logger, () => "Logger is required to init server");
455
319
  const statusReporter = initStatusReporter({
456
320
  logger
457
321
  });
@@ -463,16 +327,17 @@ async function getServer(context) {
463
327
  const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
464
328
  const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
465
329
  const initContext = {
330
+ _id: "init-context",
466
331
  config,
467
332
  logger,
468
333
  statusReporter,
469
334
  meterProvider,
470
- traceProvider
335
+ traceProvider,
336
+ singletons: {}
471
337
  };
472
338
  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");
339
+ const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
340
+ const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
476
341
  const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
477
342
  ...initContext,
478
343
  wallet,
@@ -480,55 +345,87 @@ async function getServer(context) {
480
345
  transfersSummaryMap,
481
346
  balancesSummaryMap
482
347
  });
483
- const chainId = stakeViewer.chainId;
484
- const mempoolViewer = await SimpleMempoolViewer2.create({
485
- ...initContext,
486
- pendingTransactionsArchivist,
487
- pendingBlocksArchivist
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);
497
- const chainMap = await initChainMap({
498
- ...context,
499
- chainArchivist: writableChainArchivist,
500
- chainId,
501
- producerAccount
502
- });
503
- const stakedChainContext = initStakedChainContextRead({
504
- ...context,
505
- chainArchivist: readonlyChainArchivist,
506
- chainId,
507
- chainMap,
508
- stakeViewer
509
- });
348
+ await writableChainArchivist.start();
349
+ await readonlyChainArchivist.start();
350
+ await pendingTransactionsArchivist.start();
351
+ await pendingBlocksArchivist.start();
352
+ const possibleHead = await findMostRecentBlock(readonlyChainArchivist);
353
+ if (!possibleHead) {
354
+ const chainId2 = (await Account.random()).address;
355
+ const chain = await createBootstrapHead(wallet, chainId2, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
356
+ const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
357
+ await writableChainArchivist.insert(payloads);
358
+ }
359
+ const head = assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
360
+ const chainId = head.chain;
510
361
  const mods = await node.resolve("*");
511
362
  await Promise.all(mods.map((mod) => {
512
363
  return mod.start?.() ?? (() => true);
513
364
  }));
514
- const blockViewer = await SimpleBlockViewer2.create({
515
- context: stakedChainContext,
516
- finalizedArchivist: readonlyChainArchivist
365
+ const chainMap = payloadMapFromStore(writableChainArchivist);
366
+ const balanceSummaryContext = {
367
+ ...initContext,
368
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
369
+ summaryMap: balancesSummaryMap,
370
+ head: /* @__PURE__ */ __name(async function() {
371
+ const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
372
+ return [
373
+ head2._hash,
374
+ head2.block
375
+ ];
376
+ }, "head"),
377
+ store: {
378
+ chainMap
379
+ },
380
+ chainId
381
+ };
382
+ const transfersSummaryContext = {
383
+ ...initContext,
384
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
385
+ summaryMap: transfersSummaryMap,
386
+ head: /* @__PURE__ */ __name(async function() {
387
+ const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
388
+ return [
389
+ head2._hash,
390
+ head2.block
391
+ ];
392
+ }, "head"),
393
+ store: {
394
+ chainMap
395
+ },
396
+ chainId
397
+ };
398
+ const locator = buildLocalProviderLocator({
399
+ context: initContext,
400
+ finalizedArchivist: writableChainArchivist,
401
+ pendingTransactionsArchivist,
402
+ pendingBlocksArchivist,
403
+ balanceSummaryContext,
404
+ transfersSummaryContext,
405
+ node
517
406
  });
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
407
  const apiContext = {
523
408
  ...initContext,
524
409
  node,
525
- config,
526
- stakedChainContext,
527
- mempoolViewer,
528
- mempoolRunner,
410
+ transfersSummaryMap,
529
411
  balancesSummaryMap,
530
- transfersSummaryMap
412
+ ...locator.context,
413
+ _id: "api-context"
531
414
  };
415
+ const blockViewer = await locator.getInstance(BlockViewerMoniker);
416
+ assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
417
+ const blk = await blockViewer.currentBlock();
418
+ assertEx2(blk, () => "No blocks found after initialization");
419
+ const accountBalanceViewer = await locator.getInstance(AccountBalanceViewerMoniker);
420
+ assertEx2(await accountBalanceViewer.start(), () => "Failed to start BlockViewer");
421
+ console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
422
+ const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
423
+ id: "validator-mempool-server",
424
+ account: wallet,
425
+ context: locator.context,
426
+ finalizedArchivist: writableChainArchivist
427
+ });
428
+ await actor?.start();
532
429
  const app = await getApp(apiContext);
533
430
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
534
431
  server.setTimeout(2e4);
@@ -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 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"]}
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 type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'\nimport { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'\nimport { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\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","/* eslint-disable max-statements */\n\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initServerNode,\n initServerWallet,\n initStatusReporter, initTransferSummaryMap,\n ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\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 { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n BalanceStepSummaryContext,\n BlockViewer,\n Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n AccountBalanceViewerMoniker,\n BlockViewerMoniker,\n findMostRecentBlock,\n flattenHydratedBlock,\n payloadMapFromStore,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { buildLocalProviderLocator } from '@xyo-network/xl1-providers'\nimport { Semaphore } from 'async-mutex'\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\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 _id: 'init-context',\n config,\n logger,\n statusReporter,\n meterProvider,\n traceProvider,\n singletons: {},\n }\n\n const wallet = await initServerWallet(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 await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (!possibleHead) {\n const chainId = (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = head.chain\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)\n\n const balanceSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balancesSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transfersSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies TransfersStepSummaryContext\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balanceSummaryContext,\n transfersSummaryContext,\n node,\n })\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\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 const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start BlockViewer')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = config.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n } satisfies ValidatorActorParams)\n\n await actor?.start()\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","XyoConnectionMoniker","rpcEngineFromConnection","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","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","Account","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initServerNode","initServerWallet","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","asAttoXL1","StepSizes","AccountBalanceViewerMoniker","BlockViewerMoniker","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","buildLocalProviderLocator","Semaphore","hostname","getServer","context","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","wallet","initServerWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","finalizedArchivist","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","console","info","actor","mempool","enabled","undefined","ValidatorActor","create","id","account","app","getApp","server","listen","log","setTimeout"]}
@@ -1,4 +1,4 @@
1
1
  import type { Express } from 'express';
2
- import type { ApiContext } from './ApiContext.ts';
2
+ import type { ApiContext } from '../ApiContext.ts';
3
3
  export declare const getApp: (context: ApiContext) => Promise<Express>;
4
4
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
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
+ {"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,kBAAkB,CAAA;AAIlD,eAAO,MAAM,MAAM,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,OAAO,CAiBjE,CAAA"}
@@ -1,4 +1,3 @@
1
- export * from './ApiContext.ts';
2
1
  export * from './app.ts';
3
2
  export * from './server.ts';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
@@ -1 +1 @@
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
+ {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBAcb,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;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,8HA8FxD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAgBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAIV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAiBtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,8HAsIxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.17.7",
3
+ "version": "1.18.0",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -54,22 +54,22 @@
54
54
  "@opentelemetry/instrumentation-http": "~0.208.0",
55
55
  "@xylabs/express": "~5.0.51",
56
56
  "@xylabs/sdk-js": "~5.0.51",
57
+ "@xyo-network/account": "~5.2.17",
57
58
  "@xyo-network/archivist-model": "~5.2.17",
58
59
  "@xyo-network/boundwitness-model": "~5.2.17",
59
- "@xyo-network/chain-orchestration": "~1.17.7",
60
- "@xyo-network/chain-protocol": "~1.17.7",
61
- "@xyo-network/chain-rpc": "~1.17.7",
62
- "@xyo-network/chain-telemetry": "~1.17.7",
63
- "@xyo-network/chain-utils": "~1.17.7",
64
- "@xyo-network/chain-viewers": "~1.17.7",
60
+ "@xyo-network/chain-orchestration": "~1.18.0",
61
+ "@xyo-network/chain-services": "~1.18.0",
62
+ "@xyo-network/chain-telemetry": "~1.18.0",
63
+ "@xyo-network/chain-utils": "~1.18.0",
65
64
  "@xyo-network/module-abstract": "~5.2.17",
66
65
  "@xyo-network/module-model": "~5.2.17",
67
66
  "@xyo-network/node-model": "~5.2.17",
68
67
  "@xyo-network/payload-builder": "~5.2.17",
69
68
  "@xyo-network/payload-model": "~5.2.17",
70
69
  "@xyo-network/xl1-protocol": "~1.14.17",
71
- "@xyo-network/xl1-protocol-sdk": "~1.17.7",
72
- "@xyo-network/xl1-rpc": "~1.17.7",
70
+ "@xyo-network/xl1-protocol-sdk": "~1.18.0",
71
+ "@xyo-network/xl1-providers": "~1.18.0",
72
+ "@xyo-network/xl1-rpc": "~1.18.0",
73
73
  "async-mutex": "~0.5.0",
74
74
  "compression": "~1.8.1",
75
75
  "cors": "~2.8.5",
@@ -82,22 +82,22 @@
82
82
  "@types/cors": "~2.8.19",
83
83
  "@types/express": "5.0.6",
84
84
  "@types/express-serve-static-core": "~5.1.0",
85
- "@types/node": "~25.0.1",
85
+ "@types/node": "~25.0.2",
86
86
  "@xylabs/sdk-js": "~5.0.51",
87
- "@xylabs/ts-scripts-yarn3": "~7.2.30",
88
- "@xylabs/tsconfig": "~7.2.30",
87
+ "@xylabs/ts-scripts-yarn3": "~7.2.32",
88
+ "@xylabs/tsconfig": "~7.2.32",
89
89
  "@xyo-network/account": "~5.2.17",
90
90
  "@xyo-network/account-model": "~5.2.17",
91
91
  "@xyo-network/archivist-abstract": "~5.2.17",
92
92
  "@xyo-network/bios-model": "~7.2.0",
93
93
  "@xyo-network/boundwitness-builder": "~5.2.17",
94
- "@xyo-network/chain-services": "~1.17.7",
94
+ "@xyo-network/chain-services": "~1.18.0",
95
95
  "@xyo-network/module-abstract-mongodb": "~5.2.17",
96
96
  "@xyo-network/module-model-mongodb": "~5.2.17",
97
97
  "@xyo-network/node-memory": "~5.2.17",
98
98
  "@xyo-network/xl1-protocol": "~1.14.17",
99
99
  "dotenv": "~17.2.3",
100
- "eslint": "^9.39.1",
100
+ "eslint": "^9.39.2",
101
101
  "nodemon": "~3.1.11",
102
102
  "tslib": "~2.8.1",
103
103
  "typescript": "~5.9.3",
@@ -1,18 +1,12 @@
1
1
  import type { NodeInstance } from '@xyo-network/node-model'
2
2
  import type { WithStorageMeta } from '@xyo-network/payload-model'
3
3
  import type {
4
- BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead,
4
+ BalancesStepSummary, CreatableProviderContext, MapType,
5
5
  TransfersStepSummary,
6
6
  } from '@xyo-network/xl1-protocol-sdk'
7
7
 
8
- import type { AppContext } from '../model.ts'
9
-
10
- export interface ApiContext extends AppContext {
8
+ export interface ApiContext extends CreatableProviderContext {
11
9
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
12
- config: Config
13
- mempoolRunner: MempoolRunner
14
- mempoolViewer: MempoolViewer
15
10
  node: NodeInstance
16
- stakedChainContext: StakedChainContextRead
17
11
  transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>
18
12
  }
package/src/server/app.ts CHANGED
@@ -13,7 +13,7 @@ import cors from 'cors'
13
13
  import type { Express } from 'express'
14
14
  import express from 'express'
15
15
 
16
- import type { ApiContext } from './ApiContext.ts'
16
+ import type { ApiContext } from '../ApiContext.ts'
17
17
  import { addInstrumentation } from './instrumentation.ts'
18
18
  import { addRoutes } from './routes/index.ts'
19
19
 
@@ -1,3 +1,2 @@
1
- export * from './ApiContext.ts'
2
1
  export * from './app.ts'
3
2
  export * from './server.ts'
@@ -1,137 +1,16 @@
1
1
  import { setRawResponseFormat } from '@xylabs/express'
2
- import { assertEx } from '@xylabs/sdk-js'
3
- import { asArchivistInstance } from '@xyo-network/archivist-model'
4
- import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from '@xyo-network/chain-orchestration'
5
- import { NodeXyoViewer } from '@xyo-network/chain-rpc'
6
- import {
7
- SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
8
- } from '@xyo-network/chain-viewers'
9
- import type { NodeInstance } from '@xyo-network/node-model'
10
- import { StepSizes } from '@xyo-network/xl1-protocol'
11
- import type {
12
- BalanceStepSummaryContext,
13
- NetworkStakeStepRewardsViewer,
14
- TransfersStepSummaryContext,
15
- } from '@xyo-network/xl1-protocol-sdk'
16
- import {
17
- NetworkStakeStepRewardsViewerMoniker,
18
- RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
19
- SimpleMempoolViewer,
20
- } from '@xyo-network/xl1-protocol-sdk'
21
- import {
22
- NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,
23
- } from '@xyo-network/xl1-rpc'
24
- import { Semaphore } from 'async-mutex'
2
+ import type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'
3
+ import { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'
4
+ import { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'
25
5
  import type { Express } from 'express'
26
6
 
27
- async function chainArchivistFromNode(node: NodeInstance) {
28
- const chainArchivist = assertEx(asArchivistInstance(
29
- await node.resolve('Chain:Validated'),
30
- { required: true },
31
- ), () => 'FinalizedArchivist not found in node')
32
- return chainArchivist
33
- }
34
-
35
- // eslint-disable-next-line max-statements
36
7
  export const addRpcRoutes = async (
37
8
  app: Express,
38
9
  ) => {
39
10
  const { context } = app
40
- const {
41
- node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,
42
- } = context
43
-
44
- const finalizedArchivist = await chainArchivistFromNode(node)
45
-
46
- const balancesStepSummaryContext = {
47
- head: stakedChainContext.head,
48
- stepSemaphores: StepSizes.map(() => new Semaphore(20)),
49
- store: stakedChainContext.store,
50
- chainId: stakedChainContext.chainId,
51
- summaryMap: balancesSummaryMap,
52
- } satisfies BalanceStepSummaryContext
53
-
54
- const transfersSummaryContext = {
55
- head: stakedChainContext.head,
56
- stepSemaphores: StepSizes.map(() => new Semaphore(20)),
57
- store: stakedChainContext.store,
58
- chainId: stakedChainContext.chainId,
59
- summaryMap: transfersSummaryMap,
60
- } satisfies TransfersStepSummaryContext
61
-
62
- const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
63
- const pendingBlocksArchivist = await initPendingBlocksArchivist(context)
64
- const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)
65
-
66
- console.log('Initializing SimpleNetworkStakeViewer...')
67
- assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
68
- console.log('Initialized SimpleNetworkStakeViewer.')
69
-
70
- const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })
71
-
72
- console.log('Initializing SimpleBlockViewer...')
73
- assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')
74
- console.log('Initialized SimpleBlockViewer.')
75
-
76
- const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
77
- blockViewer,
78
- context: balancesStepSummaryContext,
79
- transfersSummaryContext,
80
- })
81
-
82
- console.log('Initializing SimpleAccountBalanceViewer...')
83
- assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
84
- console.log('Initialized SimpleAccountBalanceViewer.')
85
-
86
- const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
87
- context: stakedChainContext,
88
- rewardMultipliers: RewardMultipliers,
89
- })
90
-
91
- console.log('Initializing SimpleStepRewardsByPositionViewer...')
92
- assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')
93
- console.log('Initialized SimpleStepRewardsByPositionViewer.')
94
-
95
- const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {
96
- moniker: NetworkStakeStepRewardsViewerMoniker,
97
- position: stepRewardsByPositionViewer,
98
- }
99
- const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })
100
-
101
- console.log('Initializing SimpleStepViewer...')
102
- assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')
103
- console.log('Initialized SimpleStepViewer.')
104
-
105
- const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })
106
-
107
- console.log('Initializing SimpleMempoolViewer...')
108
- assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')
109
- console.log('Initialized SimpleMempoolViewer.')
110
-
111
- const viewer = await NodeXyoViewer.create({
112
- node,
113
- rewardMultipliers: RewardMultipliers,
114
- initRewardsCache: config.api.initRewardsCache,
115
- blockViewer,
116
- context: stakedChainContext,
117
- networkStakeViewer,
118
- accountBalanceViewer,
119
- stepViewer,
120
- transfersSummaryContext,
121
- mempoolViewer,
122
- })
123
-
124
- console.log('Initializing NodeXyoViewer...')
125
- assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')
126
- console.log('Initialized NodeXyoViewer.')
127
-
128
- const runner = await NodeXyoRunner.create({ node })
129
-
130
- console.log('Initializing NodeXyoRunner...')
131
- assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')
132
- console.log('Initialized NodeXyoRunner.')
11
+ const { locator } = context
133
12
 
134
- const connection = new XyoBaseConnection({ runner, viewer })
13
+ const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)
135
14
  const engine = rpcEngineFromConnection(connection)
136
15
 
137
16
  app.post('/rpc', (req, res) => {
@@ -1,36 +1,42 @@
1
+ /* eslint-disable max-statements */
2
+
1
3
  import type { Hash, Logger } from '@xylabs/sdk-js'
2
4
  import { assertEx } from '@xylabs/sdk-js'
3
- import type { AccountInstance } from '@xyo-network/account-model'
4
- import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
- import type { ConfigContext } from '@xyo-network/chain-orchestration'
5
+ import { Account } from '@xyo-network/account'
6
+ import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
6
7
  import {
7
8
  buildTelemetryConfig,
8
- createProducerChainStakeIntentBlock,
9
9
  initBalanceSummaryMap,
10
10
  initHealthEndpoints,
11
- initProducerAccount,
12
11
  initServerNode,
13
12
  initServerWallet,
14
- initStakeViewer, initStatusReporter, initTransferSummaryMap,
13
+ initStatusReporter, initTransferSummaryMap,
14
+ ValidatorActor,
15
15
  } from '@xyo-network/chain-orchestration'
16
- import { createGenesisBlock } from '@xyo-network/chain-protocol'
16
+ import { createBootstrapHead } from '@xyo-network/chain-services'
17
17
  import { initTelemetry } from '@xyo-network/chain-telemetry'
18
18
  import { startupSpanAsync } from '@xyo-network/chain-utils'
19
19
  import type { NodeInstance } from '@xyo-network/node-model'
20
20
  import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
21
- import type { ChainId } from '@xyo-network/xl1-protocol'
22
- import {
23
- asXL1, asXL1BlockRange, XL1Amount,
24
- } from '@xyo-network/xl1-protocol'
21
+ import { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'
25
22
  import type {
26
- Config, PayloadMapRead, SimpleBlockViewerParams, StakedChainContextRead,
27
- StakeViewer,
23
+ AccountBalanceViewer,
24
+ BalanceStepSummaryContext,
25
+ BlockViewer,
26
+ Config,
27
+ TransfersStepSummaryContext,
28
28
  } from '@xyo-network/xl1-protocol-sdk'
29
29
  import {
30
- findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
30
+ AccountBalanceViewerMoniker,
31
+ BlockViewerMoniker,
32
+ findMostRecentBlock,
33
+ flattenHydratedBlock,
34
+ payloadMapFromStore,
31
35
  } from '@xyo-network/xl1-protocol-sdk'
36
+ import { buildLocalProviderLocator } from '@xyo-network/xl1-providers'
37
+ import { Semaphore } from 'async-mutex'
32
38
 
33
- import type { ApiContext } from './ApiContext.ts'
39
+ import type { ApiContext } from '../ApiContext.ts'
34
40
  import { getApp } from './app.ts'
35
41
 
36
42
  const hostname = '::'
@@ -42,51 +48,6 @@ interface GetServerContext {
42
48
  node?: NodeInstance
43
49
  }
44
50
 
45
- async function initChainMap({
46
- chainArchivist, chainId, logger, config, producerAccount,
47
- }: ConfigContext<{
48
- chainArchivist: ArchivistInstance
49
- chainId: ChainId
50
- producerAccount: AccountInstance
51
- }>) {
52
- const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
53
-
54
- const payloads = await chainArchivist.next({ limit: 1 })
55
-
56
- if (payloads.length === 0) {
57
- logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
58
- const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
59
- const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
60
- await chainArchivist.insert(flattenHydratedBlock(block0))
61
- console.log('[API] Genesis block created and inserted into chain archivist')
62
- const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
63
- await chainArchivist.insert(flattenHydratedBlock(block1))
64
- console.log(`[API] Producer declared: ${producerAccount.address}`)
65
- }
66
-
67
- return chainMap
68
- }
69
-
70
- function initStakedChainContextRead({
71
- chainArchivist, chainId, stakeViewer, chainMap,
72
- }: ConfigContext<{
73
- chainArchivist: ArchivistInstance
74
- chainId: ChainId
75
- chainMap: PayloadMapRead<WithStorageMeta<Payload>>
76
- stakeViewer: StakeViewer
77
- }>) {
78
- return {
79
- chainId,
80
- stake: stakeViewer,
81
- store: { chainMap },
82
- head: async (): Promise<[Hash, number]> => {
83
- const head = await findMostRecentBlock(chainArchivist)
84
- return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
85
- },
86
- } satisfies StakedChainContextRead
87
- }
88
-
89
- // eslint-disable-next-line max-statements
90
51
  export async function getServer(context: GetServerContext) {
91
52
  const { config, node: providedNode } = context
92
53
  const { port } = context.config.api
@@ -104,11 +65,16 @@ export async function getServer(context: GetServerContext) {
104
65
  const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
105
66
 
106
67
  const initContext = {
107
- config, logger, statusReporter, meterProvider, traceProvider,
68
+ _id: 'init-context',
69
+ config,
70
+ logger,
71
+ statusReporter,
72
+ meterProvider,
73
+ traceProvider,
74
+ singletons: {},
108
75
  }
109
76
 
110
77
  const wallet = await initServerWallet(initContext)
111
- const stakeViewer = await initStakeViewer(initContext)
112
78
 
113
79
  const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
114
80
  const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
@@ -123,59 +89,94 @@ export async function getServer(context: GetServerContext) {
123
89
  balancesSummaryMap,
124
90
  })
125
91
 
126
- const chainId = stakeViewer.chainId
92
+ await writableChainArchivist.start()
93
+ await readonlyChainArchivist.start()
94
+ await pendingTransactionsArchivist.start()
95
+ await pendingBlocksArchivist.start()
96
+
97
+ const possibleHead = await findMostRecentBlock(readonlyChainArchivist)
98
+ if (!possibleHead) {
99
+ const chainId = (await Account.random()).address
100
+ // If there is no head, create one
101
+ const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)
102
+ const payloads = chain.flatMap(block => flattenHydratedBlock(block))
103
+ await writableChainArchivist.insert(payloads)
104
+ }
105
+
106
+ const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
107
+ const chainId = head.chain
127
108
 
128
- const mempoolViewer = await SimpleMempoolViewer.create({
109
+ const mods = await node.resolve('*')
110
+ await Promise.all(mods.map((mod) => {
111
+ return mod.start?.() ?? (() => true)
112
+ }))
113
+
114
+ const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)
115
+
116
+ const balanceSummaryContext = {
129
117
  ...initContext,
130
- pendingTransactionsArchivist,
131
- pendingBlocksArchivist,
132
- })
133
- assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')
118
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
119
+ summaryMap: balancesSummaryMap,
120
+ head: async function (): Promise<[Hash, number]> {
121
+ const head = assertEx(await findMostRecentBlock(writableChainArchivist))
122
+ return [head._hash, head.block]
123
+ },
124
+ store: { chainMap },
125
+ chainId,
126
+ } satisfies BalanceStepSummaryContext
134
127
 
135
- const mempoolRunner = await SimpleMempoolRunner.create({
128
+ const transfersSummaryContext = {
136
129
  ...initContext,
130
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
131
+ summaryMap: transfersSummaryMap,
132
+ head: async function (): Promise<[Hash, number]> {
133
+ const head = assertEx(await findMostRecentBlock(writableChainArchivist))
134
+ return [head._hash, head.block]
135
+ },
136
+ store: { chainMap },
137
+ chainId,
138
+ } satisfies TransfersStepSummaryContext
139
+
140
+ const locator = buildLocalProviderLocator({
141
+ context: initContext,
142
+ finalizedArchivist: writableChainArchivist,
137
143
  pendingTransactionsArchivist,
138
144
  pendingBlocksArchivist,
145
+ balanceSummaryContext,
146
+ transfersSummaryContext,
147
+ node,
139
148
  })
140
- assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')
141
-
142
- const producerAccount = await initProducerAccount(initContext)
143
-
144
- const chainMap = await initChainMap({
145
- ...context, chainArchivist: writableChainArchivist, chainId, producerAccount,
146
- })
147
-
148
- const stakedChainContext = initStakedChainContextRead({
149
- ...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
150
- })
151
-
152
- const mods = await node.resolve('*')
153
- await Promise.all(mods.map((mod) => {
154
- return mod.start?.() ?? (() => true)
155
- }))
156
149
 
157
- const blockViewer = await SimpleBlockViewer.create({
158
- context: stakedChainContext,
159
- finalizedArchivist: readonlyChainArchivist,
160
- } satisfies SimpleBlockViewerParams)
150
+ const apiContext = {
151
+ ...initContext,
152
+ node,
153
+ transfersSummaryMap,
154
+ balancesSummaryMap,
155
+ ...locator.context,
156
+ _id: 'api-context',
157
+ } satisfies ApiContext
161
158
 
159
+ const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))
162
160
  assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
163
161
 
164
162
  const blk = await blockViewer.currentBlock()
165
163
  assertEx(blk, () => 'No blocks found after initialization')
166
164
 
165
+ const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))
166
+ assertEx(await accountBalanceViewer.start(), () => 'Failed to start BlockViewer')
167
+
167
168
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
168
169
 
169
- const apiContext: ApiContext = {
170
- ...initContext,
171
- node,
172
- config,
173
- stakedChainContext,
174
- mempoolViewer,
175
- mempoolRunner,
176
- balancesSummaryMap,
177
- transfersSummaryMap,
178
- }
170
+ const actor = config.mempool.enabled
171
+ ? undefined
172
+ : await ValidatorActor.create({
173
+ id: 'validator-mempool-server',
174
+ account: wallet,
175
+ context: locator.context,
176
+ finalizedArchivist: writableChainArchivist,
177
+ } satisfies ValidatorActorParams)
178
+
179
+ await actor?.start()
179
180
 
180
181
  const app = await getApp(apiContext)
181
182
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
@@ -1,14 +0,0 @@
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
@@ -1 +0,0 @@
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"}