@xyo-network/chain-api 1.18.4 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/index.mjs +20 -7
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +26 -26
- package/src/server/server.ts +35 -8
package/dist/node/index.mjs
CHANGED
|
@@ -305,9 +305,9 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
|
|
|
305
305
|
}, "getApp");
|
|
306
306
|
|
|
307
307
|
// src/server/server.ts
|
|
308
|
-
import { assertEx as assertEx2, toEthAddress } from "@xylabs/sdk-js";
|
|
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 } from "@xyo-network/chain-ethereum";
|
|
310
|
+
import { EthereumChainStakeEventsViewer, EthereumChainStakeViewer, EvmChainContractViewer } from "@xyo-network/chain-ethereum";
|
|
311
311
|
import { buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
312
312
|
import { createBootstrapHead } from "@xyo-network/chain-services";
|
|
313
313
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
@@ -319,6 +319,7 @@ var hostname = "::";
|
|
|
319
319
|
async function getServer(params) {
|
|
320
320
|
const { config, node: providedNode } = params;
|
|
321
321
|
const { port } = params.config.api;
|
|
322
|
+
const { id: configuredChainId } = config.chain;
|
|
322
323
|
const logger = assertEx2(params.logger, () => "Logger is required to init server");
|
|
323
324
|
const statusReporter = initStatusReporter({
|
|
324
325
|
logger
|
|
@@ -355,14 +356,19 @@ async function getServer(params) {
|
|
|
355
356
|
await pendingTransactionsArchivist.start();
|
|
356
357
|
await pendingBlocksArchivist.start();
|
|
357
358
|
const possibleHead = await findMostRecentBlock(readonlyChainArchivist);
|
|
359
|
+
if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {
|
|
360
|
+
throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`);
|
|
361
|
+
}
|
|
362
|
+
let possibleChainId = configuredChainId;
|
|
358
363
|
if (!possibleHead) {
|
|
359
|
-
|
|
360
|
-
const chain = await createBootstrapHead(wallet,
|
|
364
|
+
possibleChainId = possibleChainId ?? (await Account.random()).address;
|
|
365
|
+
const chain = await createBootstrapHead(wallet, possibleChainId, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
|
|
361
366
|
const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
|
|
362
367
|
await writableChainArchivist.insert(payloads);
|
|
363
368
|
}
|
|
364
|
-
const head = assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
|
|
365
|
-
const chainId =
|
|
369
|
+
const head = possibleHead ?? assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
|
|
370
|
+
const chainId = assertEx2(possibleChainId, () => "Chain ID could not be determined");
|
|
371
|
+
assertEx2(head.chain === chainId, () => "Chain ID does not match head block chain ID [init]");
|
|
366
372
|
const mods = await node.resolve("*");
|
|
367
373
|
await Promise.all(mods.map((mod) => {
|
|
368
374
|
return mod.start?.() ?? (() => true);
|
|
@@ -374,6 +380,7 @@ async function getServer(params) {
|
|
|
374
380
|
summaryMap: balancesSummaryMap,
|
|
375
381
|
head: /* @__PURE__ */ __name(async function() {
|
|
376
382
|
const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
|
|
383
|
+
assertEx2(head2.chain === chainId, () => "Chain ID does not match head block chain ID [balanceSummaryContext]");
|
|
377
384
|
return [
|
|
378
385
|
head2._hash,
|
|
379
386
|
head2.block
|
|
@@ -390,6 +397,7 @@ async function getServer(params) {
|
|
|
390
397
|
summaryMap: transfersSummaryMap,
|
|
391
398
|
head: /* @__PURE__ */ __name(async function() {
|
|
392
399
|
const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
|
|
400
|
+
assertEx2(head2.chain === chainId, () => "Chain ID does not match head block chain ID [transfersSummaryContext]");
|
|
393
401
|
return [
|
|
394
402
|
head2._hash,
|
|
395
403
|
head2.block
|
|
@@ -407,7 +415,8 @@ async function getServer(params) {
|
|
|
407
415
|
pendingBlocksArchivist,
|
|
408
416
|
balanceSummaryContext,
|
|
409
417
|
transfersSummaryContext,
|
|
410
|
-
node
|
|
418
|
+
node,
|
|
419
|
+
chainId
|
|
411
420
|
});
|
|
412
421
|
if (canUseEvmProvider({
|
|
413
422
|
config
|
|
@@ -427,6 +436,10 @@ async function getServer(params) {
|
|
|
427
436
|
contract,
|
|
428
437
|
stakeEventsViewer
|
|
429
438
|
}));
|
|
439
|
+
locator.register(EvmChainContractViewer.factory(EvmChainContractViewer.dependencies, {
|
|
440
|
+
address: asAddress3(contractAddress, true),
|
|
441
|
+
runner: provider
|
|
442
|
+
}));
|
|
430
443
|
}
|
|
431
444
|
const apiContext = {
|
|
432
445
|
...initContext,
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -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 */\n\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx, toEthAddress } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { EthereumChainStakeEventsViewer, EthereumChainStakeViewer } 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, Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,\n DefaultMetricsScrapePorts,\n findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,\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\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 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 (!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 // 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\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 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","assertEx","toEthAddress","Account","EthereumChainStakeEventsViewer","EthereumChainStakeViewer","buildTelemetryConfig","canUseEvmProvider","initApiWallet","initBalanceSummaryMap","initEvmProvider","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","IStakedXyoChain__factory","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","StepSizes","Semaphore","hostname","getServer","params","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","context","finalizedArchivist","canUseEvmProvider","provider","initEvmProvider","contractAddress","id","contract","IStakedXyoChain__factory","connect","toEthAddress","register","EthereumChainStakeEventsViewer","factory","dependencies","stakeEventsViewer","getInstance","defaultMoniker","EthereumChainStakeViewer","apiContext","blockViewer","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","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 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} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,\n DefaultMetricsScrapePorts,\n findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,\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 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 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","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","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","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"
|
|
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,EAE9E,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,8HAsLvD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.19.0",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -54,21 +54,21 @@
|
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.211.0",
|
|
55
55
|
"@xylabs/express": "~5.0.64",
|
|
56
56
|
"@xylabs/sdk-js": "~5.0.64",
|
|
57
|
-
"@xyo-network/account": "~5.2
|
|
58
|
-
"@xyo-network/archivist-model": "~5.2
|
|
59
|
-
"@xyo-network/boundwitness-model": "~5.2
|
|
60
|
-
"@xyo-network/chain-ethereum": "~1.
|
|
61
|
-
"@xyo-network/chain-orchestration": "~1.
|
|
62
|
-
"@xyo-network/chain-services": "~1.
|
|
63
|
-
"@xyo-network/chain-telemetry": "~1.
|
|
64
|
-
"@xyo-network/chain-utils": "~1.
|
|
65
|
-
"@xyo-network/module-abstract": "~5.2
|
|
66
|
-
"@xyo-network/module-model": "~5.2
|
|
67
|
-
"@xyo-network/node-model": "~5.2
|
|
68
|
-
"@xyo-network/payload-builder": "~5.2
|
|
69
|
-
"@xyo-network/payload-model": "~5.2
|
|
57
|
+
"@xyo-network/account": "~5.3.2",
|
|
58
|
+
"@xyo-network/archivist-model": "~5.3.2",
|
|
59
|
+
"@xyo-network/boundwitness-model": "~5.3.2",
|
|
60
|
+
"@xyo-network/chain-ethereum": "~1.19.0",
|
|
61
|
+
"@xyo-network/chain-orchestration": "~1.19.0",
|
|
62
|
+
"@xyo-network/chain-services": "~1.19.0",
|
|
63
|
+
"@xyo-network/chain-telemetry": "~1.19.0",
|
|
64
|
+
"@xyo-network/chain-utils": "~1.19.0",
|
|
65
|
+
"@xyo-network/module-abstract": "~5.3.2",
|
|
66
|
+
"@xyo-network/module-model": "~5.3.2",
|
|
67
|
+
"@xyo-network/node-model": "~5.3.2",
|
|
68
|
+
"@xyo-network/payload-builder": "~5.3.2",
|
|
69
|
+
"@xyo-network/payload-model": "~5.3.2",
|
|
70
70
|
"@xyo-network/typechain": "~4.1.1",
|
|
71
|
-
"@xyo-network/xl1-sdk": "~1.
|
|
71
|
+
"@xyo-network/xl1-sdk": "~1.20.2",
|
|
72
72
|
"async-mutex": "~0.5.0",
|
|
73
73
|
"compression": "~1.8.1",
|
|
74
74
|
"cors": "~2.8.6",
|
|
@@ -81,20 +81,20 @@
|
|
|
81
81
|
"@types/cors": "~2.8.19",
|
|
82
82
|
"@types/express": "5.0.6",
|
|
83
83
|
"@types/express-serve-static-core": "~5.1.1",
|
|
84
|
-
"@types/node": "~25.0
|
|
84
|
+
"@types/node": "~25.1.0",
|
|
85
85
|
"@xylabs/sdk-js": "~5.0.64",
|
|
86
86
|
"@xylabs/ts-scripts-yarn3": "~7.3.2",
|
|
87
87
|
"@xylabs/tsconfig": "~7.3.2",
|
|
88
|
-
"@xyo-network/account": "~5.2
|
|
89
|
-
"@xyo-network/account-model": "~5.2
|
|
90
|
-
"@xyo-network/archivist-abstract": "~5.2
|
|
91
|
-
"@xyo-network/bios-model": "~7.2.
|
|
92
|
-
"@xyo-network/boundwitness-builder": "~5.2
|
|
93
|
-
"@xyo-network/chain-services": "~1.
|
|
94
|
-
"@xyo-network/module-abstract-mongodb": "~5.2
|
|
95
|
-
"@xyo-network/module-model-mongodb": "~5.2
|
|
96
|
-
"@xyo-network/node-memory": "~5.2
|
|
97
|
-
"@xyo-network/xl1-sdk": "~1.
|
|
88
|
+
"@xyo-network/account": "~5.3.2",
|
|
89
|
+
"@xyo-network/account-model": "~5.3.2",
|
|
90
|
+
"@xyo-network/archivist-abstract": "~5.3.2",
|
|
91
|
+
"@xyo-network/bios-model": "~7.2.1",
|
|
92
|
+
"@xyo-network/boundwitness-builder": "~5.3.2",
|
|
93
|
+
"@xyo-network/chain-services": "~1.19.0",
|
|
94
|
+
"@xyo-network/module-abstract-mongodb": "~5.3.2",
|
|
95
|
+
"@xyo-network/module-model-mongodb": "~5.3.2",
|
|
96
|
+
"@xyo-network/node-memory": "~5.3.2",
|
|
97
|
+
"@xyo-network/xl1-sdk": "~1.20.2",
|
|
98
98
|
"dotenv": "~17.2.3",
|
|
99
99
|
"eslint": "^9.39.2",
|
|
100
100
|
"nodemon": "~3.1.11",
|
package/src/server/server.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/* eslint-disable max-statements */
|
|
2
|
-
|
|
3
2
|
import type { Hash, Logger } from '@xylabs/sdk-js'
|
|
4
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
asAddress,
|
|
5
|
+
assertEx, toEthAddress,
|
|
6
|
+
} from '@xylabs/sdk-js'
|
|
5
7
|
import { Account } from '@xyo-network/account'
|
|
6
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
EthereumChainStakeEventsViewer, EthereumChainStakeViewer, EvmChainContractViewer,
|
|
10
|
+
} from '@xyo-network/chain-ethereum'
|
|
7
11
|
import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
|
|
8
12
|
import {
|
|
9
13
|
buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,
|
|
@@ -16,7 +20,7 @@ import type { NodeInstance } from '@xyo-network/node-model'
|
|
|
16
20
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
17
21
|
import { IStakedXyoChain__factory } from '@xyo-network/typechain'
|
|
18
22
|
import type {
|
|
19
|
-
AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, Config,
|
|
23
|
+
AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, ChainId, Config,
|
|
20
24
|
TransfersStepSummaryContext,
|
|
21
25
|
} from '@xyo-network/xl1-sdk'
|
|
22
26
|
import {
|
|
@@ -41,6 +45,7 @@ interface GetServerContext {
|
|
|
41
45
|
export async function getServer(params: GetServerContext) {
|
|
42
46
|
const { config, node: providedNode } = params
|
|
43
47
|
const { port } = params.config.api
|
|
48
|
+
const { id: configuredChainId } = config.chain
|
|
44
49
|
|
|
45
50
|
const logger = assertEx(params.logger, () => 'Logger is required to init server')
|
|
46
51
|
|
|
@@ -86,16 +91,29 @@ export async function getServer(params: GetServerContext) {
|
|
|
86
91
|
await pendingBlocksArchivist.start()
|
|
87
92
|
|
|
88
93
|
const possibleHead = await findMostRecentBlock(readonlyChainArchivist)
|
|
94
|
+
if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {
|
|
95
|
+
throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let possibleChainId: ChainId | undefined = configuredChainId
|
|
99
|
+
|
|
100
|
+
// if there is no configured chain ID and no head, create a new chain
|
|
89
101
|
if (!possibleHead) {
|
|
90
|
-
|
|
102
|
+
possibleChainId = possibleChainId ?? (await Account.random()).address
|
|
91
103
|
// If there is no head, create one
|
|
92
|
-
const chain = await createBootstrapHead(
|
|
104
|
+
const chain = await createBootstrapHead(
|
|
105
|
+
wallet,
|
|
106
|
+
possibleChainId,
|
|
107
|
+
asAttoXL1(20_000_000_000_000_000_000_000n),
|
|
108
|
+
config.chain.genesisRewardAddress ?? wallet.address,
|
|
109
|
+
)
|
|
93
110
|
const payloads = chain.flatMap(block => flattenHydratedBlock(block))
|
|
94
111
|
await writableChainArchivist.insert(payloads)
|
|
95
112
|
}
|
|
96
113
|
|
|
97
|
-
const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
|
|
98
|
-
const chainId =
|
|
114
|
+
const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
|
|
115
|
+
const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')
|
|
116
|
+
assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [init]')
|
|
99
117
|
|
|
100
118
|
const mods = await node.resolve('*')
|
|
101
119
|
await Promise.all(mods.map((mod) => {
|
|
@@ -110,6 +128,7 @@ export async function getServer(params: GetServerContext) {
|
|
|
110
128
|
summaryMap: balancesSummaryMap,
|
|
111
129
|
head: async function (): Promise<[Hash, number]> {
|
|
112
130
|
const head = assertEx(await findMostRecentBlock(writableChainArchivist))
|
|
131
|
+
assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [balanceSummaryContext]')
|
|
113
132
|
return [head._hash, head.block]
|
|
114
133
|
},
|
|
115
134
|
store: { chainMap },
|
|
@@ -122,6 +141,7 @@ export async function getServer(params: GetServerContext) {
|
|
|
122
141
|
summaryMap: transfersSummaryMap,
|
|
123
142
|
head: async function (): Promise<[Hash, number]> {
|
|
124
143
|
const head = assertEx(await findMostRecentBlock(writableChainArchivist))
|
|
144
|
+
assertEx(head.chain === chainId, () => 'Chain ID does not match head block chain ID [transfersSummaryContext]')
|
|
125
145
|
return [head._hash, head.block]
|
|
126
146
|
},
|
|
127
147
|
store: { chainMap },
|
|
@@ -136,6 +156,7 @@ export async function getServer(params: GetServerContext) {
|
|
|
136
156
|
balanceSummaryContext,
|
|
137
157
|
transfersSummaryContext,
|
|
138
158
|
node,
|
|
159
|
+
chainId,
|
|
139
160
|
})
|
|
140
161
|
|
|
141
162
|
// Conditionally register ETH viewers if enabled in config
|
|
@@ -160,6 +181,12 @@ export async function getServer(params: GetServerContext) {
|
|
|
160
181
|
EthereumChainStakeViewer.dependencies,
|
|
161
182
|
{ contract, stakeEventsViewer },
|
|
162
183
|
))
|
|
184
|
+
|
|
185
|
+
// Register the contract viewer
|
|
186
|
+
locator.register(EvmChainContractViewer.factory<EvmChainContractViewer>(
|
|
187
|
+
EvmChainContractViewer.dependencies,
|
|
188
|
+
{ address: asAddress(contractAddress, true), runner: provider },
|
|
189
|
+
))
|
|
163
190
|
}
|
|
164
191
|
|
|
165
192
|
const apiContext = {
|