@xyo-network/chain-api 1.17.2 → 1.17.6
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 +79 -47
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/ApiContext.d.ts +14 -0
- package/dist/node/server/ApiContext.d.ts.map +1 -0
- package/dist/node/server/app.d.ts +2 -5
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/index.d.ts +1 -8
- package/dist/node/server/index.d.ts.map +1 -1
- package/dist/node/server/routes/addRoutes.d.ts +1 -4
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +1 -4
- 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 +17 -15
- package/src/global.d.ts +13 -0
- package/src/server/ApiContext.ts +18 -0
- package/src/server/app.ts +4 -17
- package/src/server/index.ts +1 -11
- package/src/server/routes/addRoutes.ts +1 -12
- package/src/server/routes/address/addNodeRoutes.ts +1 -1
- package/src/server/routes/address/get/get.ts +1 -1
- package/src/server/routes/address/post/post.ts +1 -1
- package/src/server/routes/dataLake/addDataLakeRoutes.ts +1 -1
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +14 -16
- package/src/server/server.ts +82 -20
package/dist/node/index.mjs
CHANGED
|
@@ -31,7 +31,7 @@ import { isModuleName } from "@xyo-network/module-model";
|
|
|
31
31
|
import { StatusCodes } from "http-status-codes";
|
|
32
32
|
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
33
33
|
const { address: moduleIdentifier } = req.params;
|
|
34
|
-
const { node } = req.app;
|
|
34
|
+
const { node } = req.app.context;
|
|
35
35
|
const address = asAddress(moduleIdentifier);
|
|
36
36
|
if (isDefined(address)) {
|
|
37
37
|
let mod = node.address === address ? node : await node.resolve(address, {
|
|
@@ -94,7 +94,7 @@ var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
|
94
94
|
next();
|
|
95
95
|
}, "returnError");
|
|
96
96
|
const { address } = req.params;
|
|
97
|
-
const { node } = req.app;
|
|
97
|
+
const { node } = req.app.context;
|
|
98
98
|
const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
|
|
99
99
|
if (!isAddress(address)) {
|
|
100
100
|
return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
|
|
@@ -154,7 +154,7 @@ var postAddress = asyncHandler2(handler2);
|
|
|
154
154
|
|
|
155
155
|
// src/server/routes/address/addNodeRoutes.ts
|
|
156
156
|
var addNodeRoutes = /* @__PURE__ */ __name((app) => {
|
|
157
|
-
const defaultModule = app.node;
|
|
157
|
+
const defaultModule = app.context.node;
|
|
158
158
|
const address = defaultModule.address;
|
|
159
159
|
const defaultModuleEndpoint = `/${address}`;
|
|
160
160
|
app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
|
|
@@ -247,7 +247,7 @@ var archivistMiddleware = /* @__PURE__ */ __name((options) => {
|
|
|
247
247
|
|
|
248
248
|
// src/server/routes/dataLake/addDataLakeRoutes.ts
|
|
249
249
|
var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
|
|
250
|
-
const { node } = app;
|
|
250
|
+
const { node } = app.context;
|
|
251
251
|
const archivistModuleIdentifier = "Chain:Finalized";
|
|
252
252
|
app.use("/chain", archivistMiddleware({
|
|
253
253
|
node,
|
|
@@ -259,11 +259,11 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
|
|
|
259
259
|
import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
|
|
260
260
|
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
261
261
|
import { asArchivistInstance as asArchivistInstance2 } from "@xyo-network/archivist-model";
|
|
262
|
-
import {
|
|
262
|
+
import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from "@xyo-network/chain-orchestration";
|
|
263
263
|
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
264
264
|
import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
|
|
265
265
|
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
266
|
-
import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
266
|
+
import { NetworkStakeStepRewardsViewerMoniker, RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
267
267
|
import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
|
|
268
268
|
import { Semaphore } from "async-mutex";
|
|
269
269
|
async function chainArchivistFromNode(node) {
|
|
@@ -273,8 +273,9 @@ async function chainArchivistFromNode(node) {
|
|
|
273
273
|
return chainArchivist;
|
|
274
274
|
}
|
|
275
275
|
__name(chainArchivistFromNode, "chainArchivistFromNode");
|
|
276
|
-
var addRpcRoutes = /* @__PURE__ */ __name(async (app
|
|
277
|
-
const {
|
|
276
|
+
var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
|
|
277
|
+
const { context } = app;
|
|
278
|
+
const { node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config } = context;
|
|
278
279
|
const finalizedArchivist = await chainArchivistFromNode(node);
|
|
279
280
|
const balancesStepSummaryContext = {
|
|
280
281
|
head: stakedChainContext.head,
|
|
@@ -293,8 +294,8 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
|
|
|
293
294
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({
|
|
294
295
|
context: stakedChainContext
|
|
295
296
|
});
|
|
296
|
-
const pendingBlocksArchivist = await
|
|
297
|
-
const pendingTransactionsArchivist = await
|
|
297
|
+
const pendingBlocksArchivist = await initPendingBlocksArchivist(context);
|
|
298
|
+
const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context);
|
|
298
299
|
console.log("Initializing SimpleNetworkStakeViewer...");
|
|
299
300
|
assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
|
|
300
301
|
console.log("Initialized SimpleNetworkStakeViewer.");
|
|
@@ -321,6 +322,7 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
|
|
|
321
322
|
assertEx2(await stepRewardsByPositionViewer.start(), () => "Failed to start SimpleStepRewardsByPositionViewer");
|
|
322
323
|
console.log("Initialized SimpleStepRewardsByPositionViewer.");
|
|
323
324
|
const networkStakeStepRewardsViewer = {
|
|
325
|
+
moniker: NetworkStakeStepRewardsViewerMoniker,
|
|
324
326
|
position: stepRewardsByPositionViewer
|
|
325
327
|
};
|
|
326
328
|
const stepViewer = await SimpleStepViewer.create({
|
|
@@ -340,7 +342,7 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
|
|
|
340
342
|
const viewer = await NodeXyoViewer.create({
|
|
341
343
|
node,
|
|
342
344
|
rewardMultipliers: RewardMultipliers,
|
|
343
|
-
initRewardsCache,
|
|
345
|
+
initRewardsCache: config.api.initRewardsCache,
|
|
344
346
|
blockViewer,
|
|
345
347
|
context: stakedChainContext,
|
|
346
348
|
networkStakeViewer,
|
|
@@ -372,14 +374,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryM
|
|
|
372
374
|
}, "addRpcRoutes");
|
|
373
375
|
|
|
374
376
|
// src/server/routes/addRoutes.ts
|
|
375
|
-
var addRoutes = /* @__PURE__ */ __name(async (app
|
|
376
|
-
await addRpcRoutes(app
|
|
377
|
+
var addRoutes = /* @__PURE__ */ __name(async (app) => {
|
|
378
|
+
await addRpcRoutes(app);
|
|
377
379
|
addDataLakeRoutes(app);
|
|
378
380
|
addNodeRoutes(app);
|
|
379
381
|
}, "addRoutes");
|
|
380
382
|
|
|
381
383
|
// src/server/app.ts
|
|
382
|
-
var getApp = /* @__PURE__ */ __name(async (
|
|
384
|
+
var getApp = /* @__PURE__ */ __name(async (context) => {
|
|
383
385
|
addInstrumentation();
|
|
384
386
|
const app = express2();
|
|
385
387
|
app.set("etag", false);
|
|
@@ -393,39 +395,37 @@ var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, b
|
|
|
393
395
|
disableExpressDefaultPoweredByHeader(app);
|
|
394
396
|
app.use(customPoweredByHeader);
|
|
395
397
|
disableCaseSensitiveRouting(app);
|
|
396
|
-
app.
|
|
397
|
-
await addRoutes(app
|
|
398
|
+
app.context = context;
|
|
399
|
+
await addRoutes(app);
|
|
398
400
|
app.use(standardErrors);
|
|
399
401
|
return app;
|
|
400
402
|
}, "getApp");
|
|
401
403
|
|
|
402
404
|
// src/server/server.ts
|
|
403
405
|
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
404
|
-
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
406
|
+
import { buildTelemetryConfig, createProducerChainStakeIntentBlock, initBalanceSummaryMap, initHealthEndpoints, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initStatusReporter, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
405
407
|
import { createGenesisBlock } from "@xyo-network/chain-protocol";
|
|
408
|
+
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
409
|
+
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
406
410
|
import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
|
|
407
|
-
import { findMostRecentBlock, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
411
|
+
import { findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer as SimpleBlockViewer2, SimpleMempoolRunner, SimpleMempoolViewer as SimpleMempoolViewer2 } from "@xyo-network/xl1-protocol-sdk";
|
|
408
412
|
var hostname = "::";
|
|
409
413
|
async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
|
|
410
414
|
const chainMap = readPayloadMapFromStore(chainArchivist);
|
|
411
|
-
const payloads = await chainArchivist.next(
|
|
415
|
+
const payloads = await chainArchivist.next({
|
|
416
|
+
limit: 1
|
|
417
|
+
});
|
|
412
418
|
if (payloads.length === 0) {
|
|
413
419
|
logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
|
|
414
420
|
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
|
|
415
421
|
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
|
|
416
|
-
await chainArchivist.insert(
|
|
417
|
-
...block0[1].flat(),
|
|
418
|
-
block0[0]
|
|
419
|
-
]);
|
|
422
|
+
await chainArchivist.insert(flattenHydratedBlock(block0));
|
|
420
423
|
console.log("[API] Genesis block created and inserted into chain archivist");
|
|
421
424
|
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([
|
|
422
425
|
0,
|
|
423
426
|
1e4
|
|
424
427
|
], true));
|
|
425
|
-
await chainArchivist.insert(
|
|
426
|
-
...block1[1].flat(),
|
|
427
|
-
block1[0]
|
|
428
|
-
]);
|
|
428
|
+
await chainArchivist.insert(flattenHydratedBlock(block1));
|
|
429
429
|
console.log(`[API] Producer declared: ${producerAccount.address}`);
|
|
430
430
|
}
|
|
431
431
|
return chainMap;
|
|
@@ -449,43 +449,60 @@ function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chai
|
|
|
449
449
|
}
|
|
450
450
|
__name(initStakedChainContextRead, "initStakedChainContextRead");
|
|
451
451
|
async function getServer(context) {
|
|
452
|
-
const { config,
|
|
452
|
+
const { config, node: providedNode } = context;
|
|
453
453
|
const { port } = context.config.api;
|
|
454
|
-
const
|
|
455
|
-
|
|
454
|
+
const logger = assertEx3(context.logger, () => "Logger is required to init server");
|
|
455
|
+
const statusReporter = initStatusReporter({
|
|
456
456
|
logger
|
|
457
457
|
});
|
|
458
|
-
|
|
459
|
-
const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
|
|
460
|
-
config,
|
|
461
|
-
logger
|
|
462
|
-
}), () => "Balance Summary Map not initialized");
|
|
463
|
-
const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
|
|
458
|
+
await startupSpanAsync("initHealthEndpoints", () => initHealthEndpoints({
|
|
464
459
|
config,
|
|
465
|
-
logger
|
|
466
|
-
|
|
467
|
-
|
|
460
|
+
logger,
|
|
461
|
+
statusReporter
|
|
462
|
+
}));
|
|
463
|
+
const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
|
|
464
|
+
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
465
|
+
const initContext = {
|
|
468
466
|
config,
|
|
469
467
|
logger,
|
|
468
|
+
statusReporter,
|
|
469
|
+
meterProvider,
|
|
470
|
+
traceProvider
|
|
471
|
+
};
|
|
472
|
+
const wallet = await initServerWallet(initContext);
|
|
473
|
+
const stakeViewer = await initStakeViewer(initContext);
|
|
474
|
+
const balancesSummaryMap = assertEx3(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
475
|
+
const transfersSummaryMap = assertEx3(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
476
|
+
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
477
|
+
...initContext,
|
|
470
478
|
wallet,
|
|
471
479
|
node: providedNode,
|
|
472
480
|
transfersSummaryMap,
|
|
473
481
|
balancesSummaryMap
|
|
474
482
|
});
|
|
475
483
|
const chainId = stakeViewer.chainId;
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
484
|
+
const mempoolViewer = await SimpleMempoolViewer2.create({
|
|
485
|
+
...initContext,
|
|
486
|
+
pendingTransactionsArchivist,
|
|
487
|
+
pendingBlocksArchivist
|
|
479
488
|
});
|
|
489
|
+
assertEx3(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
|
|
490
|
+
const mempoolRunner = await SimpleMempoolRunner.create({
|
|
491
|
+
...initContext,
|
|
492
|
+
pendingTransactionsArchivist,
|
|
493
|
+
pendingBlocksArchivist
|
|
494
|
+
});
|
|
495
|
+
assertEx3(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
|
|
496
|
+
const producerAccount = await initProducerAccount(initContext);
|
|
480
497
|
const chainMap = await initChainMap({
|
|
481
498
|
...context,
|
|
482
|
-
chainArchivist,
|
|
499
|
+
chainArchivist: writableChainArchivist,
|
|
483
500
|
chainId,
|
|
484
501
|
producerAccount
|
|
485
502
|
});
|
|
486
503
|
const stakedChainContext = initStakedChainContextRead({
|
|
487
504
|
...context,
|
|
488
|
-
chainArchivist,
|
|
505
|
+
chainArchivist: readonlyChainArchivist,
|
|
489
506
|
chainId,
|
|
490
507
|
chainMap,
|
|
491
508
|
stakeViewer
|
|
@@ -494,10 +511,25 @@ async function getServer(context) {
|
|
|
494
511
|
await Promise.all(mods.map((mod) => {
|
|
495
512
|
return mod.start?.() ?? (() => true);
|
|
496
513
|
}));
|
|
497
|
-
const
|
|
514
|
+
const blockViewer = await SimpleBlockViewer2.create({
|
|
515
|
+
context: stakedChainContext,
|
|
516
|
+
finalizedArchivist: readonlyChainArchivist
|
|
517
|
+
});
|
|
518
|
+
assertEx3(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
519
|
+
const blk = await blockViewer.currentBlock();
|
|
520
|
+
assertEx3(blk, () => "No blocks found after initialization");
|
|
521
|
+
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
522
|
+
const apiContext = {
|
|
523
|
+
...initContext,
|
|
524
|
+
node,
|
|
498
525
|
config,
|
|
499
|
-
|
|
500
|
-
|
|
526
|
+
stakedChainContext,
|
|
527
|
+
mempoolViewer,
|
|
528
|
+
mempoolRunner,
|
|
529
|
+
balancesSummaryMap,
|
|
530
|
+
transfersSummaryMap
|
|
531
|
+
};
|
|
532
|
+
const app = await getApp(apiContext);
|
|
501
533
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
502
534
|
server.setTimeout(2e4);
|
|
503
535
|
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 BalancesStepSummary,\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 type { AppContext } from '../model.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\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, context, transfersSummaryMap, balancesSummaryMap, 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 { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalancesStepSummary,\n BalanceStepSummaryContext,\n MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../../../model.ts'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n const pendingBlocksArchivist = await initPendingBlockArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })\n\n console.log('Initializing SimpleMempoolViewer...')\n assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')\n console.log('Initialized SimpleMempoolViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n mempoolViewer,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const runner = await NodeXyoRunner.create({ node })\n\n console.log('Initializing NodeXyoRunner...')\n assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')\n console.log('Initialized NodeXyoRunner.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../model.ts'\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 context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, 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 type { AccountInstance } from '@xyo-network/account-model'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ConfigContext } from '@xyo-network/chain-orchestration'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type {\n Config, PayloadMapRead, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { findMostRecentBlock, 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\nasync function initChainMap({\n chainArchivist, chainId, logger, config, producerAccount,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n producerAccount: AccountInstance\n}>) {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...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 return chainMap\n}\n\nfunction initStakedChainContextRead({\n chainArchivist, chainId, stakeViewer, chainMap,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n chainMap: PayloadMapRead<WithStorageMeta<Payload>>\n stakeViewer: StakeViewer\n}>) {\n return {\n chainId,\n stake: stakeViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n } satisfies StakedChainContextRead\n}\n\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 stakeViewer = await initStakeViewer(config, logger)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = 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 transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const producerAccount = await initProducerAccount({ config, logger })\n const chainMap = await initChainMap({\n ...context, chainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,\n })\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, 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;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,uBAAAA,4BAA2B;AACpC,SAASC,2BAA2BC,uCAAuC;AAC3E,SAASC,qBAAqB;AAC9B,SACEC,0BAA0BC,mCAAmCC,wBACxD;AAGP,SAASC,iBAAiB;AAO1B,SACEC,mBAAmBC,4BAA4BC,mBAC/CC,2BACK;AACP,SACEC,eAAeC,yBAAyBC,yBACnC;AACP,SAASC,iBAAiB;AAK1B,eAAeC,uBAAuBC,MAAkB;AACtD,QAAMC,iBAAiBC,UAASC,qBAC9B,MAAMH,KAAKI,QAAQ,iBAAA,GACnB;IAAEC,UAAU;EAAK,CAAA,GAChB,MAAM,sCAAA;AACT,SAAOJ;AACT;AANeF;AASR,IAAMO,eAAe,8BAC1BC,KACAC,SACAC,qBACAC,oBACAC,oBACAC,qBAAAA;AAEA,QAAM,EAAEZ,KAAI,IAAKO;AAEjB,QAAMM,qBAAqB,MAAMd,uBAAuBC,IAAAA;AAExD,QAAMc,6BAA6B;IACjCC,MAAMJ,mBAAmBI;IACzBC,gBAAgBC,UAAUC,IAAI,MAAM,IAAIC,UAAU,EAAA,CAAA;IAClDC,OAAOT,mBAAmBS;IAC1BC,SAASV,mBAAmBU;IAC5BC,YAAYZ;EACd;AAEA,QAAMa,0BAA0B;IAC9BR,MAAMJ,mBAAmBI;IACzBC,gBAAgBC,UAAUC,IAAI,MAAM,IAAIC,UAAU,EAAA,CAAA;IAClDC,OAAOT,mBAAmBS;IAC1BC,SAASV,mBAAmBU;IAC5BC,YAAYb;EACd;AAEA,QAAMe,qBAAqB,MAAMC,yBAAyBC,OAAO;IAAElB,SAASG;EAAmB,CAAA;AAC/F,QAAMgB,yBAAyB,MAAMC,0BAA0BpB,OAAAA;AAC/D,QAAMqB,+BAA+B,MAAMC,gCAAgCtB,OAAAA;AAE3EuB,UAAQC,IAAI,0CAAA;AACZ9B,EAAAA,UAAS,MAAMsB,mBAAmBS,MAAK,GAAI,MAAM,0CAAA;AACjDF,UAAQC,IAAI,uCAAA;AAEZ,QAAME,cAAc,MAAMC,kBAAkBT,OAAO;IAAElB,SAASG;IAAoBE;EAAmB,CAAA;AAErGkB,UAAQC,IAAI,mCAAA;AACZ9B,EAAAA,UAAS,MAAMgC,YAAYD,MAAK,GAAI,MAAM,mCAAA;AAC1CF,UAAQC,IAAI,gCAAA;AAEZ,QAAMI,uBAAuB,MAAMC,2BAA2BX,OAAO;IACnEQ;IACA1B,SAASM;IACTS;EACF,CAAA;AAEAQ,UAAQC,IAAI,4CAAA;AACZ9B,EAAAA,UAAS,MAAMkC,qBAAqBH,MAAK,GAAI,MAAM,4CAAA;AACnDF,UAAQC,IAAI,yCAAA;AAEZ,QAAMM,8BAA8B,MAAMC,kCAAkCb,OAAO;IACjFlB,SAASG;IACT6B,mBAAmBC;EACrB,CAAA;AAEAV,UAAQC,IAAI,mDAAA;AACZ9B,EAAAA,UAAS,MAAMoC,4BAA4BL,MAAK,GAAI,MAAM,mDAAA;AAC1DF,UAAQC,IAAI,gDAAA;AAEZ,QAAMU,gCAA+D;IAAEC,UAAUL;EAA4B;AAC7G,QAAMM,aAAa,MAAMC,iBAAiBnB,OAAO;IAAEoB,cAAcnC;IAAoB+B;EAA8B,CAAA;AAEnHX,UAAQC,IAAI,kCAAA;AACZ9B,EAAAA,UAAS,MAAM0C,WAAWX,MAAK,GAAI,MAAM,kCAAA;AACzCF,UAAQC,IAAI,+BAAA;AAEZ,QAAMe,gBAAgB,MAAMC,oBAAoBtB,OAAO;IAAEC;IAAwBE;EAA6B,CAAA;AAE9GE,UAAQC,IAAI,qCAAA;AACZ9B,EAAAA,UAAS,MAAM6C,cAAcd,MAAK,GAAI,MAAM,qCAAA;AAC5CF,UAAQC,IAAI,kCAAA;AAEZ,QAAMiB,SAAS,MAAMC,cAAcxB,OAAO;IACxC1B;IACAwC,mBAAmBC;IACnB7B;IACAsB;IACA1B,SAASG;IACTa;IACAY;IACAQ;IACArB;IACAwB;EACF,CAAA;AAEAhB,UAAQC,IAAI,+BAAA;AACZ9B,EAAAA,UAAS,MAAM+C,OAAOhB,MAAK,GAAI,MAAM,+BAAA;AACrCF,UAAQC,IAAI,4BAAA;AAEZ,QAAMmB,SAAS,MAAMC,cAAc1B,OAAO;IAAE1B;EAAK,CAAA;AAEjD+B,UAAQC,IAAI,+BAAA;AACZ9B,EAAAA,UAAS,MAAMiD,OAAOlB,MAAK,GAAI,MAAM,+BAAA;AACrCF,UAAQC,IAAI,4BAAA;AAEZ,QAAMqB,aAAa,IAAIC,kBAAkB;IAAEH;IAAQF;EAAO,CAAA;AAC1D,QAAMM,SAASC,wBAAwBH,UAAAA;AAEvC9C,MAAIkD,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,GA1G4B;;;AC1BrB,IAAME,YAAY,8BACvBC,KACAC,SACAC,qBACAC,oBACAC,oBACAC,qBAAAA;AAEA,QAAMC,aAAaN,KAAKC,SAASC,qBAAqBC,oBAAoBC,oBAAoBC,gBAAAA;AAC9FE,oBAAkBP,GAAAA;AAClBQ,gBAAcR,GAAAA;AAChB,GAXyB;;;ATalB,IAAMS,SAAS,8BACpBC,MACAC,SACAC,qBACAC,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,MAAIP,OAAOA;AACX,QAAMqB,UAAUd,KAAKN,SAASC,qBAAqBC,oBAAoBC,oBAAoBC,gBAAAA;AAC3FE,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAxBsB;;;AUxBtB,SAASgB,YAAAA,iBAAgB;AAIzB,SACEC,qCACAC,uBACAC,qBACAC,gBACAC,kBACAC,iBAAiBC,8BACZ;AACP,SAASC,0BAA0B;AAInC,SACEC,OAAOC,iBAAiBC,iBACnB;AAKP,SAASC,qBAAqBC,+BAA+B;AAI7D,IAAMC,WAAW;AASjB,eAAeC,aAAa,EAC1BC,gBAAgBC,SAASC,QAAQC,QAAQC,gBAAe,GAKxD;AACA,QAAMC,WAAWC,wBAAkDN,cAAAA;AAEnE,QAAMO,WAAW,MAAMP,eAAeQ,KAAI;AAE1C,MAAID,SAASE,WAAW,GAAG;AACzBP,YAAQQ,KAAK,kEAAA;AACb,UAAMC,uBAAuBR,OAAOS,MAAMD,wBAAwBP,gBAAgBS;AAClF,UAAMC,SAAS,MAAMC,mBAAmBX,iBAAiBH,SAASe,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,GAAIV,iBAAiBsB,gBAAgB;MAAC;MAAG;OAAS,IAAA,CAAA;AAClH,UAAM1B,eAAeoB,OAAO;SAAII,OAAO,CAAA,EAAGH,KAAI;MAAIG,OAAO,CAAA;KAAG;AAC5DF,YAAQC,IAAI,4BAA4BnB,gBAAgBS,OAAO,EAAE;EACnE;AAEA,SAAOR;AACT;AAvBeN;AAyBf,SAAS4B,2BAA2B,EAClC3B,gBAAgBC,SAAS2B,aAAavB,SAAQ,GAM9C;AACA,SAAO;IACLJ;IACA4B,OAAOD;IACPE,OAAO;MAAEzB;IAAS;IAClB0B,MAAM,mCAAA;AACJ,YAAMA,OAAO,MAAMC,oBAAoBhC,cAAAA;AACvC,aAAO;QAACiC,UAASF,MAAMG,OAAO,MAAM,iCAAA;QAAoCH,MAAMI,SAAS;;IACzF,GAHM;EAIR;AACF;AAjBSR;AAmBT,eAAsBS,UAAUC,SAAyB;AACvD,QAAM,EACJlC,QAAQD,QAAQoC,MAAMC,aAAY,IAChCF;AACJ,QAAM,EAAEG,KAAI,IAAKH,QAAQlC,OAAOsC;AAChC,QAAMC,SAAS,MAAMC,iBAAiB;IAAExC;IAAQD;EAAO,CAAA;AACvD,QAAM0B,cAAc,MAAMgB,gBAAgBzC,QAAQD,MAAAA;AAElD,QAAM2C,qBAAqBZ,UAAS,MAAMa,sBAAsB;IAAE3C;IAAQD;EAAO,CAAA,GAAI,MAAM,qCAAA;AAC3F,QAAM6C,sBAAsBd,UAAS,MAAMe,uBAAuB;IAAE7C;IAAQD;EAAO,CAAA,GAAI,MAAM,sCAAA;AAE7F,QAAM,EAAEoC,MAAMtC,eAAc,IAAK,MAAMiD,eAAe;IACpD9C;IACAD;IACAwC;IACAJ,MAAMC;IACNQ;IACAF;EACF,CAAA;AAEA,QAAM5C,UAAU2B,YAAY3B;AAE5B,QAAMG,kBAAkB,MAAM8C,oBAAoB;IAAE/C;IAAQD;EAAO,CAAA;AACnE,QAAMG,WAAW,MAAMN,aAAa;IAClC,GAAGsC;IAASrC;IAAgBC;IAASG;EACvC,CAAA;AAEA,QAAM+C,qBAAqBxB,2BAA2B;IACpD,GAAGU;IAASrC;IAAgBC;IAASI;IAAUuB;EACjD,CAAA;AAEA,QAAMwB,OAAO,MAAMd,KAAKe,QAAQ,GAAA;AAChC,QAAMC,QAAQC,IAAIH,KAAKI,IAAI,CAACC,QAAAA;AAC1B,WAAOA,IAAIC,QAAK,MAAS,MAAM;EACjC,CAAA,CAAA;AAEA,QAAMC,MAAM,MAAMC,OAAOtB,MAAM;IAAEnC;IAAQD;EAAO,GAAG6C,qBAAqBF,oBAAoBM,oBAAoBhD,OAAOsC,IAAIoB,gBAAgB;AAC3I,QAAMC,SAASH,IAAII,OAAOvB,MAAM1C,UAAU,MAAMI,QAAQqB,IAAI,oCAAoCzB,QAAAA,IAAY0C,IAAAA,EAAM,CAAA;AAClHsB,SAAOE,WAAW,GAAA;AAClB,SAAOF;AACT;AAxCsB1B;","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","asArchivistInstance","initPendingBlockArchivist","initPendingTransactionArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlockArchivist","pendingTransactionsArchivist","initPendingTransactionArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initTransferSummaryMap","createGenesisBlock","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","readPayloadMapFromStore","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","initServerNode","initProducerAccount","stakedChainContext","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 compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from './ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { initPendingBlocksArchivist, initPendingTransactionsArchivist } from '@xyo-network/chain-orchestration'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalanceStepSummaryContext,\n NetworkStakeStepRewardsViewer,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NetworkStakeStepRewardsViewerMoniker,\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const {\n node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,\n } = context\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n const pendingBlocksArchivist = await initPendingBlocksArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {\n moniker: NetworkStakeStepRewardsViewerMoniker,\n position: stepRewardsByPositionViewer,\n }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })\n\n console.log('Initializing SimpleMempoolViewer...')\n assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')\n console.log('Initialized SimpleMempoolViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache: config.api.initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n mempoolViewer,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const runner = await NodeXyoRunner.create({ node })\n\n console.log('Initializing NodeXyoRunner...')\n assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')\n console.log('Initialized NodeXyoRunner.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ConfigContext } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initStatusReporter, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type {\n Config, PayloadMapRead, SimpleBlockViewerParams, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport type { ApiContext } from './ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nasync function initChainMap({\n chainArchivist, chainId, logger, config, producerAccount,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n producerAccount: AccountInstance\n}>) {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next({ limit: 1 })\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert(flattenHydratedBlock(block0))\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert(flattenHydratedBlock(block1))\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n return chainMap\n}\n\nfunction initStakedChainContextRead({\n chainArchivist, chainId, stakeViewer, chainMap,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n chainMap: PayloadMapRead<WithStorageMeta<Payload>>\n stakeViewer: StakeViewer\n}>) {\n return {\n chainId,\n stake: stakeViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n } satisfies StakedChainContextRead\n}\n\n// eslint-disable-next-line max-statements\nexport async function getServer(context: GetServerContext) {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n config, logger, statusReporter, meterProvider, traceProvider,\n }\n\n const wallet = await initServerWallet(initContext)\n const stakeViewer = await initStakeViewer(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const mempoolViewer = await SimpleMempoolViewer.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = await SimpleMempoolRunner.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n const producerAccount = await initProducerAccount(initContext)\n\n const chainMap = await initChainMap({\n ...context, chainArchivist: writableChainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,\n })\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const blockViewer = await SimpleBlockViewer.create({\n context: stakedChainContext,\n finalizedArchivist: readonlyChainArchivist,\n } satisfies SimpleBlockViewerParams)\n\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const apiContext: ApiContext = {\n ...initContext,\n node,\n config,\n stakedChainContext,\n mempoolViewer,\n mempoolRunner,\n balancesSummaryMap,\n transfersSummaryMap,\n }\n\n const app = await getApp(apiContext)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","initPendingBlocksArchivist","initPendingTransactionsArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","NetworkStakeStepRewardsViewerMoniker","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","stakedChainContext","balancesSummaryMap","transfersSummaryMap","config","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlocksArchivist","pendingTransactionsArchivist","initPendingTransactionsArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","moniker","NetworkStakeStepRewardsViewerMoniker","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","initRewardsCache","api","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","buildTelemetryConfig","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initHealthEndpoints","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initStatusReporter","initTransferSummaryMap","createGenesisBlock","initTelemetry","startupSpanAsync","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","flattenHydratedBlock","readPayloadMapFromStore","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","limit","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flattenHydratedBlock","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","mempoolViewer","SimpleMempoolViewer","create","start","mempoolRunner","SimpleMempoolRunner","initProducerAccount","stakedChainContext","mods","resolve","Promise","all","map","mod","blockViewer","SimpleBlockViewer","finalizedArchivist","blk","currentBlock","info","apiContext","app","getApp","server","listen","setTimeout"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
|
+
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
+
import type { BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
|
+
import type { AppContext } from '../model.ts';
|
|
5
|
+
export interface ApiContext extends AppContext {
|
|
6
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
7
|
+
config: Config;
|
|
8
|
+
mempoolRunner: MempoolRunner;
|
|
9
|
+
mempoolViewer: MempoolViewer;
|
|
10
|
+
node: NodeInstance;
|
|
11
|
+
stakedChainContext: StakedChainContextRead;
|
|
12
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ApiContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../../src/server/ApiContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAC1F,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
1
|
import type { Express } from 'express';
|
|
5
|
-
import type {
|
|
6
|
-
export declare const getApp: (
|
|
2
|
+
import type { ApiContext } from './ApiContext.ts';
|
|
3
|
+
export declare const getApp: (context: ApiContext) => Promise<Express>;
|
|
7
4
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAIjD,eAAO,MAAM,MAAM,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,OAAO,CAiBjE,CAAA"}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
+
export * from './ApiContext.ts';
|
|
1
2
|
export * from './app.ts';
|
|
2
3
|
export * from './server.ts';
|
|
3
|
-
import type { NodeInstance } from '@xyo-network/node-model';
|
|
4
|
-
declare global {
|
|
5
|
-
namespace Express {
|
|
6
|
-
interface Application {
|
|
7
|
-
node: NodeInstance;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
1
|
import type { Express } from 'express';
|
|
4
|
-
|
|
5
|
-
export declare const addRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
2
|
+
export declare const addRoutes: (app: Express) => Promise<void>;
|
|
6
3
|
//# 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,
|
|
1
|
+
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,kBAKb,CAAA"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
1
|
import type { Express } from 'express';
|
|
4
|
-
|
|
5
|
-
export declare const addRpcRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
2
|
+
export declare const addRpcRoutes: (app: Express) => Promise<void>;
|
|
6
3
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAWtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBA0Gb,CAAA"}
|
|
@@ -1 +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;AAkBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAM3D,OAAO,KAAK,EACV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAWtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA+CD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GA8FxD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.17.
|
|
3
|
+
"version": "1.17.6",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,22 +52,24 @@
|
|
|
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.
|
|
55
|
+
"@xylabs/express": "~5.0.51",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.51",
|
|
57
57
|
"@xyo-network/archivist-model": "~5.2.17",
|
|
58
58
|
"@xyo-network/boundwitness-model": "~5.2.17",
|
|
59
|
-
"@xyo-network/chain-orchestration": "
|
|
60
|
-
"@xyo-network/chain-protocol": "
|
|
61
|
-
"@xyo-network/chain-rpc": "
|
|
62
|
-
"@xyo-network/chain-
|
|
59
|
+
"@xyo-network/chain-orchestration": "workspace:~",
|
|
60
|
+
"@xyo-network/chain-protocol": "workspace:~",
|
|
61
|
+
"@xyo-network/chain-rpc": "workspace:~",
|
|
62
|
+
"@xyo-network/chain-telemetry": "workspace:~",
|
|
63
|
+
"@xyo-network/chain-utils": "workspace:~",
|
|
64
|
+
"@xyo-network/chain-viewers": "workspace:~",
|
|
63
65
|
"@xyo-network/module-abstract": "~5.2.17",
|
|
64
66
|
"@xyo-network/module-model": "~5.2.17",
|
|
65
67
|
"@xyo-network/node-model": "~5.2.17",
|
|
66
68
|
"@xyo-network/payload-builder": "~5.2.17",
|
|
67
69
|
"@xyo-network/payload-model": "~5.2.17",
|
|
68
|
-
"@xyo-network/xl1-protocol": "~1.14.
|
|
69
|
-
"@xyo-network/xl1-protocol-sdk": "
|
|
70
|
-
"@xyo-network/xl1-rpc": "
|
|
70
|
+
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
71
|
+
"@xyo-network/xl1-protocol-sdk": "workspace:~",
|
|
72
|
+
"@xyo-network/xl1-rpc": "workspace:~",
|
|
71
73
|
"async-mutex": "~0.5.0",
|
|
72
74
|
"compression": "~1.8.1",
|
|
73
75
|
"cors": "~2.8.5",
|
|
@@ -80,8 +82,8 @@
|
|
|
80
82
|
"@types/cors": "~2.8.19",
|
|
81
83
|
"@types/express": "5.0.6",
|
|
82
84
|
"@types/express-serve-static-core": "~5.1.0",
|
|
83
|
-
"@types/node": "~24.10.
|
|
84
|
-
"@xylabs/sdk-js": "~5.0.
|
|
85
|
+
"@types/node": "~24.10.3",
|
|
86
|
+
"@xylabs/sdk-js": "~5.0.51",
|
|
85
87
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
86
88
|
"@xylabs/tsconfig": "~7.2.8",
|
|
87
89
|
"@xyo-network/account": "~5.2.17",
|
|
@@ -89,11 +91,11 @@
|
|
|
89
91
|
"@xyo-network/archivist-abstract": "~5.2.17",
|
|
90
92
|
"@xyo-network/bios-model": "~7.2.0",
|
|
91
93
|
"@xyo-network/boundwitness-builder": "~5.2.17",
|
|
92
|
-
"@xyo-network/chain-services": "
|
|
94
|
+
"@xyo-network/chain-services": "workspace:~",
|
|
93
95
|
"@xyo-network/module-abstract-mongodb": "~5.2.17",
|
|
94
96
|
"@xyo-network/module-model-mongodb": "~5.2.17",
|
|
95
97
|
"@xyo-network/node-memory": "~5.2.17",
|
|
96
|
-
"@xyo-network/xl1-protocol": "~1.14.
|
|
98
|
+
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
97
99
|
"dotenv": "~17.2.3",
|
|
98
100
|
"eslint": "^9.39.1",
|
|
99
101
|
"nodemon": "~3.1.11",
|
|
@@ -109,4 +111,4 @@
|
|
|
109
111
|
"publishConfig": {
|
|
110
112
|
"access": "restricted"
|
|
111
113
|
}
|
|
112
|
-
}
|
|
114
|
+
}
|
package/src/global.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
2
|
+
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
3
|
+
import type {
|
|
4
|
+
BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead,
|
|
5
|
+
TransfersStepSummary,
|
|
6
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
7
|
+
|
|
8
|
+
import type { AppContext } from '../model.ts'
|
|
9
|
+
|
|
10
|
+
export interface ApiContext extends AppContext {
|
|
11
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
|
|
12
|
+
config: Config
|
|
13
|
+
mempoolRunner: MempoolRunner
|
|
14
|
+
mempoolViewer: MempoolViewer
|
|
15
|
+
node: NodeInstance
|
|
16
|
+
stakedChainContext: StakedChainContextRead
|
|
17
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>
|
|
18
|
+
}
|
package/src/server/app.ts
CHANGED
|
@@ -8,29 +8,16 @@ import {
|
|
|
8
8
|
standardErrors,
|
|
9
9
|
standardResponses,
|
|
10
10
|
} from '@xylabs/express'
|
|
11
|
-
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
13
|
-
import type {
|
|
14
|
-
BalancesStepSummary,
|
|
15
|
-
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
16
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
17
11
|
import compression from 'compression'
|
|
18
12
|
import cors from 'cors'
|
|
19
13
|
import type { Express } from 'express'
|
|
20
14
|
import express from 'express'
|
|
21
15
|
|
|
22
|
-
import type {
|
|
16
|
+
import type { ApiContext } from './ApiContext.ts'
|
|
23
17
|
import { addInstrumentation } from './instrumentation.ts'
|
|
24
18
|
import { addRoutes } from './routes/index.ts'
|
|
25
19
|
|
|
26
|
-
export const getApp = async (
|
|
27
|
-
node: NodeInstance,
|
|
28
|
-
context: AppContext,
|
|
29
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
30
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
31
|
-
stakedChainContext: StakedChainContextRead,
|
|
32
|
-
initRewardsCache?: boolean,
|
|
33
|
-
): Promise<Express> => {
|
|
20
|
+
export const getApp = async (context: ApiContext): Promise<Express> => {
|
|
34
21
|
addInstrumentation()
|
|
35
22
|
const app = express()
|
|
36
23
|
app.set('etag', false)
|
|
@@ -43,8 +30,8 @@ export const getApp = async (
|
|
|
43
30
|
disableExpressDefaultPoweredByHeader(app)
|
|
44
31
|
app.use(customPoweredByHeader)
|
|
45
32
|
disableCaseSensitiveRouting(app)
|
|
46
|
-
app.
|
|
47
|
-
await addRoutes(app
|
|
33
|
+
app.context = context
|
|
34
|
+
await addRoutes(app)
|
|
48
35
|
app.use(standardErrors)
|
|
49
36
|
return app
|
|
50
37
|
}
|
package/src/server/index.ts
CHANGED
|
@@ -1,13 +1,3 @@
|
|
|
1
|
+
export * from './ApiContext.ts'
|
|
1
2
|
export * from './app.ts'
|
|
2
3
|
export * from './server.ts'
|
|
3
|
-
|
|
4
|
-
import type { NodeInstance } from '@xyo-network/node-model'
|
|
5
|
-
|
|
6
|
-
declare global {
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
8
|
-
namespace Express {
|
|
9
|
-
interface Application {
|
|
10
|
-
node: NodeInstance
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,24 +1,13 @@
|
|
|
1
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
2
|
-
import type {
|
|
3
|
-
BalancesStepSummary,
|
|
4
|
-
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
5
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
6
1
|
import type { Express } from 'express'
|
|
7
2
|
|
|
8
|
-
import type { AppContext } from '../../model.ts'
|
|
9
3
|
import { addNodeRoutes } from './address/index.ts'
|
|
10
4
|
import { addDataLakeRoutes } from './dataLake/index.ts'
|
|
11
5
|
import { addRpcRoutes } from './rpc/index.ts'
|
|
12
6
|
|
|
13
7
|
export const addRoutes = async (
|
|
14
8
|
app: Express,
|
|
15
|
-
context: AppContext,
|
|
16
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
17
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
18
|
-
stakedChainContext: StakedChainContextRead,
|
|
19
|
-
initRewardsCache?: boolean,
|
|
20
9
|
) => {
|
|
21
|
-
await addRpcRoutes(app
|
|
10
|
+
await addRpcRoutes(app)
|
|
22
11
|
addDataLakeRoutes(app)
|
|
23
12
|
addNodeRoutes(app)
|
|
24
13
|
}
|
|
@@ -5,7 +5,7 @@ import { getAddress } from './get/index.ts'
|
|
|
5
5
|
import { postAddress } from './post/index.ts'
|
|
6
6
|
|
|
7
7
|
export const addNodeRoutes = (app: Express) => {
|
|
8
|
-
const defaultModule = app.node
|
|
8
|
+
const defaultModule = app.context.node
|
|
9
9
|
const address = defaultModule.address
|
|
10
10
|
const defaultModuleEndpoint = `/${address}`
|
|
11
11
|
app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))
|
|
@@ -9,7 +9,7 @@ import type { AddressPathParams } from '../AddressPathParams.ts'
|
|
|
9
9
|
|
|
10
10
|
const handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {
|
|
11
11
|
const { address: moduleIdentifier } = req.params
|
|
12
|
-
const { node } = req.app
|
|
12
|
+
const { node } = req.app.context
|
|
13
13
|
const address = asAddress(moduleIdentifier)
|
|
14
14
|
if (isDefined(address)) {
|
|
15
15
|
let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))
|
|
@@ -26,7 +26,7 @@ const handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const { address } = req.params
|
|
29
|
-
const { node } = req.app
|
|
29
|
+
const { node } = req.app.context
|
|
30
30
|
const [bw, payloads] = Array.isArray(req.body) ? req.body : []
|
|
31
31
|
if (!isAddress(address)) {
|
|
32
32
|
return returnError(StatusCodes.BAD_REQUEST, 'Missing address')
|
|
@@ -3,7 +3,7 @@ import type { Express } from 'express'
|
|
|
3
3
|
import { archivistMiddleware } from './archivistMiddleware.ts'
|
|
4
4
|
|
|
5
5
|
export const addDataLakeRoutes = (app: Express) => {
|
|
6
|
-
const { node } = app
|
|
6
|
+
const { node } = app.context
|
|
7
7
|
const archivistModuleIdentifier = 'Chain:Finalized'
|
|
8
8
|
app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))
|
|
9
9
|
}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { setRawResponseFormat } from '@xylabs/express'
|
|
2
2
|
import { assertEx } from '@xylabs/sdk-js'
|
|
3
3
|
import { asArchivistInstance } from '@xyo-network/archivist-model'
|
|
4
|
-
import {
|
|
4
|
+
import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from '@xyo-network/chain-orchestration'
|
|
5
5
|
import { NodeXyoViewer } from '@xyo-network/chain-rpc'
|
|
6
6
|
import {
|
|
7
7
|
SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
|
|
8
8
|
} from '@xyo-network/chain-viewers'
|
|
9
9
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
10
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
11
10
|
import { StepSizes } from '@xyo-network/xl1-protocol'
|
|
12
11
|
import type {
|
|
13
|
-
BalancesStepSummary,
|
|
14
12
|
BalanceStepSummaryContext,
|
|
15
|
-
|
|
13
|
+
NetworkStakeStepRewardsViewer,
|
|
16
14
|
TransfersStepSummaryContext,
|
|
17
15
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
18
16
|
import {
|
|
17
|
+
NetworkStakeStepRewardsViewerMoniker,
|
|
19
18
|
RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
|
|
20
19
|
SimpleMempoolViewer,
|
|
21
20
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
@@ -25,8 +24,6 @@ import {
|
|
|
25
24
|
import { Semaphore } from 'async-mutex'
|
|
26
25
|
import type { Express } from 'express'
|
|
27
26
|
|
|
28
|
-
import type { AppContext } from '../../../../model.ts'
|
|
29
|
-
|
|
30
27
|
async function chainArchivistFromNode(node: NodeInstance) {
|
|
31
28
|
const chainArchivist = assertEx(asArchivistInstance(
|
|
32
29
|
await node.resolve('Chain:Validated'),
|
|
@@ -38,13 +35,11 @@ async function chainArchivistFromNode(node: NodeInstance) {
|
|
|
38
35
|
// eslint-disable-next-line max-statements
|
|
39
36
|
export const addRpcRoutes = async (
|
|
40
37
|
app: Express,
|
|
41
|
-
context: AppContext,
|
|
42
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
43
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
44
|
-
stakedChainContext: StakedChainContextRead,
|
|
45
|
-
initRewardsCache?: boolean,
|
|
46
38
|
) => {
|
|
47
|
-
const {
|
|
39
|
+
const { context } = app
|
|
40
|
+
const {
|
|
41
|
+
node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,
|
|
42
|
+
} = context
|
|
48
43
|
|
|
49
44
|
const finalizedArchivist = await chainArchivistFromNode(node)
|
|
50
45
|
|
|
@@ -65,8 +60,8 @@ export const addRpcRoutes = async (
|
|
|
65
60
|
} satisfies TransfersStepSummaryContext
|
|
66
61
|
|
|
67
62
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
|
|
68
|
-
const pendingBlocksArchivist = await
|
|
69
|
-
const pendingTransactionsArchivist = await
|
|
63
|
+
const pendingBlocksArchivist = await initPendingBlocksArchivist(context)
|
|
64
|
+
const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)
|
|
70
65
|
|
|
71
66
|
console.log('Initializing SimpleNetworkStakeViewer...')
|
|
72
67
|
assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
|
|
@@ -97,7 +92,10 @@ export const addRpcRoutes = async (
|
|
|
97
92
|
assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')
|
|
98
93
|
console.log('Initialized SimpleStepRewardsByPositionViewer.')
|
|
99
94
|
|
|
100
|
-
const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {
|
|
95
|
+
const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {
|
|
96
|
+
moniker: NetworkStakeStepRewardsViewerMoniker,
|
|
97
|
+
position: stepRewardsByPositionViewer,
|
|
98
|
+
}
|
|
101
99
|
const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })
|
|
102
100
|
|
|
103
101
|
console.log('Initializing SimpleStepViewer...')
|
|
@@ -113,7 +111,7 @@ export const addRpcRoutes = async (
|
|
|
113
111
|
const viewer = await NodeXyoViewer.create({
|
|
114
112
|
node,
|
|
115
113
|
rewardMultipliers: RewardMultipliers,
|
|
116
|
-
initRewardsCache,
|
|
114
|
+
initRewardsCache: config.api.initRewardsCache,
|
|
117
115
|
blockViewer,
|
|
118
116
|
context: stakedChainContext,
|
|
119
117
|
networkStakeViewer,
|
package/src/server/server.ts
CHANGED
|
@@ -4,14 +4,18 @@ import type { AccountInstance } from '@xyo-network/account-model'
|
|
|
4
4
|
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
5
5
|
import type { ConfigContext } from '@xyo-network/chain-orchestration'
|
|
6
6
|
import {
|
|
7
|
+
buildTelemetryConfig,
|
|
7
8
|
createProducerChainStakeIntentBlock,
|
|
8
9
|
initBalanceSummaryMap,
|
|
10
|
+
initHealthEndpoints,
|
|
9
11
|
initProducerAccount,
|
|
10
12
|
initServerNode,
|
|
11
13
|
initServerWallet,
|
|
12
|
-
initStakeViewer, initTransferSummaryMap,
|
|
14
|
+
initStakeViewer, initStatusReporter, initTransferSummaryMap,
|
|
13
15
|
} from '@xyo-network/chain-orchestration'
|
|
14
16
|
import { createGenesisBlock } from '@xyo-network/chain-protocol'
|
|
17
|
+
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
18
|
+
import { startupSpanAsync } from '@xyo-network/chain-utils'
|
|
15
19
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
16
20
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
17
21
|
import type { ChainId } from '@xyo-network/xl1-protocol'
|
|
@@ -19,11 +23,14 @@ import {
|
|
|
19
23
|
asXL1, asXL1BlockRange, XL1Amount,
|
|
20
24
|
} from '@xyo-network/xl1-protocol'
|
|
21
25
|
import type {
|
|
22
|
-
Config, PayloadMapRead, StakedChainContextRead,
|
|
26
|
+
Config, PayloadMapRead, SimpleBlockViewerParams, StakedChainContextRead,
|
|
23
27
|
StakeViewer,
|
|
24
28
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
25
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
|
|
31
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
26
32
|
|
|
33
|
+
import type { ApiContext } from './ApiContext.ts'
|
|
27
34
|
import { getApp } from './app.ts'
|
|
28
35
|
|
|
29
36
|
const hostname = '::'
|
|
@@ -44,16 +51,16 @@ async function initChainMap({
|
|
|
44
51
|
}>) {
|
|
45
52
|
const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
|
|
46
53
|
|
|
47
|
-
const payloads = await chainArchivist.next()
|
|
54
|
+
const payloads = await chainArchivist.next({ limit: 1 })
|
|
48
55
|
|
|
49
56
|
if (payloads.length === 0) {
|
|
50
57
|
logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
|
|
51
58
|
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
|
|
52
59
|
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
|
|
53
|
-
await chainArchivist.insert(
|
|
60
|
+
await chainArchivist.insert(flattenHydratedBlock(block0))
|
|
54
61
|
console.log('[API] Genesis block created and inserted into chain archivist')
|
|
55
62
|
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
|
|
56
|
-
await chainArchivist.insert(
|
|
63
|
+
await chainArchivist.insert(flattenHydratedBlock(block1))
|
|
57
64
|
console.log(`[API] Producer declared: ${producerAccount.address}`)
|
|
58
65
|
}
|
|
59
66
|
|
|
@@ -79,20 +86,37 @@ function initStakedChainContextRead({
|
|
|
79
86
|
} satisfies StakedChainContextRead
|
|
80
87
|
}
|
|
81
88
|
|
|
89
|
+
// eslint-disable-next-line max-statements
|
|
82
90
|
export async function getServer(context: GetServerContext) {
|
|
83
|
-
const {
|
|
84
|
-
config, logger, node: providedNode,
|
|
85
|
-
} = context
|
|
91
|
+
const { config, node: providedNode } = context
|
|
86
92
|
const { port } = context.config.api
|
|
87
|
-
const wallet = await initServerWallet({ config, logger })
|
|
88
|
-
const stakeViewer = await initStakeViewer(config, logger)
|
|
89
93
|
|
|
90
|
-
const
|
|
91
|
-
const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
|
|
94
|
+
const logger = assertEx(context.logger, () => 'Logger is required to init server')
|
|
92
95
|
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
const statusReporter = initStatusReporter({ logger })
|
|
97
|
+
|
|
98
|
+
await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({
|
|
99
|
+
config, logger, statusReporter,
|
|
100
|
+
}))
|
|
101
|
+
|
|
102
|
+
const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')
|
|
103
|
+
|
|
104
|
+
const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
|
|
105
|
+
|
|
106
|
+
const initContext = {
|
|
107
|
+
config, logger, statusReporter, meterProvider, traceProvider,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const wallet = await initServerWallet(initContext)
|
|
111
|
+
const stakeViewer = await initStakeViewer(initContext)
|
|
112
|
+
|
|
113
|
+
const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
|
|
114
|
+
const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
|
|
115
|
+
|
|
116
|
+
const {
|
|
117
|
+
node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
|
|
118
|
+
} = await initServerNode({
|
|
119
|
+
...initContext,
|
|
96
120
|
wallet,
|
|
97
121
|
node: providedNode,
|
|
98
122
|
transfersSummaryMap,
|
|
@@ -101,13 +125,28 @@ export async function getServer(context: GetServerContext) {
|
|
|
101
125
|
|
|
102
126
|
const chainId = stakeViewer.chainId
|
|
103
127
|
|
|
104
|
-
const
|
|
128
|
+
const mempoolViewer = await SimpleMempoolViewer.create({
|
|
129
|
+
...initContext,
|
|
130
|
+
pendingTransactionsArchivist,
|
|
131
|
+
pendingBlocksArchivist,
|
|
132
|
+
})
|
|
133
|
+
assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')
|
|
134
|
+
|
|
135
|
+
const mempoolRunner = await SimpleMempoolRunner.create({
|
|
136
|
+
...initContext,
|
|
137
|
+
pendingTransactionsArchivist,
|
|
138
|
+
pendingBlocksArchivist,
|
|
139
|
+
})
|
|
140
|
+
assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')
|
|
141
|
+
|
|
142
|
+
const producerAccount = await initProducerAccount(initContext)
|
|
143
|
+
|
|
105
144
|
const chainMap = await initChainMap({
|
|
106
|
-
...context, chainArchivist, chainId, producerAccount,
|
|
145
|
+
...context, chainArchivist: writableChainArchivist, chainId, producerAccount,
|
|
107
146
|
})
|
|
108
147
|
|
|
109
148
|
const stakedChainContext = initStakedChainContextRead({
|
|
110
|
-
...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
|
|
149
|
+
...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
|
|
111
150
|
})
|
|
112
151
|
|
|
113
152
|
const mods = await node.resolve('*')
|
|
@@ -115,7 +154,30 @@ export async function getServer(context: GetServerContext) {
|
|
|
115
154
|
return mod.start?.() ?? (() => true)
|
|
116
155
|
}))
|
|
117
156
|
|
|
118
|
-
const
|
|
157
|
+
const blockViewer = await SimpleBlockViewer.create({
|
|
158
|
+
context: stakedChainContext,
|
|
159
|
+
finalizedArchivist: readonlyChainArchivist,
|
|
160
|
+
} satisfies SimpleBlockViewerParams)
|
|
161
|
+
|
|
162
|
+
assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
|
|
163
|
+
|
|
164
|
+
const blk = await blockViewer.currentBlock()
|
|
165
|
+
assertEx(blk, () => 'No blocks found after initialization')
|
|
166
|
+
|
|
167
|
+
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
|
|
168
|
+
|
|
169
|
+
const apiContext: ApiContext = {
|
|
170
|
+
...initContext,
|
|
171
|
+
node,
|
|
172
|
+
config,
|
|
173
|
+
stakedChainContext,
|
|
174
|
+
mempoolViewer,
|
|
175
|
+
mempoolRunner,
|
|
176
|
+
balancesSummaryMap,
|
|
177
|
+
transfersSummaryMap,
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const app = await getApp(apiContext)
|
|
119
181
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
120
182
|
server.setTimeout(20_000)
|
|
121
183
|
return server
|