@xyo-network/chain-api 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/ApiContext.d.ts +9 -0
- package/dist/node/ApiContext.d.ts.map +1 -0
- package/dist/node/index.mjs +83 -192
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/app.d.ts +1 -1
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/index.d.ts +0 -1
- package/dist/node/server/index.d.ts.map +1 -1
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.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 +17 -16
- package/src/{server/ApiContext.ts → ApiContext.ts} +2 -8
- package/src/server/app.ts +1 -1
- package/src/server/index.ts +0 -1
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +5 -126
- package/src/server/server.ts +90 -99
- 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 ApiContext extends CreatableProviderContext {
|
|
5
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
6
|
+
node: NodeInstance;
|
|
7
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ApiContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../src/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,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,MAAM,WAAW,UAAW,SAAQ,wBAAwB;IAC1D,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
|
@@ -257,113 +257,12 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
|
|
|
257
257
|
|
|
258
258
|
// src/server/routes/rpc/routes/addRpcRoutes.ts
|
|
259
259
|
import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
|
|
260
|
-
import {
|
|
261
|
-
import {
|
|
262
|
-
import { initPendingBlocksArchivist, initPendingTransactionsArchivist } from "@xyo-network/chain-orchestration";
|
|
263
|
-
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
264
|
-
import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
|
|
265
|
-
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
266
|
-
import { NetworkStakeStepRewardsViewerMoniker, RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
267
|
-
import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
|
|
268
|
-
import { Semaphore } from "async-mutex";
|
|
269
|
-
async function chainArchivistFromNode(node) {
|
|
270
|
-
const chainArchivist = assertEx2(asArchivistInstance2(await node.resolve("Chain:Validated"), {
|
|
271
|
-
required: true
|
|
272
|
-
}), () => "FinalizedArchivist not found in node");
|
|
273
|
-
return chainArchivist;
|
|
274
|
-
}
|
|
275
|
-
__name(chainArchivistFromNode, "chainArchivistFromNode");
|
|
260
|
+
import { XyoConnectionMoniker } from "@xyo-network/xl1-protocol-sdk";
|
|
261
|
+
import { rpcEngineFromConnection } from "@xyo-network/xl1-rpc";
|
|
276
262
|
var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
|
|
277
263
|
const { context } = app;
|
|
278
|
-
const {
|
|
279
|
-
const
|
|
280
|
-
const balancesStepSummaryContext = {
|
|
281
|
-
head: stakedChainContext.head,
|
|
282
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
283
|
-
store: stakedChainContext.store,
|
|
284
|
-
chainId: stakedChainContext.chainId,
|
|
285
|
-
summaryMap: balancesSummaryMap
|
|
286
|
-
};
|
|
287
|
-
const transfersSummaryContext = {
|
|
288
|
-
head: stakedChainContext.head,
|
|
289
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
290
|
-
store: stakedChainContext.store,
|
|
291
|
-
chainId: stakedChainContext.chainId,
|
|
292
|
-
summaryMap: transfersSummaryMap
|
|
293
|
-
};
|
|
294
|
-
const networkStakeViewer = await SimpleNetworkStakeViewer.create({
|
|
295
|
-
context: stakedChainContext
|
|
296
|
-
});
|
|
297
|
-
const pendingBlocksArchivist = await initPendingBlocksArchivist(context);
|
|
298
|
-
const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context);
|
|
299
|
-
console.log("Initializing SimpleNetworkStakeViewer...");
|
|
300
|
-
assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
|
|
301
|
-
console.log("Initialized SimpleNetworkStakeViewer.");
|
|
302
|
-
const blockViewer = await SimpleBlockViewer.create({
|
|
303
|
-
context: stakedChainContext,
|
|
304
|
-
finalizedArchivist
|
|
305
|
-
});
|
|
306
|
-
console.log("Initializing SimpleBlockViewer...");
|
|
307
|
-
assertEx2(await blockViewer.start(), () => "Failed to start SimpleBlockViewer");
|
|
308
|
-
console.log("Initialized SimpleBlockViewer.");
|
|
309
|
-
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
310
|
-
blockViewer,
|
|
311
|
-
context: balancesStepSummaryContext,
|
|
312
|
-
transfersSummaryContext
|
|
313
|
-
});
|
|
314
|
-
console.log("Initializing SimpleAccountBalanceViewer...");
|
|
315
|
-
assertEx2(await accountBalanceViewer.start(), () => "Failed to start SimpleAccountBalanceViewer");
|
|
316
|
-
console.log("Initialized SimpleAccountBalanceViewer.");
|
|
317
|
-
const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
|
|
318
|
-
context: stakedChainContext,
|
|
319
|
-
rewardMultipliers: RewardMultipliers
|
|
320
|
-
});
|
|
321
|
-
console.log("Initializing SimpleStepRewardsByPositionViewer...");
|
|
322
|
-
assertEx2(await stepRewardsByPositionViewer.start(), () => "Failed to start SimpleStepRewardsByPositionViewer");
|
|
323
|
-
console.log("Initialized SimpleStepRewardsByPositionViewer.");
|
|
324
|
-
const networkStakeStepRewardsViewer = {
|
|
325
|
-
moniker: NetworkStakeStepRewardsViewerMoniker,
|
|
326
|
-
position: stepRewardsByPositionViewer
|
|
327
|
-
};
|
|
328
|
-
const stepViewer = await SimpleStepViewer.create({
|
|
329
|
-
chainContext: stakedChainContext,
|
|
330
|
-
networkStakeStepRewardsViewer
|
|
331
|
-
});
|
|
332
|
-
console.log("Initializing SimpleStepViewer...");
|
|
333
|
-
assertEx2(await stepViewer.start(), () => "Failed to start SimpleStepViewer");
|
|
334
|
-
console.log("Initialized SimpleStepViewer.");
|
|
335
|
-
const mempoolViewer = await SimpleMempoolViewer.create({
|
|
336
|
-
pendingBlocksArchivist,
|
|
337
|
-
pendingTransactionsArchivist
|
|
338
|
-
});
|
|
339
|
-
console.log("Initializing SimpleMempoolViewer...");
|
|
340
|
-
assertEx2(await mempoolViewer.start(), () => "Failed to start SimpleMempoolViewer");
|
|
341
|
-
console.log("Initialized SimpleMempoolViewer.");
|
|
342
|
-
const viewer = await NodeXyoViewer.create({
|
|
343
|
-
node,
|
|
344
|
-
rewardMultipliers: RewardMultipliers,
|
|
345
|
-
initRewardsCache: config.api.initRewardsCache,
|
|
346
|
-
blockViewer,
|
|
347
|
-
context: stakedChainContext,
|
|
348
|
-
networkStakeViewer,
|
|
349
|
-
accountBalanceViewer,
|
|
350
|
-
stepViewer,
|
|
351
|
-
transfersSummaryContext,
|
|
352
|
-
mempoolViewer
|
|
353
|
-
});
|
|
354
|
-
console.log("Initializing NodeXyoViewer...");
|
|
355
|
-
assertEx2(await viewer.start(), () => "Failed to start NodeXyoViewer");
|
|
356
|
-
console.log("Initialized NodeXyoViewer.");
|
|
357
|
-
const runner = await NodeXyoRunner.create({
|
|
358
|
-
node
|
|
359
|
-
});
|
|
360
|
-
console.log("Initializing NodeXyoRunner...");
|
|
361
|
-
assertEx2(await runner.start(), () => "Failed to start NodeXyoRunner");
|
|
362
|
-
console.log("Initialized NodeXyoRunner.");
|
|
363
|
-
const connection = new XyoBaseConnection({
|
|
364
|
-
runner,
|
|
365
|
-
viewer
|
|
366
|
-
});
|
|
264
|
+
const { locator } = context;
|
|
265
|
+
const connection = await locator.getInstance(XyoConnectionMoniker);
|
|
367
266
|
const engine = rpcEngineFromConnection(connection);
|
|
368
267
|
app.post("/rpc", (req, res) => {
|
|
369
268
|
setRawResponseFormat2(res);
|
|
@@ -402,56 +301,21 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
|
|
|
402
301
|
}, "getApp");
|
|
403
302
|
|
|
404
303
|
// src/server/server.ts
|
|
405
|
-
import { assertEx as
|
|
406
|
-
import {
|
|
407
|
-
import {
|
|
304
|
+
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
305
|
+
import { Account } from "@xyo-network/account";
|
|
306
|
+
import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
307
|
+
import { createBootstrapHead } from "@xyo-network/chain-services";
|
|
408
308
|
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
409
309
|
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
410
|
-
import {
|
|
411
|
-
import { findMostRecentBlock, flattenHydratedBlock,
|
|
310
|
+
import { asAttoXL1, StepSizes } from "@xyo-network/xl1-protocol";
|
|
311
|
+
import { BlockViewerMoniker, findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
312
|
+
import { buildLocalProviderLocator } from "@xyo-network/xl1-providers";
|
|
313
|
+
import { Semaphore } from "async-mutex";
|
|
412
314
|
var hostname = "::";
|
|
413
|
-
async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
|
|
414
|
-
const chainMap = readPayloadMapFromStore(chainArchivist);
|
|
415
|
-
const payloads = await chainArchivist.next({
|
|
416
|
-
limit: 1
|
|
417
|
-
});
|
|
418
|
-
if (payloads.length === 0) {
|
|
419
|
-
logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
|
|
420
|
-
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
|
|
421
|
-
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
|
|
422
|
-
await chainArchivist.insert(flattenHydratedBlock(block0));
|
|
423
|
-
console.log("[API] Genesis block created and inserted into chain archivist");
|
|
424
|
-
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([
|
|
425
|
-
0,
|
|
426
|
-
1e4
|
|
427
|
-
], true));
|
|
428
|
-
await chainArchivist.insert(flattenHydratedBlock(block1));
|
|
429
|
-
console.log(`[API] Producer declared: ${producerAccount.address}`);
|
|
430
|
-
}
|
|
431
|
-
return chainMap;
|
|
432
|
-
}
|
|
433
|
-
__name(initChainMap, "initChainMap");
|
|
434
|
-
function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chainMap }) {
|
|
435
|
-
return {
|
|
436
|
-
chainId,
|
|
437
|
-
stake: stakeViewer,
|
|
438
|
-
store: {
|
|
439
|
-
chainMap
|
|
440
|
-
},
|
|
441
|
-
head: /* @__PURE__ */ __name(async () => {
|
|
442
|
-
const head = await findMostRecentBlock(chainArchivist);
|
|
443
|
-
return [
|
|
444
|
-
assertEx3(head?._hash, () => "No head found in chainArchivist"),
|
|
445
|
-
head?.block ?? 0
|
|
446
|
-
];
|
|
447
|
-
}, "head")
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
__name(initStakedChainContextRead, "initStakedChainContextRead");
|
|
451
315
|
async function getServer(context) {
|
|
452
316
|
const { config, node: providedNode } = context;
|
|
453
317
|
const { port } = context.config.api;
|
|
454
|
-
const logger =
|
|
318
|
+
const logger = assertEx2(context.logger, () => "Logger is required to init server");
|
|
455
319
|
const statusReporter = initStatusReporter({
|
|
456
320
|
logger
|
|
457
321
|
});
|
|
@@ -463,16 +327,17 @@ async function getServer(context) {
|
|
|
463
327
|
const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
|
|
464
328
|
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
465
329
|
const initContext = {
|
|
330
|
+
_id: "init-context",
|
|
466
331
|
config,
|
|
467
332
|
logger,
|
|
468
333
|
statusReporter,
|
|
469
334
|
meterProvider,
|
|
470
|
-
traceProvider
|
|
335
|
+
traceProvider,
|
|
336
|
+
singletons: {}
|
|
471
337
|
};
|
|
472
338
|
const wallet = await initServerWallet(initContext);
|
|
473
|
-
const
|
|
474
|
-
const
|
|
475
|
-
const transfersSummaryMap = assertEx3(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
339
|
+
const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
340
|
+
const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
476
341
|
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
477
342
|
...initContext,
|
|
478
343
|
wallet,
|
|
@@ -480,55 +345,81 @@ async function getServer(context) {
|
|
|
480
345
|
transfersSummaryMap,
|
|
481
346
|
balancesSummaryMap
|
|
482
347
|
});
|
|
483
|
-
const
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
pendingTransactionsArchivist,
|
|
493
|
-
pendingBlocksArchivist
|
|
494
|
-
});
|
|
495
|
-
assertEx3(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
|
|
496
|
-
const producerAccount = await initProducerAccount(initContext);
|
|
497
|
-
const chainMap = await initChainMap({
|
|
498
|
-
...context,
|
|
499
|
-
chainArchivist: writableChainArchivist,
|
|
500
|
-
chainId,
|
|
501
|
-
producerAccount
|
|
502
|
-
});
|
|
503
|
-
const stakedChainContext = initStakedChainContextRead({
|
|
504
|
-
...context,
|
|
505
|
-
chainArchivist: readonlyChainArchivist,
|
|
506
|
-
chainId,
|
|
507
|
-
chainMap,
|
|
508
|
-
stakeViewer
|
|
509
|
-
});
|
|
348
|
+
const possibleHead = await findMostRecentBlock(readonlyChainArchivist);
|
|
349
|
+
if (!possibleHead) {
|
|
350
|
+
const chainId2 = (await Account.random()).address;
|
|
351
|
+
const chain = await createBootstrapHead(wallet, chainId2, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
|
|
352
|
+
const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
|
|
353
|
+
await writableChainArchivist.insert(payloads);
|
|
354
|
+
}
|
|
355
|
+
const head = assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
|
|
356
|
+
const chainId = head.chain;
|
|
510
357
|
const mods = await node.resolve("*");
|
|
511
358
|
await Promise.all(mods.map((mod) => {
|
|
512
359
|
return mod.start?.() ?? (() => true);
|
|
513
360
|
}));
|
|
514
|
-
const
|
|
515
|
-
|
|
516
|
-
|
|
361
|
+
const chainMap = payloadMapFromStore(writableChainArchivist);
|
|
362
|
+
const balanceSummaryContext = {
|
|
363
|
+
...initContext,
|
|
364
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
365
|
+
summaryMap: balancesSummaryMap,
|
|
366
|
+
head: /* @__PURE__ */ __name(async function() {
|
|
367
|
+
const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
|
|
368
|
+
return [
|
|
369
|
+
head2._hash,
|
|
370
|
+
head2.block
|
|
371
|
+
];
|
|
372
|
+
}, "head"),
|
|
373
|
+
store: {
|
|
374
|
+
chainMap
|
|
375
|
+
},
|
|
376
|
+
chainId
|
|
377
|
+
};
|
|
378
|
+
const transfersSummaryContext = {
|
|
379
|
+
...initContext,
|
|
380
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
381
|
+
summaryMap: transfersSummaryMap,
|
|
382
|
+
head: /* @__PURE__ */ __name(async function() {
|
|
383
|
+
const head2 = assertEx2(await findMostRecentBlock(writableChainArchivist));
|
|
384
|
+
return [
|
|
385
|
+
head2._hash,
|
|
386
|
+
head2.block
|
|
387
|
+
];
|
|
388
|
+
}, "head"),
|
|
389
|
+
store: {
|
|
390
|
+
chainMap
|
|
391
|
+
},
|
|
392
|
+
chainId
|
|
393
|
+
};
|
|
394
|
+
const locator = buildLocalProviderLocator({
|
|
395
|
+
context: initContext,
|
|
396
|
+
finalizedArchivist: writableChainArchivist,
|
|
397
|
+
pendingTransactionsArchivist,
|
|
398
|
+
pendingBlocksArchivist,
|
|
399
|
+
balanceSummaryContext,
|
|
400
|
+
transfersSummaryContext,
|
|
401
|
+
node
|
|
517
402
|
});
|
|
518
|
-
assertEx3(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
519
|
-
const blk = await blockViewer.currentBlock();
|
|
520
|
-
assertEx3(blk, () => "No blocks found after initialization");
|
|
521
|
-
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
522
403
|
const apiContext = {
|
|
523
404
|
...initContext,
|
|
524
405
|
node,
|
|
525
|
-
|
|
526
|
-
stakedChainContext,
|
|
527
|
-
mempoolViewer,
|
|
528
|
-
mempoolRunner,
|
|
406
|
+
transfersSummaryMap,
|
|
529
407
|
balancesSummaryMap,
|
|
530
|
-
|
|
408
|
+
...locator.context,
|
|
409
|
+
_id: "api-context"
|
|
531
410
|
};
|
|
411
|
+
const blockViewer = await locator.getInstance(BlockViewerMoniker);
|
|
412
|
+
assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
413
|
+
const blk = await blockViewer.currentBlock();
|
|
414
|
+
assertEx2(blk, () => "No blocks found after initialization");
|
|
415
|
+
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
416
|
+
const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
|
|
417
|
+
id: "validator-mempool-server",
|
|
418
|
+
account: wallet,
|
|
419
|
+
context: locator.context,
|
|
420
|
+
finalizedArchivist: writableChainArchivist
|
|
421
|
+
});
|
|
422
|
+
await actor?.start();
|
|
532
423
|
const app = await getApp(apiContext);
|
|
533
424
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
534
425
|
server.setTimeout(2e4);
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from './ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { initPendingBlocksArchivist, initPendingTransactionsArchivist } from '@xyo-network/chain-orchestration'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalanceStepSummaryContext,\n NetworkStakeStepRewardsViewer,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NetworkStakeStepRewardsViewerMoniker,\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const {\n node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,\n } = context\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n const pendingBlocksArchivist = await initPendingBlocksArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {\n moniker: NetworkStakeStepRewardsViewerMoniker,\n position: stepRewardsByPositionViewer,\n }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })\n\n console.log('Initializing SimpleMempoolViewer...')\n assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')\n console.log('Initialized SimpleMempoolViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache: config.api.initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n mempoolViewer,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const runner = await NodeXyoRunner.create({ node })\n\n console.log('Initializing NodeXyoRunner...')\n assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')\n console.log('Initialized NodeXyoRunner.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ConfigContext } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initStatusReporter, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type {\n Config, PayloadMapRead, SimpleBlockViewerParams, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n findMostRecentBlock, flattenHydratedBlock, readPayloadMapFromStore, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport type { ApiContext } from './ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nasync function initChainMap({\n chainArchivist, chainId, logger, config, producerAccount,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n producerAccount: AccountInstance\n}>) {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next({ limit: 1 })\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert(flattenHydratedBlock(block0))\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert(flattenHydratedBlock(block1))\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n return chainMap\n}\n\nfunction initStakedChainContextRead({\n chainArchivist, chainId, stakeViewer, chainMap,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n chainMap: PayloadMapRead<WithStorageMeta<Payload>>\n stakeViewer: StakeViewer\n}>) {\n return {\n chainId,\n stake: stakeViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n } satisfies StakedChainContextRead\n}\n\n// eslint-disable-next-line max-statements\nexport async function getServer(context: GetServerContext) {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n config, logger, statusReporter, meterProvider, traceProvider,\n }\n\n const wallet = await initServerWallet(initContext)\n const stakeViewer = await initStakeViewer(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const mempoolViewer = await SimpleMempoolViewer.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = await SimpleMempoolRunner.create({\n ...initContext,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n })\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n const producerAccount = await initProducerAccount(initContext)\n\n const chainMap = await initChainMap({\n ...context, chainArchivist: writableChainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,\n })\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const blockViewer = await SimpleBlockViewer.create({\n context: stakedChainContext,\n finalizedArchivist: readonlyChainArchivist,\n } satisfies SimpleBlockViewerParams)\n\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const apiContext: ApiContext = {\n ...initContext,\n node,\n config,\n stakedChainContext,\n mempoolViewer,\n mempoolRunner,\n balancesSummaryMap,\n transfersSummaryMap,\n }\n\n const app = await getApp(apiContext)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","initPendingBlocksArchivist","initPendingTransactionsArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","NetworkStakeStepRewardsViewerMoniker","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","stakedChainContext","balancesSummaryMap","transfersSummaryMap","config","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlocksArchivist","pendingTransactionsArchivist","initPendingTransactionsArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","moniker","NetworkStakeStepRewardsViewerMoniker","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","initRewardsCache","api","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","buildTelemetryConfig","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initHealthEndpoints","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initStatusReporter","initTransferSummaryMap","createGenesisBlock","initTelemetry","startupSpanAsync","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","flattenHydratedBlock","readPayloadMapFromStore","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","limit","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flattenHydratedBlock","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","mempoolViewer","SimpleMempoolViewer","create","start","mempoolRunner","SimpleMempoolRunner","initProducerAccount","stakedChainContext","mods","resolve","Promise","all","map","mod","blockViewer","SimpleBlockViewer","finalizedArchivist","blk","currentBlock","info","apiContext","app","getApp","server","listen","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'\nimport { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'\nimport { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\n\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initServerNode,\n initServerWallet,\n initStatusReporter, initTransferSummaryMap,\n ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalanceStepSummaryContext,\n BlockViewer,\n Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n BlockViewerMoniker,\n findMostRecentBlock,\n flattenHydratedBlock,\n payloadMapFromStore,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { buildLocalProviderLocator } from '@xyo-network/xl1-providers'\nimport { Semaphore } from 'async-mutex'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _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 const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (!possibleHead) {\n const chainId = (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = head.chain\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)\n\n const balanceSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balancesSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transfersSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies TransfersStepSummaryContext\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balanceSummaryContext,\n transfersSummaryContext,\n node,\n })\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\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 = config.mempool.enabled\n ? undefined\n : 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 = await getApp(apiContext)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","XyoConnectionMoniker","rpcEngineFromConnection","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","Account","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initServerNode","initServerWallet","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","asAttoXL1","StepSizes","BlockViewerMoniker","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","buildLocalProviderLocator","Semaphore","hostname","getServer","context","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","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","start","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","finalizedArchivist","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","console","info","actor","mempool","enabled","undefined","ValidatorActor","create","id","account","app","getApp","server","listen","log","setTimeout"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,eAAO,MAAM,MAAM,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,OAAO,CAiBjE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBAcb,CAAA"}
|
|
@@ -6,6 +6,6 @@ interface GetServerContext {
|
|
|
6
6
|
logger?: Logger;
|
|
7
7
|
node?: NodeInstance;
|
|
8
8
|
}
|
|
9
|
-
export declare function getServer(context: GetServerContext): Promise<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>>;
|
|
9
|
+
export declare function 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":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAgBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAGV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAgBtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,8HA8HxD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
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,22 +54,22 @@
|
|
|
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/account": "~5.2.17",
|
|
57
58
|
"@xyo-network/archivist-model": "~5.2.17",
|
|
58
59
|
"@xyo-network/boundwitness-model": "~5.2.17",
|
|
59
|
-
"@xyo-network/chain-orchestration": "
|
|
60
|
-
"@xyo-network/chain-
|
|
61
|
-
"@xyo-network/chain-
|
|
62
|
-
"@xyo-network/chain-
|
|
63
|
-
"@xyo-network/chain-utils": "workspace:~",
|
|
64
|
-
"@xyo-network/chain-viewers": "workspace:~",
|
|
60
|
+
"@xyo-network/chain-orchestration": "~1.18.0-rc.1",
|
|
61
|
+
"@xyo-network/chain-services": "~1.18.0-rc.1",
|
|
62
|
+
"@xyo-network/chain-telemetry": "~1.18.0-rc.1",
|
|
63
|
+
"@xyo-network/chain-utils": "~1.18.0-rc.1",
|
|
65
64
|
"@xyo-network/module-abstract": "~5.2.17",
|
|
66
65
|
"@xyo-network/module-model": "~5.2.17",
|
|
67
66
|
"@xyo-network/node-model": "~5.2.17",
|
|
68
67
|
"@xyo-network/payload-builder": "~5.2.17",
|
|
69
68
|
"@xyo-network/payload-model": "~5.2.17",
|
|
70
69
|
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
71
|
-
"@xyo-network/xl1-protocol-sdk": "
|
|
72
|
-
"@xyo-network/xl1-
|
|
70
|
+
"@xyo-network/xl1-protocol-sdk": "~1.18.0-rc.1",
|
|
71
|
+
"@xyo-network/xl1-providers": "~1.18.0-rc.1",
|
|
72
|
+
"@xyo-network/xl1-rpc": "~1.18.0-rc.1",
|
|
73
73
|
"async-mutex": "~0.5.0",
|
|
74
74
|
"compression": "~1.8.1",
|
|
75
75
|
"cors": "~2.8.5",
|
|
@@ -82,22 +82,22 @@
|
|
|
82
82
|
"@types/cors": "~2.8.19",
|
|
83
83
|
"@types/express": "5.0.6",
|
|
84
84
|
"@types/express-serve-static-core": "~5.1.0",
|
|
85
|
-
"@types/node": "~
|
|
85
|
+
"@types/node": "~25.0.2",
|
|
86
86
|
"@xylabs/sdk-js": "~5.0.51",
|
|
87
|
-
"@xylabs/ts-scripts-yarn3": "~7.2.
|
|
88
|
-
"@xylabs/tsconfig": "~7.2.
|
|
87
|
+
"@xylabs/ts-scripts-yarn3": "~7.2.32",
|
|
88
|
+
"@xylabs/tsconfig": "~7.2.32",
|
|
89
89
|
"@xyo-network/account": "~5.2.17",
|
|
90
90
|
"@xyo-network/account-model": "~5.2.17",
|
|
91
91
|
"@xyo-network/archivist-abstract": "~5.2.17",
|
|
92
92
|
"@xyo-network/bios-model": "~7.2.0",
|
|
93
93
|
"@xyo-network/boundwitness-builder": "~5.2.17",
|
|
94
|
-
"@xyo-network/chain-services": "
|
|
94
|
+
"@xyo-network/chain-services": "~1.18.0-rc.1",
|
|
95
95
|
"@xyo-network/module-abstract-mongodb": "~5.2.17",
|
|
96
96
|
"@xyo-network/module-model-mongodb": "~5.2.17",
|
|
97
97
|
"@xyo-network/node-memory": "~5.2.17",
|
|
98
98
|
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
99
99
|
"dotenv": "~17.2.3",
|
|
100
|
-
"eslint": "^9.39.
|
|
100
|
+
"eslint": "^9.39.2",
|
|
101
101
|
"nodemon": "~3.1.11",
|
|
102
102
|
"tslib": "~2.8.1",
|
|
103
103
|
"typescript": "~5.9.3",
|
|
@@ -110,5 +110,6 @@
|
|
|
110
110
|
"engineStrict": true,
|
|
111
111
|
"publishConfig": {
|
|
112
112
|
"access": "restricted"
|
|
113
|
-
}
|
|
114
|
-
|
|
113
|
+
},
|
|
114
|
+
"stableVersion": "1.17.7"
|
|
115
|
+
}
|
|
@@ -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 ApiContext extends AppContext {
|
|
8
|
+
export interface ApiContext 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/server/app.ts
CHANGED
|
@@ -13,7 +13,7 @@ import cors from 'cors'
|
|
|
13
13
|
import type { Express } from 'express'
|
|
14
14
|
import express from 'express'
|
|
15
15
|
|
|
16
|
-
import type { ApiContext } from '
|
|
16
|
+
import type { ApiContext } from '../ApiContext.ts'
|
|
17
17
|
import { addInstrumentation } from './instrumentation.ts'
|
|
18
18
|
import { addRoutes } from './routes/index.ts'
|
|
19
19
|
|
package/src/server/index.ts
CHANGED
|
@@ -1,137 +1,16 @@
|
|
|
1
1
|
import { setRawResponseFormat } from '@xylabs/express'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { NodeXyoViewer } from '@xyo-network/chain-rpc'
|
|
6
|
-
import {
|
|
7
|
-
SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
|
|
8
|
-
} from '@xyo-network/chain-viewers'
|
|
9
|
-
import type { NodeInstance } from '@xyo-network/node-model'
|
|
10
|
-
import { StepSizes } from '@xyo-network/xl1-protocol'
|
|
11
|
-
import type {
|
|
12
|
-
BalanceStepSummaryContext,
|
|
13
|
-
NetworkStakeStepRewardsViewer,
|
|
14
|
-
TransfersStepSummaryContext,
|
|
15
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
16
|
-
import {
|
|
17
|
-
NetworkStakeStepRewardsViewerMoniker,
|
|
18
|
-
RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
|
|
19
|
-
SimpleMempoolViewer,
|
|
20
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
21
|
-
import {
|
|
22
|
-
NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,
|
|
23
|
-
} from '@xyo-network/xl1-rpc'
|
|
24
|
-
import { Semaphore } from 'async-mutex'
|
|
2
|
+
import type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'
|
|
3
|
+
import { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'
|
|
4
|
+
import { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'
|
|
25
5
|
import type { Express } from 'express'
|
|
26
6
|
|
|
27
|
-
async function chainArchivistFromNode(node: NodeInstance) {
|
|
28
|
-
const chainArchivist = assertEx(asArchivistInstance(
|
|
29
|
-
await node.resolve('Chain:Validated'),
|
|
30
|
-
{ required: true },
|
|
31
|
-
), () => 'FinalizedArchivist not found in node')
|
|
32
|
-
return chainArchivist
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// eslint-disable-next-line max-statements
|
|
36
7
|
export const addRpcRoutes = async (
|
|
37
8
|
app: Express,
|
|
38
9
|
) => {
|
|
39
10
|
const { context } = app
|
|
40
|
-
const {
|
|
41
|
-
node, stakedChainContext, balancesSummaryMap, transfersSummaryMap, config,
|
|
42
|
-
} = context
|
|
43
|
-
|
|
44
|
-
const finalizedArchivist = await chainArchivistFromNode(node)
|
|
45
|
-
|
|
46
|
-
const balancesStepSummaryContext = {
|
|
47
|
-
head: stakedChainContext.head,
|
|
48
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
49
|
-
store: stakedChainContext.store,
|
|
50
|
-
chainId: stakedChainContext.chainId,
|
|
51
|
-
summaryMap: balancesSummaryMap,
|
|
52
|
-
} satisfies BalanceStepSummaryContext
|
|
53
|
-
|
|
54
|
-
const transfersSummaryContext = {
|
|
55
|
-
head: stakedChainContext.head,
|
|
56
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
57
|
-
store: stakedChainContext.store,
|
|
58
|
-
chainId: stakedChainContext.chainId,
|
|
59
|
-
summaryMap: transfersSummaryMap,
|
|
60
|
-
} satisfies TransfersStepSummaryContext
|
|
61
|
-
|
|
62
|
-
const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
|
|
63
|
-
const pendingBlocksArchivist = await initPendingBlocksArchivist(context)
|
|
64
|
-
const pendingTransactionsArchivist = await initPendingTransactionsArchivist(context)
|
|
65
|
-
|
|
66
|
-
console.log('Initializing SimpleNetworkStakeViewer...')
|
|
67
|
-
assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
|
|
68
|
-
console.log('Initialized SimpleNetworkStakeViewer.')
|
|
69
|
-
|
|
70
|
-
const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })
|
|
71
|
-
|
|
72
|
-
console.log('Initializing SimpleBlockViewer...')
|
|
73
|
-
assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')
|
|
74
|
-
console.log('Initialized SimpleBlockViewer.')
|
|
75
|
-
|
|
76
|
-
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
77
|
-
blockViewer,
|
|
78
|
-
context: balancesStepSummaryContext,
|
|
79
|
-
transfersSummaryContext,
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
console.log('Initializing SimpleAccountBalanceViewer...')
|
|
83
|
-
assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
|
|
84
|
-
console.log('Initialized SimpleAccountBalanceViewer.')
|
|
85
|
-
|
|
86
|
-
const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
|
|
87
|
-
context: stakedChainContext,
|
|
88
|
-
rewardMultipliers: RewardMultipliers,
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
console.log('Initializing SimpleStepRewardsByPositionViewer...')
|
|
92
|
-
assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')
|
|
93
|
-
console.log('Initialized SimpleStepRewardsByPositionViewer.')
|
|
94
|
-
|
|
95
|
-
const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = {
|
|
96
|
-
moniker: NetworkStakeStepRewardsViewerMoniker,
|
|
97
|
-
position: stepRewardsByPositionViewer,
|
|
98
|
-
}
|
|
99
|
-
const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })
|
|
100
|
-
|
|
101
|
-
console.log('Initializing SimpleStepViewer...')
|
|
102
|
-
assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')
|
|
103
|
-
console.log('Initialized SimpleStepViewer.')
|
|
104
|
-
|
|
105
|
-
const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })
|
|
106
|
-
|
|
107
|
-
console.log('Initializing SimpleMempoolViewer...')
|
|
108
|
-
assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')
|
|
109
|
-
console.log('Initialized SimpleMempoolViewer.')
|
|
110
|
-
|
|
111
|
-
const viewer = await NodeXyoViewer.create({
|
|
112
|
-
node,
|
|
113
|
-
rewardMultipliers: RewardMultipliers,
|
|
114
|
-
initRewardsCache: config.api.initRewardsCache,
|
|
115
|
-
blockViewer,
|
|
116
|
-
context: stakedChainContext,
|
|
117
|
-
networkStakeViewer,
|
|
118
|
-
accountBalanceViewer,
|
|
119
|
-
stepViewer,
|
|
120
|
-
transfersSummaryContext,
|
|
121
|
-
mempoolViewer,
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
console.log('Initializing NodeXyoViewer...')
|
|
125
|
-
assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')
|
|
126
|
-
console.log('Initialized NodeXyoViewer.')
|
|
127
|
-
|
|
128
|
-
const runner = await NodeXyoRunner.create({ node })
|
|
129
|
-
|
|
130
|
-
console.log('Initializing NodeXyoRunner...')
|
|
131
|
-
assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')
|
|
132
|
-
console.log('Initialized NodeXyoRunner.')
|
|
11
|
+
const { locator } = context
|
|
133
12
|
|
|
134
|
-
const connection =
|
|
13
|
+
const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)
|
|
135
14
|
const engine = rpcEngineFromConnection(connection)
|
|
136
15
|
|
|
137
16
|
app.post('/rpc', (req, res) => {
|
package/src/server/server.ts
CHANGED
|
@@ -1,36 +1,40 @@
|
|
|
1
|
+
/* eslint-disable max-statements */
|
|
2
|
+
|
|
1
3
|
import type { Hash, Logger } from '@xylabs/sdk-js'
|
|
2
4
|
import { assertEx } from '@xylabs/sdk-js'
|
|
3
|
-
import
|
|
4
|
-
import type {
|
|
5
|
-
import type { ConfigContext } from '@xyo-network/chain-orchestration'
|
|
5
|
+
import { Account } from '@xyo-network/account'
|
|
6
|
+
import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
|
|
6
7
|
import {
|
|
7
8
|
buildTelemetryConfig,
|
|
8
|
-
createProducerChainStakeIntentBlock,
|
|
9
9
|
initBalanceSummaryMap,
|
|
10
10
|
initHealthEndpoints,
|
|
11
|
-
initProducerAccount,
|
|
12
11
|
initServerNode,
|
|
13
12
|
initServerWallet,
|
|
14
|
-
|
|
13
|
+
initStatusReporter, initTransferSummaryMap,
|
|
14
|
+
ValidatorActor,
|
|
15
15
|
} from '@xyo-network/chain-orchestration'
|
|
16
|
-
import {
|
|
16
|
+
import { createBootstrapHead } from '@xyo-network/chain-services'
|
|
17
17
|
import { initTelemetry } from '@xyo-network/chain-telemetry'
|
|
18
18
|
import { startupSpanAsync } from '@xyo-network/chain-utils'
|
|
19
19
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
20
20
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
23
|
-
asXL1, asXL1BlockRange, XL1Amount,
|
|
24
|
-
} from '@xyo-network/xl1-protocol'
|
|
21
|
+
import { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'
|
|
25
22
|
import type {
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
BalanceStepSummaryContext,
|
|
24
|
+
BlockViewer,
|
|
25
|
+
Config,
|
|
26
|
+
TransfersStepSummaryContext,
|
|
28
27
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
29
28
|
import {
|
|
30
|
-
|
|
29
|
+
BlockViewerMoniker,
|
|
30
|
+
findMostRecentBlock,
|
|
31
|
+
flattenHydratedBlock,
|
|
32
|
+
payloadMapFromStore,
|
|
31
33
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
34
|
+
import { buildLocalProviderLocator } from '@xyo-network/xl1-providers'
|
|
35
|
+
import { Semaphore } from 'async-mutex'
|
|
32
36
|
|
|
33
|
-
import type { ApiContext } from '
|
|
37
|
+
import type { ApiContext } from '../ApiContext.ts'
|
|
34
38
|
import { getApp } from './app.ts'
|
|
35
39
|
|
|
36
40
|
const hostname = '::'
|
|
@@ -42,51 +46,6 @@ interface GetServerContext {
|
|
|
42
46
|
node?: NodeInstance
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
async function initChainMap({
|
|
46
|
-
chainArchivist, chainId, logger, config, producerAccount,
|
|
47
|
-
}: ConfigContext<{
|
|
48
|
-
chainArchivist: ArchivistInstance
|
|
49
|
-
chainId: ChainId
|
|
50
|
-
producerAccount: AccountInstance
|
|
51
|
-
}>) {
|
|
52
|
-
const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
|
|
53
|
-
|
|
54
|
-
const payloads = await chainArchivist.next({ limit: 1 })
|
|
55
|
-
|
|
56
|
-
if (payloads.length === 0) {
|
|
57
|
-
logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
|
|
58
|
-
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
|
|
59
|
-
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
|
|
60
|
-
await chainArchivist.insert(flattenHydratedBlock(block0))
|
|
61
|
-
console.log('[API] Genesis block created and inserted into chain archivist')
|
|
62
|
-
const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))
|
|
63
|
-
await chainArchivist.insert(flattenHydratedBlock(block1))
|
|
64
|
-
console.log(`[API] Producer declared: ${producerAccount.address}`)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return chainMap
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function initStakedChainContextRead({
|
|
71
|
-
chainArchivist, chainId, stakeViewer, chainMap,
|
|
72
|
-
}: ConfigContext<{
|
|
73
|
-
chainArchivist: ArchivistInstance
|
|
74
|
-
chainId: ChainId
|
|
75
|
-
chainMap: PayloadMapRead<WithStorageMeta<Payload>>
|
|
76
|
-
stakeViewer: StakeViewer
|
|
77
|
-
}>) {
|
|
78
|
-
return {
|
|
79
|
-
chainId,
|
|
80
|
-
stake: stakeViewer,
|
|
81
|
-
store: { chainMap },
|
|
82
|
-
head: async (): Promise<[Hash, number]> => {
|
|
83
|
-
const head = await findMostRecentBlock(chainArchivist)
|
|
84
|
-
return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
|
|
85
|
-
},
|
|
86
|
-
} satisfies StakedChainContextRead
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// eslint-disable-next-line max-statements
|
|
90
49
|
export async function getServer(context: GetServerContext) {
|
|
91
50
|
const { config, node: providedNode } = context
|
|
92
51
|
const { port } = context.config.api
|
|
@@ -104,11 +63,16 @@ export async function getServer(context: GetServerContext) {
|
|
|
104
63
|
const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
|
|
105
64
|
|
|
106
65
|
const initContext = {
|
|
107
|
-
|
|
66
|
+
_id: 'init-context',
|
|
67
|
+
config,
|
|
68
|
+
logger,
|
|
69
|
+
statusReporter,
|
|
70
|
+
meterProvider,
|
|
71
|
+
traceProvider,
|
|
72
|
+
singletons: {},
|
|
108
73
|
}
|
|
109
74
|
|
|
110
75
|
const wallet = await initServerWallet(initContext)
|
|
111
|
-
const stakeViewer = await initStakeViewer(initContext)
|
|
112
76
|
|
|
113
77
|
const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
|
|
114
78
|
const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
|
|
@@ -123,42 +87,69 @@ export async function getServer(context: GetServerContext) {
|
|
|
123
87
|
balancesSummaryMap,
|
|
124
88
|
})
|
|
125
89
|
|
|
126
|
-
const
|
|
90
|
+
const possibleHead = await findMostRecentBlock(readonlyChainArchivist)
|
|
91
|
+
if (!possibleHead) {
|
|
92
|
+
const chainId = (await Account.random()).address
|
|
93
|
+
// If there is no head, create one
|
|
94
|
+
const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)
|
|
95
|
+
const payloads = chain.flatMap(block => flattenHydratedBlock(block))
|
|
96
|
+
await writableChainArchivist.insert(payloads)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')
|
|
100
|
+
const chainId = head.chain
|
|
101
|
+
|
|
102
|
+
const mods = await node.resolve('*')
|
|
103
|
+
await Promise.all(mods.map((mod) => {
|
|
104
|
+
return mod.start?.() ?? (() => true)
|
|
105
|
+
}))
|
|
106
|
+
|
|
107
|
+
const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)
|
|
127
108
|
|
|
128
|
-
const
|
|
109
|
+
const balanceSummaryContext = {
|
|
129
110
|
...initContext,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
111
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
112
|
+
summaryMap: balancesSummaryMap,
|
|
113
|
+
head: async function (): Promise<[Hash, number]> {
|
|
114
|
+
const head = assertEx(await findMostRecentBlock(writableChainArchivist))
|
|
115
|
+
return [head._hash, head.block]
|
|
116
|
+
},
|
|
117
|
+
store: { chainMap },
|
|
118
|
+
chainId,
|
|
119
|
+
} satisfies BalanceStepSummaryContext
|
|
134
120
|
|
|
135
|
-
const
|
|
121
|
+
const transfersSummaryContext = {
|
|
136
122
|
...initContext,
|
|
123
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
124
|
+
summaryMap: transfersSummaryMap,
|
|
125
|
+
head: async function (): Promise<[Hash, number]> {
|
|
126
|
+
const head = assertEx(await findMostRecentBlock(writableChainArchivist))
|
|
127
|
+
return [head._hash, head.block]
|
|
128
|
+
},
|
|
129
|
+
store: { chainMap },
|
|
130
|
+
chainId,
|
|
131
|
+
} satisfies TransfersStepSummaryContext
|
|
132
|
+
|
|
133
|
+
const locator = buildLocalProviderLocator({
|
|
134
|
+
context: initContext,
|
|
135
|
+
finalizedArchivist: writableChainArchivist,
|
|
137
136
|
pendingTransactionsArchivist,
|
|
138
137
|
pendingBlocksArchivist,
|
|
138
|
+
balanceSummaryContext,
|
|
139
|
+
transfersSummaryContext,
|
|
140
|
+
node,
|
|
139
141
|
})
|
|
140
|
-
assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')
|
|
141
|
-
|
|
142
|
-
const producerAccount = await initProducerAccount(initContext)
|
|
143
|
-
|
|
144
|
-
const chainMap = await initChainMap({
|
|
145
|
-
...context, chainArchivist: writableChainArchivist, chainId, producerAccount,
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
const stakedChainContext = initStakedChainContextRead({
|
|
149
|
-
...context, chainArchivist: readonlyChainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
const mods = await node.resolve('*')
|
|
153
|
-
await Promise.all(mods.map((mod) => {
|
|
154
|
-
return mod.start?.() ?? (() => true)
|
|
155
|
-
}))
|
|
156
142
|
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
143
|
+
const apiContext = {
|
|
144
|
+
...initContext,
|
|
145
|
+
node,
|
|
146
|
+
transfersSummaryMap,
|
|
147
|
+
balancesSummaryMap,
|
|
148
|
+
...locator.context,
|
|
149
|
+
_id: 'api-context',
|
|
150
|
+
} satisfies ApiContext
|
|
161
151
|
|
|
152
|
+
const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))
|
|
162
153
|
assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')
|
|
163
154
|
|
|
164
155
|
const blk = await blockViewer.currentBlock()
|
|
@@ -166,16 +157,16 @@ export async function getServer(context: GetServerContext) {
|
|
|
166
157
|
|
|
167
158
|
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
|
|
168
159
|
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
160
|
+
const actor = config.mempool.enabled
|
|
161
|
+
? undefined
|
|
162
|
+
: await ValidatorActor.create({
|
|
163
|
+
id: 'validator-mempool-server',
|
|
164
|
+
account: wallet,
|
|
165
|
+
context: locator.context,
|
|
166
|
+
finalizedArchivist: writableChainArchivist,
|
|
167
|
+
} satisfies ValidatorActorParams)
|
|
168
|
+
|
|
169
|
+
await actor?.start()
|
|
179
170
|
|
|
180
171
|
const app = await getApp(apiContext)
|
|
181
172
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
@@ -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 ApiContext extends AppContext {
|
|
6
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
7
|
-
config: Config;
|
|
8
|
-
mempoolRunner: MempoolRunner;
|
|
9
|
-
mempoolViewer: MempoolViewer;
|
|
10
|
-
node: NodeInstance;
|
|
11
|
-
stakedChainContext: StakedChainContextRead;
|
|
12
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=ApiContext.d.ts.map
|
|
@@ -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,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
|