@xyo-network/chain-api 1.17.0 → 1.17.2
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.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +81 -42
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/model.d.ts +5 -0
- package/dist/node/model.d.ts.map +1 -0
- package/dist/node/server/app.d.ts +2 -1
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/routes/addRoutes.d.ts +2 -1
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +2 -1
- 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 +31 -31
- package/src/index.ts +1 -0
- package/src/model.ts +5 -0
- package/src/server/app.ts +3 -3
- package/src/server/routes/addRoutes.ts +3 -1
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +20 -1
- package/src/server/server.ts +64 -57
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -259,10 +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 { initPendingBlockArchivist, initPendingTransactionArchivist } from "@xyo-network/chain-orchestration";
|
|
262
263
|
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
263
264
|
import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
|
|
264
265
|
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
265
|
-
import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
266
|
+
import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
266
267
|
import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
|
|
267
268
|
import { Semaphore } from "async-mutex";
|
|
268
269
|
async function chainArchivistFromNode(node) {
|
|
@@ -272,9 +273,8 @@ async function chainArchivistFromNode(node) {
|
|
|
272
273
|
return chainArchivist;
|
|
273
274
|
}
|
|
274
275
|
__name(chainArchivistFromNode, "chainArchivistFromNode");
|
|
275
|
-
var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
276
|
+
var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
276
277
|
const { node } = app;
|
|
277
|
-
const runner = new NodeXyoRunner(node);
|
|
278
278
|
const finalizedArchivist = await chainArchivistFromNode(node);
|
|
279
279
|
const balancesStepSummaryContext = {
|
|
280
280
|
head: stakedChainContext.head,
|
|
@@ -293,6 +293,8 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
|
|
|
293
293
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({
|
|
294
294
|
context: stakedChainContext
|
|
295
295
|
});
|
|
296
|
+
const pendingBlocksArchivist = await initPendingBlockArchivist(context);
|
|
297
|
+
const pendingTransactionsArchivist = await initPendingTransactionArchivist(context);
|
|
296
298
|
console.log("Initializing SimpleNetworkStakeViewer...");
|
|
297
299
|
assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
|
|
298
300
|
console.log("Initialized SimpleNetworkStakeViewer.");
|
|
@@ -328,6 +330,13 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
|
|
|
328
330
|
console.log("Initializing SimpleStepViewer...");
|
|
329
331
|
assertEx2(await stepViewer.start(), () => "Failed to start SimpleStepViewer");
|
|
330
332
|
console.log("Initialized SimpleStepViewer.");
|
|
333
|
+
const mempoolViewer = await SimpleMempoolViewer.create({
|
|
334
|
+
pendingBlocksArchivist,
|
|
335
|
+
pendingTransactionsArchivist
|
|
336
|
+
});
|
|
337
|
+
console.log("Initializing SimpleMempoolViewer...");
|
|
338
|
+
assertEx2(await mempoolViewer.start(), () => "Failed to start SimpleMempoolViewer");
|
|
339
|
+
console.log("Initialized SimpleMempoolViewer.");
|
|
331
340
|
const viewer = await NodeXyoViewer.create({
|
|
332
341
|
node,
|
|
333
342
|
rewardMultipliers: RewardMultipliers,
|
|
@@ -337,11 +346,18 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
|
|
|
337
346
|
networkStakeViewer,
|
|
338
347
|
accountBalanceViewer,
|
|
339
348
|
stepViewer,
|
|
340
|
-
transfersSummaryContext
|
|
349
|
+
transfersSummaryContext,
|
|
350
|
+
mempoolViewer
|
|
341
351
|
});
|
|
342
352
|
console.log("Initializing NodeXyoViewer...");
|
|
343
353
|
assertEx2(await viewer.start(), () => "Failed to start NodeXyoViewer");
|
|
344
354
|
console.log("Initialized NodeXyoViewer.");
|
|
355
|
+
const runner = await NodeXyoRunner.create({
|
|
356
|
+
node
|
|
357
|
+
});
|
|
358
|
+
console.log("Initializing NodeXyoRunner...");
|
|
359
|
+
assertEx2(await runner.start(), () => "Failed to start NodeXyoRunner");
|
|
360
|
+
console.log("Initialized NodeXyoRunner.");
|
|
345
361
|
const connection = new XyoBaseConnection({
|
|
346
362
|
runner,
|
|
347
363
|
viewer
|
|
@@ -356,14 +372,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balan
|
|
|
356
372
|
}, "addRpcRoutes");
|
|
357
373
|
|
|
358
374
|
// src/server/routes/addRoutes.ts
|
|
359
|
-
var addRoutes = /* @__PURE__ */ __name(async (app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
360
|
-
await addRpcRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
375
|
+
var addRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
376
|
+
await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
361
377
|
addDataLakeRoutes(app);
|
|
362
378
|
addNodeRoutes(app);
|
|
363
379
|
}, "addRoutes");
|
|
364
380
|
|
|
365
381
|
// src/server/app.ts
|
|
366
|
-
var getApp = /* @__PURE__ */ __name(async (node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
382
|
+
var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
367
383
|
addInstrumentation();
|
|
368
384
|
const app = express2();
|
|
369
385
|
app.set("etag", false);
|
|
@@ -378,51 +394,23 @@ var getApp = /* @__PURE__ */ __name(async (node, transfersSummaryMap, balancesSu
|
|
|
378
394
|
app.use(customPoweredByHeader);
|
|
379
395
|
disableCaseSensitiveRouting(app);
|
|
380
396
|
app.node = node;
|
|
381
|
-
await addRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
397
|
+
await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
382
398
|
app.use(standardErrors);
|
|
383
399
|
return app;
|
|
384
400
|
}, "getApp");
|
|
385
401
|
|
|
386
402
|
// src/server/server.ts
|
|
387
403
|
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
388
|
-
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap,
|
|
404
|
+
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
389
405
|
import { createGenesisBlock } from "@xyo-network/chain-protocol";
|
|
390
406
|
import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
|
|
391
407
|
import { findMostRecentBlock, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
392
408
|
var hostname = "::";
|
|
393
|
-
async function
|
|
394
|
-
const { config, logger, node: providedNode } = context;
|
|
395
|
-
const { port } = context.config.api;
|
|
396
|
-
const wallet = await initServerWallet({
|
|
397
|
-
config,
|
|
398
|
-
logger
|
|
399
|
-
});
|
|
400
|
-
const stakeChainViewer = await initChainStakeViewer(config, logger);
|
|
401
|
-
const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
|
|
402
|
-
config,
|
|
403
|
-
logger
|
|
404
|
-
}), () => "Balance Summary Map not initialized");
|
|
405
|
-
const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
|
|
406
|
-
config,
|
|
407
|
-
logger
|
|
408
|
-
}), () => "Transfer Summary Map not initialized");
|
|
409
|
-
const { node, chainArchivist } = await initServerNode({
|
|
410
|
-
config,
|
|
411
|
-
logger,
|
|
412
|
-
wallet,
|
|
413
|
-
node: providedNode,
|
|
414
|
-
transfersSummaryMap,
|
|
415
|
-
balancesSummaryMap
|
|
416
|
-
});
|
|
409
|
+
async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
|
|
417
410
|
const chainMap = readPayloadMapFromStore(chainArchivist);
|
|
418
411
|
const payloads = await chainArchivist.next();
|
|
419
412
|
if (payloads.length === 0) {
|
|
420
413
|
logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
|
|
421
|
-
const producerAccount = await initProducerAccount({
|
|
422
|
-
config,
|
|
423
|
-
logger
|
|
424
|
-
});
|
|
425
|
-
const chainId = stakeChainViewer.chainId;
|
|
426
414
|
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
|
|
427
415
|
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
|
|
428
416
|
await chainArchivist.insert([
|
|
@@ -440,9 +428,13 @@ async function getServer(context) {
|
|
|
440
428
|
]);
|
|
441
429
|
console.log(`[API] Producer declared: ${producerAccount.address}`);
|
|
442
430
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
431
|
+
return chainMap;
|
|
432
|
+
}
|
|
433
|
+
__name(initChainMap, "initChainMap");
|
|
434
|
+
function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chainMap }) {
|
|
435
|
+
return {
|
|
436
|
+
chainId,
|
|
437
|
+
stake: stakeViewer,
|
|
446
438
|
store: {
|
|
447
439
|
chainMap
|
|
448
440
|
},
|
|
@@ -454,11 +446,58 @@ async function getServer(context) {
|
|
|
454
446
|
];
|
|
455
447
|
}, "head")
|
|
456
448
|
};
|
|
449
|
+
}
|
|
450
|
+
__name(initStakedChainContextRead, "initStakedChainContextRead");
|
|
451
|
+
async function getServer(context) {
|
|
452
|
+
const { config, logger, node: providedNode } = context;
|
|
453
|
+
const { port } = context.config.api;
|
|
454
|
+
const wallet = await initServerWallet({
|
|
455
|
+
config,
|
|
456
|
+
logger
|
|
457
|
+
});
|
|
458
|
+
const stakeViewer = await initStakeViewer(config, logger);
|
|
459
|
+
const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
|
|
460
|
+
config,
|
|
461
|
+
logger
|
|
462
|
+
}), () => "Balance Summary Map not initialized");
|
|
463
|
+
const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
|
|
464
|
+
config,
|
|
465
|
+
logger
|
|
466
|
+
}), () => "Transfer Summary Map not initialized");
|
|
467
|
+
const { node, chainArchivist } = await initServerNode({
|
|
468
|
+
config,
|
|
469
|
+
logger,
|
|
470
|
+
wallet,
|
|
471
|
+
node: providedNode,
|
|
472
|
+
transfersSummaryMap,
|
|
473
|
+
balancesSummaryMap
|
|
474
|
+
});
|
|
475
|
+
const chainId = stakeViewer.chainId;
|
|
476
|
+
const producerAccount = await initProducerAccount({
|
|
477
|
+
config,
|
|
478
|
+
logger
|
|
479
|
+
});
|
|
480
|
+
const chainMap = await initChainMap({
|
|
481
|
+
...context,
|
|
482
|
+
chainArchivist,
|
|
483
|
+
chainId,
|
|
484
|
+
producerAccount
|
|
485
|
+
});
|
|
486
|
+
const stakedChainContext = initStakedChainContextRead({
|
|
487
|
+
...context,
|
|
488
|
+
chainArchivist,
|
|
489
|
+
chainId,
|
|
490
|
+
chainMap,
|
|
491
|
+
stakeViewer
|
|
492
|
+
});
|
|
457
493
|
const mods = await node.resolve("*");
|
|
458
494
|
await Promise.all(mods.map((mod) => {
|
|
459
495
|
return mod.start?.() ?? (() => true);
|
|
460
496
|
}));
|
|
461
|
-
const app = await getApp(node,
|
|
497
|
+
const app = await getApp(node, {
|
|
498
|
+
config,
|
|
499
|
+
logger
|
|
500
|
+
}, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache);
|
|
462
501
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
463
502
|
server.setTimeout(2e4);
|
|
464
503
|
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 { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\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 { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\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, 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 { 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} 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 transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\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\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 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 })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\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 { 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 transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, 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 {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initChainStakeViewer, initProducerAccount,\n initServerNode,\n initServerWallet,\n 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 {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type { Config, StakedChainContextRead } 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\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeChainViewer = await initChainStakeViewer(config, logger)\n\n const 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 chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const producerAccount = await initProducerAccount({ config, logger })\n const chainId = stakeChainViewer.chainId\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n const stakedChainContext: StakedChainContextRead = {\n chainId: stakeChainViewer.chainId,\n stake: stakeChainViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n }\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n // const chainIterator = await initChainIterator({\n // config,\n // logger,\n // chainMap,\n // head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),\n // })\n\n // const blockViewer = chainIterator\n\n // const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n // context: {\n // chainId: stakedChainContext.chainId,\n // store: stakedChainContext.store,\n // head: stakedChainContext.head,\n // stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n // summaryMap: balanceSummaryMap,\n // },\n // transferContext: {\n // chainId: stakedChainContext.chainId,\n // store: stakedChainContext.store,\n // head: stakedChainContext.head,\n // stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n // summaryMap: transferSummaryMap,\n // },\n // blockViewer,\n // })\n\n // assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n\n const app = await getApp(node, 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":"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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","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","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","runner","NodeXyoRunner","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","context","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","position","stepViewer","SimpleStepViewer","chainContext","viewer","NodeXyoViewer","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initChainStakeViewer","initProducerAccount","initServerNode","initServerWallet","initTransferSummaryMap","createGenesisBlock","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","readPayloadMapFromStore","hostname","getServer","context","config","logger","node","providedNode","port","api","wallet","initServerWallet","stakeChainViewer","initChainStakeViewer","balancesSummaryMap","assertEx","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","chainArchivist","initServerNode","chainMap","readPayloadMapFromStore","payloads","next","length","warn","producerAccount","initProducerAccount","chainId","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","stakedChainContext","stake","store","head","findMostRecentBlock","_hash","block","mods","resolve","Promise","all","map","mod","start","app","getApp","initRewardsCache","server","listen","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n 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":"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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","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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAExE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -2,5 +2,6 @@ import type { NodeInstance } from '@xyo-network/node-model';
|
|
|
2
2
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
3
|
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
4
|
import type { Express } from 'express';
|
|
5
|
-
|
|
5
|
+
import type { AppContext } from '../model.ts';
|
|
6
|
+
export declare const getApp: (node: NodeInstance, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<Express>;
|
|
6
7
|
//# 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":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
2
|
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
|
|
4
|
+
import type { AppContext } from '../../model.ts';
|
|
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>;
|
|
5
6
|
//# sourceMappingURL=addRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKhD,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
2
|
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
|
|
4
|
+
import type { AppContext } from '../../../../model.ts';
|
|
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>;
|
|
5
6
|
//# 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":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,mBAAmB,EAEnB,OAAO,EAAiC,sBAAsB,EAAE,oBAAoB,EAErF,MAAM,+BAA+B,CAAA;AAStC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAWtD,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAoG3B,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;AAclD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAM3D,OAAO,KAAK,EACV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAQtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA8CD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GAwCxD"}
|
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.2",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,54 +52,54 @@
|
|
|
52
52
|
"@opentelemetry/instrumentation": "~0.208.0",
|
|
53
53
|
"@opentelemetry/instrumentation-express": "~0.57.0",
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
55
|
-
"@xylabs/express": "~5.0.
|
|
56
|
-
"@xylabs/sdk-js": "~5.0.
|
|
57
|
-
"@xyo-network/archivist-model": "~5.2.
|
|
58
|
-
"@xyo-network/boundwitness-model": "~5.2.
|
|
59
|
-
"@xyo-network/chain-orchestration": "~1.17.
|
|
60
|
-
"@xyo-network/chain-protocol": "~1.17.
|
|
61
|
-
"@xyo-network/chain-rpc": "~1.17.
|
|
62
|
-
"@xyo-network/chain-viewers": "~1.17.
|
|
63
|
-
"@xyo-network/module-abstract": "~5.2.
|
|
64
|
-
"@xyo-network/module-model": "~5.2.
|
|
65
|
-
"@xyo-network/node-model": "~5.2.
|
|
66
|
-
"@xyo-network/payload-builder": "~5.2.
|
|
67
|
-
"@xyo-network/payload-model": "~5.2.
|
|
68
|
-
"@xyo-network/xl1-protocol": "~1.14.
|
|
69
|
-
"@xyo-network/xl1-protocol-sdk": "~1.17.
|
|
70
|
-
"@xyo-network/xl1-rpc": "~1.17.
|
|
55
|
+
"@xylabs/express": "~5.0.50",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.50",
|
|
57
|
+
"@xyo-network/archivist-model": "~5.2.17",
|
|
58
|
+
"@xyo-network/boundwitness-model": "~5.2.17",
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.17.2",
|
|
60
|
+
"@xyo-network/chain-protocol": "~1.17.2",
|
|
61
|
+
"@xyo-network/chain-rpc": "~1.17.2",
|
|
62
|
+
"@xyo-network/chain-viewers": "~1.17.2",
|
|
63
|
+
"@xyo-network/module-abstract": "~5.2.17",
|
|
64
|
+
"@xyo-network/module-model": "~5.2.17",
|
|
65
|
+
"@xyo-network/node-model": "~5.2.17",
|
|
66
|
+
"@xyo-network/payload-builder": "~5.2.17",
|
|
67
|
+
"@xyo-network/payload-model": "~5.2.17",
|
|
68
|
+
"@xyo-network/xl1-protocol": "~1.14.16",
|
|
69
|
+
"@xyo-network/xl1-protocol-sdk": "~1.17.2",
|
|
70
|
+
"@xyo-network/xl1-rpc": "~1.17.2",
|
|
71
71
|
"async-mutex": "~0.5.0",
|
|
72
72
|
"compression": "~1.8.1",
|
|
73
73
|
"cors": "~2.8.5",
|
|
74
|
-
"ethers": "
|
|
75
|
-
"express": "~5.1
|
|
74
|
+
"ethers": "^6.16.0",
|
|
75
|
+
"express": "~5.2.1",
|
|
76
76
|
"http-status-codes": "~2.3.0"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@types/compression": "~1.8.1",
|
|
80
80
|
"@types/cors": "~2.8.19",
|
|
81
|
-
"@types/express": "5.0.
|
|
81
|
+
"@types/express": "5.0.6",
|
|
82
82
|
"@types/express-serve-static-core": "~5.1.0",
|
|
83
83
|
"@types/node": "~24.10.1",
|
|
84
|
-
"@xylabs/sdk-js": "~5.0.
|
|
84
|
+
"@xylabs/sdk-js": "~5.0.50",
|
|
85
85
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
86
86
|
"@xylabs/tsconfig": "~7.2.8",
|
|
87
|
-
"@xyo-network/account": "~5.2.
|
|
88
|
-
"@xyo-network/account-model": "~5.2.
|
|
89
|
-
"@xyo-network/archivist-abstract": "~5.2.
|
|
87
|
+
"@xyo-network/account": "~5.2.17",
|
|
88
|
+
"@xyo-network/account-model": "~5.2.17",
|
|
89
|
+
"@xyo-network/archivist-abstract": "~5.2.17",
|
|
90
90
|
"@xyo-network/bios-model": "~7.2.0",
|
|
91
|
-
"@xyo-network/boundwitness-builder": "~5.2.
|
|
92
|
-
"@xyo-network/chain-services": "~1.17.
|
|
93
|
-
"@xyo-network/module-abstract-mongodb": "~5.2.
|
|
94
|
-
"@xyo-network/module-model-mongodb": "~5.2.
|
|
95
|
-
"@xyo-network/node-memory": "~5.2.
|
|
96
|
-
"@xyo-network/xl1-protocol": "~1.14.
|
|
91
|
+
"@xyo-network/boundwitness-builder": "~5.2.17",
|
|
92
|
+
"@xyo-network/chain-services": "~1.17.2",
|
|
93
|
+
"@xyo-network/module-abstract-mongodb": "~5.2.17",
|
|
94
|
+
"@xyo-network/module-model-mongodb": "~5.2.17",
|
|
95
|
+
"@xyo-network/node-memory": "~5.2.17",
|
|
96
|
+
"@xyo-network/xl1-protocol": "~1.14.16",
|
|
97
97
|
"dotenv": "~17.2.3",
|
|
98
98
|
"eslint": "^9.39.1",
|
|
99
99
|
"nodemon": "~3.1.11",
|
|
100
100
|
"tslib": "~2.8.1",
|
|
101
101
|
"typescript": "~5.9.3",
|
|
102
|
-
"vitest": "~4.0.
|
|
102
|
+
"vitest": "~4.0.15",
|
|
103
103
|
"vitest-mock-extended": "~3.1.0"
|
|
104
104
|
},
|
|
105
105
|
"engines": {
|
package/src/index.ts
CHANGED
package/src/model.ts
ADDED
package/src/server/app.ts
CHANGED
|
@@ -8,11 +8,9 @@ import {
|
|
|
8
8
|
standardErrors,
|
|
9
9
|
standardResponses,
|
|
10
10
|
} from '@xylabs/express'
|
|
11
|
-
import type { ReadArchivist } from '@xyo-network/archivist-model'
|
|
12
11
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
13
12
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
14
13
|
import type {
|
|
15
|
-
AccountBalanceViewer,
|
|
16
14
|
BalancesStepSummary,
|
|
17
15
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
18
16
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
@@ -21,11 +19,13 @@ import cors from 'cors'
|
|
|
21
19
|
import type { Express } from 'express'
|
|
22
20
|
import express from 'express'
|
|
23
21
|
|
|
22
|
+
import type { AppContext } from '../model.ts'
|
|
24
23
|
import { addInstrumentation } from './instrumentation.ts'
|
|
25
24
|
import { addRoutes } from './routes/index.ts'
|
|
26
25
|
|
|
27
26
|
export const getApp = async (
|
|
28
27
|
node: NodeInstance,
|
|
28
|
+
context: AppContext,
|
|
29
29
|
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
30
30
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
31
31
|
stakedChainContext: StakedChainContextRead,
|
|
@@ -44,7 +44,7 @@ export const getApp = async (
|
|
|
44
44
|
app.use(customPoweredByHeader)
|
|
45
45
|
disableCaseSensitiveRouting(app)
|
|
46
46
|
app.node = node
|
|
47
|
-
await addRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
47
|
+
await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
48
48
|
app.use(standardErrors)
|
|
49
49
|
return app
|
|
50
50
|
}
|
|
@@ -5,18 +5,20 @@ import type {
|
|
|
5
5
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
6
6
|
import type { Express } from 'express'
|
|
7
7
|
|
|
8
|
+
import type { AppContext } from '../../model.ts'
|
|
8
9
|
import { addNodeRoutes } from './address/index.ts'
|
|
9
10
|
import { addDataLakeRoutes } from './dataLake/index.ts'
|
|
10
11
|
import { addRpcRoutes } from './rpc/index.ts'
|
|
11
12
|
|
|
12
13
|
export const addRoutes = async (
|
|
13
14
|
app: Express,
|
|
15
|
+
context: AppContext,
|
|
14
16
|
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
15
17
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
16
18
|
stakedChainContext: StakedChainContextRead,
|
|
17
19
|
initRewardsCache?: boolean,
|
|
18
20
|
) => {
|
|
19
|
-
await addRpcRoutes(app, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
21
|
+
await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
20
22
|
addDataLakeRoutes(app)
|
|
21
23
|
addNodeRoutes(app)
|
|
22
24
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
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 { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'
|
|
4
5
|
import { NodeXyoViewer } from '@xyo-network/chain-rpc'
|
|
5
6
|
import {
|
|
6
7
|
SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
|
|
@@ -16,6 +17,7 @@ import type {
|
|
|
16
17
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
17
18
|
import {
|
|
18
19
|
RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
|
|
20
|
+
SimpleMempoolViewer,
|
|
19
21
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
20
22
|
import {
|
|
21
23
|
NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,
|
|
@@ -23,6 +25,8 @@ import {
|
|
|
23
25
|
import { Semaphore } from 'async-mutex'
|
|
24
26
|
import type { Express } from 'express'
|
|
25
27
|
|
|
28
|
+
import type { AppContext } from '../../../../model.ts'
|
|
29
|
+
|
|
26
30
|
async function chainArchivistFromNode(node: NodeInstance) {
|
|
27
31
|
const chainArchivist = assertEx(asArchivistInstance(
|
|
28
32
|
await node.resolve('Chain:Validated'),
|
|
@@ -34,13 +38,13 @@ async function chainArchivistFromNode(node: NodeInstance) {
|
|
|
34
38
|
// eslint-disable-next-line max-statements
|
|
35
39
|
export const addRpcRoutes = async (
|
|
36
40
|
app: Express,
|
|
41
|
+
context: AppContext,
|
|
37
42
|
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
38
43
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
39
44
|
stakedChainContext: StakedChainContextRead,
|
|
40
45
|
initRewardsCache?: boolean,
|
|
41
46
|
) => {
|
|
42
47
|
const { node } = app
|
|
43
|
-
const runner = new NodeXyoRunner(node)
|
|
44
48
|
|
|
45
49
|
const finalizedArchivist = await chainArchivistFromNode(node)
|
|
46
50
|
|
|
@@ -61,6 +65,8 @@ export const addRpcRoutes = async (
|
|
|
61
65
|
} satisfies TransfersStepSummaryContext
|
|
62
66
|
|
|
63
67
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
|
|
68
|
+
const pendingBlocksArchivist = await initPendingBlockArchivist(context)
|
|
69
|
+
const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)
|
|
64
70
|
|
|
65
71
|
console.log('Initializing SimpleNetworkStakeViewer...')
|
|
66
72
|
assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
|
|
@@ -98,6 +104,12 @@ export const addRpcRoutes = async (
|
|
|
98
104
|
assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')
|
|
99
105
|
console.log('Initialized SimpleStepViewer.')
|
|
100
106
|
|
|
107
|
+
const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })
|
|
108
|
+
|
|
109
|
+
console.log('Initializing SimpleMempoolViewer...')
|
|
110
|
+
assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')
|
|
111
|
+
console.log('Initialized SimpleMempoolViewer.')
|
|
112
|
+
|
|
101
113
|
const viewer = await NodeXyoViewer.create({
|
|
102
114
|
node,
|
|
103
115
|
rewardMultipliers: RewardMultipliers,
|
|
@@ -108,12 +120,19 @@ export const addRpcRoutes = async (
|
|
|
108
120
|
accountBalanceViewer,
|
|
109
121
|
stepViewer,
|
|
110
122
|
transfersSummaryContext,
|
|
123
|
+
mempoolViewer,
|
|
111
124
|
})
|
|
112
125
|
|
|
113
126
|
console.log('Initializing NodeXyoViewer...')
|
|
114
127
|
assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')
|
|
115
128
|
console.log('Initialized NodeXyoViewer.')
|
|
116
129
|
|
|
130
|
+
const runner = await NodeXyoRunner.create({ node })
|
|
131
|
+
|
|
132
|
+
console.log('Initializing NodeXyoRunner...')
|
|
133
|
+
assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')
|
|
134
|
+
console.log('Initialized NodeXyoRunner.')
|
|
135
|
+
|
|
117
136
|
const connection = new XyoBaseConnection({ runner, viewer })
|
|
118
137
|
const engine = rpcEngineFromConnection(connection)
|
|
119
138
|
|
package/src/server/server.ts
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import type { Hash, Logger } from '@xylabs/sdk-js'
|
|
2
2
|
import { assertEx } from '@xylabs/sdk-js'
|
|
3
|
+
import type { AccountInstance } from '@xyo-network/account-model'
|
|
4
|
+
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
5
|
+
import type { ConfigContext } from '@xyo-network/chain-orchestration'
|
|
3
6
|
import {
|
|
4
7
|
createProducerChainStakeIntentBlock,
|
|
5
8
|
initBalanceSummaryMap,
|
|
6
|
-
|
|
9
|
+
initProducerAccount,
|
|
7
10
|
initServerNode,
|
|
8
11
|
initServerWallet,
|
|
9
|
-
initTransferSummaryMap,
|
|
12
|
+
initStakeViewer, initTransferSummaryMap,
|
|
10
13
|
} from '@xyo-network/chain-orchestration'
|
|
11
14
|
import { createGenesisBlock } from '@xyo-network/chain-protocol'
|
|
12
15
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
13
16
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
17
|
+
import type { ChainId } from '@xyo-network/xl1-protocol'
|
|
14
18
|
import {
|
|
15
19
|
asXL1, asXL1BlockRange, XL1Amount,
|
|
16
20
|
} from '@xyo-network/xl1-protocol'
|
|
17
|
-
import type {
|
|
21
|
+
import type {
|
|
22
|
+
Config, PayloadMapRead, StakedChainContextRead,
|
|
23
|
+
StakeViewer,
|
|
24
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
18
25
|
import { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
|
|
19
26
|
|
|
20
27
|
import { getApp } from './app.ts'
|
|
@@ -28,13 +35,57 @@ interface GetServerContext {
|
|
|
28
35
|
node?: NodeInstance
|
|
29
36
|
}
|
|
30
37
|
|
|
38
|
+
async function initChainMap({
|
|
39
|
+
chainArchivist, chainId, logger, config, producerAccount,
|
|
40
|
+
}: ConfigContext<{
|
|
41
|
+
chainArchivist: ArchivistInstance
|
|
42
|
+
chainId: ChainId
|
|
43
|
+
producerAccount: AccountInstance
|
|
44
|
+
}>) {
|
|
45
|
+
const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
|
|
46
|
+
|
|
47
|
+
const payloads = await chainArchivist.next()
|
|
48
|
+
|
|
49
|
+
if (payloads.length === 0) {
|
|
50
|
+
logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
|
|
51
|
+
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
|
|
52
|
+
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
|
|
53
|
+
await chainArchivist.insert([...block0[1].flat(), block0[0]])
|
|
54
|
+
console.log('[API] Genesis block created and inserted into chain archivist')
|
|
55
|
+
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
|
|
56
|
+
await chainArchivist.insert([...block1[1].flat(), block1[0]])
|
|
57
|
+
console.log(`[API] Producer declared: ${producerAccount.address}`)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return chainMap
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function initStakedChainContextRead({
|
|
64
|
+
chainArchivist, chainId, stakeViewer, chainMap,
|
|
65
|
+
}: ConfigContext<{
|
|
66
|
+
chainArchivist: ArchivistInstance
|
|
67
|
+
chainId: ChainId
|
|
68
|
+
chainMap: PayloadMapRead<WithStorageMeta<Payload>>
|
|
69
|
+
stakeViewer: StakeViewer
|
|
70
|
+
}>) {
|
|
71
|
+
return {
|
|
72
|
+
chainId,
|
|
73
|
+
stake: stakeViewer,
|
|
74
|
+
store: { chainMap },
|
|
75
|
+
head: async (): Promise<[Hash, number]> => {
|
|
76
|
+
const head = await findMostRecentBlock(chainArchivist)
|
|
77
|
+
return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
|
|
78
|
+
},
|
|
79
|
+
} satisfies StakedChainContextRead
|
|
80
|
+
}
|
|
81
|
+
|
|
31
82
|
export async function getServer(context: GetServerContext) {
|
|
32
83
|
const {
|
|
33
84
|
config, logger, node: providedNode,
|
|
34
85
|
} = context
|
|
35
86
|
const { port } = context.config.api
|
|
36
87
|
const wallet = await initServerWallet({ config, logger })
|
|
37
|
-
const
|
|
88
|
+
const stakeViewer = await initStakeViewer(config, logger)
|
|
38
89
|
|
|
39
90
|
const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')
|
|
40
91
|
const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
|
|
@@ -48,67 +99,23 @@ export async function getServer(context: GetServerContext) {
|
|
|
48
99
|
balancesSummaryMap,
|
|
49
100
|
})
|
|
50
101
|
|
|
51
|
-
const
|
|
102
|
+
const chainId = stakeViewer.chainId
|
|
52
103
|
|
|
53
|
-
const
|
|
104
|
+
const producerAccount = await initProducerAccount({ config, logger })
|
|
105
|
+
const chainMap = await initChainMap({
|
|
106
|
+
...context, chainArchivist, chainId, producerAccount,
|
|
107
|
+
})
|
|
54
108
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const chainId = stakeChainViewer.chainId
|
|
59
|
-
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
|
|
60
|
-
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
|
|
61
|
-
await chainArchivist.insert([...block0[1].flat(), block0[0]])
|
|
62
|
-
console.log('[API] Genesis block created and inserted into chain archivist')
|
|
63
|
-
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
|
|
64
|
-
await chainArchivist.insert([...block1[1].flat(), block1[0]])
|
|
65
|
-
console.log(`[API] Producer declared: ${producerAccount.address}`)
|
|
66
|
-
}
|
|
109
|
+
const stakedChainContext = initStakedChainContextRead({
|
|
110
|
+
...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
|
|
111
|
+
})
|
|
67
112
|
|
|
68
|
-
const stakedChainContext: StakedChainContextRead = {
|
|
69
|
-
chainId: stakeChainViewer.chainId,
|
|
70
|
-
stake: stakeChainViewer,
|
|
71
|
-
store: { chainMap },
|
|
72
|
-
head: async (): Promise<[Hash, number]> => {
|
|
73
|
-
const head = await findMostRecentBlock(chainArchivist)
|
|
74
|
-
return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
|
|
75
|
-
},
|
|
76
|
-
}
|
|
77
113
|
const mods = await node.resolve('*')
|
|
78
114
|
await Promise.all(mods.map((mod) => {
|
|
79
115
|
return mod.start?.() ?? (() => true)
|
|
80
116
|
}))
|
|
81
117
|
|
|
82
|
-
|
|
83
|
-
// config,
|
|
84
|
-
// logger,
|
|
85
|
-
// chainMap,
|
|
86
|
-
// head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),
|
|
87
|
-
// })
|
|
88
|
-
|
|
89
|
-
// const blockViewer = chainIterator
|
|
90
|
-
|
|
91
|
-
// const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
92
|
-
// context: {
|
|
93
|
-
// chainId: stakedChainContext.chainId,
|
|
94
|
-
// store: stakedChainContext.store,
|
|
95
|
-
// head: stakedChainContext.head,
|
|
96
|
-
// stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
97
|
-
// summaryMap: balanceSummaryMap,
|
|
98
|
-
// },
|
|
99
|
-
// transferContext: {
|
|
100
|
-
// chainId: stakedChainContext.chainId,
|
|
101
|
-
// store: stakedChainContext.store,
|
|
102
|
-
// head: stakedChainContext.head,
|
|
103
|
-
// stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
104
|
-
// summaryMap: transferSummaryMap,
|
|
105
|
-
// },
|
|
106
|
-
// blockViewer,
|
|
107
|
-
// })
|
|
108
|
-
|
|
109
|
-
// assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
|
|
110
|
-
|
|
111
|
-
const app = await getApp(node, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
|
|
118
|
+
const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
|
|
112
119
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
113
120
|
server.setTimeout(20_000)
|
|
114
121
|
return server
|