@xyo-network/chain-api 1.19.3 → 1.19.5

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.
@@ -307,13 +307,14 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
307
307
  // src/server/server.ts
308
308
  import { asAddress as asAddress3, assertEx as assertEx2, toEthAddress } from "@xylabs/sdk-js";
309
309
  import { Account } from "@xyo-network/account";
310
- import { EthereumChainStakeEventsViewer, EthereumChainStakeViewer, EvmChainContractViewer } from "@xyo-network/chain-ethereum";
311
- import { buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
310
+ import { EvmChainContractViewer, EvmStakeEventsViewer, EvmStakeViewer } from "@xyo-network/chain-ethereum";
311
+ import { buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor } from "@xyo-network/chain-orchestration";
312
312
  import { createBootstrapHead } from "@xyo-network/chain-services";
313
313
  import { initTelemetry } from "@xyo-network/chain-telemetry";
314
314
  import { startupSpanAsync } from "@xyo-network/chain-utils";
315
+ import { validateHydratedBlock, validateHydratedBlockState } from "@xyo-network/chain-validation";
315
316
  import { IStakedXyoChain__factory } from "@xyo-network/typechain";
316
- import { AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
317
+ import { AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock, MempoolRunnerMoniker, MempoolViewerMoniker, payloadMapFromStore, SimpleBlockValidationViewer, SimpleTimeSyncViewer, StepSizes, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
317
318
  import { Semaphore } from "async-mutex";
318
319
  var hostname = "::";
319
320
  async function getServer(params) {
@@ -419,6 +420,10 @@ async function getServer(params) {
419
420
  node,
420
421
  chainId
421
422
  });
423
+ locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
424
+ state: validateHydratedBlockState,
425
+ protocol: validateHydratedBlock
426
+ }));
422
427
  if (canUseEvmProvider({
423
428
  config
424
429
  })) {
@@ -428,12 +433,12 @@ async function getServer(params) {
428
433
  });
429
434
  const contractAddress = assertEx2(config.chain.id, () => "Missing config.chain.chainId");
430
435
  const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider);
