@xyo-network/chain-api 1.17.7 → 1.18.0-rc.1

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 { 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,81 @@ 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
+ const possibleHead = await findMostRecentBlock(readonlyChainArchivist);
349
+ if (!possibleHead) {
350
+ const chainId2 = (await Account.random()).address;
351
+ const chain = await createBootstrapHead(wallet, chainId2, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
352
+ const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
353
+ await writableChainArchivist.insert(payloads);
354
+ }
355
+ const head = assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
356
+ const chainId = head.chain;
510
357
  const mods = await node.resolve("*");
511
358
  await Promise.all(mods.map((mod) => {
512
359
  return mod.start?.() ?? (() => true);
513
360
  }));
514
- const blockViewer = await SimpleBlockViewer2.create({
515
- context: stakedChainContext,
516
- finalizedArchivist: readonlyChainArchivist
361
+ const chainMap = payloadMapFromStore(writableChainArchivist);
362
+ const balanceSummaryContext = {
363
+ ...initContext,
364
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
365
+ summaryMap: balancesSummaryMap,
366
+ head: /* @__PURE__ */ __name(async function() {
367
+ const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
368
+ return [
369
+ head2._hash,
370
+ head2.block
371
+ ];
372
+ }, "head"),
373
+ store: {
374
+ chainMap
375
+ },
376
+ chainId
377
+ };
378
+ const transfersSummaryContext = {
379
+ ...initContext,
380
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
381
+ summaryMap: transfersSummaryMap,
382
+ head: /* @__PURE__ */ __name(async function() {
383
+ const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
384
+ return [
385
+ head2._hash,
386
+ head2.block
387
+ ];
388
+ }, "head"),
389
+ store: {
390
+ chainMap
391
+ },
392
+ chainId
393
+ };
394
+ const locator = buildLocalProviderLocator({
395
+ context: initContext,
396
+ finalizedArchivist: writableChainArchivist,
397
+ pendingTransactionsArchivist,
398
+ pendingBlocksArchivist,
399
+ balanceSummaryContext,
400
+ transfersSummaryContext,
401
+ node
517
402
  });
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
403
  const apiContext = {
523
404
  ...initContext,
524
405
  node,
525
- config,
526
- stakedChainContext,
527
- mempoolViewer,
528
- mempoolRunner,
406
+ transfersSummaryMap,
529
407
  balancesSummaryMap,
530
- transfersSummaryMap
408
+ ...locator.context,
409
+ _id: "api-context"
531
410
  };
411
+ const blockViewer = await locator.getInstance(BlockViewerMoniker);
412
+ assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
413
+ const blk = await blockViewer.currentBlock();
414
+ assertEx2(blk, () => "No blocks found after initialization");
415
+ console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
416
+ const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
417
+ id: "validator-mempool-server",
418
+ account: wallet,
419
+ context: locator.context,
420
+ finalizedArchivist: writableChainArchivist
421
+ });
422
+ await actor?.start();
532
423
  const app = await getApp(apiContext);
533
424
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
534
425
  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 BalanceStepSummaryContext,\n BlockViewer,\n Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\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 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 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","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","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","start","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","finalizedArchivist","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","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,EAGV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAgBtC,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,8HA8HxD"}
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-rc.1",
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-rc.1",
61
+ "@xyo-network/chain-services": "~1.18.0-rc.1",
62
+ "@xyo-network/chain-telemetry": "~1.18.0-rc.1",
63
+ "@xyo-network/chain-utils": "~1.18.0-rc.1",
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-rc.1",
71
+ "@xyo-network/xl1-providers": "~1.18.0-rc.1",
72
+ "@xyo-network/xl1-rpc": "~1.18.0-rc.1",
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-rc.1",
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",
@@ -110,5 +110,6 @@
110
110
  "engineStrict": true,
111
111
  "publishConfig": {
112
112
  "access": "restricted"
113
- }
113
+ },
114
+ "stableVersion": "1.17.7"
114
115
  }
@@ -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,40 @@
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
+ BalanceStepSummaryContext,
24
+ BlockViewer,
25
+ Config,
26
+ TransfersStepSummaryContext,
28
27
  } from '@xyo-network/xl1-protocol-sdk'
29
28
  import {
30
- findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
29
+ BlockViewerMoniker,
30
+ findMostRecentBlock,
31
+ flattenHydratedBlock,
32
+ payloadMapFromStore,
31
33
  } from '@xyo-network/xl1-protocol-sdk'
34
+ import { buildLocalProviderLocator } from '@xyo-network/xl1-providers'
35
+ import { Semaphore } from 'async-mutex'
32
36
 
33
- import type { ApiContext } from './ApiContext.ts'
37
+ import type { ApiContext } from '../ApiContext.ts'
34
38
  import { getApp } from './app.ts'
35
39
 
36
40
  const hostname = '::'
