@xyo-network/chain-api 1.16.24 → 1.16.25
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 +37 -9
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/app.d.ts +2 -2
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/routes/addRoutes.d.ts +2 -2
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +2 -2
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +29 -28
- package/src/server/app.ts +3 -1
- package/src/server/routes/addRoutes.ts +3 -1
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +3 -0
- package/src/server/server.ts +35 -3
package/dist/node/index.mjs
CHANGED
|
@@ -264,7 +264,7 @@ import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
|
264
264
|
import { RewardMultipliers } from "@xyo-network/xl1-protocol-sdk";
|
|
265
265
|
import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
|
|
266
266
|
import { Semaphore } from "async-mutex";
|
|
267
|
-
var addRpcRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
267
|
+
var addRpcRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache) => {
|
|
268
268
|
const { node } = app;
|
|
269
269
|
const runner = new NodeXyoRunner(node);
|
|
270
270
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({
|
|
@@ -277,6 +277,7 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, staked
|
|
|
277
277
|
node,
|
|
278
278
|
rewardMultipliers: RewardMultipliers,
|
|
279
279
|
initRewardsCache,
|
|
280
|
+
accountBalanceViewer,
|
|
280
281
|
context: stakedChainContext,
|
|
281
282
|
transfersSummaryContext: {
|
|
282
283
|
...stakedChainContext,
|
|
@@ -308,14 +309,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, staked
|
|
|
308
309
|
}, "addRpcRoutes");
|
|
309
310
|
|
|
310
311
|
// src/server/routes/addRoutes.ts
|
|
311
|
-
var addRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
312
|
-
await addRpcRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache);
|
|
312
|
+
var addRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache) => {
|
|
313
|
+
await addRpcRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache);
|
|
313
314
|
addDataLakeRoutes(app);
|
|
314
315
|
addNodeRoutes(app);
|
|
315
316
|
}, "addRoutes");
|
|
316
317
|
|
|
317
318
|
// src/server/app.ts
|
|
318
|
-
var getApp = /* @__PURE__ */ __name(async (node, transferSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
319
|
+
var getApp = /* @__PURE__ */ __name(async (node, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache) => {
|
|
319
320
|
addInstrumentation();
|
|
320
321
|
const app = express2();
|
|
321
322
|
app.set("etag", false);
|
|
@@ -330,17 +331,19 @@ var getApp = /* @__PURE__ */ __name(async (node, transferSummaryMap, stakedChain
|
|
|
330
331
|
app.use(customPoweredByHeader);
|
|
331
332
|
disableCaseSensitiveRouting(app);
|
|
332
333
|
app.node = node;
|
|
333
|
-
await addRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache);
|
|
334
|
+
await addRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache);
|
|
334
335
|
app.use(standardErrors);
|
|
335
336
|
return app;
|
|
336
337
|
}, "getApp");
|
|
337
338
|
|
|
338
339
|
// src/server/server.ts
|
|
339
340
|
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
340
|
-
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initChainStakeViewer, initProducerAccount, initServerNode, initServerWallet, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
341
|
+
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initChainIterator, initChainStakeViewer, initProducerAccount, initServerNode, initServerWallet, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
341
342
|
import { createGenesisBlock, findMostRecentBlock } from "@xyo-network/chain-protocol";
|
|
342
|
-
import {
|
|
343
|
-
import {
|
|
343
|
+
import { blockViewerFromChainIteratorAndArchivist } from "@xyo-network/chain-services";
|
|
344
|
+
import { asXL1, asXL1BlockRange, StepSizes as StepSizes2, XL1Amount } from "@xyo-network/xl1-protocol";
|
|
345
|
+
import { readPayloadMapFromStore, SimpleAccountBalanceViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
346
|
+
import { Semaphore as Semaphore2 } from "async-mutex";
|
|
344
347
|
var hostname = "::";
|
|
345
348
|
async function getServer(context) {
|
|
346
349
|
const { config, logger, node: providedNode } = context;
|
|
@@ -410,7 +413,32 @@ async function getServer(context) {
|
|
|
410
413
|
await Promise.all(mods.map((mod) => {
|
|
411
414
|
return mod.start?.() ?? (() => true);
|
|
412
415
|
}));
|
|
413
|
-
const
|
|
416
|
+
const chainIterator = await initChainIterator({
|
|
417
|
+
config,
|
|
418
|
+
logger,
|
|
419
|
+
chainMap,
|
|
420
|
+
head: assertEx3(await findMostRecentBlock(chainArchivist), () => "No head found in chainArchivist")
|
|
421
|
+
});
|
|
422
|
+
const blockViewer = blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist);
|
|
423
|
+
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
424
|
+
context: {
|
|
425
|
+
chainId: stakedChainContext.chainId,
|
|
426
|
+
store: stakedChainContext.store,
|
|
427
|
+
head: stakedChainContext.head,
|
|
428
|
+
stepSemaphores: StepSizes2.map(() => new Semaphore2(20)),
|
|
429
|
+
summaryMap: balanceSummaryMap
|
|
430
|
+
},
|
|
431
|
+
transferContext: {
|
|
432
|
+
chainId: stakedChainContext.chainId,
|
|
433
|
+
store: stakedChainContext.store,
|
|
434
|
+
head: stakedChainContext.head,
|
|
435
|
+
stepSemaphores: StepSizes2.map(() => new Semaphore2(20)),
|
|
436
|
+
summaryMap: transferSummaryMap
|
|
437
|
+
},
|
|
438
|
+
blockViewer
|
|
439
|
+
});
|
|
440
|
+
assertEx3(await accountBalanceViewer.start(), () => "Failed to start SimpleAccountBalanceViewer");
|
|
441
|
+
const app = await getApp(node, transferSummaryMap, stakedChainContext, accountBalanceViewer, config.api.initRewardsCache);
|
|
414
442
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
415
443
|
server.setTimeout(2e4);
|
|
416
444
|
return server;
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n await addRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer } from '@xyo-network/chain-viewers'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { RewardMultipliers } from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n context: stakedChainContext,\n transfersSummaryContext: {\n ...stakedChainContext, stepSemaphores: StepSizes.map(() => new Semaphore(20)), summaryMap: transferSummaryMap,\n },\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection, networkStakeViewer)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport 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 transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initChainStakeViewer, initProducerAccount,\n initServerNode,\n initServerWallet,\n initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock, findMostRecentBlock } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeChainViewer = await initChainStakeViewer(config, logger)\n\n const balanceSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transferSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transferSummaryMap,\n balanceSummaryMap,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const producerAccount = await initProducerAccount({ config, logger })\n const chainId = stakeChainViewer.chainId\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n const stakedChainContext: StakedChainContextRead = {\n chainId: stakeChainViewer.chainId,\n stake: stakeChainViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n }\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const app = await getApp(node, transferSummaryMap, stakedChainContext, config.api.initRewardsCache)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":";;;;AAAA,SACEA,uBACAC,6BACAC,sCACAC,mBACAC,0BACAC,kBACAC,gBACAC,yBACK;AAMP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,cAAa;;;AClBpB,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AACvC,SAASC,2BAA2B;AAS7B,IAAMC,qBAAqB,6BAAA;AAChC,QAAMC,mBAAmB;IAAC,IAAIC,oBAAAA;IAAuB,IAAIC,uBAAAA;;AACzDC,2BAAyB;IAAEH;EAAiB,CAAA;AAC9C,GAHkC;;;ACVlC,SAASI,eAAAA,oBAAmB;;;ACD5B,SAASC,oBAAoB;AAC7B,SAASC,WAAWC,iBAAiB;AACrC,SAASC,oBAAoB;AAG7B,SAASC,mBAAmB;AAI5B,IAAMC,UAAwD,8BAAOC,KAAKC,KAAKC,SAAAA;AAC7E,QAAM,EAAEC,SAASC,iBAAgB,IAAKJ,IAAIK;AAC1C,QAAM,EAAEC,KAAI,IAAKN,IAAIO;AACrB,QAAMJ,UAAUK,UAAUJ,gBAAAA;AAC1B,MAAIK,UAAUN,OAAAA,GAAU;AACtB,QAAIO,MAAMJ,KAAKH,YAAYA,UAAUG,OAAQ,MAAMA,KAAKK,QAAQR,SAAS;MAAES,WAAW;IAAO,CAAA;AAC7F,QAAIF,KAAK;AACPT,UAAIY,KAAK,MAAMH,IAAII,MAAK,CAAA;AACxB;IACF;EACF;AACA,MAAIC,aAAaX,gBAAAA,GAAmB;AAClC,UAAMM,MAAM,MAAMJ,KAAKK,QAAQP,kBAAkB;MAAEQ,WAAW;IAAO,CAAA;AACrE,QAAIF,KAAK;AACPT,UAAIe,SAASC,YAAYC,mBAAmB,IAAIR,IAAIP,OAAO,EAAE;AAC7D;IACF;EACF;AACAD,OAAK,OAAA;AACP,GAnB8D;AAoBvD,IAAMiB,aAAaC,aAAarB,OAAAA;;;AC7BvC,SAASsB,gBAAAA,qBAAoB;AAE7B,SACEC,aAAAA,YAAWC,UACXC,WACAC,iBACK;AACP,SAASC,2BAAmD;AAC5D,SAASC,0BAA0B;AAInC,SAASC,eAAAA,oBAAmB;;;ACX5B,SAASC,0BAA0B;AAEnC,SAASC,0BAA0B;AAInC,IAAMC,gBAAgB;AAEf,IAAMC,iBAAiB,wBAACC,KAAqBC,KAAcC,IAAuBC,aAAAA;AAGvF,QAAMC,oBACFD,UACEE,KAAKP,aAAAA,EACNQ,OAAqB,CAACC,YAAqCA,SAASC,WAAWC,kBAAAA,EAC/EC,IAAIR,CAAAA,QAAMA,IAAGS,SAAS,KAAK,CAAA;AAEhC,QAAMA,YAAY;IAACT,GAAGS;OAAcP;IAAmBE,OAAOM,CAAAA,YAAWA,QAAQC,SAAS,CAAA;AAC1F,QAAMC,UAAUH,UAAUE,SAAS,IAAIE,OAAOC,YAAYhB,IAAIiB,QAAQP,IAAIF,CAAAA,WAAU;IAACA;IAAQG;GAAU,CAAA,IAAK,CAAC;AAC7G,QAAMO,WAAW;IAAEJ;EAAQ;AAC3B,SAAO;IAAEN,QAAQW;IAAoBD;EAAS;AAChD,GAb8B;;;ADU9B,IAAME,WAAsG,8BAAOC,KAAKC,KAAKC,SAAAA;AAC3H,QAAMC,cAAc,wBAACC,MAAcC,UAAU,qBAAqBC,YAAAA;AAChE,UAAMC,QAAQ,IAAIC,mBAAAA,EAAqBH,QAAQA,OAAAA,EAASC,QAAQA,OAAAA,EAASG,MAAK;AAC9ER,QAAIS,OAAOC,cAAc;AACzBV,QAAIW,OAAOR,IAAAA,EAAMS,KAAKN,KAAAA;AACtBL,SAAAA;EACF,GALoB;AAOpB,QAAM,EAAEY,QAAO,IAAKd,IAAIe;AACxB,QAAM,EAAEC,KAAI,IAAKhB,IAAIiB;AACrB,QAAM,CAACC,IAAIC,QAAAA,IAAYC,MAAMC,QAAQrB,IAAIsB,IAAI,IAAItB,IAAIsB,OAAO,CAAA;AAC5D,MAAI,CAACC,UAAUT,OAAAA,GAAU;AACvB,WAAOX,YAAYqB,aAAYC,aAAa,iBAAA;EAC9C;AAEA,MAAI,CAACP,IAAI;AACP,WAAOf,YAAYqB,aAAYC,aAAa,sBAAA;EAC9C;AAEA,MAAI,CAACC,oBAAoBR,EAAAA,GAAK;AAC5B,WAAOf,YAAYqB,aAAYC,aAAa,4BAAA;EAC9C;AAEA,MAAIE,UAA4B,CAAA;AAChC,QAAMC,oBAAoBC,UAAUf,OAAAA;AACpC,MAAIE,KAAKF,YAAYc,kBAAmBD,WAAU;IAACX;;OAC9C;AACH,UAAMc,eAAeC,WAAUjB,OAAAA;AAC/B,UAAMkB,YAAaF,iBAAiBG,SAAaA,SAAY,MAAMjB,KAAKkB,QAAQJ,cAAc;MAAEK,UAAU;IAAG,CAAA;AAE7G,QAAIH,UAAWL,WAAU;MAACK;;SACrB;AACH,YAAMI,SAAS,MAAMpB,KAAKkB,QAAQpB,SAAS;QAAEuB,WAAW;MAAO,CAAA;AAC/D,UAAID,QAAQ;AACV,cAAME,gBAAgBC,SAASH,QAAQtB,SAAS,MAAM,wCAAA;AACtDb,YAAIuC,SAAShB,aAAYiB,oBAAoB,IAAIH,aAAAA,EAAe;AAChE;MACF,OAAO;AACL,eAAOnC,YAAYqB,aAAYkB,WAAW,oBAAoB;UAAE5B;QAAQ,CAAA;MAC1E;IACF;EACF;AAEA,MAAIa,QAAQgB,SAAS,GAAG;AACtB,UAAMC,MAAMjB,QAAQ,CAAA;AACpB,UAAMkB,cAAcC,eAAeF,KAAK5C,KAAKkB,IAAIC,QAAAA;AACjD,QAAI;AACF,YAAM4B,cAAc,MAAMH,IAAII,MAAM9B,IAAIC,UAAU0B,WAAAA;AAClD5C,UAAIY,KAAKkC,WAAAA;IACX,SAASE,IAAI;AACX,aAAO9C,YAAYqB,aAAY0B,uBAAuB,gBAAgB;QAAE7C,SAAU4C,IAAc5C,WAAW;MAAgB,CAAA;IAC7H;EACF,OAAO;AACL,WAAOF,YAAYqB,aAAYkB,WAAW,oBAAoB;MAAE5B;IAAQ,CAAA;EAC1E;AACF,GAvD4G;AAyDrG,IAAMqC,cAAcC,cAAarD,QAAAA;;;AFtEjC,IAAMsD,gBAAgB,wBAACC,QAAAA;AAC5B,QAAMC,gBAAgBD,IAAIE;AAC1B,QAAMC,UAAUF,cAAcE;AAC9B,QAAMC,wBAAwB,IAAID,OAAAA;AAClCH,MAAIK,IAAI,KAAK,CAACC,MAAMC,QAAQA,IAAIC,SAASC,aAAYC,mBAAmBN,qBAAAA,CAAAA;AACxEJ,MAAIW,KAAK,KAAK,CAACL,MAAMC,QAAQA,IAAIC,SAASC,aAAYG,oBAAoBR,qBAAAA,CAAAA;AAC1EJ,MAAIK,IAAI,aAAaQ,UAAAA;AACrBb,MAAIW,KAAK,aAAaG,WAAAA;AACtBd,MAAIK,IAAI,UAAU,CAACC,MAAMC,QAAAA;AACvBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACAhB,MAAIW,KAAK,UAAU,CAACL,MAAMC,QAAAA;AACxBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACF,GAd6B;;;AIN7B,SAASC,4BAA4B;AACrC,SAASC,QAAQC,aAAAA,kBAAiB;AAKlC,SAASC,2BAA2B;AAGpC,SAASC,sBAAsB;AAE/B,SAASC,cAAcC,kBAAkB;AAEzC,OAAOC,aAAa;AAGpB,IAAMC,mBAAmB,8BAAOC,MAAoBC,8BAAAA;AAClD,QAAMC,MAAM,MAAMF,KAAKG,QAAQF,yBAAAA;AAC/B,SAAOG,oBAAoBF,KAAK;IAAEG,UAAU;EAAK,CAAA;AACnD,GAHyB;AAKzB,IAAIC;AAEJ,IAAMC,eAAe,8BAAOP,MAAoBC,8BAAAA;AAC9C,MAAIO,WAAUF,iBAAAA,EAAoB,QAAOA;AACzCA,sBAAoB,MAAMP,iBAAiBC,MAAMC,yBAAAA;AACjD,SAAOK;AACT,GAJqB;AAWd,IAAMG,sBAAsB,wBAACC,YAAAA;AAClC,QAAM,EAAEV,MAAMC,0BAAyB,IAAKS;AAC5C,QAAMC,SAASC,QAAQC,OAAO;IAAEC,aAAa;EAAK,CAAA;AAElDH,SAAOI,KAAK,WAAW,OAAOC,KAAKC,QAAAA;AACjCC,yBAAqBD,GAAAA;AACrB,UAAME,OAAOC,MAAMC,QAAQL,IAAIG,IAAI,IAAIH,IAAIG,OAAO;MAACH,IAAIG;;AACvD,UAAMG,YAAY,MAAMC,eAAeC,UAAmBL,IAAAA,GAAOM,IAAIC,CAAAA,MAAKA,EAAE,CAAA,CAAE;AAC9E,UAAMC,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUE,OAAOP,QAAAA;AACtCL,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,SAAS,OAAOhB,KAAoCC,QAAAA;AAC7DC,yBAAqBD,GAAAA;AACrB,UAAMgB,SAASC,WAAWlB,IAAImB,MAAMF,MAAM,IAAIjB,IAAImB,MAAMF,SAASG;AACjE,UAAMC,QAAQ7B,WAAUQ,IAAImB,MAAME,KAAK,IAAIC,OAAOtB,IAAImB,MAAME,KAAK,IAAID;AACrE,UAAMG,OAAO/B,WAAUQ,IAAImB,MAAMI,IAAI,IAAIC,QAAQxB,IAAImB,MAAMI,IAAI,IAAIH;AACnE,UAAMK,QAAQzB,IAAImB,MAAMM,UAAU,QAAQ,QAAQ;AAClD,UAAM/B,WAAgC;MACpC2B;MAAOE;MAAME;MAAOR;IACtB;AACA,UAAMN,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUe,KAAKhC,QAAAA;AACpCO,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AACAjB,SAAOI,KAAK,SAAS,OAAOC,KAAwDC,QAAAA;AAClFC,yBAAqBD,GAAAA;AACrB,UAAMP,WAAUM,IAAIG;AACpB,UAAMQ,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,OAAOpB,WAAUE,QAAAA,IAAWiB,UAAUe,KAAKhC,QAAAA,IAAWiB,UAAUe,KAAI;AACnFzB,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,cAAc,OAAOhB,KAAKC,QAAAA;AACnCC,yBAAqBD,GAAAA;AACrB,UAAM,EAAE0B,MAAMC,QAAO,IAAK5B,IAAI6B;AAC9B,UAAMF,OAAOG,OAAOF,OAAAA;AACpB,QAAIpC,WAAUmC,IAAAA,GAAO;AACnB,YAAMhB,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,YAAM,CAAC8C,OAAAA,IAAW,MAAMpB,UAAUK,IAAI;QAACW;OAAK;AAC5C,UAAIK,aAAaD,OAAAA,GAAU;AACzB9B,YAAIc,KAAKgB,OAAAA;AACT;MACF;IACF;AACA9B,QAAIa,OAAO,GAAA,EAAKmB,KAAI;EACtB,CAAA;AAEA,SAAOtC;AACT,GAlDmC;;;AC9B5B,IAAMuC,oBAAoB,wBAACC,QAAAA;AAChC,QAAM,EAAEC,KAAI,IAAKD;AACjB,QAAME,4BAA4B;AAClCF,MAAIG,IAAI,UAAUC,oBAAoB;IAAEH;IAAMC;EAA0B,CAAA,CAAA;AAC1E,GAJiC;;;ACJjC,SAASG,wBAAAA,6BAA4B;AACrC,SAASC,YAAAA,iBAAgB;AACzB,SAASC,qBAAqB;AAC9B,SAASC,0BAA0BC,yCAAyC;AAE5E,SAASC,iBAAiB;AAI1B,SAASC,yBAAyB;AAClC,SACEC,eAAeC,yBAAyBC,yBACnC;AACP,SAASC,iBAAiB;AAGnB,IAAMC,eAAe,8BAC1BC,KACAC,oBACAC,oBACAC,qBAAAA;AAEA,QAAM,EAAEC,KAAI,IAAKJ;AACjB,QAAMK,SAAS,IAAIC,cAAcF,IAAAA;AACjC,QAAMG,qBAAqB,MAAMC,yBAAyBC,OAAO;IAAEC,SAASR;EAAmB,CAAA;AAE/FS,UAAQC,IAAI,0CAAA;AACZC,EAAAA,UAAS,MAAMN,mBAAmBO,MAAK,GAAI,MAAM,0CAAA;AACjDH,UAAQC,IAAI,uCAAA;AAEZ,QAAMG,SAAS,MAAMC,cAAcP,OAAO;IACxCL;IACAa,mBAAmBC;IACnBf;IACAO,SAASR;IACTiB,yBAAyB;MACvB,GAAGjB;MAAoBkB,gBAAgBC,UAAUC,IAAI,MAAM,IAAIC,UAAU,EAAA,CAAA;MAAMC,YAAYvB;IAC7F;EACF,CAAA;AAEAU,UAAQC,IAAI,+BAAA;AACZC,EAAAA,UAAS,MAAME,OAAOD,MAAK,GAAI,MAAM,+BAAA;AACrCH,UAAQC,IAAI,4BAAA;AAEZ,QAAMa,8BAA8B,MAAMC,kCAAkCjB,OAAO;IACjFC,SAASR;IACTe,mBAAmBC;EACrB,CAAA;AAEAP,UAAQC,IAAI,mDAAA;AACZC,EAAAA,UAAS,MAAMY,4BAA4BX,MAAK,GAAI,MAAM,mDAAA;AAC1DH,UAAQC,IAAI,gDAAA;AAEZ,QAAMe,aAAa,IAAIC,kBAAkB;IAAEvB;IAAQU;EAAO,CAAA;AAC1D,QAAMc,SAASC,wBAAwBH,YAAYpB,kBAAAA;AAEnDP,MAAI+B,KAAK,QAAQ,CAACC,KAAKC,QAAAA;AACrBC,IAAAA,sBAAqBD,GAAAA;AACrBJ,WAAOM,OAAOH,IAAII,MAAM,CAACC,GAAGC,gBAAAA;AAC1BL,UAAIM,KAAKD,WAAAA;IACX,CAAA;EACF,CAAA;AACF,GA9C4B;;;ACNrB,IAAME,YAAY,8BACvBC,KACAC,oBACAC,oBACAC,qBAAAA;AAEA,QAAMC,aAAaJ,KAAKC,oBAAoBC,oBAAoBC,gBAAAA;AAChEE,oBAAkBL,GAAAA;AAClBM,gBAAcN,GAAAA;AAChB,GATyB;;;ATalB,IAAMO,SAAS,8BACpBC,MACAC,oBACAC,oBACAC,qBAAAA;AAEAC,qBAAAA;AACA,QAAMC,MAAMC,SAAAA;AACZD,MAAIE,IAAI,QAAQ,KAAA;AAEhBF,MAAIG,IAAIC,KAAAA,CAAAA;AACRJ,MAAIG,IAAIE,YAAAA,CAAAA;AACRL,MAAIG,IAAIG,gBAAAA;AACRN,MAAIG,IAAII,kBAAkBC,yBAAyB;IAAEC,OAAO;EAAM,CAAA,CAAA,CAAA;AAClET,MAAIG,IAAIO,iBAAAA;AACRC,uCAAqCX,GAAAA;AACrCA,MAAIG,IAAIS,qBAAAA;AACRC,8BAA4Bb,GAAAA;AAC5BA,MAAIL,OAAOA;AACX,QAAMmB,UAAUd,KAAKJ,oBAAoBC,oBAAoBC,gBAAAA;AAC7DE,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAtBsB;;;AUtBtB,SAASgB,YAAAA,iBAAgB;AACzB,SACEC,qCACAC,uBACAC,sBAAsBC,qBACtBC,gBACAC,kBACAC,8BACK;AACP,SAASC,oBAAoBC,2BAA2B;AAGxD,SACEC,OAAOC,iBAAiBC,iBACnB;AAEP,SAASC,+BAA+B;AAIxC,IAAMC,WAAW;AASjB,eAAsBC,UAAUC,SAAyB;AACvD,QAAM,EACJC,QAAQC,QAAQC,MAAMC,aAAY,IAChCJ;AACJ,QAAM,EAAEK,KAAI,IAAKL,QAAQC,OAAOK;AAChC,QAAMC,SAAS,MAAMC,iBAAiB;IAAEP;IAAQC;EAAO,CAAA;AACvD,QAAMO,mBAAmB,MAAMC,qBAAqBT,QAAQC,MAAAA;AAE5D,QAAMS,oBAAoBC,UAAS,MAAMC,sBAAsB;IAAEZ;IAAQC;EAAO,CAAA,GAAI,MAAM,qCAAA;AAC1F,QAAMY,qBAAqBF,UAAS,MAAMG,uBAAuB;IAAEd;IAAQC;EAAO,CAAA,GAAI,MAAM,sCAAA;AAE5F,QAAM,EAAEC,MAAMa,eAAc,IAAK,MAAMC,eAAe;IACpDhB;IACAC;IACAK;IACAJ,MAAMC;IACNU;IACAH;EACF,CAAA;AAEA,QAAMO,WAAWC,wBAAkDH,cAAAA;AAEnE,QAAMI,WAAW,MAAMJ,eAAeK,KAAI;AAE1C,MAAID,SAASE,WAAW,GAAG;AACzBpB,YAAQqB,KAAK,kEAAA;AACb,UAAMC,kBAAkB,MAAMC,oBAAoB;MAAExB;MAAQC;IAAO,CAAA;AACnE,UAAMwB,UAAUjB,iBAAiBiB;AACjC,UAAMC,uBAAuB1B,OAAO2B,MAAMD,wBAAwBH,gBAAgBK;AAClF,UAAMC,SAAS,MAAMC,mBAAmBP,iBAAiBE,SAASM,UAAUC,QAAQC,MAAM,QAAU,CAAA,EAAGC,MAAMR,oBAAAA;AAC7G,UAAMX,eAAeoB,OAAO;SAAIN,OAAO,CAAA,EAAGO,KAAI;MAAIP,OAAO,CAAA;KAAG;AAC5DQ,YAAQC,IAAI,+DAAA;AACZ,UAAMC,SAAS,MAAMC,oCAAoCX,OAAO,CAAA,GAAIN,iBAAiBkB,gBAAgB;MAAC;MAAG;OAAS,IAAA,CAAA;AAClH,UAAM1B,eAAeoB,OAAO;SAAII,OAAO,CAAA,EAAGH,KAAI;MAAIG,OAAO,CAAA;KAAG;AAC5DF,YAAQC,IAAI,4BAA4Bf,gBAAgBK,OAAO,EAAE;EACnE;AAEA,QAAMc,qBAA6C;IACjDjB,SAASjB,iBAAiBiB;IAC1BkB,OAAOnC;IACPoC,OAAO;MAAE3B;IAAS;IAClB4B,MAAM,mCAAA;AACJ,YAAMA,OAAO,MAAMC,oBAAoB/B,cAAAA;AACvC,aAAO;QAACJ,UAASkC,MAAME,OAAO,MAAM,iCAAA;QAAoCF,MAAMG,SAAS;;IACzF,GAHM;EAIR;AACA,QAAMC,OAAO,MAAM/C,KAAKgD,QAAQ,GAAA;AAChC,QAAMC,QAAQC,IAAIH,KAAKI,IAAI,CAACC,QAAAA;AAC1B,WAAOA,IAAIC,QAAK,MAAS,MAAM;EACjC,CAAA,CAAA;AAEA,QAAMC,MAAM,MAAMC,OAAOvD,MAAMW,oBAAoB6B,oBAAoB1C,OAAOK,IAAIqD,gBAAgB;AAClG,QAAMC,SAASH,IAAII,OAAOxD,MAAMP,UAAU,MAAMI,QAAQqC,IAAI,oCAAoCzC,QAAAA,IAAYO,IAAAA,EAAM,CAAA;AAClHuD,SAAOE,WAAW,GAAA;AAClB,SAAOF;AACT;AAvDsB7D;","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","StepSizes","RewardMultipliers","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","addRpcRoutes","app","transferSummaryMap","stakedChainContext","initRewardsCache","node","runner","NodeXyoRunner","networkStakeViewer","SimpleNetworkStakeViewer","create","context","console","log","assertEx","start","viewer","NodeXyoViewer","rewardMultipliers","RewardMultipliers","transfersSummaryContext","stepSemaphores","StepSizes","map","Semaphore","summaryMap","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","transferSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","transferSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initChainStakeViewer","initProducerAccount","initServerNode","initServerWallet","initTransferSummaryMap","createGenesisBlock","findMostRecentBlock","asXL1","asXL1BlockRange","XL1Amount","readPayloadMapFromStore","hostname","getServer","context","config","logger","node","providedNode","port","api","wallet","initServerWallet","stakeChainViewer","initChainStakeViewer","balanceSummaryMap","assertEx","initBalanceSummaryMap","transferSummaryMap","initTransferSummaryMap","chainArchivist","initServerNode","chainMap","readPayloadMapFromStore","payloads","next","length","warn","producerAccount","initProducerAccount","chainId","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","stakedChainContext","stake","store","head","findMostRecentBlock","_hash","block","mods","resolve","Promise","all","map","mod","start","app","getApp","initRewardsCache","server","listen","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n await addRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer } from '@xyo-network/chain-viewers'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { RewardMultipliers } from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n accountBalanceViewer,\n context: stakedChainContext,\n transfersSummaryContext: {\n ...stakedChainContext, stepSemaphores: StepSizes.map(() => new Semaphore(20)), summaryMap: transferSummaryMap,\n },\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection, networkStakeViewer)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport 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 transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initChainIterator,\n initChainStakeViewer, initProducerAccount,\n initServerNode,\n initServerWallet,\n initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock, findMostRecentBlock } from '@xyo-network/chain-protocol'\nimport { blockViewerFromChainIteratorAndArchivist } from '@xyo-network/chain-services'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asXL1, asXL1BlockRange, StepSizes, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore, SimpleAccountBalanceViewer } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeChainViewer = await initChainStakeViewer(config, logger)\n\n const balanceSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transferSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transferSummaryMap,\n balanceSummaryMap,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const producerAccount = await initProducerAccount({ config, logger })\n const chainId = stakeChainViewer.chainId\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n const stakedChainContext: StakedChainContextRead = {\n chainId: stakeChainViewer.chainId,\n stake: stakeChainViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n }\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainIterator = await initChainIterator({\n config,\n logger,\n chainMap,\n head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),\n })\n\n const blockViewer = blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist)\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n context: {\n chainId: stakedChainContext.chainId,\n store: stakedChainContext.store,\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balanceSummaryMap,\n },\n transferContext: {\n chainId: stakedChainContext.chainId,\n store: stakedChainContext.store,\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n },\n blockViewer,\n })\n\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n\n const app = await getApp(node, transferSummaryMap, stakedChainContext, accountBalanceViewer, config.api.initRewardsCache)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":";;;;AAAA,SACEA,uBACAC,6BACAC,sCACAC,mBACAC,0BACAC,kBACAC,gBACAC,yBACK;AAOP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,cAAa;;;ACnBpB,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AACvC,SAASC,2BAA2B;AAS7B,IAAMC,qBAAqB,6BAAA;AAChC,QAAMC,mBAAmB;IAAC,IAAIC,oBAAAA;IAAuB,IAAIC,uBAAAA;;AACzDC,2BAAyB;IAAEH;EAAiB,CAAA;AAC9C,GAHkC;;;ACVlC,SAASI,eAAAA,oBAAmB;;;ACD5B,SAASC,oBAAoB;AAC7B,SAASC,WAAWC,iBAAiB;AACrC,SAASC,oBAAoB;AAG7B,SAASC,mBAAmB;AAI5B,IAAMC,UAAwD,8BAAOC,KAAKC,KAAKC,SAAAA;AAC7E,QAAM,EAAEC,SAASC,iBAAgB,IAAKJ,IAAIK;AAC1C,QAAM,EAAEC,KAAI,IAAKN,IAAIO;AACrB,QAAMJ,UAAUK,UAAUJ,gBAAAA;AAC1B,MAAIK,UAAUN,OAAAA,GAAU;AACtB,QAAIO,MAAMJ,KAAKH,YAAYA,UAAUG,OAAQ,MAAMA,KAAKK,QAAQR,SAAS;MAAES,WAAW;IAAO,CAAA;AAC7F,QAAIF,KAAK;AACPT,UAAIY,KAAK,MAAMH,IAAII,MAAK,CAAA;AACxB;IACF;EACF;AACA,MAAIC,aAAaX,gBAAAA,GAAmB;AAClC,UAAMM,MAAM,MAAMJ,KAAKK,QAAQP,kBAAkB;MAAEQ,WAAW;IAAO,CAAA;AACrE,QAAIF,KAAK;AACPT,UAAIe,SAASC,YAAYC,mBAAmB,IAAIR,IAAIP,OAAO,EAAE;AAC7D;IACF;EACF;AACAD,OAAK,OAAA;AACP,GAnB8D;AAoBvD,IAAMiB,aAAaC,aAAarB,OAAAA;;;AC7BvC,SAASsB,gBAAAA,qBAAoB;AAE7B,SACEC,aAAAA,YAAWC,UACXC,WACAC,iBACK;AACP,SAASC,2BAAmD;AAC5D,SAASC,0BAA0B;AAInC,SAASC,eAAAA,oBAAmB;;;ACX5B,SAASC,0BAA0B;AAEnC,SAASC,0BAA0B;AAInC,IAAMC,gBAAgB;AAEf,IAAMC,iBAAiB,wBAACC,KAAqBC,KAAcC,IAAuBC,aAAAA;AAGvF,QAAMC,oBACFD,UACEE,KAAKP,aAAAA,EACNQ,OAAqB,CAACC,YAAqCA,SAASC,WAAWC,kBAAAA,EAC/EC,IAAIR,CAAAA,QAAMA,IAAGS,SAAS,KAAK,CAAA;AAEhC,QAAMA,YAAY;IAACT,GAAGS;OAAcP;IAAmBE,OAAOM,CAAAA,YAAWA,QAAQC,SAAS,CAAA;AAC1F,QAAMC,UAAUH,UAAUE,SAAS,IAAIE,OAAOC,YAAYhB,IAAIiB,QAAQP,IAAIF,CAAAA,WAAU;IAACA;IAAQG;GAAU,CAAA,IAAK,CAAC;AAC7G,QAAMO,WAAW;IAAEJ;EAAQ;AAC3B,SAAO;IAAEN,QAAQW;IAAoBD;EAAS;AAChD,GAb8B;;;ADU9B,IAAME,WAAsG,8BAAOC,KAAKC,KAAKC,SAAAA;AAC3H,QAAMC,cAAc,wBAACC,MAAcC,UAAU,qBAAqBC,YAAAA;AAChE,UAAMC,QAAQ,IAAIC,mBAAAA,EAAqBH,QAAQA,OAAAA,EAASC,QAAQA,OAAAA,EAASG,MAAK;AAC9ER,QAAIS,OAAOC,cAAc;AACzBV,QAAIW,OAAOR,IAAAA,EAAMS,KAAKN,KAAAA;AACtBL,SAAAA;EACF,GALoB;AAOpB,QAAM,EAAEY,QAAO,IAAKd,IAAIe;AACxB,QAAM,EAAEC,KAAI,IAAKhB,IAAIiB;AACrB,QAAM,CAACC,IAAIC,QAAAA,IAAYC,MAAMC,QAAQrB,IAAIsB,IAAI,IAAItB,IAAIsB,OAAO,CAAA;AAC5D,MAAI,CAACC,UAAUT,OAAAA,GAAU;AACvB,WAAOX,YAAYqB,aAAYC,aAAa,iBAAA;EAC9C;AAEA,MAAI,CAACP,IAAI;AACP,WAAOf,YAAYqB,aAAYC,aAAa,sBAAA;EAC9C;AAEA,MAAI,CAACC,oBAAoBR,EAAAA,GAAK;AAC5B,WAAOf,YAAYqB,aAAYC,aAAa,4BAAA;EAC9C;AAEA,MAAIE,UAA4B,CAAA;AAChC,QAAMC,oBAAoBC,UAAUf,OAAAA;AACpC,MAAIE,KAAKF,YAAYc,kBAAmBD,WAAU;IAACX;;OAC9C;AACH,UAAMc,eAAeC,WAAUjB,OAAAA;AAC/B,UAAMkB,YAAaF,iBAAiBG,SAAaA,SAAY,MAAMjB,KAAKkB,QAAQJ,cAAc;MAAEK,UAAU;IAAG,CAAA;AAE7G,QAAIH,UAAWL,WAAU;MAACK;;SACrB;AACH,YAAMI,SAAS,MAAMpB,KAAKkB,QAAQpB,SAAS;QAAEuB,WAAW;MAAO,CAAA;AAC/D,UAAID,QAAQ;AACV,cAAME,gBAAgBC,SAASH,QAAQtB,SAAS,MAAM,wCAAA;AACtDb,YAAIuC,SAAShB,aAAYiB,oBAAoB,IAAIH,aAAAA,EAAe;AAChE;MACF,OAAO;AACL,eAAOnC,YAAYqB,aAAYkB,WAAW,oBAAoB;UAAE5B;QAAQ,CAAA;MAC1E;IACF;EACF;AAEA,MAAIa,QAAQgB,SAAS,GAAG;AACtB,UAAMC,MAAMjB,QAAQ,CAAA;AACpB,UAAMkB,cAAcC,eAAeF,KAAK5C,KAAKkB,IAAIC,QAAAA;AACjD,QAAI;AACF,YAAM4B,cAAc,MAAMH,IAAII,MAAM9B,IAAIC,UAAU0B,WAAAA;AAClD5C,UAAIY,KAAKkC,WAAAA;IACX,SAASE,IAAI;AACX,aAAO9C,YAAYqB,aAAY0B,uBAAuB,gBAAgB;QAAE7C,SAAU4C,IAAc5C,WAAW;MAAgB,CAAA;IAC7H;EACF,OAAO;AACL,WAAOF,YAAYqB,aAAYkB,WAAW,oBAAoB;MAAE5B;IAAQ,CAAA;EAC1E;AACF,GAvD4G;AAyDrG,IAAMqC,cAAcC,cAAarD,QAAAA;;;AFtEjC,IAAMsD,gBAAgB,wBAACC,QAAAA;AAC5B,QAAMC,gBAAgBD,IAAIE;AAC1B,QAAMC,UAAUF,cAAcE;AAC9B,QAAMC,wBAAwB,IAAID,OAAAA;AAClCH,MAAIK,IAAI,KAAK,CAACC,MAAMC,QAAQA,IAAIC,SAASC,aAAYC,mBAAmBN,qBAAAA,CAAAA;AACxEJ,MAAIW,KAAK,KAAK,CAACL,MAAMC,QAAQA,IAAIC,SAASC,aAAYG,oBAAoBR,qBAAAA,CAAAA;AAC1EJ,MAAIK,IAAI,aAAaQ,UAAAA;AACrBb,MAAIW,KAAK,aAAaG,WAAAA;AACtBd,MAAIK,IAAI,UAAU,CAACC,MAAMC,QAAAA;AACvBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACAhB,MAAIW,KAAK,UAAU,CAACL,MAAMC,QAAAA;AACxBA,QAAIQ,WAAWN,aAAYO,SAAS;EACtC,CAAA;AACF,GAd6B;;;AIN7B,SAASC,4BAA4B;AACrC,SAASC,QAAQC,aAAAA,kBAAiB;AAKlC,SAASC,2BAA2B;AAGpC,SAASC,sBAAsB;AAE/B,SAASC,cAAcC,kBAAkB;AAEzC,OAAOC,aAAa;AAGpB,IAAMC,mBAAmB,8BAAOC,MAAoBC,8BAAAA;AAClD,QAAMC,MAAM,MAAMF,KAAKG,QAAQF,yBAAAA;AAC/B,SAAOG,oBAAoBF,KAAK;IAAEG,UAAU;EAAK,CAAA;AACnD,GAHyB;AAKzB,IAAIC;AAEJ,IAAMC,eAAe,8BAAOP,MAAoBC,8BAAAA;AAC9C,MAAIO,WAAUF,iBAAAA,EAAoB,QAAOA;AACzCA,sBAAoB,MAAMP,iBAAiBC,MAAMC,yBAAAA;AACjD,SAAOK;AACT,GAJqB;AAWd,IAAMG,sBAAsB,wBAACC,YAAAA;AAClC,QAAM,EAAEV,MAAMC,0BAAyB,IAAKS;AAC5C,QAAMC,SAASC,QAAQC,OAAO;IAAEC,aAAa;EAAK,CAAA;AAElDH,SAAOI,KAAK,WAAW,OAAOC,KAAKC,QAAAA;AACjCC,yBAAqBD,GAAAA;AACrB,UAAME,OAAOC,MAAMC,QAAQL,IAAIG,IAAI,IAAIH,IAAIG,OAAO;MAACH,IAAIG;;AACvD,UAAMG,YAAY,MAAMC,eAAeC,UAAmBL,IAAAA,GAAOM,IAAIC,CAAAA,MAAKA,EAAE,CAAA,CAAE;AAC9E,UAAMC,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUE,OAAOP,QAAAA;AACtCL,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,SAAS,OAAOhB,KAAoCC,QAAAA;AAC7DC,yBAAqBD,GAAAA;AACrB,UAAMgB,SAASC,WAAWlB,IAAImB,MAAMF,MAAM,IAAIjB,IAAImB,MAAMF,SAASG;AACjE,UAAMC,QAAQ7B,WAAUQ,IAAImB,MAAME,KAAK,IAAIC,OAAOtB,IAAImB,MAAME,KAAK,IAAID;AACrE,UAAMG,OAAO/B,WAAUQ,IAAImB,MAAMI,IAAI,IAAIC,QAAQxB,IAAImB,MAAMI,IAAI,IAAIH;AACnE,UAAMK,QAAQzB,IAAImB,MAAMM,UAAU,QAAQ,QAAQ;AAClD,UAAM/B,WAAgC;MACpC2B;MAAOE;MAAME;MAAOR;IACtB;AACA,UAAMN,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,MAAMD,UAAUe,KAAKhC,QAAAA;AACpCO,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AACAjB,SAAOI,KAAK,SAAS,OAAOC,KAAwDC,QAAAA;AAClFC,yBAAqBD,GAAAA;AACrB,UAAMP,WAAUM,IAAIG;AACpB,UAAMQ,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,UAAM2B,SAAS,OAAOpB,WAAUE,QAAAA,IAAWiB,UAAUe,KAAKhC,QAAAA,IAAWiB,UAAUe,KAAI;AACnFzB,QAAIa,OAAO,GAAA,EAAKC,KAAKH,MAAAA;EACvB,CAAA;AAEAjB,SAAOqB,IAAI,cAAc,OAAOhB,KAAKC,QAAAA;AACnCC,yBAAqBD,GAAAA;AACrB,UAAM,EAAE0B,MAAMC,QAAO,IAAK5B,IAAI6B;AAC9B,UAAMF,OAAOG,OAAOF,OAAAA;AACpB,QAAIpC,WAAUmC,IAAAA,GAAO;AACnB,YAAMhB,YAAY,MAAMpB,aAAaP,MAAMC,yBAAAA;AAC3C,YAAM,CAAC8C,OAAAA,IAAW,MAAMpB,UAAUK,IAAI;QAACW;OAAK;AAC5C,UAAIK,aAAaD,OAAAA,GAAU;AACzB9B,YAAIc,KAAKgB,OAAAA;AACT;MACF;IACF;AACA9B,QAAIa,OAAO,GAAA,EAAKmB,KAAI;EACtB,CAAA;AAEA,SAAOtC;AACT,GAlDmC;;;AC9B5B,IAAMuC,oBAAoB,wBAACC,QAAAA;AAChC,QAAM,EAAEC,KAAI,IAAKD;AACjB,QAAME,4BAA4B;AAClCF,MAAIG,IAAI,UAAUC,oBAAoB;IAAEH;IAAMC;EAA0B,CAAA,CAAA;AAC1E,GAJiC;;;ACJjC,SAASG,wBAAAA,6BAA4B;AACrC,SAASC,YAAAA,iBAAgB;AACzB,SAASC,qBAAqB;AAC9B,SAASC,0BAA0BC,yCAAyC;AAE5E,SAASC,iBAAiB;AAK1B,SAASC,yBAAyB;AAClC,SACEC,eAAeC,yBAAyBC,yBACnC;AACP,SAASC,iBAAiB;AAGnB,IAAMC,eAAe,8BAC1BC,KACAC,oBACAC,oBACAC,sBACAC,qBAAAA;AAEA,QAAM,EAAEC,KAAI,IAAKL;AACjB,QAAMM,SAAS,IAAIC,cAAcF,IAAAA;AACjC,QAAMG,qBAAqB,MAAMC,yBAAyBC,OAAO;IAAEC,SAAST;EAAmB,CAAA;AAE/FU,UAAQC,IAAI,0CAAA;AACZC,EAAAA,UAAS,MAAMN,mBAAmBO,MAAK,GAAI,MAAM,0CAAA;AACjDH,UAAQC,IAAI,uCAAA;AAEZ,QAAMG,SAAS,MAAMC,cAAcP,OAAO;IACxCL;IACAa,mBAAmBC;IACnBf;IACAD;IACAQ,SAAST;IACTkB,yBAAyB;MACvB,GAAGlB;MAAoBmB,gBAAgBC,UAAUC,IAAI,MAAM,IAAIC,UAAU,EAAA,CAAA;MAAMC,YAAYxB;IAC7F;EACF,CAAA;AAEAW,UAAQC,IAAI,+BAAA;AACZC,EAAAA,UAAS,MAAME,OAAOD,MAAK,GAAI,MAAM,+BAAA;AACrCH,UAAQC,IAAI,4BAAA;AAEZ,QAAMa,8BAA8B,MAAMC,kCAAkCjB,OAAO;IACjFC,SAAST;IACTgB,mBAAmBC;EACrB,CAAA;AAEAP,UAAQC,IAAI,mDAAA;AACZC,EAAAA,UAAS,MAAMY,4BAA4BX,MAAK,GAAI,MAAM,mDAAA;AAC1DH,UAAQC,IAAI,gDAAA;AAEZ,QAAMe,aAAa,IAAIC,kBAAkB;IAAEvB;IAAQU;EAAO,CAAA;AAC1D,QAAMc,SAASC,wBAAwBH,YAAYpB,kBAAAA;AAEnDR,MAAIgC,KAAK,QAAQ,CAACC,KAAKC,QAAAA;AACrBC,IAAAA,sBAAqBD,GAAAA;AACrBJ,WAAOM,OAAOH,IAAII,MAAM,CAACC,GAAGC,gBAAAA;AAC1BL,UAAIM,KAAKD,WAAAA;IACX,CAAA;EACF,CAAA;AACF,GAhD4B;;;ACNrB,IAAME,YAAY,8BACvBC,KACAC,oBACAC,oBACAC,sBACAC,qBAAAA;AAEA,QAAMC,aAAaL,KAAKC,oBAAoBC,oBAAoBC,sBAAsBC,gBAAAA;AACtFE,oBAAkBN,GAAAA;AAClBO,gBAAcP,GAAAA;AAChB,GAVyB;;;ATalB,IAAMQ,SAAS,8BACpBC,MACAC,oBACAC,oBACAC,sBACAC,qBAAAA;AAEAC,qBAAAA;AACA,QAAMC,MAAMC,SAAAA;AACZD,MAAIE,IAAI,QAAQ,KAAA;AAEhBF,MAAIG,IAAIC,KAAAA,CAAAA;AACRJ,MAAIG,IAAIE,YAAAA,CAAAA;AACRL,MAAIG,IAAIG,gBAAAA;AACRN,MAAIG,IAAII,kBAAkBC,yBAAyB;IAAEC,OAAO;EAAM,CAAA,CAAA,CAAA;AAClET,MAAIG,IAAIO,iBAAAA;AACRC,uCAAqCX,GAAAA;AACrCA,MAAIG,IAAIS,qBAAAA;AACRC,8BAA4Bb,GAAAA;AAC5BA,MAAIN,OAAOA;AACX,QAAMoB,UAAUd,KAAKL,oBAAoBC,oBAAoBC,sBAAsBC,gBAAAA;AACnFE,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAvBsB;;;AUvBtB,SAASgB,YAAAA,iBAAgB;AACzB,SACEC,qCACAC,uBACAC,mBACAC,sBAAsBC,qBACtBC,gBACAC,kBACAC,8BACK;AACP,SAASC,oBAAoBC,2BAA2B;AACxD,SAASC,gDAAgD;AAGzD,SACEC,OAAOC,iBAAiBC,aAAAA,YAAWC,iBAC9B;AAEP,SAASC,yBAAyBC,kCAAkC;AACpE,SAASC,aAAAA,kBAAiB;AAI1B,IAAMC,WAAW;AASjB,eAAsBC,UAAUC,SAAyB;AACvD,QAAM,EACJC,QAAQC,QAAQC,MAAMC,aAAY,IAChCJ;AACJ,QAAM,EAAEK,KAAI,IAAKL,QAAQC,OAAOK;AAChC,QAAMC,SAAS,MAAMC,iBAAiB;IAAEP;IAAQC;EAAO,CAAA;AACvD,QAAMO,mBAAmB,MAAMC,qBAAqBT,QAAQC,MAAAA;AAE5D,QAAMS,oBAAoBC,UAAS,MAAMC,sBAAsB;IAAEZ;IAAQC;EAAO,CAAA,GAAI,MAAM,qCAAA;AAC1F,QAAMY,qBAAqBF,UAAS,MAAMG,uBAAuB;IAAEd;IAAQC;EAAO,CAAA,GAAI,MAAM,sCAAA;AAE5F,QAAM,EAAEC,MAAMa,eAAc,IAAK,MAAMC,eAAe;IACpDhB;IACAC;IACAK;IACAJ,MAAMC;IACNU;IACAH;EACF,CAAA;AAEA,QAAMO,WAAWC,wBAAkDH,cAAAA;AAEnE,QAAMI,WAAW,MAAMJ,eAAeK,KAAI;AAE1C,MAAID,SAASE,WAAW,GAAG;AACzBpB,YAAQqB,KAAK,kEAAA;AACb,UAAMC,kBAAkB,MAAMC,oBAAoB;MAAExB;MAAQC;IAAO,CAAA;AACnE,UAAMwB,UAAUjB,iBAAiBiB;AACjC,UAAMC,uBAAuB1B,OAAO2B,MAAMD,wBAAwBH,gBAAgBK;AAClF,UAAMC,SAAS,MAAMC,mBAAmBP,iBAAiBE,SAASM,UAAUC,QAAQC,MAAM,QAAU,CAAA,EAAGC,MAAMR,oBAAAA;AAC7G,UAAMX,eAAeoB,OAAO;SAAIN,OAAO,CAAA,EAAGO,KAAI;MAAIP,OAAO,CAAA;KAAG;AAC5DQ,YAAQC,IAAI,+DAAA;AACZ,UAAMC,SAAS,MAAMC,oCAAoCX,OAAO,CAAA,GAAIN,iBAAiBkB,gBAAgB;MAAC;MAAG;OAAS,IAAA,CAAA;AAClH,UAAM1B,eAAeoB,OAAO;SAAII,OAAO,CAAA,EAAGH,KAAI;MAAIG,OAAO,CAAA;KAAG;AAC5DF,YAAQC,IAAI,4BAA4Bf,gBAAgBK,OAAO,EAAE;EACnE;AAEA,QAAMc,qBAA6C;IACjDjB,SAASjB,iBAAiBiB;IAC1BkB,OAAOnC;IACPoC,OAAO;MAAE3B;IAAS;IAClB4B,MAAM,mCAAA;AACJ,YAAMA,OAAO,MAAMC,oBAAoB/B,cAAAA;AACvC,aAAO;QAACJ,UAASkC,MAAME,OAAO,MAAM,iCAAA;QAAoCF,MAAMG,SAAS;;IACzF,GAHM;EAIR;AACA,QAAMC,OAAO,MAAM/C,KAAKgD,QAAQ,GAAA;AAChC,QAAMC,QAAQC,IAAIH,KAAKI,IAAI,CAACC,QAAAA;AAC1B,WAAOA,IAAIC,QAAK,MAAS,MAAM;EACjC,CAAA,CAAA;AAEA,QAAMC,gBAAgB,MAAMC,kBAAkB;IAC5CzD;IACAC;IACAgB;IACA4B,MAAMlC,UAAS,MAAMmC,oBAAoB/B,cAAAA,GAAiB,MAAM,iCAAA;EAClE,CAAA;AAEA,QAAM2C,cAAcC,yCAAyCH,eAAezC,cAAAA;AAE5E,QAAM6C,uBAAuB,MAAMC,2BAA2BC,OAAO;IACnE/D,SAAS;MACP0B,SAASiB,mBAAmBjB;MAC5BmB,OAAOF,mBAAmBE;MAC1BC,MAAMH,mBAAmBG;MACzBkB,gBAAgBC,WAAUX,IAAI,MAAM,IAAIY,WAAU,EAAA,CAAA;MAClDC,YAAYxD;IACd;IACAyD,iBAAiB;MACf1C,SAASiB,mBAAmBjB;MAC5BmB,OAAOF,mBAAmBE;MAC1BC,MAAMH,mBAAmBG;MACzBkB,gBAAgBC,WAAUX,IAAI,MAAM,IAAIY,WAAU,EAAA,CAAA;MAClDC,YAAYrD;IACd;IACA6C;EACF,CAAA;AAEA/C,EAAAA,UAAS,MAAMiD,qBAAqBL,MAAK,GAAI,MAAM,4CAAA;AAEnD,QAAMa,MAAM,MAAMC,OAAOnE,MAAMW,oBAAoB6B,oBAAoBkB,sBAAsB5D,OAAOK,IAAIiE,gBAAgB;AACxH,QAAMC,SAASH,IAAII,OAAOpE,MAAMP,UAAU,MAAMI,QAAQqC,IAAI,oCAAoCzC,QAAAA,IAAYO,IAAAA,EAAM,CAAA;AAClHmE,SAAOE,WAAW,GAAA;AAClB,SAAOF;AACT;AApFsBzE;","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","StepSizes","RewardMultipliers","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","addRpcRoutes","app","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","node","runner","NodeXyoRunner","networkStakeViewer","SimpleNetworkStakeViewer","create","context","console","log","assertEx","start","viewer","NodeXyoViewer","rewardMultipliers","RewardMultipliers","transfersSummaryContext","stepSemaphores","StepSizes","map","Semaphore","summaryMap","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initChainIterator","initChainStakeViewer","initProducerAccount","initServerNode","initServerWallet","initTransferSummaryMap","createGenesisBlock","findMostRecentBlock","blockViewerFromChainIteratorAndArchivist","asXL1","asXL1BlockRange","StepSizes","XL1Amount","readPayloadMapFromStore","SimpleAccountBalanceViewer","Semaphore","hostname","getServer","context","config","logger","node","providedNode","port","api","wallet","initServerWallet","stakeChainViewer","initChainStakeViewer","balanceSummaryMap","assertEx","initBalanceSummaryMap","transferSummaryMap","initTransferSummaryMap","chainArchivist","initServerNode","chainMap","readPayloadMapFromStore","payloads","next","length","warn","producerAccount","initProducerAccount","chainId","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","stakedChainContext","stake","store","head","findMostRecentBlock","_hash","block","mods","resolve","Promise","all","map","mod","start","chainIterator","initChainIterator","blockViewer","blockViewerFromChainIteratorAndArchivist","accountBalanceViewer","SimpleAccountBalanceViewer","create","stepSemaphores","StepSizes","Semaphore","summaryMap","transferContext","app","getApp","initRewardsCache","server","listen","setTimeout"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
2
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type { MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
|
+
import type { AccountBalanceViewer, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
4
|
import type { Express } from 'express';
|
|
5
|
-
export declare const getApp: (node: NodeInstance, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<Express>;
|
|
5
|
+
export declare const getApp: (node: NodeInstance, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, accountBalanceViewer: AccountBalanceViewer, initRewardsCache?: boolean) => Promise<Express>;
|
|
6
6
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,sBAAsB,oBAAoB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type { MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
2
|
+
import type { AccountBalanceViewer, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
export declare const addRoutes: (app: Express, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
4
|
+
export declare const addRoutes: (app: Express, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, accountBalanceViewer: AccountBalanceViewer, initRewardsCache?: boolean) => Promise<void>;
|
|
5
5
|
//# sourceMappingURL=addRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
|
|
1
|
+
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,sBAAsB,oBAAoB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type { MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
2
|
+
import type { AccountBalanceViewer, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
export declare const addRpcRoutes: (app: Express, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
4
|
+
export declare const addRpcRoutes: (app: Express, transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, stakedChainContext: StakedChainContextRead, accountBalanceViewer: AccountBalanceViewer, initRewardsCache?: boolean) => Promise<void>;
|
|
5
5
|
//# sourceMappingURL=addRpcRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAMtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,
|
|
1
|
+
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAMtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC1E,oBAAoB,sBAAsB,EAC1C,sBAAsB,oBAAoB,EAC1C,mBAAmB,OAAO,kBA2C3B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAalD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D,OAAO,KAAK,EAAE,MAAM,EAA0B,MAAM,+BAA+B,CAAA;AASnF,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GAoFxD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.25",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,22 +52,23 @@
|
|
|
52
52
|
"@opentelemetry/instrumentation": "~0.208.0",
|
|
53
53
|
"@opentelemetry/instrumentation-express": "~0.57.0",
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
55
|
-
"@xylabs/express": "~5.0.
|
|
56
|
-
"@xylabs/sdk-js": "~5.0.
|
|
57
|
-
"@xyo-network/archivist-model": "~5.
|
|
58
|
-
"@xyo-network/boundwitness-model": "~5.
|
|
59
|
-
"@xyo-network/chain-orchestration": "~1.16.
|
|
60
|
-
"@xyo-network/chain-protocol": "~1.16.
|
|
61
|
-
"@xyo-network/chain-rpc": "~1.16.
|
|
62
|
-
"@xyo-network/chain-
|
|
63
|
-
"@xyo-network/
|
|
64
|
-
"@xyo-network/module-
|
|
65
|
-
"@xyo-network/
|
|
66
|
-
"@xyo-network/
|
|
67
|
-
"@xyo-network/payload-
|
|
68
|
-
"@xyo-network/
|
|
69
|
-
"@xyo-network/xl1-protocol
|
|
70
|
-
"@xyo-network/xl1-
|
|
55
|
+
"@xylabs/express": "~5.0.42",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.42",
|
|
57
|
+
"@xyo-network/archivist-model": "~5.2.10",
|
|
58
|
+
"@xyo-network/boundwitness-model": "~5.2.10",
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.16.25",
|
|
60
|
+
"@xyo-network/chain-protocol": "~1.16.25",
|
|
61
|
+
"@xyo-network/chain-rpc": "~1.16.25",
|
|
62
|
+
"@xyo-network/chain-services": "~1.16.25",
|
|
63
|
+
"@xyo-network/chain-viewers": "~1.16.25",
|
|
64
|
+
"@xyo-network/module-abstract": "~5.2.10",
|
|
65
|
+
"@xyo-network/module-model": "~5.2.10",
|
|
66
|
+
"@xyo-network/node-model": "~5.2.10",
|
|
67
|
+
"@xyo-network/payload-builder": "~5.2.10",
|
|
68
|
+
"@xyo-network/payload-model": "~5.2.10",
|
|
69
|
+
"@xyo-network/xl1-protocol": "~1.14.13",
|
|
70
|
+
"@xyo-network/xl1-protocol-sdk": "~1.16.25",
|
|
71
|
+
"@xyo-network/xl1-rpc": "~1.16.25",
|
|
71
72
|
"async-mutex": "~0.5.0",
|
|
72
73
|
"compression": "~1.8.1",
|
|
73
74
|
"cors": "~2.8.5",
|
|
@@ -81,24 +82,24 @@
|
|
|
81
82
|
"@types/express": "5.0.5",
|
|
82
83
|
"@types/express-serve-static-core": "~5.1.0",
|
|
83
84
|
"@types/node": "~24.10.1",
|
|
84
|
-
"@xylabs/sdk-js": "~5.0.
|
|
85
|
+
"@xylabs/sdk-js": "~5.0.42",
|
|
85
86
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
86
87
|
"@xylabs/tsconfig": "~7.2.8",
|
|
87
|
-
"@xyo-network/account": "~5.
|
|
88
|
-
"@xyo-network/account-model": "~5.
|
|
89
|
-
"@xyo-network/archivist-abstract": "~5.
|
|
90
|
-
"@xyo-network/bios-model": "~7.
|
|
91
|
-
"@xyo-network/boundwitness-builder": "~5.
|
|
92
|
-
"@xyo-network/module-abstract-mongodb": "~5.
|
|
93
|
-
"@xyo-network/module-model-mongodb": "~5.
|
|
94
|
-
"@xyo-network/node-memory": "~5.
|
|
95
|
-
"@xyo-network/xl1-protocol": "~1.
|
|
88
|
+
"@xyo-network/account": "~5.2.10",
|
|
89
|
+
"@xyo-network/account-model": "~5.2.10",
|
|
90
|
+
"@xyo-network/archivist-abstract": "~5.2.10",
|
|
91
|
+
"@xyo-network/bios-model": "~7.2.0",
|
|
92
|
+
"@xyo-network/boundwitness-builder": "~5.2.10",
|
|
93
|
+
"@xyo-network/module-abstract-mongodb": "~5.2.10",
|
|
94
|
+
"@xyo-network/module-model-mongodb": "~5.2.10",
|
|
95
|
+
"@xyo-network/node-memory": "~5.2.10",
|
|
96
|
+
"@xyo-network/xl1-protocol": "~1.14.13",
|
|
96
97
|
"dotenv": "~17.2.3",
|
|
97
98
|
"eslint": "^9.39.1",
|
|
98
99
|
"nodemon": "~3.1.11",
|
|
99
100
|
"tslib": "~2.8.1",
|
|
100
101
|
"typescript": "~5.9.3",
|
|
101
|
-
"vitest": "~4.0.
|
|
102
|
+
"vitest": "~4.0.13",
|
|
102
103
|
"vitest-mock-extended": "~3.1.0"
|
|
103
104
|
},
|
|
104
105
|
"engines": {
|
package/src/server/app.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
12
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
13
13
|
import type {
|
|
14
|
+
AccountBalanceViewer,
|
|
14
15
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
15
16
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
16
17
|
import compression from 'compression'
|
|
@@ -25,6 +26,7 @@ export const getApp = async (
|
|
|
25
26
|
node: NodeInstance,
|
|
26
27
|
transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
27
28
|
stakedChainContext: StakedChainContextRead,
|
|
29
|
+
accountBalanceViewer: AccountBalanceViewer,
|
|
28
30
|
initRewardsCache?: boolean,
|
|
29
31
|
): Promise<Express> => {
|
|
30
32
|
addInstrumentation()
|
|
@@ -40,7 +42,7 @@ export const getApp = async (
|
|
|
40
42
|
app.use(customPoweredByHeader)
|
|
41
43
|
disableCaseSensitiveRouting(app)
|
|
42
44
|
app.node = node
|
|
43
|
-
await addRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache)
|
|
45
|
+
await addRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)
|
|
44
46
|
app.use(standardErrors)
|
|
45
47
|
return app
|
|
46
48
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
2
2
|
import type {
|
|
3
|
+
AccountBalanceViewer,
|
|
3
4
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
4
5
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
5
6
|
import type { Express } from 'express'
|
|
@@ -12,9 +13,10 @@ export const addRoutes = async (
|
|
|
12
13
|
app: Express,
|
|
13
14
|
transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
14
15
|
stakedChainContext: StakedChainContextRead,
|
|
16
|
+
accountBalanceViewer: AccountBalanceViewer,
|
|
15
17
|
initRewardsCache?: boolean,
|
|
16
18
|
) => {
|
|
17
|
-
await addRpcRoutes(app, transferSummaryMap, stakedChainContext, initRewardsCache)
|
|
19
|
+
await addRpcRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)
|
|
18
20
|
addDataLakeRoutes(app)
|
|
19
21
|
addNodeRoutes(app)
|
|
20
22
|
}
|
|
@@ -5,6 +5,7 @@ import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer } from '@xy
|
|
|
5
5
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
6
6
|
import { StepSizes } from '@xyo-network/xl1-protocol'
|
|
7
7
|
import type {
|
|
8
|
+
AccountBalanceViewer,
|
|
8
9
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
9
10
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
10
11
|
import { RewardMultipliers } from '@xyo-network/xl1-protocol-sdk'
|
|
@@ -18,6 +19,7 @@ export const addRpcRoutes = async (
|
|
|
18
19
|
app: Express,
|
|
19
20
|
transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
20
21
|
stakedChainContext: StakedChainContextRead,
|
|
22
|
+
accountBalanceViewer: AccountBalanceViewer,
|
|
21
23
|
initRewardsCache?: boolean,
|
|
22
24
|
) => {
|
|
23
25
|
const { node } = app
|
|
@@ -32,6 +34,7 @@ export const addRpcRoutes = async (
|
|
|
32
34
|
node,
|
|
33
35
|
rewardMultipliers: RewardMultipliers,
|
|
34
36
|
initRewardsCache,
|
|
37
|
+
accountBalanceViewer,
|
|
35
38
|
context: stakedChainContext,
|
|
36
39
|
transfersSummaryContext: {
|
|
37
40
|
...stakedChainContext, stepSemaphores: StepSizes.map(() => new Semaphore(20)), summaryMap: transferSummaryMap,
|
package/src/server/server.ts
CHANGED
|
@@ -3,19 +3,22 @@ import { assertEx } from '@xylabs/sdk-js'
|
|
|
3
3
|
import {
|
|
4
4
|
createProducerChainStakeIntentBlock,
|
|
5
5
|
initBalanceSummaryMap,
|
|
6
|
+
initChainIterator,
|
|
6
7
|
initChainStakeViewer, initProducerAccount,
|
|
7
8
|
initServerNode,
|
|
8
9
|
initServerWallet,
|
|
9
10
|
initTransferSummaryMap,
|
|
10
11
|
} from '@xyo-network/chain-orchestration'
|
|
11
12
|
import { createGenesisBlock, findMostRecentBlock } from '@xyo-network/chain-protocol'
|
|
13
|
+
import { blockViewerFromChainIteratorAndArchivist } from '@xyo-network/chain-services'
|
|
12
14
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
13
15
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
14
16
|
import {
|
|
15
|
-
asXL1, asXL1BlockRange, XL1Amount,
|
|
17
|
+
asXL1, asXL1BlockRange, StepSizes, XL1Amount,
|
|
16
18
|
} from '@xyo-network/xl1-protocol'
|
|
17
19
|
import type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'
|
|
18
|
-
import { readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
|
|
20
|
+
import { readPayloadMapFromStore, SimpleAccountBalanceViewer } from '@xyo-network/xl1-protocol-sdk'
|
|
21
|
+
import { Semaphore } from 'async-mutex'
|
|
19
22
|
|
|
20
23
|
import { getApp } from './app.ts'
|
|
21
24
|
|
|
@@ -79,7 +82,36 @@ export async function getServer(context: GetServerContext) {
|
|
|
79
82
|
return mod.start?.() ?? (() => true)
|
|
80
83
|
}))
|
|
81
84
|
|
|
82
|
-
const
|
|
85
|
+
const chainIterator = await initChainIterator({
|
|
86
|
+
config,
|
|
87
|
+
logger,
|
|
88
|
+
chainMap,
|
|
89
|
+
head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
const blockViewer = blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist)
|
|
93
|
+
|
|
94
|
+
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
95
|
+
context: {
|
|
96
|
+
chainId: stakedChainContext.chainId,
|
|
97
|
+
store: stakedChainContext.store,
|
|
98
|
+
head: stakedChainContext.head,
|
|
99
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
100
|
+
summaryMap: balanceSummaryMap,
|
|
101
|
+
},
|
|
102
|
+
transferContext: {
|
|
103
|
+
chainId: stakedChainContext.chainId,
|
|
104
|
+
store: stakedChainContext.store,
|
|
105
|
+
head: stakedChainContext.head,
|
|
106
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
107
|
+
summaryMap: transferSummaryMap,
|
|
108
|
+
},
|
|
109
|
+
blockViewer,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
|
|
113
|
+
|
|
114
|
+
const app = await getApp(node, transferSummaryMap, stakedChainContext, accountBalanceViewer, config.api.initRewardsCache)
|
|
83
115
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
84
116
|
server.setTimeout(20_000)
|
|
85
117
|
return server
|