431
- locator.register(EthereumChainStakeEventsViewer.factory(EthereumChainStakeEventsViewer.dependencies, {
436
+ locator.register(EvmStakeEventsViewer.factory(EvmStakeEventsViewer.dependencies, {
432
437
  contract
433
438
  }));
434
- const stakeEventsViewer = await locator.getInstance(EthereumChainStakeEventsViewer.defaultMoniker);
435
- assertEx2(await stakeEventsViewer.start(), () => "Failed to start EthereumChainStakeEventsViewer");
436
- locator.register(EthereumChainStakeViewer.factory(EthereumChainStakeViewer.dependencies, {
439
+ const stakeEventsViewer = await locator.getInstance(EvmStakeEventsViewer.defaultMoniker);
440
+ assertEx2(await stakeEventsViewer.start(), () => "Failed to start EvmStakeEventsViewer");
441
+ locator.register(EvmStakeViewer.factory(EvmStakeViewer.dependencies, {
437
442
  contract,
438
443
  stakeEventsViewer
439
444
  }));
@@ -441,6 +446,9 @@ async function getServer(params) {
441
446
  address: asAddress3(contractAddress, true),
442
447
  runner: provider
443
448
  }));
449
+ locator.register(SimpleTimeSyncViewer.factory(SimpleTimeSyncViewer.dependencies, {
450
+ ethProvider: provider
451
+ }));
444
452
  }
445
453
  const apiContext = {
446
454
  ...initContext,
@@ -458,14 +466,29 @@ async function getServer(params) {
458
466
  assertEx2(await accountBalanceViewer.start(), () => "Failed to start AccountBalanceViewer");
459
467
  const xyoViewer = await locator.getInstance(XyoViewerMoniker);
460
468
  assertEx2(await xyoViewer.start(), () => "Failed to start XyoViewer");
469
+ const mempoolViewer = await locator.getInstance(MempoolViewerMoniker);
470
+ assertEx2(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
471
+ const mempoolRunner = await locator.getInstance(MempoolRunnerMoniker);
472
+ assertEx2(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
461
473
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
462
- const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
474
+ const validatorActor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
463
475
  id: "validator-mempool-server",
464
476
  account: wallet,
465
477
  context: locator.context,
466
- finalizedArchivist: writableChainArchivist
478
+ finalizedArchivist: writableChainArchivist,
479
+ mempoolViewer,
480
+ blockViewer
481
+ });
482
+ await validatorActor?.start();
483
+ const mempoolActor = config.mempool.enabled ? void 0 : await MempoolActor.create({
484
+ id: "mempool-mempool-server",
485
+ account: wallet,
486
+ context: locator.context,
487
+ mempoolRunner,
488
+ pendingBlocksArchivist,
489
+ pendingTransactionsArchivist
467
490
  });
468
- await actor?.start();
491
+ await mempoolActor?.start();
469
492
  const app = await getApp(apiContext);
470
493
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
471
494
  server.setTimeout(2e4);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { Actor, ActorParams } from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n static override async paramsHandler<T extends ApiActor>(params?: Partial<T['params']>) {\n const logger = params?.context?.logger\n\n const account = params?.account ?? await Account.random()\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler({\n ...params,\n account,\n }),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer({ config: this.config, logger: this.logger })\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","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-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\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 */\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport {\n asAddress,\n assertEx, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport {\n EthereumChainStakeEventsViewer, EthereumChainStakeViewer, EvmChainContractViewer,\n} from '@xyo-network/chain-ethereum'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, 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 { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type {\n AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, ChainId, Config,\n TransfersStepSummaryContext,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,\n DefaultMetricsScrapePorts,\n findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\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(params: GetServerContext) {\n const { config, node: providedNode } = params\n const { port } = params.config.api\n const { id: configuredChainId } = config.chain\n\n const logger = assertEx(params.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', DefaultMetricsScrapePorts.api)\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 timeBudgetLimit: 1000,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {\n throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)\n }\n\n let possibleChainId: ChainId | undefined = configuredChainId\n\n // if there is no configured chain ID and no head, create a new chain\n if (!possibleHead) {\n possibleChainId = possibleChainId ?? (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(\n wallet,\n possibleChainId,\n asAttoXL1(20_000_000_000_000_000_000_000n),\n config.chain.genesisRewardAddress ?? wallet.address,\n )\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')\n assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [init]')\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 assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [balanceSummaryContext]')\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 assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [transfersSummaryContext]')\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 chainId,\n })\n\n // Conditionally register ETH viewers if enabled in config\n if (canUseEvmProvider({ config })) {\n const provider = await initEvmProvider({ config, logger })\n const contractAddress = assertEx(config.chain.id, () => 'Missing config.chain.chainId') as string\n // Connect to the contract\n const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider)\n\n // Register the contract events viewer\n locator.register(EthereumChainStakeEventsViewer.factory<EthereumChainStakeEventsViewer>(\n EthereumChainStakeEventsViewer.dependencies,\n { contract },\n ))\n\n // Get an instance of the events viewer to pass to the stake viewer\n const stakeEventsViewer = (await locator.getInstance<EthereumChainStakeEventsViewer>(EthereumChainStakeEventsViewer.defaultMoniker))\n assertEx(await stakeEventsViewer.start(), () => 'Failed to start EthereumChainStakeEventsViewer')\n\n // Register the stake viewer\n locator.register(EthereumChainStakeViewer.factory<EthereumChainStakeViewer>(\n EthereumChainStakeViewer.dependencies,\n { contract, stakeEventsViewer },\n ))\n\n // Register the contract viewer\n locator.register(EvmChainContractViewer.factory<EvmChainContractViewer>(\n EvmChainContractViewer.dependencies,\n { address: asAddress(contractAddress, true), runner: provider },\n ))\n }\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))\n assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')\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","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport type {\n BaseContext, Config, ProviderFactoryLocatorInstance,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n locator?: ProviderFactoryLocatorInstance\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, logger, orchestrator, locator,\n}: RunApiContext) => {\n const localLogger = logger ?? new IdLogger(logger ?? console, () => 'ResolveHelper [runApi]')\n const account = await Account.random()\n localLogger.info(`Running api for account ${account.address} [random]`)\n\n // Create actors\n const api = await ApiActor.create({\n logger,\n context: {\n config, locator, singletons: {}, logger, caches: {},\n },\n })\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["creatable","Account","Actor","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","rpcEngineFromConnection","XyoConnectionMoniker","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","asAddress","assertEx","toEthAddress","Account","EthereumChainStakeEventsViewer","EthereumChainStakeViewer","EvmChainContractViewer","buildTelemetryConfig","canUseEvmProvider","initApiWallet","initBalanceSummaryMap","initEvmProvider","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","IStakedXyoChain__factory","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","StepSizes","XyoViewerMoniker","Semaphore","hostname","getServer","params","config","node","providedNode","port","api","id","configuredChainId","chain","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","traceProvider","meterProvider","initTelemetry","initContext","_id","timeBudgetLimit","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","Error","possibleChainId","Account","random","address","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","chainId","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","context","finalizedArchivist","canUseEvmProvider","provider","initEvmProvider","contractAddress","contract","IStakedXyoChain__factory","connect","toEthAddress","register","EthereumChainStakeEventsViewer","factory","dependencies","stakeEventsViewer","getInstance","defaultMoniker","EthereumChainStakeViewer","EvmChainContractViewer","asAddress","runner","apiContext","blockViewer","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","xyoViewer","XyoViewerMoniker","console","info","actor","mempool","enabled","undefined","ValidatorActor","create","account","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","paramsHandler","params","logger","context","account","Account","random","info","address","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","config","close","undefined","exists","IdLogger","Account","runApi","config","logger","orchestrator","locator","localLogger","IdLogger","console","account","Account","random","info","address","api","ApiActor","create","context","singletons","caches","actors","filter","exists","actor","registerActor","start"]}
1
+ {"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { Actor, ActorParams } from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n static override async paramsHandler<T extends ApiActor>(params?: Partial<T['params']>) {\n const logger = params?.context?.logger\n\n const account = params?.account ?? await Account.random()\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler({\n ...params,\n account,\n }),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer({ config: this.config, logger: this.logger })\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","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-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\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 */\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport {\n asAddress,\n assertEx, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport {\n EvmChainContractViewer,\n EvmStakeEventsViewer, EvmStakeViewer,\n} from '@xyo-network/chain-ethereum'\nimport type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, MempoolActor, 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 { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type {\n AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, ChainId, Config,\n MempoolRunner,\n MempoolViewer,\n TransfersStepSummaryContext,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock,\n MempoolRunnerMoniker, MempoolViewerMoniker, payloadMapFromStore, SimpleBlockValidationViewer, SimpleTimeSyncViewer, StepSizes,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\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(params: GetServerContext) {\n const { config, node: providedNode } = params\n const { port } = params.config.api\n const { id: configuredChainId } = config.chain\n\n const logger = assertEx(params.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', DefaultMetricsScrapePorts.api)\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 timeBudgetLimit: 1000,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {\n throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)\n }\n\n let possibleChainId: ChainId | undefined = configuredChainId\n\n // if there is no configured chain ID and no head, create a new chain\n if (!possibleHead) {\n possibleChainId = possibleChainId ?? (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(\n wallet,\n possibleChainId,\n asAttoXL1(20_000_000_000_000_000_000_000n),\n config.chain.genesisRewardAddress ?? wallet.address,\n )\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')\n assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [init]')\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 assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [balanceSummaryContext]')\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 assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [transfersSummaryContext]')\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 chainId,\n })\n\n locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n SimpleBlockValidationViewer.dependencies,\n { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n ))\n\n // Conditionally register ETH viewers if enabled in config\n if (canUseEvmProvider({ config })) {\n const provider = await initEvmProvider({ config, logger })\n const contractAddress = assertEx(config.chain.id, () => 'Missing config.chain.chainId') as string\n // Connect to the contract\n const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider)\n\n // Register the contract events viewer\n locator.register(EvmStakeEventsViewer.factory<EvmStakeEventsViewer>(\n EvmStakeEventsViewer.dependencies,\n { contract },\n ))\n\n // Get an instance of the events viewer to pass to the stake viewer\n const stakeEventsViewer = (await locator.getInstance<EvmStakeEventsViewer>(EvmStakeEventsViewer.defaultMoniker))\n assertEx(await stakeEventsViewer.start(), () => 'Failed to start EvmStakeEventsViewer')\n\n // Register the stake viewer\n locator.register(EvmStakeViewer.factory<EvmStakeViewer>(\n EvmStakeViewer.dependencies,\n { contract, stakeEventsViewer },\n ))\n\n // Register the contract viewer\n locator.register(EvmChainContractViewer.factory<EvmChainContractViewer>(\n EvmChainContractViewer.dependencies,\n { address: asAddress(contractAddress, true), runner: provider },\n ))\n\n // Register the contract viewer\n locator.register(SimpleTimeSyncViewer.factory<SimpleTimeSyncViewer>(\n SimpleTimeSyncViewer.dependencies,\n { ethProvider: provider },\n ))\n }\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))\n assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')\n\n const mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = (await locator.getInstance<MempoolRunner>(MempoolRunnerMoniker))\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const validatorActor = 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 mempoolViewer,\n blockViewer,\n } satisfies ValidatorActorParams)\n\n await validatorActor?.start()\n\n const mempoolActor = config.mempool.enabled\n ? undefined\n : await MempoolActor.create({\n id: 'mempool-mempool-server',\n account: wallet,\n context: locator.context,\n mempoolRunner,\n pendingBlocksArchivist,\n pendingTransactionsArchivist,\n } satisfies MempoolActorParams)\n\n await mempoolActor?.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","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport type {\n BaseContext, Config, ProviderFactoryLocatorInstance,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n locator?: ProviderFactoryLocatorInstance\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, logger, orchestrator, locator,\n}: RunApiContext) => {\n const localLogger = logger ?? new IdLogger(logger ?? console, () => 'ResolveHelper [runApi]')\n const account = await Account.random()\n localLogger.info(`Running api for account ${account.address} [random]`)\n\n // Create actors\n const api = await ApiActor.create({\n logger,\n context: {\n config, locator, singletons: {}, logger, caches: {},\n },\n })\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["creatable","Account","Actor","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","rpcEngineFromConnection","XyoConnectionMoniker","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","asAddress","assertEx","toEthAddress","Account","EvmChainContractViewer","EvmStakeEventsViewer","EvmStakeViewer","buildTelemetryConfig","canUseEvmProvider","initApiWallet","initBalanceSummaryMap","initEvmProvider","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","MempoolActor","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","validateHydratedBlock","validateHydratedBlockState","IStakedXyoChain__factory","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","MempoolRunnerMoniker","MempoolViewerMoniker","payloadMapFromStore","SimpleBlockValidationViewer","SimpleTimeSyncViewer","StepSizes","XyoViewerMoniker","Semaphore","hostname","getServer","params","config","node","providedNode","port","api","id","configuredChainId","chain","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","traceProvider","meterProvider","initTelemetry","initContext","_id","timeBudgetLimit","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","Error","possibleChainId","Account","random","address","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","chainId","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","context","finalizedArchivist","register","SimpleBlockValidationViewer","factory","dependencies","state","validateHydratedBlockState","protocol","validateHydratedBlock","canUseEvmProvider","provider","initEvmProvider","contractAddress","contract","IStakedXyoChain__factory","connect","toEthAddress","EvmStakeEventsViewer","stakeEventsViewer","getInstance","defaultMoniker","EvmStakeViewer","EvmChainContractViewer","asAddress","runner","SimpleTimeSyncViewer","ethProvider","apiContext","blockViewer","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","xyoViewer","XyoViewerMoniker","mempoolViewer","MempoolViewerMoniker","mempoolRunner","MempoolRunnerMoniker","console","info","validatorActor","mempool","enabled","undefined","ValidatorActor","create","account","mempoolActor","MempoolActor","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","paramsHandler","params","logger","context","account","Account","random","info","address","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","config","close","undefined","exists","IdLogger","Account","runApi","config","logger","orchestrator","locator","localLogger","IdLogger","console","account","Account","random","info","address","api","ApiActor","create","context","singletons","caches","actors","filter","exists","actor","registerActor","start"]}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAiBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAC6D,MAAM,EAG9E,MAAM,sBAAsB,CAAA;AAe7B,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,8HA0LvD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAmBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAC6D,MAAM,EAK9E,MAAM,sBAAsB,CAAA;AAc7B,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,8HA0NvD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.19.3",
3
+ "version": "1.19.5",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -57,18 +57,19 @@
57
57
  "@xyo-network/account": "~5.3.2",
58
58
  "@xyo-network/archivist-model": "~5.3.2",
59
59
  "@xyo-network/boundwitness-model": "~5.3.2",
60
- "@xyo-network/chain-ethereum": "~1.19.3",
61
- "@xyo-network/chain-orchestration": "~1.19.3",
62
- "@xyo-network/chain-services": "~1.19.3",
63
- "@xyo-network/chain-telemetry": "~1.19.3",
64
- "@xyo-network/chain-utils": "~1.19.3",
60
+ "@xyo-network/chain-ethereum": "~1.19.5",
61
+ "@xyo-network/chain-orchestration": "~1.19.5",
62
+ "@xyo-network/chain-services": "~1.19.5",
63
+ "@xyo-network/chain-telemetry": "~1.19.5",
64
+ "@xyo-network/chain-utils": "~1.19.5",
65
+ "@xyo-network/chain-validation": "~1.19.5",
65
66
  "@xyo-network/module-abstract": "~5.3.2",
66
67
  "@xyo-network/module-model": "~5.3.2",
67
68
  "@xyo-network/node-model": "~5.3.2",
68
69
  "@xyo-network/payload-builder": "~5.3.2",
69
70
  "@xyo-network/payload-model": "~5.3.2",
70
71
  "@xyo-network/typechain": "~4.1.1",
71
- "@xyo-network/xl1-sdk": "~1.20.9",
72
+ "@xyo-network/xl1-sdk": "~1.21.10",
72
73
  "async-mutex": "~0.5.0",
73
74
  "compression": "~1.8.1",
74
75
  "cors": "~2.8.6",
@@ -90,11 +91,11 @@
90
91
  "@xyo-network/archivist-abstract": "~5.3.2",
91
92
  "@xyo-network/bios-model": "~7.2.1",
92
93
  "@xyo-network/boundwitness-builder": "~5.3.2",
93
- "@xyo-network/chain-services": "~1.19.3",
94
+ "@xyo-network/chain-services": "~1.19.5",
94
95
  "@xyo-network/module-abstract-mongodb": "~5.3.2",
95
96
  "@xyo-network/module-model-mongodb": "~5.3.2",
96
97
  "@xyo-network/node-memory": "~5.3.2",
97
- "@xyo-network/xl1-sdk": "~1.20.9",
98
+ "@xyo-network/xl1-sdk": "~1.21.10",
98
99
  "dotenv": "~17.2.3",
99
100
  "eslint": "^9.39.2",
100
101
  "nodemon": "~3.1.11",
@@ -6,28 +6,31 @@ import {
6
6
  } from '@xylabs/sdk-js'
7
7
  import { Account } from '@xyo-network/account'
8
8
  import {
9
- EthereumChainStakeEventsViewer, EthereumChainStakeViewer, EvmChainContractViewer,
9
+ EvmChainContractViewer,
10
+ EvmStakeEventsViewer, EvmStakeViewer,
10
11
  } from '@xyo-network/chain-ethereum'
11
- import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
12
+ import type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'
12
13
  import {
13
14
  buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,
14
- initStatusReporter, initTransferSummaryMap, ValidatorActor,
15
+ initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor,
15
16
  } from '@xyo-network/chain-orchestration'
16
17
  import { createBootstrapHead } from '@xyo-network/chain-services'
17
18
  import { initTelemetry } from '@xyo-network/chain-telemetry'
18
19
  import { startupSpanAsync } from '@xyo-network/chain-utils'
20
+ import { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'
19
21
  import type { NodeInstance } from '@xyo-network/node-model'
20
22
  import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
21
23
  import { IStakedXyoChain__factory } from '@xyo-network/typechain'
22
24
  import type {
23
25
  AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, ChainId, Config,
26
+ MempoolRunner,
27
+ MempoolViewer,
24
28
  TransfersStepSummaryContext,
25
29
  XyoViewer,
26
30
  } from '@xyo-network/xl1-sdk'
27
31
  import {
28
- AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,
29
- DefaultMetricsScrapePorts,
30
- findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,
32
+ AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock,
33
+ MempoolRunnerMoniker, MempoolViewerMoniker, payloadMapFromStore, SimpleBlockValidationViewer, SimpleTimeSyncViewer, StepSizes,
31
34
  XyoViewerMoniker,
32
35
  } from '@xyo-network/xl1-sdk'
33
36
  import { Semaphore } from 'async-mutex'
@@ -162,6 +165,11 @@ export async function getServer(params: GetServerContext) {
162
165
  chainId,
163
166
  })
164
167
 
168
+ locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(
169
+ SimpleBlockValidationViewer.dependencies,
170
+ { state: validateHydratedBlockState, protocol: validateHydratedBlock },
171
+ ))
172
+
165
173
  // Conditionally register ETH viewers if enabled in config
166
174
  if (canUseEvmProvider({ config })) {
167
175
  const provider = await initEvmProvider({ config, logger })
@@ -170,18 +178,18 @@ export async function getServer(params: GetServerContext) {
170
178
  const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider)
171
179
 
172
180
  // Register the contract events viewer
173
- locator.register(EthereumChainStakeEventsViewer.factory<EthereumChainStakeEventsViewer>(
174
- EthereumChainStakeEventsViewer.dependencies,
181
+ locator.register(EvmStakeEventsViewer.factory<EvmStakeEventsViewer>(
182
+ EvmStakeEventsViewer.dependencies,
175
183
  { contract },
176
184
  ))
177
185
 
178
186
  // Get an instance of the events viewer to pass to the stake viewer
179
- const stakeEventsViewer = (await locator.getInstance<EthereumChainStakeEventsViewer>(EthereumChainStakeEventsViewer.defaultMoniker))
180
- assertEx(await stakeEventsViewer.start(), () => 'Failed to start EthereumChainStakeEventsViewer')
187
+ const stakeEventsViewer = (await locator.getInstance<EvmStakeEventsViewer>(EvmStakeEventsViewer.defaultMoniker))
188
+ assertEx(await stakeEventsViewer.start(), () => 'Failed to start EvmStakeEventsViewer')
181
189
 
182
190
  // Register the stake viewer
183
- locator.register(EthereumChainStakeViewer.factory<EthereumChainStakeViewer>(
184
- EthereumChainStakeViewer.dependencies,
191
+ locator.register(EvmStakeViewer.factory<EvmStakeViewer>(
192
+ EvmStakeViewer.dependencies,
185
193
  { contract, stakeEventsViewer },
186
194
  ))
187
195
 
@@ -190,6 +198,12 @@ export async function getServer(params: GetServerContext) {
190
198
  EvmChainContractViewer.dependencies,
191
199
  { address: asAddress(contractAddress, true), runner: provider },
192
200
  ))
201
+
202
+ // Register the contract viewer
203
+ locator.register(SimpleTimeSyncViewer.factory<SimpleTimeSyncViewer>(
204
+ SimpleTimeSyncViewer.dependencies,
205
+ { ethProvider: provider },
206
+ ))
193
207
  }
194
208
 
195
209
  const apiContext = {
@@ -213,18 +227,39 @@ export async function getServer(params: GetServerContext) {
213
227
  const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))
214
228
  assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')
215
229
 
230
+ const mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))
231
+ assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')
232
+
233
+ const mempoolRunner = (await locator.getInstance<MempoolRunner>(MempoolRunnerMoniker))
234
+ assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')
235
+
216
236
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
217
237
 
218
- const actor = config.mempool.enabled
238
+ const validatorActor = config.mempool.enabled
219
239
  ? undefined
220
240
  : await ValidatorActor.create({
221
241
  id: 'validator-mempool-server',
222
242
  account: wallet,
223
243
  context: locator.context,
224
244
  finalizedArchivist: writableChainArchivist,
245
+ mempoolViewer,
246
+ blockViewer,
225
247
  } satisfies ValidatorActorParams)
226
248
 
227
- await actor?.start()
249
+ await validatorActor?.start()
250
+
251
+ const mempoolActor = config.mempool.enabled
252
+ ? undefined
253
+ : await MempoolActor.create({
254
+ id: 'mempool-mempool-server',
255
+ account: wallet,
256
+ context: locator.context,
257
+ mempoolRunner,
258
+ pendingBlocksArchivist,
259
+ pendingTransactionsArchivist,
260
+ } satisfies MempoolActorParams)
261
+
262
+ await mempoolActor?.start()
228
263
 
229
264
  const app = await getApp(apiContext)
230
265
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))