@@ -42,51 +46,6 @@ interface GetServerContext {
42
46
  node?: NodeInstance
43
47
  }
44
48
 
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
49
  export async function getServer(context: GetServerContext) {
91
50
  const { config, node: providedNode } = context
92
51
  const { port } = context.config.api
@@ -104,11 +63,16 @@ export async function getServer(context: GetServerContext) {
104
63
  const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
105
64
 
106
65
  const initContext = {
107
- config, logger, statusReporter, meterProvider, traceProvider,
66
+ _id: 'init-context',
67
+ config,
68
+ logger,
69
+ statusReporter,
70
+ meterProvider,
71
+ traceProvider,
72
+ singletons: {},
108
73
  }
109
74
 
110
75
  const wallet = await initServerWallet(initContext)
111
- const stakeViewer = await initStakeViewer(initContext)
112
76
 
113
77
  const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
114
78
  const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
@@ -123,42 +87,69 @@ export async function getServer(context: GetServerContext) {
123
87
  balancesSummaryMap,
124
88
  })
125
89
 
126
- const chainId = stakeViewer.chainId
90
+ const possibleHead = await findMostRecentBlock(readonlyChainArchivist)
91
+ if (!possibleHead) {
92
+ const chainId = (await Account.random()).address
93
+ // If there is no head, create one
94
+ const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)
95
+ const payloads = chain.flatMap(block => flattenHydratedBlock(block))
96
+ await writableChainArchivist.insert(payloads)
97
+ }
98
+
99
+ const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
100
+ const chainId = head.chain
101
+
102
+ const mods = await node.resolve('*')
103
+ await Promise.all(mods.map((mod) => {
104
+ return mod.start?.() ?? (() => true)
105
+ }))
106
+
107
+ const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)
127
108
 
128
- const mempoolViewer = await SimpleMempoolViewer.create({
109
+ const balanceSummaryContext = {
129
110
  ...initContext,
130
- pendingTransactionsArchivist,
131
- pendingBlocksArchivist,
132
- })
133
- assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')
111
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
112
+ summaryMap: balancesSummaryMap,
113
+ head: async function (): Promise<[Hash, number]> {
114
+ const head = assertEx(await findMostRecentBlock(writableChainArchivist))
115
+ return [head._hash, head.block]
116
+ },
117
+ store: { chainMap },
118
+ chainId,
119
+ } satisfies BalanceStepSummaryContext
134
120
 
135
- const mempoolRunner = await SimpleMempoolRunner.create({
121
+ const transfersSummaryContext = {
136
122
  ...initContext,
123
+ stepSemaphores: StepSizes.map(() => new Semaphore(20)),
124
+ summaryMap: transfersSummaryMap,
125
+ head: async function (): Promise<[Hash, number]> {
126
+ const head = assertEx(await findMostRecentBlock(writableChainArchivist))
127
+ return [head._hash, head.block]
128
+ },
129
+ store: { chainMap },
130
+ chainId,
131
+ } satisfies TransfersStepSummaryContext
132
+
133
+ const locator = buildLocalProviderLocator({
134
+ context: initContext,
135
+ finalizedArchivist: writableChainArchivist,
137
136
  pendingTransactionsArchivist,
138
137
  pendingBlocksArchivist,
138
+ balanceSummaryContext,
139
+ transfersSummaryContext,
140
+ node,
139
141
  })
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
142
 
157
- const blockViewer = await SimpleBlockViewer.create({
158
- context: stakedChainContext,
159
- finalizedArchivist: readonlyChainArchivist,
160
- } satisfies SimpleBlockViewerParams)
143
+ const apiContext = {
144
+ ...initContext,
145
+ node,
146
+ transfersSummaryMap,
147
+ balancesSummaryMap,
148
+ ...locator.context,
149
+ _id: 'api-context',
150
+ } satisfies ApiContext
161
151
 
152
+ const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))
162
153
  assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
163
154
 
164
155
  const blk = await blockViewer.currentBlock()
@@ -166,16 +157,16 @@ export async function getServer(context: GetServerContext) {
166
157
 
167
158
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
168
159
 
169
- const apiContext: ApiContext = {
170
- ...initContext,
171
- node,
172
- config,
173
- stakedChainContext,
174
- mempoolViewer,
175
- mempoolRunner,
176
- balancesSummaryMap,
177
- transfersSummaryMap,
178
- }
160
+ const actor = config.mempool.enabled
161
+ ? undefined
162
+ : await ValidatorActor.create({
163
+ id: 'validator-mempool-server',
164
+ account: wallet,
165
+ context: locator.context,
166
+ finalizedArchivist: writableChainArchivist,
167
+ } satisfies ValidatorActorParams)
168
+
169
+ await actor?.start()
179
170
 
180
171
  const app = await getApp(apiContext)
181
172
  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"}