@xyo-network/chain-mempool 1.17.6 → 1.18.0-rc.1
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 +9 -0
- package/dist/node/MempoolContext.d.ts.map +1 -0
- package/dist/node/index.mjs +71 -265
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/app.d.ts +2 -2
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/server.d.ts +2 -2
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +18 -18
- package/src/{server/ApiContext.ts → MempoolContext.ts} +2 -8
- package/src/global.d.ts +13 -0
- package/src/server/app.ts +3 -3
- package/src/server/server.ts +109 -57
- package/dist/node/server/ApiContext.d.ts +0 -14
- package/dist/node/server/ApiContext.d.ts.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
|
+
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
+
import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
|
+
export interface MempoolContext extends CreatableProviderContext {
|
|
5
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
6
|
+
node: NodeInstance;
|
|
7
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=MempoolContext.d.ts.map
|
|
@@ -0,0 +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,+BAA+B,CAAA;AAEtC,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"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -277,7 +277,7 @@ var addRoutes = /* @__PURE__ */ __name((app) => {
|
|
|
277
277
|
}, "addRoutes");
|
|
278
278
|
|
|
279
279
|
// src/server/app.ts
|
|
280
|
-
var getApp = /* @__PURE__ */ __name((
|
|
280
|
+
var getApp = /* @__PURE__ */ __name((context) => {
|
|
281
281
|
addInstrumentation();
|
|
282
282
|
const app = express2();
|
|
283
283
|
app.set("etag", false);
|
|
@@ -291,267 +291,40 @@ var getApp = /* @__PURE__ */ __name((node) => {
|
|
|
291
291
|
disableExpressDefaultPoweredByHeader(app);
|
|
292
292
|
app.use(customPoweredByHeader);
|
|
293
293
|
disableCaseSensitiveRouting(app);
|
|
294
|
-
app.
|
|
294
|
+
app.context = context;
|
|
295
295
|
addRoutes(app);
|
|
296
296
|
app.use(standardErrors);
|
|
297
297
|
return app;
|
|
298
298
|
}, "getApp");
|
|
299
299
|
|
|
300
300
|
// src/server/server.ts
|
|
301
|
-
import { assertEx as assertEx2
|
|
302
|
-
import {
|
|
303
|
-
import { initHealthEndpoints, initStatusReporter, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
304
|
-
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
305
|
-
import { HDWallet } from "@xyo-network/wallet";
|
|
306
|
-
|
|
307
|
-
// src/manifest/getLocator.ts
|
|
308
|
-
import { isDefined as isDefined3 } from "@xylabs/sdk-js";
|
|
309
|
-
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
310
|
-
import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
|
|
311
|
-
import { ViewArchivist } from "@xyo-network/archivist-view";
|
|
301
|
+
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
302
|
+
import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
312
303
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
313
|
-
import {
|
|
314
|
-
import {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
const { traceProvider, meterProvider } = await initTelemetry({
|
|
322
|
-
attributes: {
|
|
323
|
-
serviceName: "xl1-mempool",
|
|
324
|
-
serviceVersion: "1.0.0"
|
|
325
|
-
},
|
|
326
|
-
otlpEndpoint,
|
|
327
|
-
metricsConfig: {
|
|
328
|
-
endpoint,
|
|
329
|
-
port
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
if (isDefined3(logger)) AbstractModule.defaultLogger = logger;
|
|
333
|
-
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
|
|
334
|
-
const locator = new ModuleFactoryLocator();
|
|
335
|
-
const mongoConfig = config.storage?.mongo;
|
|
336
|
-
if (hasMongoConfig(mongoConfig)) {
|
|
337
|
-
const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
|
|
338
|
-
const payloadSdkConfig = {
|
|
339
|
-
dbConnectionString,
|
|
340
|
-
dbDomain,
|
|
341
|
-
dbName,
|
|
342
|
-
dbPassword,
|
|
343
|
-
dbUserName
|
|
344
|
-
};
|
|
345
|
-
const params = {
|
|
346
|
-
meterProvider,
|
|
347
|
-
payloadSdkConfig,
|
|
348
|
-
statusReporter,
|
|
349
|
-
traceProvider
|
|
350
|
-
};
|
|
351
|
-
locator.register(MongoDBArchivistV2.factory(params), void 0, true);
|
|
352
|
-
}
|
|
353
|
-
locator.register(MemoryArchivist.factory({
|
|
354
|
-
traceProvider,
|
|
355
|
-
meterProvider,
|
|
356
|
-
statusReporter
|
|
304
|
+
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
305
|
+
import { BlockViewerMoniker, findMostRecentBlock, ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer, SimpleStakeEventsViewer, SimpleStakeViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
306
|
+
var hostname = "::";
|
|
307
|
+
var getProviderFactoryLocator = /* @__PURE__ */ __name((context, finalizedArchivist, pendingTransactionsArchivist, pendingBlocksArchivist) => {
|
|
308
|
+
const locator = new ProviderFactoryLocator(context);
|
|
309
|
+
locator.register(SimpleMempoolViewer.factory({
|
|
310
|
+
pendingTransactionsArchivist,
|
|
311
|
+
pendingBlocksArchivist
|
|
357
312
|
}));
|
|
358
|
-
locator.register(
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
statusReporter
|
|
313
|
+
locator.register(SimpleMempoolRunner.factory({
|
|
314
|
+
pendingTransactionsArchivist,
|
|
315
|
+
pendingBlocksArchivist
|
|
362
316
|
}));
|
|
363
|
-
locator.register(
|
|
364
|
-
|
|
365
|
-
meterProvider,
|
|
366
|
-
statusReporter
|
|
317
|
+
locator.register(SimpleBlockViewer.factory({
|
|
318
|
+
finalizedArchivist
|
|
367
319
|
}));
|
|
320
|
+
locator.register(SimpleStakeViewer.factory());
|
|
321
|
+
locator.register(SimpleStakeEventsViewer.factory());
|
|
368
322
|
return locator;
|
|
369
|
-
}, "
|
|
370
|
-
|
|
371
|
-
// src/manifest/getNode.ts
|
|
372
|
-
import { ManifestWrapper } from "@xyo-network/manifest-wrapper";
|
|
373
|
-
|
|
374
|
-
// src/manifest/node.json
|
|
375
|
-
var node_default = {
|
|
376
|
-
$schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
|
|
377
|
-
nodes: [
|
|
378
|
-
{
|
|
379
|
-
config: {
|
|
380
|
-
accountPath: "44'/60'/1",
|
|
381
|
-
name: "XYOChain",
|
|
382
|
-
schema: "network.xyo.node.config"
|
|
383
|
-
},
|
|
384
|
-
modules: {
|
|
385
|
-
private: [],
|
|
386
|
-
public: []
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
],
|
|
390
|
-
schema: "network.xyo.manifest"
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
// src/manifest/nodeManifest.ts
|
|
394
|
-
var NodeManifest = node_default;
|
|
395
|
-
|
|
396
|
-
// src/manifest/private/index.ts
|
|
397
|
-
var PrivateChildManifests = [];
|
|
398
|
-
|
|
399
|
-
// src/manifest/public/Chain.json
|
|
400
|
-
var Chain_default = {
|
|
401
|
-
$schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
|
|
402
|
-
nodes: [
|
|
403
|
-
{
|
|
404
|
-
config: {
|
|
405
|
-
accountPath: "1",
|
|
406
|
-
name: "Chain",
|
|
407
|
-
schema: "network.xyo.node.config"
|
|
408
|
-
},
|
|
409
|
-
modules: {
|
|
410
|
-
private: [
|
|
411
|
-
{
|
|
412
|
-
config: {
|
|
413
|
-
accountPath: "1/1'/1'",
|
|
414
|
-
name: "Validated",
|
|
415
|
-
getCache: {
|
|
416
|
-
enabled: true,
|
|
417
|
-
maxEntries: 5e3
|
|
418
|
-
},
|
|
419
|
-
payloadSdkConfig: {
|
|
420
|
-
collection: "chain_validated"
|
|
421
|
-
},
|
|
422
|
-
schema: "network.xyo.archivist.config"
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
],
|
|
426
|
-
public: [
|
|
427
|
-
{
|
|
428
|
-
config: {
|
|
429
|
-
accountPath: "1/1/1",
|
|
430
|
-
name: "Submissions",
|
|
431
|
-
getCache: {
|
|
432
|
-
enabled: true,
|
|
433
|
-
maxEntries: 5e3
|
|
434
|
-
},
|
|
435
|
-
payloadSdkConfig: {
|
|
436
|
-
collection: "chain_submissions"
|
|
437
|
-
},
|
|
438
|
-
schema: "network.xyo.archivist.config"
|
|
439
|
-
}
|
|
440
|
-
},
|
|
441
|
-
{
|
|
442
|
-
config: {
|
|
443
|
-
accountPath: "1/1/2",
|
|
444
|
-
name: "Finalized",
|
|
445
|
-
allowedQueries: [
|
|
446
|
-
"network.xyo.query.archivist.get",
|
|
447
|
-
"network.xyo.query.archivist.next"
|
|
448
|
-
],
|
|
449
|
-
getCache: {
|
|
450
|
-
enabled: true,
|
|
451
|
-
maxEntries: 5e4
|
|
452
|
-
},
|
|
453
|
-
originArchivist: "Validated",
|
|
454
|
-
schema: "network.xyo.archivist.view.config"
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
]
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
],
|
|
461
|
-
schema: "network.xyo.manifest"
|
|
462
|
-
};
|
|
463
|
-
|
|
464
|
-
// src/manifest/public/Pending.json
|
|
465
|
-
var Pending_default = {
|
|
466
|
-
$schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
|
|
467
|
-
nodes: [
|
|
468
|
-
{
|
|
469
|
-
config: {
|
|
470
|
-
accountPath: "2",
|
|
471
|
-
name: "Pending",
|
|
472
|
-
schema: "network.xyo.node.config"
|
|
473
|
-
},
|
|
474
|
-
modules: {
|
|
475
|
-
private: [],
|
|
476
|
-
public: [
|
|
477
|
-
{
|
|
478
|
-
config: {
|
|
479
|
-
accountPath: "2/1/1",
|
|
480
|
-
name: "PendingTransactions",
|
|
481
|
-
getCache: {
|
|
482
|
-
enabled: true,
|
|
483
|
-
maxEntries: 5e3
|
|
484
|
-
},
|
|
485
|
-
labels: {
|
|
486
|
-
"network.xyo.storage.class": "mongodb"
|
|
487
|
-
},
|
|
488
|
-
payloadSdkConfig: {
|
|
489
|
-
collection: "pending_bundles"
|
|
490
|
-
},
|
|
491
|
-
schema: "network.xyo.archivist.config"
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
]
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
],
|
|
498
|
-
schema: "network.xyo.manifest"
|
|
499
|
-
};
|
|
500
|
-
|
|
501
|
-
// src/manifest/public/index.ts
|
|
502
|
-
var ChainNodeManifest = Chain_default;
|
|
503
|
-
var PendingNodeManifest = Pending_default;
|
|
504
|
-
var PublicChildManifests = [
|
|
505
|
-
...ChainNodeManifest.nodes,
|
|
506
|
-
...PendingNodeManifest.nodes
|
|
507
|
-
];
|
|
508
|
-
|
|
509
|
-
// src/manifest/getNode.ts
|
|
510
|
-
var getNode = /* @__PURE__ */ __name(async (context) => {
|
|
511
|
-
const { wallet } = context;
|
|
512
|
-
const locator = await getLocator(context);
|
|
513
|
-
const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests);
|
|
514
|
-
const [node, ...childNodes] = await wrapper.loadNodes();
|
|
515
|
-
if (childNodes?.length > 0) {
|
|
516
|
-
await Promise.all(childNodes.map((childNode) => node.register(childNode)));
|
|
517
|
-
await Promise.all(childNodes.map((childNode) => node.attach(childNode.address, true)));
|
|
518
|
-
}
|
|
519
|
-
return node;
|
|
520
|
-
}, "getNode");
|
|
521
|
-
|
|
522
|
-
// src/server/server.ts
|
|
523
|
-
var hostname = "::";
|
|
524
|
-
var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
|
|
525
|
-
const storedSeedPhrase = await bios.seedPhraseStore.get("os");
|
|
526
|
-
logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`);
|
|
527
|
-
const { mnemonic } = config.api;
|
|
528
|
-
if (isString(storedSeedPhrase) && isString(mnemonic)) {
|
|
529
|
-
logger?.warn("[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.");
|
|
530
|
-
await bios.seedPhraseStore.set("os", mnemonic);
|
|
531
|
-
} else {
|
|
532
|
-
let seedPhrase;
|
|
533
|
-
if (isString(mnemonic)) {
|
|
534
|
-
seedPhrase = mnemonic;
|
|
535
|
-
} else {
|
|
536
|
-
seedPhrase = HDWallet.generateMnemonic();
|
|
537
|
-
logger?.log("[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.");
|
|
538
|
-
logger?.log(`[API] Mnemonic: ${seedPhrase}`);
|
|
539
|
-
}
|
|
540
|
-
await bios.seedPhraseStore.set("os", seedPhrase);
|
|
541
|
-
}
|
|
542
|
-
return assertEx2(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
|
|
543
|
-
}, "getSeedPhrase");
|
|
323
|
+
}, "getProviderFactoryLocator");
|
|
544
324
|
var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
545
|
-
const { config,
|
|
546
|
-
const {
|
|
547
|
-
const
|
|
548
|
-
const seedPhrase = isDefined4(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
|
|
549
|
-
const wallet = await HDWallet.fromPhrase(seedPhrase);
|
|
550
|
-
const nodeContext = {
|
|
551
|
-
wallet,
|
|
552
|
-
logger,
|
|
553
|
-
config
|
|
554
|
-
};
|
|
325
|
+
const { config, node: providedNode } = context;
|
|
326
|
+
const { port } = context.config.api;
|
|
327
|
+
const logger = assertEx2(context.logger, () => "Logger is required to init server");
|
|
555
328
|
const statusReporter = initStatusReporter({
|
|
556
329
|
logger
|
|
557
330
|
});
|
|
@@ -560,24 +333,57 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
560
333
|
logger,
|
|
561
334
|
statusReporter
|
|
562
335
|
}));
|
|
563
|
-
const
|
|
564
|
-
const
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
const app = getApp(resolvedNode);
|
|
568
|
-
const actor = await ValidatorActor.create({
|
|
336
|
+
const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
|
|
337
|
+
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
338
|
+
const initContext = {
|
|
339
|
+
_id: "init-context",
|
|
569
340
|
config,
|
|
341
|
+
logger,
|
|
342
|
+
statusReporter,
|
|
343
|
+
meterProvider,
|
|
344
|
+
traceProvider,
|
|
345
|
+
singletons: {}
|
|
346
|
+
};
|
|
347
|
+
const wallet = await initServerWallet(initContext);
|
|
348
|
+
const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
349
|
+
const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
350
|
+
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
351
|
+
...initContext,
|
|
352
|
+
wallet,
|
|
353
|
+
node: providedNode,
|
|
354
|
+
transfersSummaryMap,
|
|
355
|
+
balancesSummaryMap
|
|
356
|
+
});
|
|
357
|
+
assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No head found");
|
|
358
|
+
const mods = await node.resolve("*");
|
|
359
|
+
await Promise.all(mods.map((mod) => {
|
|
360
|
+
return mod.start?.() ?? (() => true);
|
|
361
|
+
}));
|
|
362
|
+
const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist);
|
|
363
|
+
const mempoolContext = {
|
|
364
|
+
...initContext,
|
|
365
|
+
node,
|
|
366
|
+
transfersSummaryMap,
|
|
367
|
+
balancesSummaryMap,
|
|
368
|
+
...locator.context,
|
|
369
|
+
_id: "mempool-context"
|
|
370
|
+
};
|
|
371
|
+
const blockViewer = await locator.getInstance(BlockViewerMoniker);
|
|
372
|
+
assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
373
|
+
const blk = await blockViewer.currentBlock();
|
|
374
|
+
assertEx2(blk, () => "No blocks found after initialization");
|
|
375
|
+
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
376
|
+
const actor = await ValidatorActor.create({
|
|
570
377
|
id: "validator-mempool-server",
|
|
571
|
-
account: wallet
|
|
378
|
+
account: wallet,
|
|
379
|
+
context: locator.context,
|
|
380
|
+
finalizedArchivist: writableChainArchivist
|
|
572
381
|
});
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
} finally {
|
|
579
|
-
await actor.stop();
|
|
580
|
-
}
|
|
382
|
+
await actor.start();
|
|
383
|
+
const app = getApp(mempoolContext);
|
|
384
|
+
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
385
|
+
server.setTimeout(2e4);
|
|
386
|
+
return server;
|
|
581
387
|
}, "getServer");
|
|
582
388
|
export {
|
|
583
389
|
getApp,
|
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","../../src/manifest/getLocator.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/Chain.json","../../src/manifest/public/Pending.json","../../src/manifest/public/index.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 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 = (node: NodeInstance): 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.node = 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 {\n assertEx, isDefined, isString,\n} from '@xylabs/sdk-js'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport {\n initHealthEndpoints, initStatusReporter, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[API] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const {\n config, logger, node,\n } = context\n const { mnemonic, port } = context.config.mempool\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const resolvedNode: NodeInstance = node ?? await getNode(nodeContext)\n const mods = await resolvedNode.resolve('*')\n const startResults = await Promise.all(mods.map(mod => mod.start?.() ?? true))\n assertEx(startResults.every(r => r === true), () => '[Mempool] Not all modules started successfully')\n const app = getApp(resolvedNode)\n const actor = await ValidatorActor.create({\n config,\n id: 'validator-mempool-server',\n account: wallet,\n })\n try {\n await actor.start()\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 } finally {\n await actor.stop()\n }\n}\n","import { type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport type { Logger } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { hasMongoConfig } from '@xyo-network/xl1-protocol-sdk'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { path: endpoint = '/metrics', port: port = 9466 } = config.telemetry?.metrics?.scrape ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-mempool',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: { endpoint, port },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n return locator\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOChain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"1\",\n \"name\": \"Chain\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"name\": \"Validated\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_validated\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"Submissions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"payloadSdkConfig\": {\n \"collection\": \"chain_submissions\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n },\n {\n \"config\": {\n \"accountPath\": \"1/1/2\",\n \"name\": \"Finalized\",\n \"allowedQueries\": [\n \"network.xyo.query.archivist.get\",\n \"network.xyo.query.archivist.next\"\n ],\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 50000\n },\n \"originArchivist\": \"Validated\",\n \"schema\": \"network.xyo.archivist.view.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"Pending\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"2/1/1\",\n \"name\": \"PendingTransactions\",\n \"getCache\": {\n \"enabled\": true,\n \"maxEntries\": 5000\n },\n \"labels\": {\n \"network.xyo.storage.class\": \"mongodb\"\n },\n \"payloadSdkConfig\": {\n \"collection\": \"pending_bundles\"\n },\n \"schema\": \"network.xyo.archivist.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport Chain from './Chain.json' with { type: 'json' }\nimport Pending from './Pending.json' with { type: 'json' }\n\n/**\n * Chain Node Manifest\n */\nexport const ChainNodeManifest = Chain as PackageManifestPayload\n/**\n * Pending Node Manifest\n */\nexport const PendingNodeManifest = Pending as PackageManifestPayload\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...ChainNodeManifest.nodes,\n ...PendingNodeManifest.nodes,\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","node","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","initHealthEndpoints","initStatusReporter","ValidatorActor","startupSpanAsync","HDWallet","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","hasMongoConfig","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","ManifestWrapper","NodeManifest","node","PrivateChildManifests","ChainNodeManifest","Chain","PendingNodeManifest","Pending","PublicChildManifests","nodes","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","node","port","mempool","boot","isDefined","wallet","fromPhrase","nodeContext","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","resolvedNode","getNode","mods","resolve","startResults","Promise","all","map","mod","start","every","r","app","getApp","actor","ValidatorActor","create","id","account","server","listen","setTimeout","stop"]}
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
1
|
import type { Express } from 'express';
|
|
3
|
-
|
|
2
|
+
import type { MempoolContext } from '../MempoolContext.ts';
|
|
3
|
+
export declare const getApp: (context: MempoolContext) => Express;
|
|
4
4
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAI1D,eAAO,MAAM,MAAM,GAAI,SAAS,cAAc,KAAG,OAgBhD,CAAA"}
|
|
@@ -3,9 +3,9 @@ import type { NodeInstance } from '@xyo-network/node-model';
|
|
|
3
3
|
import type { Config } from '@xyo-network/xl1-protocol-sdk';
|
|
4
4
|
interface GetServerContext {
|
|
5
5
|
config: Config;
|
|
6
|
-
logger
|
|
6
|
+
logger?: Logger;
|
|
7
7
|
node?: NodeInstance;
|
|
8
8
|
}
|
|
9
|
-
export declare const getServer: (context: GetServerContext) => Promise<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>>;
|
|
9
|
+
export declare const getServer: (context: GetServerContext) => Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -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;AAW5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAEV,MAAM,EACP,MAAM,+BAA+B,CAAA;AActC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAuBD,eAAO,MAAM,SAAS,GAAU,SAAS,gBAAgB,+HAgFxD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-mempool",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0-rc.1",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -54,27 +54,20 @@
|
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
55
55
|
"@xylabs/express": "~5.0.51",
|
|
56
56
|
"@xylabs/sdk-js": "~5.0.51",
|
|
57
|
-
"@xyo-network/archivist-memory": "~5.2.17",
|
|
58
57
|
"@xyo-network/archivist-model": "~5.2.17",
|
|
59
|
-
"@xyo-network/archivist-mongodb": "~5.2.17",
|
|
60
|
-
"@xyo-network/archivist-view": "~5.2.17",
|
|
61
|
-
"@xyo-network/bios": "~7.2.0",
|
|
62
58
|
"@xyo-network/boundwitness-model": "~5.2.17",
|
|
63
|
-
"@xyo-network/chain-orchestration": "
|
|
64
|
-
"@xyo-network/chain-telemetry": "
|
|
65
|
-
"@xyo-network/chain-utils": "
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.18.0-rc.1",
|
|
60
|
+
"@xyo-network/chain-telemetry": "~1.18.0-rc.1",
|
|
61
|
+
"@xyo-network/chain-utils": "~1.18.0-rc.1",
|
|
66
62
|
"@xyo-network/manifest-model": "~5.2.17",
|
|
67
|
-
"@xyo-network/manifest-wrapper": "~5.2.17",
|
|
68
63
|
"@xyo-network/module-abstract": "~5.2.17",
|
|
69
64
|
"@xyo-network/module-factory-locator": "~5.2.17",
|
|
70
65
|
"@xyo-network/module-model": "~5.2.17",
|
|
71
66
|
"@xyo-network/node-model": "~5.2.17",
|
|
72
67
|
"@xyo-network/payload-builder": "~5.2.17",
|
|
73
68
|
"@xyo-network/payload-model": "~5.2.17",
|
|
74
|
-
"@xyo-network/sentinel-memory": "~5.2.17",
|
|
75
|
-
"@xyo-network/wallet": "~5.2.17",
|
|
76
69
|
"@xyo-network/wallet-model": "~5.2.17",
|
|
77
|
-
"@xyo-network/xl1-protocol-sdk": "
|
|
70
|
+
"@xyo-network/xl1-protocol-sdk": "~1.18.0-rc.1",
|
|
78
71
|
"compression": "~1.8.1",
|
|
79
72
|
"cors": "~2.8.5",
|
|
80
73
|
"express": "~5.2.1",
|
|
@@ -85,22 +78,28 @@
|
|
|
85
78
|
"@types/cors": "~2.8.19",
|
|
86
79
|
"@types/express": "5.0.6",
|
|
87
80
|
"@types/express-serve-static-core": "~5.1.0",
|
|
88
|
-
"@types/node": "~
|
|
81
|
+
"@types/node": "~25.0.2",
|
|
89
82
|
"@xylabs/mongo": "~5.0.51",
|
|
90
83
|
"@xylabs/sdk-js": "~5.0.51",
|
|
91
|
-
"@xylabs/ts-scripts-yarn3": "~7.2.
|
|
92
|
-
"@xylabs/tsconfig": "~7.2.
|
|
84
|
+
"@xylabs/ts-scripts-yarn3": "~7.2.32",
|
|
85
|
+
"@xylabs/tsconfig": "~7.2.32",
|
|
93
86
|
"@xyo-network/account": "~5.2.17",
|
|
94
87
|
"@xyo-network/account-model": "~5.2.17",
|
|
95
88
|
"@xyo-network/archivist-abstract": "~5.2.17",
|
|
89
|
+
"@xyo-network/archivist-memory": "~5.2.17",
|
|
90
|
+
"@xyo-network/archivist-mongodb": "~5.2.17",
|
|
91
|
+
"@xyo-network/archivist-view": "~5.2.17",
|
|
96
92
|
"@xyo-network/bios-model": "~7.2.0",
|
|
97
93
|
"@xyo-network/boundwitness-builder": "~5.2.17",
|
|
94
|
+
"@xyo-network/manifest-wrapper": "~5.2.17",
|
|
98
95
|
"@xyo-network/module-abstract-mongodb": "~5.2.17",
|
|
99
96
|
"@xyo-network/module-model-mongodb": "~5.2.17",
|
|
100
97
|
"@xyo-network/node-memory": "~5.2.17",
|
|
98
|
+
"@xyo-network/sentinel-memory": "~5.2.17",
|
|
99
|
+
"@xyo-network/wallet": "~5.2.17",
|
|
101
100
|
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
102
101
|
"dotenv": "~17.2.3",
|
|
103
|
-
"eslint": "^9.39.
|
|
102
|
+
"eslint": "^9.39.2",
|
|
104
103
|
"nodemon": "~3.1.11",
|
|
105
104
|
"tslib": "~2.8.1",
|
|
106
105
|
"typescript": "~5.9.3",
|
|
@@ -113,5 +112,6 @@
|
|
|
113
112
|
"engineStrict": true,
|
|
114
113
|
"publishConfig": {
|
|
115
114
|
"access": "restricted"
|
|
116
|
-
}
|
|
117
|
-
|
|
115
|
+
},
|
|
116
|
+
"stableVersion": "1.17.7"
|
|
117
|
+
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
2
2
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
3
3
|
import type {
|
|
4
|
-
BalancesStepSummary,
|
|
4
|
+
BalancesStepSummary, CreatableProviderContext, MapType,
|
|
5
5
|
TransfersStepSummary,
|
|
6
6
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export interface MempoolContext extends AppContext {
|
|
8
|
+
export interface MempoolContext extends CreatableProviderContext {
|
|
11
9
|
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
|
|
12
|
-
config: Config
|
|
13
|
-
mempoolRunner: MempoolRunner
|
|
14
|
-
mempoolViewer: MempoolViewer
|
|
15
10
|
node: NodeInstance
|
|
16
|
-
stakedChainContext: StakedChainContextRead
|
|
17
11
|
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>
|
|
18
12
|
}
|
package/src/global.d.ts
ADDED
package/src/server/app.ts
CHANGED
|
@@ -8,16 +8,16 @@ import {
|
|
|
8
8
|
standardErrors,
|
|
9
9
|
standardResponses,
|
|
10
10
|
} from '@xylabs/express'
|
|
11
|
-
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
11
|
import compression from 'compression'
|
|
13
12
|
import cors from 'cors'
|
|
14
13
|
import type { Express } from 'express'
|
|
15
14
|
import express from 'express'
|
|
16
15
|
|
|
16
|
+
import type { MempoolContext } from '../MempoolContext.ts'
|
|
17
17
|
import { addInstrumentation } from './instrumentation.ts'
|
|
18
18
|
import { addRoutes } from './routes/index.ts'
|
|
19
19
|
|
|
20
|
-
export const getApp = (
|
|
20
|
+
export const getApp = (context: MempoolContext): Express => {
|
|
21
21
|
addInstrumentation()
|
|
22
22
|
const app = express()
|
|
23
23
|
app.set('etag', false)
|
|
@@ -29,7 +29,7 @@ export const getApp = (node: NodeInstance): Express => {
|
|
|
29
29
|
disableExpressDefaultPoweredByHeader(app)
|
|
30
30
|
app.use(customPoweredByHeader)
|
|
31
31
|
disableCaseSensitiveRouting(app)
|
|
32
|
-
app.
|
|
32
|
+
app.context = context
|
|
33
33
|
addRoutes(app)
|
|
34
34
|
app.use(standardErrors)
|
|
35
35
|
return app
|
package/src/server/server.ts
CHANGED
|
@@ -1,62 +1,64 @@
|
|
|
1
1
|
import type { Logger } from '@xylabs/sdk-js'
|
|
2
|
+
import { assertEx } from '@xylabs/sdk-js'
|
|
3
|
+
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
4
|
+
import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
|
|
2
5
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import type { BiosExternalInterface } from '@xyo-network/bios-model'
|
|
7
|
-
import {
|
|
8
|
-
initHealthEndpoints, initStatusReporter, ValidatorActor,
|
|
6
|
+
buildTelemetryConfig,
|
|
7
|
+
initBalanceSummaryMap,
|
|
8
|
+
initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor,
|
|
9
9
|
} from '@xyo-network/chain-orchestration'
|
|
10
|
+
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
10
11
|
import { startupSpanAsync } from '@xyo-network/chain-utils'
|
|
11
12
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
|
-
import {
|
|
13
|
-
|
|
13
|
+
import type {
|
|
14
|
+
BlockViewer,
|
|
15
|
+
Config, CreatableProviderContext, CreatableProviderParams,
|
|
16
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
17
|
+
import {
|
|
18
|
+
BlockViewerMoniker,
|
|
19
|
+
findMostRecentBlock,
|
|
20
|
+
ProviderFactoryLocator, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,
|
|
21
|
+
SimpleStakeEventsViewer, SimpleStakeViewer,
|
|
22
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
14
23
|
|
|
15
|
-
import {
|
|
24
|
+
import type { MempoolContext } from '../MempoolContext.ts'
|
|
16
25
|
import { getApp } from './app.ts'
|
|
17
26
|
|
|
18
27
|
const hostname = '::'
|
|
19
28
|
// const hostname = '0.0.0.0'
|
|
20
29
|
|
|
21
|
-
// TODO: Make nodejs version of bios support round tripping mnemonic between boots
|
|
22
|
-
const getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {
|
|
23
|
-
const storedSeedPhrase = await bios.seedPhraseStore.get('os')
|
|
24
|
-
logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`)
|
|
25
|
-
const { mnemonic } = config.api
|
|
26
|
-
if (isString(storedSeedPhrase) && isString(mnemonic)) {
|
|
27
|
-
logger?.warn('[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')
|
|
28
|
-
await bios.seedPhraseStore.set('os', mnemonic)
|
|
29
|
-
} else {
|
|
30
|
-
let seedPhrase: string
|
|
31
|
-
if (isString(mnemonic)) {
|
|
32
|
-
seedPhrase = mnemonic
|
|
33
|
-
} else {
|
|
34
|
-
seedPhrase = HDWallet.generateMnemonic()
|
|
35
|
-
logger?.log('[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.')
|
|
36
|
-
logger?.log(`[API] Mnemonic: ${seedPhrase}`)
|
|
37
|
-
}
|
|
38
|
-
await bios.seedPhraseStore.set('os', seedPhrase)
|
|
39
|
-
}
|
|
40
|
-
return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')
|
|
41
|
-
}
|
|
42
|
-
|
|
43
30
|
interface GetServerContext {
|
|
44
31
|
config: Config
|
|
45
|
-
logger
|
|
32
|
+
logger?: Logger
|
|
46
33
|
node?: NodeInstance
|
|
47
34
|
}
|
|
48
35
|
|
|
36
|
+
const getProviderFactoryLocator = (
|
|
37
|
+
context: Omit<CreatableProviderContext, 'locator'>,
|
|
38
|
+
finalizedArchivist: ArchivistInstance,
|
|
39
|
+
pendingTransactionsArchivist: ArchivistInstance,
|
|
40
|
+
pendingBlocksArchivist: ArchivistInstance,
|
|
41
|
+
) => {
|
|
42
|
+
const locator = new ProviderFactoryLocator(context)
|
|
43
|
+
locator.register(SimpleMempoolViewer.factory({
|
|
44
|
+
pendingTransactionsArchivist,
|
|
45
|
+
pendingBlocksArchivist,
|
|
46
|
+
} as Partial<CreatableProviderParams>))
|
|
47
|
+
locator.register(SimpleMempoolRunner.factory({
|
|
48
|
+
pendingTransactionsArchivist,
|
|
49
|
+
pendingBlocksArchivist,
|
|
50
|
+
} as Partial<CreatableProviderParams>))
|
|
51
|
+
locator.register(SimpleBlockViewer.factory({ finalizedArchivist } as Partial<CreatableProviderParams>))
|
|
52
|
+
locator.register(SimpleStakeViewer.factory())
|
|
53
|
+
locator.register(SimpleStakeEventsViewer.factory())
|
|
54
|
+
return locator
|
|
55
|
+
}
|
|
56
|
+
|
|
49
57
|
export const getServer = async (context: GetServerContext) => {
|
|
50
|
-
const {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
const bios = await boot()
|
|
55
|
-
const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)
|
|
56
|
-
const wallet = await HDWallet.fromPhrase(seedPhrase)
|
|
57
|
-
const nodeContext = {
|
|
58
|
-
wallet, logger, config,
|
|
59
|
-
}
|
|
58
|
+
const { config, node: providedNode } = context
|
|
59
|
+
const { port } = context.config.api
|
|
60
|
+
|
|
61
|
+
const logger = assertEx(context.logger, () => 'Logger is required to init server')
|
|
60
62
|
|
|
61
63
|
const statusReporter = initStatusReporter({ logger })
|
|
62
64
|
|
|
@@ -64,22 +66,72 @@ export const getServer = async (context: GetServerContext) => {
|
|
|
64
66
|
config, logger, statusReporter,
|
|
65
67
|
}))
|
|
66
68
|
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
69
|
+
const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')
|
|
70
|
+
|
|
71
|
+
const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
|
|
72
|
+
|
|
73
|
+
const initContext = {
|
|
74
|
+
_id: 'init-context',
|
|
73
75
|
config,
|
|
76
|
+
logger,
|
|
77
|
+
statusReporter,
|
|
78
|
+
meterProvider,
|
|
79
|
+
traceProvider,
|
|
80
|
+
singletons: {},
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const wallet = await initServerWallet(initContext)
|
|
84
|
+
|
|
85
|
+
const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
|
|
86
|
+
const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
|
|
87
|
+
|
|
88
|
+
const {
|
|
89
|
+
node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
|
|
90
|
+
} = await initServerNode({
|
|
91
|
+
...initContext,
|
|
92
|
+
wallet,
|
|
93
|
+
node: providedNode,
|
|
94
|
+
transfersSummaryMap,
|
|
95
|
+
balancesSummaryMap,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No head found')
|
|
99
|
+
|
|
100
|
+
const mods = await node.resolve('*')
|
|
101
|
+
await Promise.all(mods.map((mod) => {
|
|
102
|
+
return mod.start?.() ?? (() => true)
|
|
103
|
+
}))
|
|
104
|
+
|
|
105
|
+
const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist)
|
|
106
|
+
|
|
107
|
+
const mempoolContext = {
|
|
108
|
+
...initContext,
|
|
109
|
+
node,
|
|
110
|
+
transfersSummaryMap,
|
|
111
|
+
balancesSummaryMap,
|
|
112
|
+
...locator.context,
|
|
113
|
+
_id: 'mempool-context',
|
|
114
|
+
} satisfies MempoolContext
|
|
115
|
+
|
|
116
|
+
const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))
|
|
117
|
+
assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
|
|
118
|
+
|
|
119
|
+
const blk = await blockViewer.currentBlock()
|
|
120
|
+
assertEx(blk, () => 'No blocks found after initialization')
|
|
121
|
+
|
|
122
|
+
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
|
|
123
|
+
|
|
124
|
+
const actor = await ValidatorActor.create({
|
|
74
125
|
id: 'validator-mempool-server',
|
|
75
126
|
account: wallet,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
127
|
+
context: locator.context,
|
|
128
|
+
finalizedArchivist: writableChainArchivist,
|
|
129
|
+
} satisfies ValidatorActorParams)
|
|
130
|
+
|
|
131
|
+
await actor.start()
|
|
132
|
+
|
|
133
|
+
const app = getApp(mempoolContext)
|
|
134
|
+
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
135
|
+
server.setTimeout(20_000)
|
|
136
|
+
return server
|
|
85
137
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
|
-
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type { BalancesStepSummary, Config, MapType, MempoolRunner, MempoolViewer, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
|
-
import type { AppContext } from './model.ts';
|
|
5
|
-
export interface MempoolContext extends AppContext {
|
|
6
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
7
|
-
config: Config;
|
|
8
|
-
mempoolRunner: MempoolRunner;
|
|
9
|
-
mempoolViewer: MempoolViewer;
|
|
10
|
-
node: NodeInstance;
|
|
11
|
-
stakedChainContext: StakedChainContextRead;
|
|
12
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=ApiContext.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../../src/server/ApiContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAC1F,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
|