@xyo-network/chain-mempool 1.18.0 → 1.18.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/MempoolContext.d.ts +1 -1
- package/dist/node/MempoolContext.d.ts.map +1 -1
- package/dist/node/actors/MempoolActor.d.ts +42 -0
- package/dist/node/actors/MempoolActor.d.ts.map +1 -0
- package/dist/node/actors/index.d.ts +2 -0
- package/dist/node/actors/index.d.ts.map +1 -0
- package/dist/node/helpers/initChainId.d.ts +1 -1
- package/dist/node/helpers/initChainId.d.ts.map +1 -1
- package/dist/node/index.mjs +18 -12
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/manifest/getLocator.d.ts +1 -1
- package/dist/node/manifest/getLocator.d.ts.map +1 -1
- package/dist/node/manifest/getNode.d.ts +1 -1
- package/dist/node/manifest/getNode.d.ts.map +1 -1
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/model.d.ts +1 -1
- package/dist/node/server/model.d.ts.map +1 -1
- package/dist/node/server/server.d.ts +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +44 -43
- package/src/MempoolContext.ts +1 -1
- package/src/actors/MempoolActor.ts +119 -0
- package/src/actors/index.ts +1 -0
- package/src/helpers/initChainId.ts +1 -1
- package/src/manifest/getLocator.ts +2 -2
- package/src/manifest/getNode.ts +1 -1
- package/src/server/app.ts +3 -8
- package/src/server/model.ts +1 -1
- package/src/server/server.ts +21 -23
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
2
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-
|
|
3
|
+
import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-sdk';
|
|
4
4
|
export interface MempoolContext extends CreatableProviderContext {
|
|
5
5
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
6
6
|
node: NodeInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MempoolContext.d.ts","sourceRoot":"","sources":["../../src/MempoolContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM
|
|
1
|
+
{"version":3,"file":"MempoolContext.d.ts","sourceRoot":"","sources":["../../src/MempoolContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,cAAe,SAAQ,wBAAwB;IAC9D,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,EAAE,YAAY,CAAA;IAClB,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ArchivistInstance } from '@xyo-network/archivist-model';
|
|
2
|
+
import { Actor, ActorParams } from '@xyo-network/xl1-sdk';
|
|
3
|
+
export type MempoolActorParams = ActorParams<{
|
|
4
|
+
pendingBlocksArchivist: ArchivistInstance;
|
|
5
|
+
pendingTransactionsArchivist: ArchivistInstance;
|
|
6
|
+
}>;
|
|
7
|
+
export declare class MempoolActor extends Actor<MempoolActorParams> {
|
|
8
|
+
private _blockTimerId;
|
|
9
|
+
private _blockTimerMutex;
|
|
10
|
+
private _transactionTimerId;
|
|
11
|
+
private _transactionTimerMutex;
|
|
12
|
+
protected get pendingBlocksArchivist(): ArchivistInstance<import("@xyo-network/archivist-model").ArchivistParams<import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/archivist-model").ArchivistConfig>>, import("@xyo-network/archivist-model").ArchivistModuleEventData, import("@xyo-network/payload-model").Payload>;
|
|
13
|
+
protected get pendingTransactionsArchivist(): ArchivistInstance<import("@xyo-network/archivist-model").ArchivistParams<import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/archivist-model").ArchivistConfig>>, import("@xyo-network/archivist-model").ArchivistModuleEventData, import("@xyo-network/payload-model").Payload>;
|
|
14
|
+
static paramsHandler(params?: Partial<MempoolActorParams>): Promise<{
|
|
15
|
+
pendingBlocksArchivist: ArchivistInstance<import("@xyo-network/archivist-model").ArchivistParams<import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/archivist-model").ArchivistConfig>>, import("@xyo-network/archivist-model").ArchivistModuleEventData, import("@xyo-network/payload-model").Payload>;
|
|
16
|
+
pendingTransactionsArchivist: ArchivistInstance<import("@xyo-network/archivist-model").ArchivistParams<import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/archivist-model").ArchivistConfig>>, import("@xyo-network/archivist-model").ArchivistModuleEventData, import("@xyo-network/payload-model").Payload>;
|
|
17
|
+
name?: import("@xylabs/sdk-js").CreatableName;
|
|
18
|
+
statusReporter?: import("@xylabs/sdk-js").CreatableStatusReporter<void> | undefined;
|
|
19
|
+
logger: import("@xylabs/sdk-js").Logger;
|
|
20
|
+
meterProvider?: import("@opentelemetry/api").MeterProvider;
|
|
21
|
+
traceProvider?: import("@opentelemetry/api").TracerProvider;
|
|
22
|
+
account: import("@xyo-network/account-model").AccountInstance;
|
|
23
|
+
context: import("@xyo-network/xl1-sdk").ActorContext;
|
|
24
|
+
displayName: string | (string & {
|
|
25
|
+
__baseClassName: true;
|
|
26
|
+
}) | undefined;
|
|
27
|
+
id: string | (string & {
|
|
28
|
+
__baseClassName: true;
|
|
29
|
+
});
|
|
30
|
+
}>;
|
|
31
|
+
protected static initContext(params: MempoolActorParams): Promise<import("@xyo-network/xl1-sdk").CreatableProviderContext>;
|
|
32
|
+
createHandler(): Promise<void>;
|
|
33
|
+
startHandler(): Promise<void>;
|
|
34
|
+
stopHandler(): Promise<void>;
|
|
35
|
+
private removeInvalidPendingBlocks;
|
|
36
|
+
private removeInvalidPendingTransactions;
|
|
37
|
+
private restartBlockTimer;
|
|
38
|
+
private restartTransactionTimer;
|
|
39
|
+
private stopBlockTimer;
|
|
40
|
+
private stopTransactionTimer;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=MempoolActor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MempoolActor.d.ts","sourceRoot":"","sources":["../../../src/actors/MempoolActor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EACL,KAAK,EAAE,WAAW,EAKnB,MAAM,sBAAsB,CAAA;AAG7B,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC;IAC3C,sBAAsB,EAAE,iBAAiB,CAAA;IACzC,4BAA4B,EAAE,iBAAiB,CAAA;CAChD,CAAC,CAAA;AAEF,qBACa,YAAa,SAAQ,KAAK,CAAC,kBAAkB,CAAC;IACzD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,gBAAgB,CAAc;IAEtC,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,sBAAsB,CAAc;IAE5C,SAAS,KAAK,sBAAsB,0SAEnC;IAED,SAAS,KAAK,4BAA4B,0SAEzC;WAEqB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;qBAcxC,WAAW,CACzC,MAAM,EAAE,kBAAkB;IAYb,aAAa;IAIb,YAAY;IAMZ,WAAW;YAKZ,0BAA0B;YAE1B,gCAAgC;IAE9C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,oBAAoB;CAM7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actors/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Config } from '@xyo-network/xl1-
|
|
1
|
+
import type { Config } from '@xyo-network/xl1-sdk';
|
|
2
2
|
export declare const canUseChainId: (config: Config) => boolean;
|
|
3
3
|
export declare const getChainId: (config: Config) => number;
|
|
4
4
|
//# sourceMappingURL=initChainId.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initChainId.d.ts","sourceRoot":"","sources":["../../../src/helpers/initChainId.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"initChainId.d.ts","sourceRoot":"","sources":["../../../src/helpers/initChainId.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,OAE9C,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,WAUxC,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -292,6 +292,7 @@ var getApp = /* @__PURE__ */ __name((context) => {
|
|
|
292
292
|
app.use(customPoweredByHeader);
|
|
293
293
|
disableCaseSensitiveRouting(app);
|
|
294
294
|
app.context = context;
|
|
295
|
+
app.node = context.node;
|
|
295
296
|
addRoutes(app);
|
|
296
297
|
app.use(standardErrors);
|
|
297
298
|
return app;
|
|
@@ -299,26 +300,30 @@ var getApp = /* @__PURE__ */ __name((context) => {
|
|
|
299
300
|
|
|
300
301
|
// src/server/server.ts
|
|
301
302
|
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
302
|
-
import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints,
|
|
303
|
+
import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initMempoolWallet, initServerNode, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
303
304
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
304
305
|
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
305
|
-
import { BlockViewerMoniker, findMostRecentBlock, ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer, SimpleStakeEventsViewer, SimpleStakeViewer } from "@xyo-network/xl1-
|
|
306
|
+
import { BlockViewerMoniker, DefaultMetricsScrapePorts, findMostRecentBlock, ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer, SimpleStakeEventsViewer, SimpleStakeViewer, SimpleWindowedBlockViewer } from "@xyo-network/xl1-sdk";
|
|
306
307
|
var hostname = "::";
|
|
307
308
|
var getProviderFactoryLocator = /* @__PURE__ */ __name((context, finalizedArchivist, pendingTransactionsArchivist, pendingBlocksArchivist) => {
|
|
308
309
|
const locator = new ProviderFactoryLocator(context);
|
|
309
|
-
locator.register(SimpleMempoolViewer.factory({
|
|
310
|
+
locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
|
|
310
311
|
pendingTransactionsArchivist,
|
|
311
312
|
pendingBlocksArchivist
|
|
312
313
|
}));
|
|
313
|
-
locator.register(SimpleMempoolRunner.factory({
|
|
314
|
+
locator.register(SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {
|
|
314
315
|
pendingTransactionsArchivist,
|
|
315
316
|
pendingBlocksArchivist
|
|
316
317
|
}));
|
|
317
|
-
locator.register(SimpleBlockViewer.factory({
|
|
318
|
+
locator.register(SimpleBlockViewer.factory(SimpleBlockViewer.dependencies, {
|
|
318
319
|
finalizedArchivist
|
|
319
320
|
}));
|
|
320
|
-
locator.register(
|
|
321
|
-
|
|
321
|
+
locator.register(SimpleWindowedBlockViewer.factory(SimpleWindowedBlockViewer.dependencies, {
|
|
322
|
+
maxWindowSize: 1e4,
|
|
323
|
+
syncInterval: 1e4
|
|
324
|
+
}));
|
|
325
|
+
locator.register(SimpleStakeViewer.factory(SimpleStakeViewer.dependencies));
|
|
326
|
+
locator.register(SimpleStakeEventsViewer.factory(SimpleStakeEventsViewer.dependencies));
|
|
322
327
|
return locator;
|
|
323
328
|
}, "getProviderFactoryLocator");
|
|
324
329
|
var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
@@ -333,7 +338,7 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
333
338
|
logger,
|
|
334
339
|
statusReporter
|
|
335
340
|
}));
|
|
336
|
-
const telemetryConfig = buildTelemetryConfig(config, "xl1-
|
|
341
|
+
const telemetryConfig = buildTelemetryConfig(config, "xl1-mempool", "1.0.0", DefaultMetricsScrapePorts.mempool);
|
|
337
342
|
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
338
343
|
const initContext = {
|
|
339
344
|
_id: "init-context",
|
|
@@ -342,9 +347,10 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
342
347
|
statusReporter,
|
|
343
348
|
meterProvider,
|
|
344
349
|
traceProvider,
|
|
345
|
-
singletons: {}
|
|
350
|
+
singletons: {},
|
|
351
|
+
caches: {}
|
|
346
352
|
};
|
|
347
|
-
const wallet = await
|
|
353
|
+
const wallet = await initMempoolWallet(initContext);
|
|
348
354
|
const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
349
355
|
const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
350
356
|
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
@@ -372,7 +378,7 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
372
378
|
assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
373
379
|
const blk = await blockViewer.currentBlock();
|
|
374
380
|
assertEx2(blk, () => "No blocks found after initialization");
|
|
375
|
-
console.info(`[
|
|
381
|
+
console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
376
382
|
const actor = await ValidatorActor.create({
|
|
377
383
|
id: "validator-mempool-server",
|
|
378
384
|
account: wallet,
|
|
@@ -381,7 +387,7 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
381
387
|
});
|
|
382
388
|
await actor.start();
|
|
383
389
|
const app = getApp(mempoolContext);
|
|
384
|
-
const server = app.listen(port, hostname, () => logger?.log(`[
|
|
390
|
+
const server = app.listen(port, hostname, () => logger?.log(`[Mempool] Server listening at http://${hostname}:${port}`));
|
|
385
391
|
server.setTimeout(2e4);
|
|
386
392
|
return server;
|
|
387
393
|
}, "getServer");
|
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/healthz/addHealthRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { MempoolContext } from '../MempoolContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (context: MempoolContext): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.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 type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nexport const addHealthRoutes = (app: Express) => {\n app.get('/healthz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/livez', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/readyz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addHealthRoutes } from './healthz/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addHealthRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n initBalanceSummaryMap,\n initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type {\n BlockViewer,\n Config, CreatableProviderContext, CreatableProviderParams,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n BlockViewerMoniker,\n findMostRecentBlock,\n ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n SimpleStakeEventsViewer, SimpleStakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport type { MempoolContext } from '../MempoolContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nconst getProviderFactoryLocator = (\n context: Omit<CreatableProviderContext, 'locator'>,\n finalizedArchivist: ArchivistInstance,\n pendingTransactionsArchivist: ArchivistInstance,\n pendingBlocksArchivist: ArchivistInstance,\n) => {\n const locator = new ProviderFactoryLocator(context)\n locator.register(SimpleMempoolViewer.factory({\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleMempoolRunner.factory({\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleBlockViewer.factory({ finalizedArchivist } as Partial<CreatableProviderParams>))\n locator.register(SimpleStakeViewer.factory())\n locator.register(SimpleStakeEventsViewer.factory())\n return locator\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n meterProvider,\n traceProvider,\n singletons: {},\n }\n\n const wallet = await initServerWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No head found')\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist)\n\n const mempoolContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'mempool-context',\n } satisfies MempoolContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n } satisfies ValidatorActorParams)\n\n await actor.start()\n\n const app = getApp(mempoolContext)\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","StatusCodes","addHealthRoutes","app","get","_req","res","status","StatusCodes","OK","send","addRoutes","app","addHealthRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initServerNode","initServerWallet","initStatusReporter","initTransferSummaryMap","ValidatorActor","initTelemetry","startupSpanAsync","BlockViewerMoniker","findMostRecentBlock","ProviderFactoryLocator","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","SimpleStakeEventsViewer","SimpleStakeViewer","hostname","getProviderFactoryLocator","context","finalizedArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","locator","ProviderFactoryLocator","register","SimpleMempoolViewer","factory","SimpleMempoolRunner","SimpleBlockViewer","SimpleStakeViewer","SimpleStakeEventsViewer","getServer","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","wallet","initServerWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","initServerNode","findMostRecentBlock","mods","resolve","Promise","all","map","mod","start","mempoolContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","console","info","block","_hash","actor","ValidatorActor","create","id","account","app","getApp","server","listen","log","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/healthz/addHealthRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { MempoolContext } from '../MempoolContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (context: MempoolContext): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n app.node = context.node\n addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.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 type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nexport const addHealthRoutes = (app: Express) => {\n app.get('/healthz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/livez', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/readyz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addHealthRoutes } from './healthz/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addHealthRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initMempoolWallet, initServerNode, initStatusReporter, initTransferSummaryMap,\n ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type {\n BlockViewer,\n Config, CreatableProviderContext, CreatableProviderParams,\n} from '@xyo-network/xl1-sdk'\nimport {\n BlockViewerMoniker, DefaultMetricsScrapePorts, findMostRecentBlock, ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n SimpleStakeEventsViewer, SimpleStakeViewer, SimpleWindowedBlockViewer,\n} from '@xyo-network/xl1-sdk'\n\nimport type { MempoolContext } from '../MempoolContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nconst getProviderFactoryLocator = (\n context: Omit<CreatableProviderContext, 'locator'>,\n finalizedArchivist: ArchivistInstance,\n pendingTransactionsArchivist: ArchivistInstance,\n pendingBlocksArchivist: ArchivistInstance,\n) => {\n const locator = new ProviderFactoryLocator(context)\n locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }))\n locator.register(SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(\n SimpleWindowedBlockViewer.dependencies,\n { maxWindowSize: 10_000, syncInterval: 10_000 },\n ))\n locator.register(SimpleStakeViewer.factory(SimpleStakeViewer.dependencies))\n locator.register(SimpleStakeEventsViewer.factory(SimpleStakeEventsViewer.dependencies))\n return locator\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-mempool', '1.0.0', DefaultMetricsScrapePorts.mempool)\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initMempoolWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext, wallet, node: providedNode, transfersSummaryMap, balancesSummaryMap,\n })\n\n assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No head found')\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist)\n\n const mempoolContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'mempool-context',\n } satisfies MempoolContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n } satisfies ValidatorActorParams)\n\n await actor.start()\n\n const app = getApp(mempoolContext)\n const server = app.listen(port, hostname, () => logger?.log(`[Mempool] 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","StatusCodes","addHealthRoutes","app","get","_req","res","status","StatusCodes","OK","send","addRoutes","app","addHealthRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","node","addRoutes","standardErrors","assertEx","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initMempoolWallet","initServerNode","initStatusReporter","initTransferSummaryMap","ValidatorActor","initTelemetry","startupSpanAsync","BlockViewerMoniker","DefaultMetricsScrapePorts","findMostRecentBlock","ProviderFactoryLocator","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","SimpleStakeEventsViewer","SimpleStakeViewer","SimpleWindowedBlockViewer","hostname","getProviderFactoryLocator","context","finalizedArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","locator","ProviderFactoryLocator","register","SimpleMempoolViewer","factory","dependencies","SimpleMempoolRunner","SimpleBlockViewer","SimpleWindowedBlockViewer","maxWindowSize","syncInterval","SimpleStakeViewer","SimpleStakeEventsViewer","getServer","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","mempool","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","caches","wallet","initMempoolWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","initServerNode","findMostRecentBlock","mods","resolve","Promise","all","map","mod","start","mempoolContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","console","info","block","_hash","actor","ValidatorActor","create","id","account","app","getApp","server","listen","log","setTimeout"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Logger } from '@xylabs/sdk-js';
|
|
2
2
|
import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator';
|
|
3
|
-
import type { Config } from '@xyo-network/xl1-
|
|
3
|
+
import type { Config } from '@xyo-network/xl1-sdk';
|
|
4
4
|
export interface GetLocatorContext {
|
|
5
5
|
config: Config;
|
|
6
6
|
logger?: Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAO5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAG1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"getLocator.d.ts","sourceRoot":"","sources":["../../../src/manifest/getLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAO5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAG1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAGlD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,kCA6C1D,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Logger } from '@xylabs/sdk-js';
|
|
2
2
|
import type { WalletInstance } from '@xyo-network/wallet-model';
|
|
3
|
-
import type { Config } from '@xyo-network/xl1-
|
|
3
|
+
import type { Config } from '@xyo-network/xl1-sdk';
|
|
4
4
|
export interface GetNodeContext {
|
|
5
5
|
config: Config;
|
|
6
6
|
logger?: Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNode.d.ts","sourceRoot":"","sources":["../../../src/manifest/getNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"getNode.d.ts","sourceRoot":"","sources":["../../../src/manifest/getNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAOlD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAU,SAAS,cAAc,uKAUpD,CAAA"}
|
|
@@ -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":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAI1D,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,OAiBhD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/server/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/server/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE/D,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Logger } from '@xylabs/sdk-js';
|
|
2
2
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
3
|
-
import type { Config } from '@xyo-network/xl1-
|
|
3
|
+
import type { Config } from '@xyo-network/xl1-sdk';
|
|
4
4
|
interface GetServerContext {
|
|
5
5
|
config: Config;
|
|
6
6
|
logger?: Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAU5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAEV,MAAM,EACP,MAAM,sBAAsB,CAAA;AAY7B,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA2BD,eAAO,MAAM,SAAS,GAAU,SAAS,gBAAgB,+HA6ExD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-mempool",
|
|
3
|
-
"version": "1.18.
|
|
3
|
+
"version": "1.18.2",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -49,27 +49,27 @@
|
|
|
49
49
|
"types": "tsc --noEmit -p tsconfig.test.json"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@opentelemetry/instrumentation": "~0.
|
|
53
|
-
"@opentelemetry/instrumentation-express": "~0.
|
|
54
|
-
"@opentelemetry/instrumentation-http": "~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.18.
|
|
60
|
-
"@xyo-network/chain-telemetry": "~1.18.
|
|
61
|
-
"@xyo-network/chain-utils": "~1.18.
|
|
62
|
-
"@xyo-network/manifest-model": "~5.2.
|
|
63
|
-
"@xyo-network/module-abstract": "~5.2.
|
|
64
|
-
"@xyo-network/module-factory-locator": "~5.2.
|
|
65
|
-
"@xyo-network/module-model": "~5.2.
|
|
66
|
-
"@xyo-network/node-model": "~5.2.
|
|
67
|
-
"@xyo-network/payload-builder": "~5.2.
|
|
68
|
-
"@xyo-network/payload-model": "~5.2.
|
|
69
|
-
"@xyo-network/wallet-model": "~5.2.
|
|
70
|
-
"@xyo-network/xl1-
|
|
52
|
+
"@opentelemetry/instrumentation": "~0.211.0",
|
|
53
|
+
"@opentelemetry/instrumentation-express": "~0.59.0",
|
|
54
|
+
"@opentelemetry/instrumentation-http": "~0.211.0",
|
|
55
|
+
"@xylabs/express": "~5.0.64",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.64",
|
|
57
|
+
"@xyo-network/archivist-model": "~5.2.25",
|
|
58
|
+
"@xyo-network/boundwitness-model": "~5.2.25",
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.18.2",
|
|
60
|
+
"@xyo-network/chain-telemetry": "~1.18.2",
|
|
61
|
+
"@xyo-network/chain-utils": "~1.18.2",
|
|
62
|
+
"@xyo-network/manifest-model": "~5.2.25",
|
|
63
|
+
"@xyo-network/module-abstract": "~5.2.25",
|
|
64
|
+
"@xyo-network/module-factory-locator": "~5.2.25",
|
|
65
|
+
"@xyo-network/module-model": "~5.2.25",
|
|
66
|
+
"@xyo-network/node-model": "~5.2.25",
|
|
67
|
+
"@xyo-network/payload-builder": "~5.2.25",
|
|
68
|
+
"@xyo-network/payload-model": "~5.2.25",
|
|
69
|
+
"@xyo-network/wallet-model": "~5.2.25",
|
|
70
|
+
"@xyo-network/xl1-sdk": "~1.19.4",
|
|
71
71
|
"compression": "~1.8.1",
|
|
72
|
-
"cors": "~2.8.
|
|
72
|
+
"cors": "~2.8.6",
|
|
73
73
|
"express": "~5.2.1",
|
|
74
74
|
"http-status-codes": "~2.3.0"
|
|
75
75
|
},
|
|
@@ -77,33 +77,34 @@
|
|
|
77
77
|
"@types/compression": "~1.8.1",
|
|
78
78
|
"@types/cors": "~2.8.19",
|
|
79
79
|
"@types/express": "5.0.6",
|
|
80
|
-
"@types/express-serve-static-core": "~5.1.
|
|
81
|
-
"@types/node": "~25.0.
|
|
82
|
-
"@xylabs/mongo": "~5.0.
|
|
83
|
-
"@xylabs/sdk-js": "~5.0.
|
|
84
|
-
"@xylabs/ts-scripts-yarn3": "~7.2
|
|
85
|
-
"@xylabs/tsconfig": "~7.2
|
|
86
|
-
"@xyo-network/account": "~5.2.
|
|
87
|
-
"@xyo-network/account-model": "~5.2.
|
|
88
|
-
"@xyo-network/archivist-abstract": "~5.2.
|
|
89
|
-
"@xyo-network/archivist-memory": "~5.2.
|
|
90
|
-
"@xyo-network/archivist-mongodb": "~5.2.
|
|
91
|
-
"@xyo-network/archivist-view": "~5.2.
|
|
80
|
+
"@types/express-serve-static-core": "~5.1.1",
|
|
81
|
+
"@types/node": "~25.0.10",
|
|
82
|
+
"@xylabs/mongo": "~5.0.64",
|
|
83
|
+
"@xylabs/sdk-js": "~5.0.64",
|
|
84
|
+
"@xylabs/ts-scripts-yarn3": "~7.3.2",
|
|
85
|
+
"@xylabs/tsconfig": "~7.3.2",
|
|
86
|
+
"@xyo-network/account": "~5.2.25",
|
|
87
|
+
"@xyo-network/account-model": "~5.2.25",
|
|
88
|
+
"@xyo-network/archivist-abstract": "~5.2.25",
|
|
89
|
+
"@xyo-network/archivist-memory": "~5.2.25",
|
|
90
|
+
"@xyo-network/archivist-mongodb": "~5.2.25",
|
|
91
|
+
"@xyo-network/archivist-view": "~5.2.25",
|
|
92
92
|
"@xyo-network/bios-model": "~7.2.0",
|
|
93
|
-
"@xyo-network/boundwitness-builder": "~5.2.
|
|
94
|
-
"@xyo-network/manifest-wrapper": "~5.2.
|
|
95
|
-
"@xyo-network/module-abstract-mongodb": "~5.2.
|
|
96
|
-
"@xyo-network/module-model-mongodb": "~5.2.
|
|
97
|
-
"@xyo-network/node-memory": "~5.2.
|
|
98
|
-
"@xyo-network/sentinel-memory": "~5.2.
|
|
99
|
-
"@xyo-network/wallet": "~5.2.
|
|
100
|
-
"@xyo-network/xl1-
|
|
93
|
+
"@xyo-network/boundwitness-builder": "~5.2.25",
|
|
94
|
+
"@xyo-network/manifest-wrapper": "~5.2.25",
|
|
95
|
+
"@xyo-network/module-abstract-mongodb": "~5.2.25",
|
|
96
|
+
"@xyo-network/module-model-mongodb": "~5.2.25",
|
|
97
|
+
"@xyo-network/node-memory": "~5.2.25",
|
|
98
|
+
"@xyo-network/sentinel-memory": "~5.2.25",
|
|
99
|
+
"@xyo-network/wallet": "~5.2.25",
|
|
100
|
+
"@xyo-network/xl1-sdk": "~1.19.4",
|
|
101
|
+
"async-mutex": "~0.5.0",
|
|
101
102
|
"dotenv": "~17.2.3",
|
|
102
103
|
"eslint": "^9.39.2",
|
|
103
104
|
"nodemon": "~3.1.11",
|
|
104
105
|
"tslib": "~2.8.1",
|
|
105
106
|
"typescript": "~5.9.3",
|
|
106
|
-
"vitest": "~4.0.
|
|
107
|
+
"vitest": "~4.0.18",
|
|
107
108
|
"vitest-mock-extended": "~3.1.0"
|
|
108
109
|
},
|
|
109
110
|
"engines": {
|
|
@@ -113,4 +114,4 @@
|
|
|
113
114
|
"publishConfig": {
|
|
114
115
|
"access": "restricted"
|
|
115
116
|
}
|
|
116
|
-
}
|
|
117
|
+
}
|
package/src/MempoolContext.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
|
3
3
|
import type {
|
|
4
4
|
BalancesStepSummary, CreatableProviderContext, MapType,
|
|
5
5
|
TransfersStepSummary,
|
|
6
|
-
} from '@xyo-network/xl1-
|
|
6
|
+
} from '@xyo-network/xl1-sdk'
|
|
7
7
|
|
|
8
8
|
export interface MempoolContext extends CreatableProviderContext {
|
|
9
9
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertEx,
|
|
3
|
+
creatable,
|
|
4
|
+
} from '@xylabs/sdk-js'
|
|
5
|
+
import { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
6
|
+
import {
|
|
7
|
+
Actor, ActorParams,
|
|
8
|
+
buildJsonRpcProviderLocator,
|
|
9
|
+
Config,
|
|
10
|
+
getDefaultConfig,
|
|
11
|
+
HttpRpcTransport, RpcSchemaMap, TransportFactory,
|
|
12
|
+
} from '@xyo-network/xl1-sdk'
|
|
13
|
+
import { Mutex } from 'async-mutex'
|
|
14
|
+
|
|
15
|
+
export type MempoolActorParams = ActorParams<{
|
|
16
|
+
pendingBlocksArchivist: ArchivistInstance
|
|
17
|
+
pendingTransactionsArchivist: ArchivistInstance
|
|
18
|
+
}>
|
|
19
|
+
|
|
20
|
+
@creatable()
|
|
21
|
+
export class MempoolActor extends Actor<MempoolActorParams> {
|
|
22
|
+
private _blockTimerId: ReturnType<typeof setInterval> | null = null
|
|
23
|
+
private _blockTimerMutex = new Mutex()
|
|
24
|
+
|
|
25
|
+
private _transactionTimerId: ReturnType<typeof setInterval> | null = null
|
|
26
|
+
private _transactionTimerMutex = new Mutex()
|
|
27
|
+
|
|
28
|
+
protected get pendingBlocksArchivist() {
|
|
29
|
+
return this.params.pendingBlocksArchivist
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected get pendingTransactionsArchivist() {
|
|
33
|
+
return this.params.pendingTransactionsArchivist
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static override async paramsHandler(params?: Partial<MempoolActorParams>) {
|
|
37
|
+
return {
|
|
38
|
+
...await super.paramsHandler(params),
|
|
39
|
+
pendingBlocksArchivist: assertEx(
|
|
40
|
+
params?.pendingBlocksArchivist,
|
|
41
|
+
() => 'pendingBlocksArchivist is required for MempoolActor',
|
|
42
|
+
),
|
|
43
|
+
pendingTransactionsArchivist: assertEx(
|
|
44
|
+
params?.pendingTransactionsArchivist,
|
|
45
|
+
() => 'pendingTransactionsArchivist is required for MempoolActor',
|
|
46
|
+
),
|
|
47
|
+
} satisfies MempoolActorParams
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
protected static override async initContext(
|
|
51
|
+
params: MempoolActorParams,
|
|
52
|
+
) {
|
|
53
|
+
const config: Config = params?.context?.config ?? getDefaultConfig()
|
|
54
|
+
const endpoint = assertEx(config.services.apiEndpoint, () => 'API endpoint is required in config.services.apiEndpoint')
|
|
55
|
+
|
|
56
|
+
const context = await super.initContext(params)
|
|
57
|
+
|
|
58
|
+
const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)
|
|
59
|
+
const locator = await buildJsonRpcProviderLocator({ context, transportFactory })
|
|
60
|
+
return locator.context
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override async createHandler() {
|
|
64
|
+
await super.createHandler()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
override async startHandler() {
|
|
68
|
+
await super.startHandler()
|
|
69
|
+
this.restartTransactionTimer()
|
|
70
|
+
this.restartBlockTimer()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override async stopHandler() {
|
|
74
|
+
await super.stopHandler()
|
|
75
|
+
this.restartTransactionTimer()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private async removeInvalidPendingBlocks() {}
|
|
79
|
+
|
|
80
|
+
private async removeInvalidPendingTransactions() {}
|
|
81
|
+
|
|
82
|
+
private restartBlockTimer() {
|
|
83
|
+
this.stopBlockTimer()
|
|
84
|
+
this._blockTimerId = setInterval(() => {
|
|
85
|
+
if (this._blockTimerMutex.isLocked()) {
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
void this._blockTimerMutex.runExclusive(async () => {
|
|
89
|
+
await this.removeInvalidPendingBlocks()
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private restartTransactionTimer() {
|
|
95
|
+
this.stopTransactionTimer()
|
|
96
|
+
this._transactionTimerId = setInterval(() => {
|
|
97
|
+
if (this._transactionTimerMutex.isLocked()) {
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
void this._transactionTimerMutex.runExclusive(async () => {
|
|
101
|
+
await this.removeInvalidPendingTransactions()
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private stopBlockTimer() {
|
|
107
|
+
if (this._blockTimerId !== null) {
|
|
108
|
+
clearInterval(this._blockTimerId)
|
|
109
|
+
}
|
|
110
|
+
this._blockTimerId = null
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private stopTransactionTimer() {
|
|
114
|
+
if (this._transactionTimerId !== null) {
|
|
115
|
+
clearInterval(this._transactionTimerId)
|
|
116
|
+
}
|
|
117
|
+
this._transactionTimerId = null
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MempoolActor.ts'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
assertEx, hexFrom, isDefined, isHex,
|
|
3
3
|
} from '@xylabs/sdk-js'
|
|
4
|
-
import type { Config } from '@xyo-network/xl1-
|
|
4
|
+
import type { Config } from '@xyo-network/xl1-sdk'
|
|
5
5
|
|
|
6
6
|
export const canUseChainId = (config: Config): boolean => {
|
|
7
7
|
return isDefined(config.evm.chainId)
|
|
@@ -9,8 +9,8 @@ import { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-
|
|
|
9
9
|
import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
|
|
10
10
|
import type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'
|
|
11
11
|
import { MemorySentinel } from '@xyo-network/sentinel-memory'
|
|
12
|
-
import type { Config } from '@xyo-network/xl1-
|
|
13
|
-
import { hasMongoConfig } from '@xyo-network/xl1-
|
|
12
|
+
import type { Config } from '@xyo-network/xl1-sdk'
|
|
13
|
+
import { hasMongoConfig } from '@xyo-network/xl1-sdk'
|
|
14
14
|
|
|
15
15
|
export interface GetLocatorContext {
|
|
16
16
|
config: Config
|
package/src/manifest/getNode.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Logger } from '@xylabs/sdk-js'
|
|
2
2
|
import { ManifestWrapper } from '@xyo-network/manifest-wrapper'
|
|
3
3
|
import type { WalletInstance } from '@xyo-network/wallet-model'
|
|
4
|
-
import type { Config } from '@xyo-network/xl1-
|
|
4
|
+
import type { Config } from '@xyo-network/xl1-sdk'
|
|
5
5
|
|
|
6
6
|
import { getLocator } from './getLocator.ts'
|
|
7
7
|
import { NodeManifest } from './nodeManifest.ts'
|
package/src/server/app.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
-
customPoweredByHeader,
|
|
3
|
-
|
|
4
|
-
disableExpressDefaultPoweredByHeader,
|
|
5
|
-
getJsonBodyParser,
|
|
6
|
-
getJsonBodyParserOptions,
|
|
7
|
-
responseProfiler,
|
|
8
|
-
standardErrors,
|
|
9
|
-
standardResponses,
|
|
2
|
+
customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,
|
|
3
|
+
standardErrors, standardResponses,
|
|
10
4
|
} from '@xylabs/express'
|
|
11
5
|
import compression from 'compression'
|
|
12
6
|
import cors from 'cors'
|
|
@@ -30,6 +24,7 @@ export const getApp = (context: MempoolContext): Express => {
|
|
|
30
24
|
app.use(customPoweredByHeader)
|
|
31
25
|
disableCaseSensitiveRouting(app)
|
|
32
26
|
app.context = context
|
|
27
|
+
app.node = context.node
|
|
33
28
|
addRoutes(app)
|
|
34
29
|
app.use(standardErrors)
|
|
35
30
|
return app
|
package/src/server/model.ts
CHANGED
package/src/server/server.ts
CHANGED
|
@@ -3,9 +3,8 @@ import { assertEx } from '@xylabs/sdk-js'
|
|
|
3
3
|
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
4
4
|
import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
|
|
5
5
|
import {
|
|
6
|
-
buildTelemetryConfig,
|
|
7
|
-
|
|
8
|
-
initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor,
|
|
6
|
+
buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initMempoolWallet, initServerNode, initStatusReporter, initTransferSummaryMap,
|
|
7
|
+
ValidatorActor,
|
|
9
8
|
} from '@xyo-network/chain-orchestration'
|
|
10
9
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
11
10
|
import { startupSpanAsync } from '@xyo-network/chain-utils'
|
|
@@ -13,13 +12,11 @@ import type { NodeInstance } from '@xyo-network/node-model'
|
|
|
13
12
|
import type {
|
|
14
13
|
BlockViewer,
|
|
15
14
|
Config, CreatableProviderContext, CreatableProviderParams,
|
|
16
|
-
} from '@xyo-network/xl1-
|
|
15
|
+
} from '@xyo-network/xl1-sdk'
|
|
17
16
|
import {
|
|
18
|
-
BlockViewerMoniker,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
SimpleStakeEventsViewer, SimpleStakeViewer,
|
|
22
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
17
|
+
BlockViewerMoniker, DefaultMetricsScrapePorts, findMostRecentBlock, ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
|
|
18
|
+
SimpleStakeEventsViewer, SimpleStakeViewer, SimpleWindowedBlockViewer,
|
|
19
|
+
} from '@xyo-network/xl1-sdk'
|
|
23
20
|
|
|
24
21
|
import type { MempoolContext } from '../MempoolContext.ts'
|
|
25
22
|
import { getApp } from './app.ts'
|
|
@@ -40,17 +37,21 @@ const getProviderFactoryLocator = (
|
|
|
40
37
|
pendingBlocksArchivist: ArchivistInstance,
|
|
41
38
|
) => {
|
|
42
39
|
const locator = new ProviderFactoryLocator(context)
|
|
43
|
-
locator.register(SimpleMempoolViewer.factory({
|
|
40
|
+
locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
|
|
44
41
|
pendingTransactionsArchivist,
|
|
45
42
|
pendingBlocksArchivist,
|
|
46
43
|
} as Partial<CreatableProviderParams>))
|
|
47
|
-
locator.register(SimpleMempoolRunner.factory({
|
|
44
|
+
locator.register(SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {
|
|
48
45
|
pendingTransactionsArchivist,
|
|
49
46
|
pendingBlocksArchivist,
|
|
50
47
|
} as Partial<CreatableProviderParams>))
|
|
51
|
-
locator.register(SimpleBlockViewer.factory({ finalizedArchivist }
|
|
52
|
-
locator.register(
|
|
53
|
-
|
|
48
|
+
locator.register(SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }))
|
|
49
|
+
locator.register(SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(
|
|
50
|
+
SimpleWindowedBlockViewer.dependencies,
|
|
51
|
+
{ maxWindowSize: 10_000, syncInterval: 10_000 },
|
|
52
|
+
))
|
|
53
|
+
locator.register(SimpleStakeViewer.factory(SimpleStakeViewer.dependencies))
|
|
54
|
+
locator.register(SimpleStakeEventsViewer.factory(SimpleStakeEventsViewer.dependencies))
|
|
54
55
|
return locator
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -66,7 +67,7 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
66
67
|
config, logger, statusReporter,
|
|
67
68
|
}))
|
|
68
69
|
|
|
69
|
-
const telemetryConfig = buildTelemetryConfig(config, 'xl1-
|
|
70
|
+
const telemetryConfig = buildTelemetryConfig(config, 'xl1-mempool', '1.0.0', DefaultMetricsScrapePorts.mempool)
|
|
70
71
|
|
|
71
72
|
const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
|
|
72
73
|
|
|
@@ -78,9 +79,10 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
78
79
|
meterProvider,
|
|
79
80
|
traceProvider,
|
|
80
81
|
singletons: {},
|
|
82
|
+
caches: {},
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
const wallet = await
|
|
85
|
+
const wallet = await initMempoolWallet(initContext)
|
|
84
86
|
|
|
85
87
|
const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
|
|
86
88
|
const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
|
|
@@ -88,11 +90,7 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
88
90
|
const {
|
|
89
91
|
node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
|
|
90
92
|
} = await initServerNode({
|
|
91
|
-
...initContext,
|
|
92
|
-
wallet,
|
|
93
|
-
node: providedNode,
|
|
94
|
-
transfersSummaryMap,
|
|
95
|
-
balancesSummaryMap,
|
|
93
|
+
...initContext, wallet, node: providedNode, transfersSummaryMap, balancesSummaryMap,
|
|
96
94
|
})
|
|
97
95
|
|
|
98
96
|
assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No head found')
|
|
@@ -119,7 +117,7 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
119
117
|
const blk = await blockViewer.currentBlock()
|
|
120
118
|
assertEx(blk, () => 'No blocks found after initialization')
|
|
121
119
|
|
|
122
|
-
console.info(`[
|
|
120
|
+
console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
|
|
123
121
|
|
|
124
122
|
const actor = await ValidatorActor.create({
|
|
125
123
|
id: 'validator-mempool-server',
|
|
@@ -131,7 +129,7 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
131
129
|
await actor.start()
|
|
132
130
|
|
|
133
131
|
const app = getApp(mempoolContext)
|
|
134
|
-
const server = app.listen(port, hostname, () => logger?.log(`[
|
|
132
|
+
const server = app.listen(port, hostname, () => logger?.log(`[Mempool] Server listening at http://${hostname}:${port}`))
|
|
135
133
|
server.setTimeout(20_000)
|
|
136
134
|
return server
|
|
137
135
|
}
|