@xyo-network/chain-api 1.16.26 → 1.17.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/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +143 -84
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/model.d.ts +5 -0
- package/dist/node/model.d.ts.map +1 -0
- package/dist/node/server/app.d.ts +3 -2
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/routes/addRoutes.d.ts +3 -2
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +3 -2
- package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/index.ts +1 -0
- package/src/model.ts +5 -0
- package/src/server/app.ts +6 -4
- package/src/server/routes/addRoutes.ts +6 -4
- package/src/server/routes/rpc/routes/addRpcRoutes.ts +98 -19
- package/src/server/server.ts +65 -61
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -258,48 +258,111 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
|
|
|
258
258
|
// src/server/routes/rpc/routes/addRpcRoutes.ts
|
|
259
259
|
import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
|
|
260
260
|
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
261
|
+
import { asArchivistInstance as asArchivistInstance2 } from "@xyo-network/archivist-model";
|
|
262
|
+
import { initPendingBlockArchivist, initPendingTransactionArchivist } from "@xyo-network/chain-orchestration";
|
|
261
263
|
import { NodeXyoViewer } from "@xyo-network/chain-rpc";
|
|
262
|
-
import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer } from "@xyo-network/chain-viewers";
|
|
264
|
+
import { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer } from "@xyo-network/chain-viewers";
|
|
263
265
|
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
264
|
-
import { RewardMultipliers } from "@xyo-network/xl1-protocol-sdk";
|
|
266
|
+
import { RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer, SimpleMempoolViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
265
267
|
import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
|
|
266
268
|
import { Semaphore } from "async-mutex";
|
|
267
|
-
|
|
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");
|
|
276
|
+
var addRpcRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
268
277
|
const { node } = app;
|
|
269
|
-
const
|
|
278
|
+
const finalizedArchivist = await chainArchivistFromNode(node);
|
|
279
|
+
const balancesStepSummaryContext = {
|
|
280
|
+
head: stakedChainContext.head,
|
|
281
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
282
|
+
store: stakedChainContext.store,
|
|
283
|
+
chainId: stakedChainContext.chainId,
|
|
284
|
+
summaryMap: balancesSummaryMap
|
|
285
|
+
};
|
|
286
|
+
const transfersSummaryContext = {
|
|
287
|
+
head: stakedChainContext.head,
|
|
288
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
289
|
+
store: stakedChainContext.store,
|
|
290
|
+
chainId: stakedChainContext.chainId,
|
|
291
|
+
summaryMap: transfersSummaryMap
|
|
292
|
+
};
|
|
270
293
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({
|
|
271
294
|
context: stakedChainContext
|
|
272
295
|
});
|
|
296
|
+
const pendingBlocksArchivist = await initPendingBlockArchivist(context);
|
|
297
|
+
const pendingTransactionsArchivist = await initPendingTransactionArchivist(context);
|
|
273
298
|
console.log("Initializing SimpleNetworkStakeViewer...");
|
|
274
299
|
assertEx2(await networkStakeViewer.start(), () => "Failed to start SimpleNetworkStakeViewer");
|
|
275
300
|
console.log("Initialized SimpleNetworkStakeViewer.");
|
|
301
|
+
const blockViewer = await SimpleBlockViewer.create({
|
|
302
|
+
context: stakedChainContext,
|
|
303
|
+
finalizedArchivist
|
|
304
|
+
});
|
|
305
|
+
console.log("Initializing SimpleBlockViewer...");
|
|
306
|
+
assertEx2(await blockViewer.start(), () => "Failed to start SimpleBlockViewer");
|
|
307
|
+
console.log("Initialized SimpleBlockViewer.");
|
|
308
|
+
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
309
|
+
blockViewer,
|
|
310
|
+
context: balancesStepSummaryContext,
|
|
311
|
+
transfersSummaryContext
|
|
312
|
+
});
|
|
313
|
+
console.log("Initializing SimpleAccountBalanceViewer...");
|
|
314
|
+
assertEx2(await accountBalanceViewer.start(), () => "Failed to start SimpleAccountBalanceViewer");
|
|
315
|
+
console.log("Initialized SimpleAccountBalanceViewer.");
|
|
316
|
+
const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
|
|
317
|
+
context: stakedChainContext,
|
|
318
|
+
rewardMultipliers: RewardMultipliers
|
|
319
|
+
});
|
|
320
|
+
console.log("Initializing SimpleStepRewardsByPositionViewer...");
|
|
321
|
+
assertEx2(await stepRewardsByPositionViewer.start(), () => "Failed to start SimpleStepRewardsByPositionViewer");
|
|
322
|
+
console.log("Initialized SimpleStepRewardsByPositionViewer.");
|
|
323
|
+
const networkStakeStepRewardsViewer = {
|
|
324
|
+
position: stepRewardsByPositionViewer
|
|
325
|
+
};
|
|
326
|
+
const stepViewer = await SimpleStepViewer.create({
|
|
327
|
+
chainContext: stakedChainContext,
|
|
328
|
+
networkStakeStepRewardsViewer
|
|
329
|
+
});
|
|
330
|
+
console.log("Initializing SimpleStepViewer...");
|
|
331
|
+
assertEx2(await stepViewer.start(), () => "Failed to start SimpleStepViewer");
|
|
332
|
+
console.log("Initialized SimpleStepViewer.");
|
|
333
|
+
const mempoolViewer = await SimpleMempoolViewer.create({
|
|
334
|
+
pendingBlocksArchivist,
|
|
335
|
+
pendingTransactionsArchivist
|
|
336
|
+
});
|
|
337
|
+
console.log("Initializing SimpleMempoolViewer...");
|
|
338
|
+
assertEx2(await mempoolViewer.start(), () => "Failed to start SimpleMempoolViewer");
|
|
339
|
+
console.log("Initialized SimpleMempoolViewer.");
|
|
276
340
|
const viewer = await NodeXyoViewer.create({
|
|
277
341
|
node,
|
|
278
342
|
rewardMultipliers: RewardMultipliers,
|
|
279
343
|
initRewardsCache,
|
|
280
|
-
|
|
344
|
+
blockViewer,
|
|
281
345
|
context: stakedChainContext,
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
346
|
+
networkStakeViewer,
|
|
347
|
+
accountBalanceViewer,
|
|
348
|
+
stepViewer,
|
|
349
|
+
transfersSummaryContext,
|
|
350
|
+
mempoolViewer
|
|
287
351
|
});
|
|
288
352
|
console.log("Initializing NodeXyoViewer...");
|
|
289
353
|
assertEx2(await viewer.start(), () => "Failed to start NodeXyoViewer");
|
|
290
354
|
console.log("Initialized NodeXyoViewer.");
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
rewardMultipliers: RewardMultipliers
|
|
355
|
+
const runner = await NodeXyoRunner.create({
|
|
356
|
+
node
|
|
294
357
|
});
|
|
295
|
-
console.log("Initializing
|
|
296
|
-
assertEx2(await
|
|
297
|
-
console.log("Initialized
|
|
358
|
+
console.log("Initializing NodeXyoRunner...");
|
|
359
|
+
assertEx2(await runner.start(), () => "Failed to start NodeXyoRunner");
|
|
360
|
+
console.log("Initialized NodeXyoRunner.");
|
|
298
361
|
const connection = new XyoBaseConnection({
|
|
299
362
|
runner,
|
|
300
363
|
viewer
|
|
301
364
|
});
|
|
302
|
-
const engine = rpcEngineFromConnection(connection
|
|
365
|
+
const engine = rpcEngineFromConnection(connection);
|
|
303
366
|
app.post("/rpc", (req, res) => {
|
|
304
367
|
setRawResponseFormat2(res);
|
|
305
368
|
engine.handle(req.body, (_, rpcResponse) => {
|
|
@@ -309,14 +372,14 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app, transferSummaryMap, staked
|
|
|
309
372
|
}, "addRpcRoutes");
|
|
310
373
|
|
|
311
374
|
// src/server/routes/addRoutes.ts
|
|
312
|
-
var addRoutes = /* @__PURE__ */ __name(async (app,
|
|
313
|
-
await addRpcRoutes(app,
|
|
375
|
+
var addRoutes = /* @__PURE__ */ __name(async (app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
376
|
+
await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
314
377
|
addDataLakeRoutes(app);
|
|
315
378
|
addNodeRoutes(app);
|
|
316
379
|
}, "addRoutes");
|
|
317
380
|
|
|
318
381
|
// src/server/app.ts
|
|
319
|
-
var getApp = /* @__PURE__ */ __name(async (node,
|
|
382
|
+
var getApp = /* @__PURE__ */ __name(async (node, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache) => {
|
|
320
383
|
addInstrumentation();
|
|
321
384
|
const app = express2();
|
|
322
385
|
app.set("etag", false);
|
|
@@ -331,53 +394,23 @@ var getApp = /* @__PURE__ */ __name(async (node, transferSummaryMap, stakedChain
|
|
|
331
394
|
app.use(customPoweredByHeader);
|
|
332
395
|
disableCaseSensitiveRouting(app);
|
|
333
396
|
app.node = node;
|
|
334
|
-
await addRoutes(app,
|
|
397
|
+
await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache);
|
|
335
398
|
app.use(standardErrors);
|
|
336
399
|
return app;
|
|
337
400
|
}, "getApp");
|
|
338
401
|
|
|
339
402
|
// src/server/server.ts
|
|
340
403
|
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
341
|
-
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap,
|
|
342
|
-
import { createGenesisBlock
|
|
343
|
-
import {
|
|
344
|
-
import {
|
|
345
|
-
import { readPayloadMapFromStore, SimpleAccountBalanceViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
346
|
-
import { Semaphore as Semaphore2 } from "async-mutex";
|
|
404
|
+
import { createProducerChainStakeIntentBlock, initBalanceSummaryMap, initProducerAccount, initServerNode, initServerWallet, initStakeViewer, initTransferSummaryMap } from "@xyo-network/chain-orchestration";
|
|
405
|
+
import { createGenesisBlock } from "@xyo-network/chain-protocol";
|
|
406
|
+
import { asXL1, asXL1BlockRange, XL1Amount } from "@xyo-network/xl1-protocol";
|
|
407
|
+
import { findMostRecentBlock, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
347
408
|
var hostname = "::";
|
|
348
|
-
async function
|
|
349
|
-
const { config, logger, node: providedNode } = context;
|
|
350
|
-
const { port } = context.config.api;
|
|
351
|
-
const wallet = await initServerWallet({
|
|
352
|
-
config,
|
|
353
|
-
logger
|
|
354
|
-
});
|
|
355
|
-
const stakeChainViewer = await initChainStakeViewer(config, logger);
|
|
356
|
-
const balanceSummaryMap = assertEx3(await initBalanceSummaryMap({
|
|
357
|
-
config,
|
|
358
|
-
logger
|
|
359
|
-
}), () => "Balance Summary Map not initialized");
|
|
360
|
-
const transferSummaryMap = assertEx3(await initTransferSummaryMap({
|
|
361
|
-
config,
|
|
362
|
-
logger
|
|
363
|
-
}), () => "Transfer Summary Map not initialized");
|
|
364
|
-
const { node, chainArchivist } = await initServerNode({
|
|
365
|
-
config,
|
|
366
|
-
logger,
|
|
367
|
-
wallet,
|
|
368
|
-
node: providedNode,
|
|
369
|
-
transferSummaryMap,
|
|
370
|
-
balanceSummaryMap
|
|
371
|
-
});
|
|
409
|
+
async function initChainMap({ chainArchivist, chainId, logger, config, producerAccount }) {
|
|
372
410
|
const chainMap = readPayloadMapFromStore(chainArchivist);
|
|
373
411
|
const payloads = await chainArchivist.next();
|
|
374
412
|
if (payloads.length === 0) {
|
|
375
413
|
logger?.warn("[API] No blocks found in chain archivist, creating genesis block");
|
|
376
|
-
const producerAccount = await initProducerAccount({
|
|
377
|
-
config,
|
|
378
|
-
logger
|
|
379
|
-
});
|
|
380
|
-
const chainId = stakeChainViewer.chainId;
|
|
381
414
|
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address;
|
|
382
415
|
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1000000n)).atto, genesisRewardAddress);
|
|
383
416
|
await chainArchivist.insert([
|
|
@@ -395,9 +428,13 @@ async function getServer(context) {
|
|
|
395
428
|
]);
|
|
396
429
|
console.log(`[API] Producer declared: ${producerAccount.address}`);
|
|
397
430
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
431
|
+
return chainMap;
|
|
432
|
+
}
|
|
433
|
+
__name(initChainMap, "initChainMap");
|
|
434
|
+
function initStakedChainContextRead({ chainArchivist, chainId, stakeViewer, chainMap }) {
|
|
435
|
+
return {
|
|
436
|
+
chainId,
|
|
437
|
+
stake: stakeViewer,
|
|
401
438
|
store: {
|
|
402
439
|
chainMap
|
|
403
440
|
},
|
|
@@ -409,36 +446,58 @@ async function getServer(context) {
|
|
|
409
446
|
];
|
|
410
447
|
}, "head")
|
|
411
448
|
};
|
|
449
|
+
}
|
|
450
|
+
__name(initStakedChainContextRead, "initStakedChainContextRead");
|
|
451
|
+
async function getServer(context) {
|
|
452
|
+
const { config, logger, node: providedNode } = context;
|
|
453
|
+
const { port } = context.config.api;
|
|
454
|
+
const wallet = await initServerWallet({
|
|
455
|
+
config,
|
|
456
|
+
logger
|
|
457
|
+
});
|
|
458
|
+
const stakeViewer = await initStakeViewer(config, logger);
|
|
459
|
+
const balancesSummaryMap = assertEx3(await initBalanceSummaryMap({
|
|
460
|
+
config,
|
|
461
|
+
logger
|
|
462
|
+
}), () => "Balance Summary Map not initialized");
|
|
463
|
+
const transfersSummaryMap = assertEx3(await initTransferSummaryMap({
|
|
464
|
+
config,
|
|
465
|
+
logger
|
|
466
|
+
}), () => "Transfer Summary Map not initialized");
|
|
467
|
+
const { node, chainArchivist } = await initServerNode({
|
|
468
|
+
config,
|
|
469
|
+
logger,
|
|
470
|
+
wallet,
|
|
471
|
+
node: providedNode,
|
|
472
|
+
transfersSummaryMap,
|
|
473
|
+
balancesSummaryMap
|
|
474
|
+
});
|
|
475
|
+
const chainId = stakeViewer.chainId;
|
|
476
|
+
const producerAccount = await initProducerAccount({
|
|
477
|
+
config,
|
|
478
|
+
logger
|
|
479
|
+
});
|
|
480
|
+
const chainMap = await initChainMap({
|
|
481
|
+
...context,
|
|
482
|
+
chainArchivist,
|
|
483
|
+
chainId,
|
|
484
|
+
producerAccount
|
|
485
|
+
});
|
|
486
|
+
const stakedChainContext = initStakedChainContextRead({
|
|
487
|
+
...context,
|
|
488
|
+
chainArchivist,
|
|
489
|
+
chainId,
|
|
490
|
+
chainMap,
|
|
491
|
+
stakeViewer
|
|
492
|
+
});
|
|
412
493
|
const mods = await node.resolve("*");
|
|
413
494
|
await Promise.all(mods.map((mod) => {
|
|
414
495
|
return mod.start?.() ?? (() => true);
|
|
415
496
|
}));
|
|
416
|
-
const
|
|
497
|
+
const app = await getApp(node, {
|
|
417
498
|
config,
|
|
418
|
-
logger
|
|
419
|
-
|
|
420
|
-
head: assertEx3(await findMostRecentBlock(chainArchivist), () => "No head found in chainArchivist")
|
|
421
|
-
});
|
|
422
|
-
const blockViewer = blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist);
|
|
423
|
-
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
424
|
-
context: {
|
|
425
|
-
chainId: stakedChainContext.chainId,
|
|
426
|
-
store: stakedChainContext.store,
|
|
427
|
-
head: stakedChainContext.head,
|
|
428
|
-
stepSemaphores: StepSizes2.map(() => new Semaphore2(20)),
|
|
429
|
-
summaryMap: balanceSummaryMap
|
|
430
|
-
},
|
|
431
|
-
transferContext: {
|
|
432
|
-
chainId: stakedChainContext.chainId,
|
|
433
|
-
store: stakedChainContext.store,
|
|
434
|
-
head: stakedChainContext.head,
|
|
435
|
-
stepSemaphores: StepSizes2.map(() => new Semaphore2(20)),
|
|
436
|
-
summaryMap: transferSummaryMap
|
|
437
|
-
},
|
|
438
|
-
blockViewer
|
|
439
|
-
});
|
|
440
|
-
assertEx3(await accountBalanceViewer.start(), () => "Failed to start SimpleAccountBalanceViewer");
|
|
441
|
-
const app = await getApp(node, transferSummaryMap, stakedChainContext, accountBalanceViewer, config.api.initRewardsCache);
|
|
499
|
+
logger
|
|
500
|
+
}, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache);
|
|
442
501
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
|
|
443
502
|
server.setTimeout(2e4);
|
|
444
503
|
return server;
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n await addRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport { SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer } from '@xyo-network/chain-viewers'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { RewardMultipliers } 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\nexport const addRpcRoutes = async (\n app: Express,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n const runner = new NodeXyoRunner(node)\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n accountBalanceViewer,\n context: stakedChainContext,\n transfersSummaryContext: {\n ...stakedChainContext, stepSemaphores: StepSizes.map(() => new Semaphore(20)), summaryMap: transferSummaryMap,\n },\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\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 connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection, networkStakeViewer)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n AccountBalanceViewer,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n transferSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n accountBalanceViewer: AccountBalanceViewer,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, transferSummaryMap, stakedChainContext, accountBalanceViewer, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initChainIterator,\n initChainStakeViewer, initProducerAccount,\n initServerNode,\n initServerWallet,\n initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock, findMostRecentBlock } from '@xyo-network/chain-protocol'\nimport { blockViewerFromChainIteratorAndArchivist } from '@xyo-network/chain-services'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asXL1, asXL1BlockRange, StepSizes, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type { Config, StakedChainContextRead } from '@xyo-network/xl1-protocol-sdk'\nimport { readPayloadMapFromStore, SimpleAccountBalanceViewer } from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeChainViewer = await initChainStakeViewer(config, logger)\n\n const balanceSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transferSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transferSummaryMap,\n balanceSummaryMap,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const producerAccount = await initProducerAccount({ config, logger })\n const chainId = stakeChainViewer.chainId\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n const stakedChainContext: StakedChainContextRead = {\n chainId: stakeChainViewer.chainId,\n stake: stakeChainViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n }\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainIterator = await initChainIterator({\n config,\n logger,\n chainMap,\n head: assertEx(await findMostRecentBlock(chainArchivist), () => 'No head found in chainArchivist'),\n })\n\n const blockViewer = blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist)\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n context: {\n chainId: stakedChainContext.chainId,\n store: stakedChainContext.store,\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balanceSummaryMap,\n },\n transferContext: {\n chainId: stakedChainContext.chainId,\n store: stakedChainContext.store,\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n },\n blockViewer,\n })\n\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n\n const app = await getApp(node, transferSummaryMap, stakedChainContext, accountBalanceViewer, config.api.initRewardsCache)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","StepSizes","RewardMultipliers","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","addRpcRoutes","app","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","node","runner","NodeXyoRunner","networkStakeViewer","SimpleNetworkStakeViewer","create","context","console","log","assertEx","start","viewer","NodeXyoViewer","rewardMultipliers","RewardMultipliers","transfersSummaryContext","stepSemaphores","StepSizes","map","Semaphore","summaryMap","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","transferSummaryMap","stakedChainContext","accountBalanceViewer","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initChainIterator","initChainStakeViewer","initProducerAccount","initServerNode","initServerWallet","initTransferSummaryMap","createGenesisBlock","findMostRecentBlock","blockViewerFromChainIteratorAndArchivist","asXL1","asXL1BlockRange","StepSizes","XL1Amount","readPayloadMapFromStore","SimpleAccountBalanceViewer","Semaphore","hostname","getServer","context","config","logger","node","providedNode","port","api","wallet","initServerWallet","stakeChainViewer","initChainStakeViewer","balanceSummaryMap","assertEx","initBalanceSummaryMap","transferSummaryMap","initTransferSummaryMap","chainArchivist","initServerNode","chainMap","readPayloadMapFromStore","payloads","next","length","warn","producerAccount","initProducerAccount","chainId","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","stakedChainContext","stake","store","head","findMostRecentBlock","_hash","block","mods","resolve","Promise","all","map","mod","start","chainIterator","initChainIterator","blockViewer","blockViewerFromChainIteratorAndArchivist","accountBalanceViewer","SimpleAccountBalanceViewer","create","stepSemaphores","StepSizes","Semaphore","summaryMap","transferContext","app","getApp","initRewardsCache","server","listen","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { AppContext } from '../model.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (\n node: NodeInstance,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'\nimport { NodeXyoViewer } from '@xyo-network/chain-rpc'\nimport {\n SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,\n} from '@xyo-network/chain-viewers'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n BalancesStepSummary,\n BalanceStepSummaryContext,\n MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,\n SimpleMempoolViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,\n} from '@xyo-network/xl1-rpc'\nimport { Semaphore } from 'async-mutex'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../../../model.ts'\n\nasync function chainArchivistFromNode(node: NodeInstance) {\n const chainArchivist = assertEx(asArchivistInstance(\n await node.resolve('Chain:Validated'),\n { required: true },\n ), () => 'FinalizedArchivist not found in node')\n return chainArchivist\n}\n\n// eslint-disable-next-line max-statements\nexport const addRpcRoutes = async (\n app: Express,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n const { node } = app\n\n const finalizedArchivist = await chainArchivistFromNode(node)\n\n const balancesStepSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: balancesSummaryMap,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n head: stakedChainContext.head,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n store: stakedChainContext.store,\n chainId: stakedChainContext.chainId,\n summaryMap: transfersSummaryMap,\n } satisfies TransfersStepSummaryContext\n\n const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })\n const pendingBlocksArchivist = await initPendingBlockArchivist(context)\n const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)\n\n console.log('Initializing SimpleNetworkStakeViewer...')\n assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')\n console.log('Initialized SimpleNetworkStakeViewer.')\n\n const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })\n\n console.log('Initializing SimpleBlockViewer...')\n assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')\n console.log('Initialized SimpleBlockViewer.')\n\n const accountBalanceViewer = await SimpleAccountBalanceViewer.create({\n blockViewer,\n context: balancesStepSummaryContext,\n transfersSummaryContext,\n })\n\n console.log('Initializing SimpleAccountBalanceViewer...')\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')\n console.log('Initialized SimpleAccountBalanceViewer.')\n\n const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({\n context: stakedChainContext,\n rewardMultipliers: RewardMultipliers,\n })\n\n console.log('Initializing SimpleStepRewardsByPositionViewer...')\n assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')\n console.log('Initialized SimpleStepRewardsByPositionViewer.')\n\n const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }\n const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })\n\n console.log('Initializing SimpleStepViewer...')\n assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')\n console.log('Initialized SimpleStepViewer.')\n\n const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })\n\n console.log('Initializing SimpleMempoolViewer...')\n assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')\n console.log('Initialized SimpleMempoolViewer.')\n\n const viewer = await NodeXyoViewer.create({\n node,\n rewardMultipliers: RewardMultipliers,\n initRewardsCache,\n blockViewer,\n context: stakedChainContext,\n networkStakeViewer,\n accountBalanceViewer,\n stepViewer,\n transfersSummaryContext,\n mempoolViewer,\n })\n\n console.log('Initializing NodeXyoViewer...')\n assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')\n console.log('Initialized NodeXyoViewer.')\n\n const runner = await NodeXyoRunner.create({ node })\n\n console.log('Initializing NodeXyoRunner...')\n assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')\n console.log('Initialized NodeXyoRunner.')\n\n const connection = new XyoBaseConnection({ runner, viewer })\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type {\n BalancesStepSummary,\n MapType, StakedChainContextRead, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport type { AppContext } from '../../model.ts'\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n context: AppContext,\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,\n stakedChainContext: StakedChainContextRead,\n initRewardsCache?: boolean,\n) => {\n await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ConfigContext } from '@xyo-network/chain-orchestration'\nimport {\n createProducerChainStakeIntentBlock,\n initBalanceSummaryMap,\n initProducerAccount,\n initServerNode,\n initServerWallet,\n initStakeViewer, initTransferSummaryMap,\n} from '@xyo-network/chain-orchestration'\nimport { createGenesisBlock } from '@xyo-network/chain-protocol'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport {\n asXL1, asXL1BlockRange, XL1Amount,\n} from '@xyo-network/xl1-protocol'\nimport type {\n Config, PayloadMapRead, StakedChainContextRead,\n StakeViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nasync function initChainMap({\n chainArchivist, chainId, logger, config, producerAccount,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n producerAccount: AccountInstance\n}>) {\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)\n\n const payloads = await chainArchivist.next()\n\n if (payloads.length === 0) {\n logger?.warn('[API] No blocks found in chain archivist, creating genesis block')\n const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address\n const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)\n await chainArchivist.insert([...block0[1].flat(), block0[0]])\n console.log('[API] Genesis block created and inserted into chain archivist')\n const block1 = await createProducerChainStakeIntentBlock(block0[0], producerAccount, asXL1BlockRange([0, 10_000], true))\n await chainArchivist.insert([...block1[1].flat(), block1[0]])\n console.log(`[API] Producer declared: ${producerAccount.address}`)\n }\n\n return chainMap\n}\n\nfunction initStakedChainContextRead({\n chainArchivist, chainId, stakeViewer, chainMap,\n}: ConfigContext<{\n chainArchivist: ArchivistInstance\n chainId: ChainId\n chainMap: PayloadMapRead<WithStorageMeta<Payload>>\n stakeViewer: StakeViewer\n}>) {\n return {\n chainId,\n stake: stakeViewer,\n store: { chainMap },\n head: async (): Promise<[Hash, number]> => {\n const head = await findMostRecentBlock(chainArchivist)\n return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]\n },\n } satisfies StakedChainContextRead\n}\n\nexport async function getServer(context: GetServerContext) {\n const {\n config, logger, node: providedNode,\n } = context\n const { port } = context.config.api\n const wallet = await initServerWallet({ config, logger })\n const stakeViewer = await initStakeViewer(config, logger)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')\n\n const { node, chainArchivist } = await initServerNode({\n config,\n logger,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n const chainId = stakeViewer.chainId\n\n const producerAccount = await initProducerAccount({ config, logger })\n const chainMap = await initChainMap({\n ...context, chainArchivist, chainId, producerAccount,\n })\n\n const stakedChainContext = initStakedChainContextRead({\n ...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,\n })\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","assertEx","asArchivistInstance","initPendingBlockArchivist","initPendingTransactionArchivist","NodeXyoViewer","SimpleNetworkStakeViewer","SimpleStepRewardsByPositionViewer","SimpleStepViewer","StepSizes","RewardMultipliers","SimpleAccountBalanceViewer","SimpleBlockViewer","SimpleMempoolViewer","NodeXyoRunner","rpcEngineFromConnection","XyoBaseConnection","Semaphore","chainArchivistFromNode","node","chainArchivist","assertEx","asArchivistInstance","resolve","required","addRpcRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","finalizedArchivist","balancesStepSummaryContext","head","stepSemaphores","StepSizes","map","Semaphore","store","chainId","summaryMap","transfersSummaryContext","networkStakeViewer","SimpleNetworkStakeViewer","create","pendingBlocksArchivist","initPendingBlockArchivist","pendingTransactionsArchivist","initPendingTransactionArchivist","console","log","start","blockViewer","SimpleBlockViewer","accountBalanceViewer","SimpleAccountBalanceViewer","stepRewardsByPositionViewer","SimpleStepRewardsByPositionViewer","rewardMultipliers","RewardMultipliers","networkStakeStepRewardsViewer","position","stepViewer","SimpleStepViewer","chainContext","mempoolViewer","SimpleMempoolViewer","viewer","NodeXyoViewer","runner","NodeXyoRunner","connection","XyoBaseConnection","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","node","context","transfersSummaryMap","balancesSummaryMap","stakedChainContext","initRewardsCache","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","createProducerChainStakeIntentBlock","initBalanceSummaryMap","initProducerAccount","initServerNode","initServerWallet","initStakeViewer","initTransferSummaryMap","createGenesisBlock","asXL1","asXL1BlockRange","XL1Amount","findMostRecentBlock","readPayloadMapFromStore","hostname","initChainMap","chainArchivist","chainId","logger","config","producerAccount","chainMap","readPayloadMapFromStore","payloads","next","length","warn","genesisRewardAddress","chain","address","block0","createGenesisBlock","XL1Amount","fromXL1","asXL1","atto","insert","flat","console","log","block1","createProducerChainStakeIntentBlock","asXL1BlockRange","initStakedChainContextRead","stakeViewer","stake","store","head","findMostRecentBlock","assertEx","_hash","block","getServer","context","node","providedNode","port","api","wallet","initServerWallet","initStakeViewer","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","initServerNode","initProducerAccount","stakedChainContext","mods","resolve","Promise","all","map","mod","start","app","getApp","initRewardsCache","server","listen","setTimeout"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAExE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
2
2
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type {
|
|
3
|
+
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
4
4
|
import type { Express } from 'express';
|
|
5
|
-
|
|
5
|
+
import type { AppContext } from '../model.ts';
|
|
6
|
+
export declare const getApp: (node: NodeInstance, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<Express>;
|
|
6
7
|
//# sourceMappingURL=app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,eAAO,MAAM,MAAM,GACjB,MAAM,YAAY,EAClB,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,KACzB,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
|
|
4
|
+
import type { AppContext } from '../../model.ts';
|
|
5
|
+
export declare const addRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
5
6
|
//# sourceMappingURL=addRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"addRoutes.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/addRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EACtD,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKhD,eAAO,MAAM,SAAS,GACpB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAK3B,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BalancesStepSummary, MapType, StakedChainContextRead, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
|
|
3
3
|
import type { Express } from 'express';
|
|
4
|
-
|
|
4
|
+
import type { AppContext } from '../../../../model.ts';
|
|
5
|
+
export declare const addRpcRoutes: (app: Express, context: AppContext, transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>, balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>, stakedChainContext: StakedChainContextRead, initRewardsCache?: boolean) => Promise<void>;
|
|
5
6
|
//# sourceMappingURL=addRpcRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EACV,mBAAmB,EAEnB,OAAO,EAAiC,sBAAsB,EAAE,oBAAoB,EAErF,MAAM,+BAA+B,CAAA;AAStC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAWtD,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,EACZ,SAAS,UAAU,EACnB,qBAAqB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAC3E,oBAAoB,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACzE,oBAAoB,sBAAsB,EAC1C,mBAAmB,OAAO,kBAoG3B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAclD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAM3D,OAAO,KAAK,EACV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAQtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AA8CD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,+GAwCxD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.1",
|
|
4
4
|
"description": "XYO Layer One API",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -52,54 +52,54 @@
|
|
|
52
52
|
"@opentelemetry/instrumentation": "~0.208.0",
|
|
53
53
|
"@opentelemetry/instrumentation-express": "~0.57.0",
|
|
54
54
|
"@opentelemetry/instrumentation-http": "~0.208.0",
|
|
55
|
-
"@xylabs/express": "~5.0.
|
|
56
|
-
"@xylabs/sdk-js": "~5.0.
|
|
57
|
-
"@xyo-network/archivist-model": "~5.2.
|
|
58
|
-
"@xyo-network/boundwitness-model": "~5.2.
|
|
59
|
-
"@xyo-network/chain-orchestration": "~1.
|
|
60
|
-
"@xyo-network/chain-protocol": "~1.
|
|
61
|
-
"@xyo-network/chain-rpc": "~1.
|
|
62
|
-
"@xyo-network/chain-
|
|
63
|
-
"@xyo-network/
|
|
64
|
-
"@xyo-network/module-
|
|
65
|
-
"@xyo-network/
|
|
66
|
-
"@xyo-network/
|
|
67
|
-
"@xyo-network/payload-
|
|
68
|
-
"@xyo-network/
|
|
69
|
-
"@xyo-network/xl1-protocol": "~1.
|
|
70
|
-
"@xyo-network/xl1-
|
|
71
|
-
"@xyo-network/xl1-rpc": "~1.16.26",
|
|
55
|
+
"@xylabs/express": "~5.0.48",
|
|
56
|
+
"@xylabs/sdk-js": "~5.0.48",
|
|
57
|
+
"@xyo-network/archivist-model": "~5.2.13",
|
|
58
|
+
"@xyo-network/boundwitness-model": "~5.2.13",
|
|
59
|
+
"@xyo-network/chain-orchestration": "~1.17.1",
|
|
60
|
+
"@xyo-network/chain-protocol": "~1.17.1",
|
|
61
|
+
"@xyo-network/chain-rpc": "~1.17.1",
|
|
62
|
+
"@xyo-network/chain-viewers": "~1.17.1",
|
|
63
|
+
"@xyo-network/module-abstract": "~5.2.13",
|
|
64
|
+
"@xyo-network/module-model": "~5.2.13",
|
|
65
|
+
"@xyo-network/node-model": "~5.2.13",
|
|
66
|
+
"@xyo-network/payload-builder": "~5.2.13",
|
|
67
|
+
"@xyo-network/payload-model": "~5.2.13",
|
|
68
|
+
"@xyo-network/xl1-protocol": "~1.14.16",
|
|
69
|
+
"@xyo-network/xl1-protocol-sdk": "~1.17.1",
|
|
70
|
+
"@xyo-network/xl1-rpc": "~1.17.1",
|
|
72
71
|
"async-mutex": "~0.5.0",
|
|
73
72
|
"compression": "~1.8.1",
|
|
74
73
|
"cors": "~2.8.5",
|
|
75
74
|
"ethers": "~6.15.0",
|
|
76
|
-
"express": "~5.1
|
|
75
|
+
"express": "~5.2.1",
|
|
77
76
|
"http-status-codes": "~2.3.0"
|
|
78
77
|
},
|
|
79
78
|
"devDependencies": {
|
|
80
79
|
"@types/compression": "~1.8.1",
|
|
81
80
|
"@types/cors": "~2.8.19",
|
|
82
|
-
"@types/express": "5.0.
|
|
81
|
+
"@types/express": "5.0.6",
|
|
83
82
|
"@types/express-serve-static-core": "~5.1.0",
|
|
84
83
|
"@types/node": "~24.10.1",
|
|
85
|
-
"@xylabs/sdk-js": "~5.0.
|
|
84
|
+
"@xylabs/sdk-js": "~5.0.48",
|
|
86
85
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
87
86
|
"@xylabs/tsconfig": "~7.2.8",
|
|
88
|
-
"@xyo-network/account": "~5.2.
|
|
89
|
-
"@xyo-network/account-model": "~5.2.
|
|
90
|
-
"@xyo-network/archivist-abstract": "~5.2.
|
|
87
|
+
"@xyo-network/account": "~5.2.13",
|
|
88
|
+
"@xyo-network/account-model": "~5.2.13",
|
|
89
|
+
"@xyo-network/archivist-abstract": "~5.2.13",
|
|
91
90
|
"@xyo-network/bios-model": "~7.2.0",
|
|
92
|
-
"@xyo-network/boundwitness-builder": "~5.2.
|
|
93
|
-
"@xyo-network/
|
|
94
|
-
"@xyo-network/module-
|
|
95
|
-
"@xyo-network/
|
|
96
|
-
"@xyo-network/
|
|
91
|
+
"@xyo-network/boundwitness-builder": "~5.2.13",
|
|
92
|
+
"@xyo-network/chain-services": "~1.17.1",
|
|
93
|
+
"@xyo-network/module-abstract-mongodb": "~5.2.13",
|
|
94
|
+
"@xyo-network/module-model-mongodb": "~5.2.13",
|
|
95
|
+
"@xyo-network/node-memory": "~5.2.13",
|
|
96
|
+
"@xyo-network/xl1-protocol": "~1.14.16",
|
|
97
97
|
"dotenv": "~17.2.3",
|
|
98
98
|
"eslint": "^9.39.1",
|
|
99
99
|
"nodemon": "~3.1.11",
|
|
100
100
|
"tslib": "~2.8.1",
|
|
101
101
|
"typescript": "~5.9.3",
|
|
102
|
-
"vitest": "~4.0.
|
|
102
|
+
"vitest": "~4.0.15",
|
|
103
103
|
"vitest-mock-extended": "~3.1.0"
|
|
104
104
|
},
|
|
105
105
|
"engines": {
|
package/src/index.ts
CHANGED
package/src/model.ts
ADDED
package/src/server/app.ts
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
12
12
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
13
13
|
import type {
|
|
14
|
-
|
|
14
|
+
BalancesStepSummary,
|
|
15
15
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
16
16
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
17
17
|
import compression from 'compression'
|
|
@@ -19,14 +19,16 @@ import cors from 'cors'
|
|
|
19
19
|
import type { Express } from 'express'
|
|
20
20
|
import express from 'express'
|
|
21
21
|
|
|
22
|
+
import type { AppContext } from '../model.ts'
|
|
22
23
|
import { addInstrumentation } from './instrumentation.ts'
|
|
23
24
|
import { addRoutes } from './routes/index.ts'
|
|
24
25
|
|
|
25
26
|
export const getApp = async (
|
|
26
27
|
node: NodeInstance,
|
|
27
|
-
|
|
28
|
+
context: AppContext,
|
|
29
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
30
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
28
31
|
stakedChainContext: StakedChainContextRead,
|
|
29
|
-
accountBalanceViewer: AccountBalanceViewer,
|
|
30
32
|
initRewardsCache?: boolean,
|
|
31
33
|
): Promise<Express> => {
|
|
32
34
|
addInstrumentation()
|
|
@@ -42,7 +44,7 @@ export const getApp = async (
|
|
|
42
44
|
app.use(customPoweredByHeader)
|
|
43
45
|
disableCaseSensitiveRouting(app)
|
|
44
46
|
app.node = node
|
|
45
|
-
await addRoutes(app,
|
|
47
|
+
await addRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
46
48
|
app.use(standardErrors)
|
|
47
49
|
return app
|
|
48
50
|
}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
2
2
|
import type {
|
|
3
|
-
|
|
3
|
+
BalancesStepSummary,
|
|
4
4
|
MapType, StakedChainContextRead, TransfersStepSummary,
|
|
5
5
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
6
6
|
import type { Express } from 'express'
|
|
7
7
|
|
|
8
|
+
import type { AppContext } from '../../model.ts'
|
|
8
9
|
import { addNodeRoutes } from './address/index.ts'
|
|
9
10
|
import { addDataLakeRoutes } from './dataLake/index.ts'
|
|
10
11
|
import { addRpcRoutes } from './rpc/index.ts'
|
|
11
12
|
|
|
12
13
|
export const addRoutes = async (
|
|
13
14
|
app: Express,
|
|
14
|
-
|
|
15
|
+
context: AppContext,
|
|
16
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
17
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
15
18
|
stakedChainContext: StakedChainContextRead,
|
|
16
|
-
accountBalanceViewer: AccountBalanceViewer,
|
|
17
19
|
initRewardsCache?: boolean,
|
|
18
20
|
) => {
|
|
19
|
-
await addRpcRoutes(app,
|
|
21
|
+
await addRpcRoutes(app, context, transfersSummaryMap, balancesSummaryMap, stakedChainContext, initRewardsCache)
|
|
20
22
|
addDataLakeRoutes(app)
|
|
21
23
|
addNodeRoutes(app)
|
|
22
24
|
}
|
|
@@ -1,61 +1,140 @@
|
|
|
1
1
|
import { setRawResponseFormat } from '@xylabs/express'
|
|
2
2
|
import { assertEx } from '@xylabs/sdk-js'
|
|
3
|
+
import { asArchivistInstance } from '@xyo-network/archivist-model'
|
|
4
|
+
import { initPendingBlockArchivist, initPendingTransactionArchivist } from '@xyo-network/chain-orchestration'
|
|
3
5
|
import { NodeXyoViewer } from '@xyo-network/chain-rpc'
|
|
4
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
SimpleNetworkStakeViewer, SimpleStepRewardsByPositionViewer, SimpleStepViewer,
|
|
8
|
+
} from '@xyo-network/chain-viewers'
|
|
9
|
+
import type { NodeInstance } from '@xyo-network/node-model'
|
|
5
10
|
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
6
11
|
import { StepSizes } from '@xyo-network/xl1-protocol'
|
|
7
12
|
import type {
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
BalancesStepSummary,
|
|
14
|
+
BalanceStepSummaryContext,
|
|
15
|
+
MapType, NetworkStakeStepRewardsViewer, StakedChainContextRead, TransfersStepSummary,
|
|
16
|
+
TransfersStepSummaryContext,
|
|
17
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
18
|
+
import {
|
|
19
|
+
RewardMultipliers, SimpleAccountBalanceViewer, SimpleBlockViewer,
|
|
20
|
+
SimpleMempoolViewer,
|
|
10
21
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
11
|
-
import { RewardMultipliers } from '@xyo-network/xl1-protocol-sdk'
|
|
12
22
|
import {
|
|
13
23
|
NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection,
|
|
14
24
|
} from '@xyo-network/xl1-rpc'
|
|
15
25
|
import { Semaphore } from 'async-mutex'
|
|
16
26
|
import type { Express } from 'express'
|
|
17
27
|
|
|
28
|
+
import type { AppContext } from '../../../../model.ts'
|
|
29
|
+
|
|
30
|
+
async function chainArchivistFromNode(node: NodeInstance) {
|
|
31
|
+
const chainArchivist = assertEx(asArchivistInstance(
|
|
32
|
+
await node.resolve('Chain:Validated'),
|
|
33
|
+
{ required: true },
|
|
34
|
+
), () => 'FinalizedArchivist not found in node')
|
|
35
|
+
return chainArchivist
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// eslint-disable-next-line max-statements
|
|
18
39
|
export const addRpcRoutes = async (
|
|
19
40
|
app: Express,
|
|
20
|
-
|
|
41
|
+
context: AppContext,
|
|
42
|
+
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>,
|
|
43
|
+
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>,
|
|
21
44
|
stakedChainContext: StakedChainContextRead,
|
|
22
|
-
accountBalanceViewer: AccountBalanceViewer,
|
|
23
45
|
initRewardsCache?: boolean,
|
|
24
46
|
) => {
|
|
25
47
|
const { node } = app
|
|
26
|
-
|
|
48
|
+
|
|
49
|
+
const finalizedArchivist = await chainArchivistFromNode(node)
|
|
50
|
+
|
|
51
|
+
const balancesStepSummaryContext = {
|
|
52
|
+
head: stakedChainContext.head,
|
|
53
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
54
|
+
store: stakedChainContext.store,
|
|
55
|
+
chainId: stakedChainContext.chainId,
|
|
56
|
+
summaryMap: balancesSummaryMap,
|
|
57
|
+
} satisfies BalanceStepSummaryContext
|
|
58
|
+
|
|
59
|
+
const transfersSummaryContext = {
|
|
60
|
+
head: stakedChainContext.head,
|
|
61
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
62
|
+
store: stakedChainContext.store,
|
|
63
|
+
chainId: stakedChainContext.chainId,
|
|
64
|
+
summaryMap: transfersSummaryMap,
|
|
65
|
+
} satisfies TransfersStepSummaryContext
|
|
66
|
+
|
|
27
67
|
const networkStakeViewer = await SimpleNetworkStakeViewer.create({ context: stakedChainContext })
|
|
68
|
+
const pendingBlocksArchivist = await initPendingBlockArchivist(context)
|
|
69
|
+
const pendingTransactionsArchivist = await initPendingTransactionArchivist(context)
|
|
28
70
|
|
|
29
71
|
console.log('Initializing SimpleNetworkStakeViewer...')
|
|
30
72
|
assertEx(await networkStakeViewer.start(), () => 'Failed to start SimpleNetworkStakeViewer')
|
|
31
73
|
console.log('Initialized SimpleNetworkStakeViewer.')
|
|
32
74
|
|
|
75
|
+
const blockViewer = await SimpleBlockViewer.create({ context: stakedChainContext, finalizedArchivist })
|
|
76
|
+
|
|
77
|
+
console.log('Initializing SimpleBlockViewer...')
|
|
78
|
+
assertEx(await blockViewer.start(), () => 'Failed to start SimpleBlockViewer')
|
|
79
|
+
console.log('Initialized SimpleBlockViewer.')
|
|
80
|
+
|
|
81
|
+
const accountBalanceViewer = await SimpleAccountBalanceViewer.create({
|
|
82
|
+
blockViewer,
|
|
83
|
+
context: balancesStepSummaryContext,
|
|
84
|
+
transfersSummaryContext,
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
console.log('Initializing SimpleAccountBalanceViewer...')
|
|
88
|
+
assertEx(await accountBalanceViewer.start(), () => 'Failed to start SimpleAccountBalanceViewer')
|
|
89
|
+
console.log('Initialized SimpleAccountBalanceViewer.')
|
|
90
|
+
|
|
91
|
+
const stepRewardsByPositionViewer = await SimpleStepRewardsByPositionViewer.create({
|
|
92
|
+
context: stakedChainContext,
|
|
93
|
+
rewardMultipliers: RewardMultipliers,
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
console.log('Initializing SimpleStepRewardsByPositionViewer...')
|
|
97
|
+
assertEx(await stepRewardsByPositionViewer.start(), () => 'Failed to start SimpleStepRewardsByPositionViewer')
|
|
98
|
+
console.log('Initialized SimpleStepRewardsByPositionViewer.')
|
|
99
|
+
|
|
100
|
+
const networkStakeStepRewardsViewer: NetworkStakeStepRewardsViewer = { position: stepRewardsByPositionViewer }
|
|
101
|
+
const stepViewer = await SimpleStepViewer.create({ chainContext: stakedChainContext, networkStakeStepRewardsViewer })
|
|
102
|
+
|
|
103
|
+
console.log('Initializing SimpleStepViewer...')
|
|
104
|
+
assertEx(await stepViewer.start(), () => 'Failed to start SimpleStepViewer')
|
|
105
|
+
console.log('Initialized SimpleStepViewer.')
|
|
106
|
+
|
|
107
|
+
const mempoolViewer = await SimpleMempoolViewer.create({ pendingBlocksArchivist, pendingTransactionsArchivist })
|
|
108
|
+
|
|
109
|
+
console.log('Initializing SimpleMempoolViewer...')
|
|
110
|
+
assertEx(await mempoolViewer.start(), () => 'Failed to start SimpleMempoolViewer')
|
|
111
|
+
console.log('Initialized SimpleMempoolViewer.')
|
|
112
|
+
|
|
33
113
|
const viewer = await NodeXyoViewer.create({
|
|
34
114
|
node,
|
|
35
115
|
rewardMultipliers: RewardMultipliers,
|
|
36
116
|
initRewardsCache,
|
|
37
|
-
|
|
117
|
+
blockViewer,
|
|
38
118
|
context: stakedChainContext,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
119
|
+
networkStakeViewer,
|
|
120
|
+
accountBalanceViewer,
|
|
121
|
+
stepViewer,
|
|
122
|
+
transfersSummaryContext,
|
|
123
|
+
mempoolViewer,
|
|
42
124
|
})
|
|
43
125
|
|
|
44
126
|
console.log('Initializing NodeXyoViewer...')
|
|
45
127
|
assertEx(await viewer.start(), () => 'Failed to start NodeXyoViewer')
|
|
46
128
|
console.log('Initialized NodeXyoViewer.')
|
|
47
129
|
|
|
48
|
-
const
|
|
49
|
-
context: stakedChainContext,
|
|
50
|
-
rewardMultipliers: RewardMultipliers,
|
|
51
|
-
})
|
|
130
|
+
const runner = await NodeXyoRunner.create({ node })
|
|
52
131
|
|
|
53
|
-
console.log('Initializing
|
|
54
|
-
assertEx(await
|
|
55
|
-
console.log('Initialized
|
|
132
|
+
console.log('Initializing NodeXyoRunner...')
|
|
133
|
+
assertEx(await runner.start(), () => 'Failed to start NodeXyoRunner')
|
|
134
|
+
console.log('Initialized NodeXyoRunner.')
|
|
56
135
|
|
|
57
136
|
const connection = new XyoBaseConnection({ runner, viewer })
|
|
58
|
-
const engine = rpcEngineFromConnection(connection
|
|
137
|
+
const engine = rpcEngineFromConnection(connection)
|
|
59
138
|
|
|
60
139
|
app.post('/rpc', (req, res) => {
|
|
61
140
|
setRawResponseFormat(res)
|
package/src/server/server.ts
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import type { Hash, Logger } from '@xylabs/sdk-js'
|
|
2
2
|
import { assertEx } from '@xylabs/sdk-js'
|
|
3
|
+
import type { AccountInstance } from '@xyo-network/account-model'
|
|
4
|
+
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
5
|
+
import type { ConfigContext } from '@xyo-network/chain-orchestration'
|
|
3
6
|
import {
|
|
4
7
|
createProducerChainStakeIntentBlock,
|
|
5
8
|
initBalanceSummaryMap,
|
|
6
|
-
|
|
7
|
-
initChainStakeViewer, initProducerAccount,
|
|
9
|
+
initProducerAccount,
|
|
8
10
|
initServerNode,
|
|
9
11
|
initServerWallet,
|
|
10
|
-
initTransferSummaryMap,
|
|
12
|
+
initStakeViewer, initTransferSummaryMap,
|
|
11
13
|
} from '@xyo-network/chain-orchestration'
|
|
12
|
-
import { createGenesisBlock
|
|
13
|
-
import { blockViewerFromChainIteratorAndArchivist } from '@xyo-network/chain-services'
|
|
14
|
+
import { createGenesisBlock } from '@xyo-network/chain-protocol'
|
|
14
15
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
15
16
|
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
17
|
+
import type { ChainId } from '@xyo-network/xl1-protocol'
|
|
16
18
|
import {
|
|
17
|
-
asXL1, asXL1BlockRange,
|
|
19
|
+
asXL1, asXL1BlockRange, XL1Amount,
|
|
18
20
|
} from '@xyo-network/xl1-protocol'
|
|
19
|
-
import type {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
import type {
|
|
22
|
+
Config, PayloadMapRead, StakedChainContextRead,
|
|
23
|
+
StakeViewer,
|
|
24
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
25
|
+
import { findMostRecentBlock, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
|
|
22
26
|
|
|
23
27
|
import { getApp } from './app.ts'
|
|
24
28
|
|
|
@@ -31,34 +35,19 @@ interface GetServerContext {
|
|
|
31
35
|
node?: NodeInstance
|
|
32
36
|
}
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const balanceSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')
|
|
43
|
-
const transferSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
|
|
44
|
-
|
|
45
|
-
const { node, chainArchivist } = await initServerNode({
|
|
46
|
-
config,
|
|
47
|
-
logger,
|
|
48
|
-
wallet,
|
|
49
|
-
node: providedNode,
|
|
50
|
-
transferSummaryMap,
|
|
51
|
-
balanceSummaryMap,
|
|
52
|
-
})
|
|
53
|
-
|
|
38
|
+
async function initChainMap({
|
|
39
|
+
chainArchivist, chainId, logger, config, producerAccount,
|
|
40
|
+
}: ConfigContext<{
|
|
41
|
+
chainArchivist: ArchivistInstance
|
|
42
|
+
chainId: ChainId
|
|
43
|
+
producerAccount: AccountInstance
|
|
44
|
+
}>) {
|
|
54
45
|
const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(chainArchivist)
|
|
55
46
|
|
|
56
47
|
const payloads = await chainArchivist.next()
|
|
57
48
|
|
|
58
49
|
if (payloads.length === 0) {
|
|
59
50
|
logger?.warn('[API] No blocks found in chain archivist, creating genesis block')
|
|
60
|
-
const producerAccount = await initProducerAccount({ config, logger })
|
|
61
|
-
const chainId = stakeChainViewer.chainId
|
|
62
51
|
const genesisRewardAddress = config.chain.genesisRewardAddress ?? producerAccount.address
|
|
63
52
|
const block0 = await createGenesisBlock(producerAccount, chainId, XL1Amount.fromXL1(asXL1(1_000_000n)).atto, genesisRewardAddress)
|
|
64
53
|
await chainArchivist.insert([...block0[1].flat(), block0[0]])
|
|
@@ -68,50 +57,65 @@ export async function getServer(context: GetServerContext) {
|
|
|
68
57
|
console.log(`[API] Producer declared: ${producerAccount.address}`)
|
|
69
58
|
}
|
|
70
59
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
60
|
+
return chainMap
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function initStakedChainContextRead({
|
|
64
|
+
chainArchivist, chainId, stakeViewer, chainMap,
|
|
65
|
+
}: ConfigContext<{
|
|
66
|
+
chainArchivist: ArchivistInstance
|
|
67
|
+
chainId: ChainId
|
|
68
|
+
chainMap: PayloadMapRead<WithStorageMeta<Payload>>
|
|
69
|
+
stakeViewer: StakeViewer
|
|
70
|
+
}>) {
|
|
71
|
+
return {
|
|
72
|
+
chainId,
|
|
73
|
+
stake: stakeViewer,
|
|
74
74
|
store: { chainMap },
|
|
75
75
|
head: async (): Promise<[Hash, number]> => {
|
|
76
76
|
const head = await findMostRecentBlock(chainArchivist)
|
|
77
77
|
return [assertEx(head?._hash, () => 'No head found in chainArchivist'), head?.block ?? 0]
|
|
78
78
|
},
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
await Promise.all(mods.map((mod) => {
|
|
82
|
-
return mod.start?.() ?? (() => true)
|
|
83
|
-
}))
|
|
79
|
+
} satisfies StakedChainContextRead
|
|
80
|
+
}
|
|
84
81
|
|
|
85
|
-
|
|
82
|
+
export async function getServer(context: GetServerContext) {
|
|
83
|
+
const {
|
|
84
|
+
config, logger, node: providedNode,
|
|
85
|
+
} = context
|
|
86
|
+
const { port } = context.config.api
|
|
87
|
+
const wallet = await initServerWallet({ config, logger })
|
|
88
|
+
const stakeViewer = await initStakeViewer(config, logger)
|
|
89
|
+
|
|
90
|
+
const balancesSummaryMap = assertEx(await initBalanceSummaryMap({ config, logger }), () => 'Balance Summary Map not initialized')
|
|
91
|
+
const transfersSummaryMap = assertEx(await initTransferSummaryMap({ config, logger }), () => 'Transfer Summary Map not initialized')
|
|
92
|
+
|
|
93
|
+
const { node, chainArchivist } = await initServerNode({
|
|
86
94
|
config,
|
|
87
95
|
logger,
|
|
88
|
-
|
|
89
|
-
|
|
96
|
+
wallet,
|
|
97
|
+
node: providedNode,
|
|
98
|
+
transfersSummaryMap,
|
|
99
|
+
balancesSummaryMap,
|
|
90
100
|
})
|
|
91
101
|
|
|
92
|
-
const
|
|
102
|
+
const chainId = stakeViewer.chainId
|
|
93
103
|
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
},
|
|
102
|
-
transferContext: {
|
|
103
|
-
chainId: stakedChainContext.chainId,
|
|
104
|
-
store: stakedChainContext.store,
|
|
105
|
-
head: stakedChainContext.head,
|
|
106
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
107
|
-
summaryMap: transferSummaryMap,
|
|
108
|
-
},
|
|
109
|
-
blockViewer,
|
|
104
|
+
const producerAccount = await initProducerAccount({ config, logger })
|
|
105
|
+
const chainMap = await initChainMap({
|
|
106
|
+
...context, chainArchivist, chainId, producerAccount,
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
const stakedChainContext = initStakedChainContextRead({
|
|
110
|
+
...context, chainArchivist, chainId, chainMap, stakeViewer: stakeViewer,
|
|
110
111
|
})
|
|
111
112
|
|
|
112
|
-
|
|
113
|
+
const mods = await node.resolve('*')
|
|
114
|
+
await Promise.all(mods.map((mod) => {
|
|
115
|
+
return mod.start?.() ?? (() => true)
|
|
116
|
+
}))
|
|
113
117
|
|
|
114
|
-
const app = await getApp(node,
|
|
118
|
+
const app = await getApp(node, { config, logger }, transfersSummaryMap, balancesSummaryMap, stakedChainContext, config.api.initRewardsCache)
|
|
115
119
|
const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))
|
|
116
120
|
server.setTimeout(20_000)
|
|
117
121
|
return server
|