@xyo-network/chain-api 1.18.0 → 1.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/node/ApiActor.d.ts +26 -0
  2. package/dist/node/ApiActor.d.ts.map +1 -0
  3. package/dist/node/ApiContext.d.ts +1 -1
  4. package/dist/node/ApiContext.d.ts.map +1 -1
  5. package/dist/node/helpers/initChainId.d.ts +1 -1
  6. package/dist/node/helpers/initChainId.d.ts.map +1 -1
  7. package/dist/node/helpers/initEvmProvider.d.ts +1 -1
  8. package/dist/node/helpers/initEvmProvider.d.ts.map +1 -1
  9. package/dist/node/helpers/initInfuraProvider.d.ts +1 -1
  10. package/dist/node/helpers/initInfuraProvider.d.ts.map +1 -1
  11. package/dist/node/helpers/initJsonRpcProvider.d.ts +1 -1
  12. package/dist/node/helpers/initJsonRpcProvider.d.ts.map +1 -1
  13. package/dist/node/index.d.ts +2 -0
  14. package/dist/node/index.d.ts.map +1 -1
  15. package/dist/node/index.mjs +119 -16
  16. package/dist/node/index.mjs.map +1 -1
  17. package/dist/node/model.d.ts +1 -1
  18. package/dist/node/model.d.ts.map +1 -1
  19. package/dist/node/runApi.d.ts +9 -0
  20. package/dist/node/runApi.d.ts.map +1 -0
  21. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -1
  22. package/dist/node/server/server.d.ts +2 -2
  23. package/dist/node/server/server.d.ts.map +1 -1
  24. package/package.json +38 -39
  25. package/src/ApiActor.ts +54 -0
  26. package/src/ApiContext.ts +1 -1
  27. package/src/helpers/initChainId.ts +1 -1
  28. package/src/helpers/initEvmProvider.ts +1 -1
  29. package/src/helpers/initInfuraProvider.ts +1 -1
  30. package/src/helpers/initJsonRpcProvider.ts +1 -1
  31. package/src/index.ts +2 -0
  32. package/src/model.ts +1 -1
  33. package/src/runApi.ts +38 -0
  34. package/src/server/routes/rpc/routes/addRpcRoutes.ts +2 -3
  35. package/src/server/server.ts +43 -28
@@ -0,0 +1,26 @@
1
+ import { Actor, ActorParams } from '@xyo-network/xl1-sdk';
2
+ export type ApiActorParams = ActorParams<{}>;
3
+ export declare class ApiActor extends Actor<ApiActorParams> {
4
+ private server?;
5
+ static paramsHandler<T extends ApiActor>(params?: Partial<T['params']>): Promise<{
6
+ name?: import("@xylabs/sdk-js").CreatableName;
7
+ statusReporter?: import("@xylabs/sdk-js").CreatableStatusReporter<void> | undefined;
8
+ logger: import("@xylabs/sdk-js").Logger;
9
+ meterProvider?: import("@opentelemetry/api").MeterProvider;
10
+ traceProvider?: import("@opentelemetry/api").TracerProvider;
11
+ account: import("@xyo-network/account-model").AccountInstance;
12
+ context: import("@xyo-network/xl1-sdk").ActorContext;
13
+ displayName: string | (string & {
14
+ __baseClassName: true;
15
+ }) | undefined;
16
+ id: string | (string & {
17
+ __baseClassName: true;
18
+ });
19
+ }>;
20
+ createHandler(): Promise<void>;
21
+ startHandler(): Promise<void>;
22
+ stopHandler(): Promise<void>;
23
+ private startServer;
24
+ private stopServer;
25
+ }
26
+ //# sourceMappingURL=ApiActor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiActor.d.ts","sourceRoot":"","sources":["../../src/ApiActor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIzD,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,EAExC,CAAC,CAAA;AAEF,qBACa,QAAS,SAAQ,KAAK,CAAC,cAAc,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,CAAQ;WAED,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;;;;;;;;;;;;;;;IActE,aAAa;IAIb,YAAY;IAMZ,WAAW;YAKZ,WAAW;IAIzB,OAAO,CAAC,UAAU;CAInB"}
@@ -1,6 +1,6 @@
1
1
  import type { NodeInstance } from '@xyo-network/node-model';
2
2
  import type { WithStorageMeta } from '@xyo-network/payload-model';
3
- import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk';
3
+ import type { BalancesStepSummary, CreatableProviderContext, MapType, TransfersStepSummary } from '@xyo-network/xl1-sdk';
4
4
  export interface ApiContext extends CreatableProviderContext {
5
5
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
6
6
  node: NodeInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../src/ApiContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM,+BAA+B,CAAA;AAEtC,MAAM,WAAW,UAAW,SAAQ,wBAAwB;IAC1D,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,EAAE,YAAY,CAAA;IAClB,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
1
+ {"version":3,"file":"ApiContext.d.ts","sourceRoot":"","sources":["../../src/ApiContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,mBAAmB,EAAE,wBAAwB,EAAE,OAAO,EACtD,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,UAAW,SAAQ,wBAAwB;IAC1D,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,EAAE,YAAY,CAAA;IAClB,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAC5E"}
@@ -1,4 +1,4 @@
1
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
1
+ import type { Config } from '@xyo-network/xl1-sdk';
2
2
  export declare const canUseChainId: (config: Config) => boolean;
3
3
  export declare const getChainId: (config: Config) => number;
4
4
  //# sourceMappingURL=initChainId.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"initChainId.d.ts","sourceRoot":"","sources":["../../../src/helpers/initChainId.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAE3D,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,OAE9C,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,WAUxC,CAAA"}
1
+ {"version":3,"file":"initChainId.d.ts","sourceRoot":"","sources":["../../../src/helpers/initChainId.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,OAE9C,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,WAUxC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { Logger } from '@xylabs/sdk-js';
2
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
2
+ import type { Config } from '@xyo-network/xl1-sdk';
3
3
  import type { Provider } from 'ethers';
4
4
  export declare const initEvmProvider: ({ config }: {
5
5
  config: Config;
@@ -1 +1 @@
1
- {"version":3,"file":"initEvmProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initEvmProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAOtC,eAAO,MAAM,eAAe,GAAU,YAAY;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,QAAQ,CAQvG,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,YAE/D,CAAA"}
1
+ {"version":3,"file":"initEvmProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initEvmProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAOtC,eAAO,MAAM,eAAe,GAAU,YAAY;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,QAAQ,CAQvG,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,YAE/D,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
1
+ import type { Config } from '@xyo-network/xl1-sdk';
2
2
  import type { Provider } from 'ethers';
3
3
  export declare const initInfuraProvider: (config: Config) => Promise<Provider>;
4
4
  export declare const canUseInfuraProvider: (config: Config) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"initInfuraProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initInfuraProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAOtC,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,OAAO,CAAC,QAAQ,CAKnE,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,OAIrD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,sCAIrD,CAAA"}
1
+ {"version":3,"file":"initInfuraProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initInfuraProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAOtC,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,OAAO,CAAC,QAAQ,CAKnE,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,OAIrD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,sCAIrD,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
1
+ import type { Config } from '@xyo-network/xl1-sdk';
2
2
  import { JsonRpcProvider } from 'ethers/providers';
3
3
  export declare const initJsonRpcProvider: (config: Config) => Promise<JsonRpcProvider>;
4
4
  export declare const canUseJsonRpcProvider: (config: Config) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"initJsonRpcProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initJsonRpcProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,6BAGjD,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,YAGnD,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,8BAGtD,CAAA"}
1
+ {"version":3,"file":"initJsonRpcProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initJsonRpcProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,6BAGjD,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,YAGnD,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,8BAGtD,CAAA"}
@@ -1,3 +1,5 @@
1
+ export * from './ApiActor.ts';
1
2
  export * from './model.ts';
3
+ export * from './runApi.ts';
2
4
  export * from './server/index.ts';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA"}
@@ -1,6 +1,11 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
+ // src/ApiActor.ts
5
+ import { creatable } from "@xylabs/sdk-js";
6
+ import { Account as Account2 } from "@xyo-network/account";
7
+ import { Actor } from "@xyo-network/xl1-sdk";
8
+
4
9
  // src/server/app.ts
5
10
  import { customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler, standardErrors, standardResponses } from "@xylabs/express";
6
11
  import compression from "compression";
@@ -257,8 +262,7 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
257
262
 
258
263
  // src/server/routes/rpc/routes/addRpcRoutes.ts
259
264
  import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
260
- import { XyoConnectionMoniker } from "@xyo-network/xl1-protocol-sdk";
261
- import { rpcEngineFromConnection } from "@xyo-network/xl1-rpc";
265
+ import { rpcEngineFromConnection, XyoConnectionMoniker } from "@xyo-network/xl1-sdk";
262
266
  var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
263
267
  const { context } = app;
264
268
  const { locator } = context;
@@ -301,21 +305,21 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
301
305
  }, "getApp");
302
306
 
303
307
  // src/server/server.ts
304
- import { assertEx as assertEx2 } from "@xylabs/sdk-js";
308
+ import { assertEx as assertEx2, toEthAddress } from "@xylabs/sdk-js";
305
309
  import { Account } from "@xyo-network/account";
306
- import { buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initServerNode, initServerWallet, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
310
+ import { EthereumChainStakeEventsViewer, EthereumChainStakeViewer } from "@xyo-network/chain-ethereum";
311
+ import { buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, ValidatorActor } from "@xyo-network/chain-orchestration";
307
312
  import { createBootstrapHead } from "@xyo-network/chain-services";
308
313
  import { initTelemetry } from "@xyo-network/chain-telemetry";
309
314
  import { startupSpanAsync } from "@xyo-network/chain-utils";
310
- import { asAttoXL1, StepSizes } from "@xyo-network/xl1-protocol";
311
- import { AccountBalanceViewerMoniker, BlockViewerMoniker, findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
312
- import { buildLocalProviderLocator } from "@xyo-network/xl1-providers";
315
+ import { IStakedXyoChain__factory } from "@xyo-network/typechain";
316
+ import { AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes } from "@xyo-network/xl1-sdk";
313
317
  import { Semaphore } from "async-mutex";
314
318
  var hostname = "::";
315
- async function getServer(context) {
316
- const { config, node: providedNode } = context;
317
- const { port } = context.config.api;
318
- const logger = assertEx2(context.logger, () => "Logger is required to init server");
319
+ async function getServer(params) {
320
+ const { config, node: providedNode } = params;
321
+ const { port } = params.config.api;
322
+ const logger = assertEx2(params.logger, () => "Logger is required to init server");
319
323
  const statusReporter = initStatusReporter({
320
324
  logger
321
325
  });
@@ -324,7 +328,7 @@ async function getServer(context) {
324
328
  logger,
325
329
  statusReporter
326
330
  }));
327
- const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0");
331
+ const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0", DefaultMetricsScrapePorts.api);
328
332
  const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
329
333
  const initContext = {
330
334
  _id: "init-context",
@@ -333,9 +337,10 @@ async function getServer(context) {
333
337
  statusReporter,
334
338
  meterProvider,
335
339
  traceProvider,
336
- singletons: {}
340
+ singletons: {},
341
+ caches: {}
337
342
  };
338
- const wallet = await initServerWallet(initContext);
343
+ const wallet = await initApiWallet(initContext);
339
344
  const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
340
345
  const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
341
346
  const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
@@ -404,6 +409,25 @@ async function getServer(context) {
404
409
  transfersSummaryContext,
405
410
  node
406
411
  });
412
+ if (canUseEvmProvider({
413
+ config
414
+ })) {
415
+ const provider = await initEvmProvider({
416
+ config,
417
+ logger
418
+ });
419
+ const contractAddress = assertEx2(config.chain.id, () => "Missing config.chain.chainId");
420
+ const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider);
421
+ locator.register(EthereumChainStakeEventsViewer.factory(EthereumChainStakeEventsViewer.dependencies, {
422
+ contract
423
+ }));
424
+ const stakeEventsViewer = await locator.getInstance(EthereumChainStakeEventsViewer.defaultMoniker);
425
+ assertEx2(await stakeEventsViewer.start(), () => "Failed to start EthereumChainStakeEventsViewer");
426
+ locator.register(EthereumChainStakeViewer.factory(EthereumChainStakeViewer.dependencies, {
427
+ contract,
428
+ stakeEventsViewer
429
+ }));
430
+ }
407
431
  const apiContext = {
408
432
  ...initContext,
409
433
  node,
@@ -417,7 +441,7 @@ async function getServer(context) {
417
441
  const blk = await blockViewer.currentBlock();
418
442
  assertEx2(blk, () => "No blocks found after initialization");
419
443
  const accountBalanceViewer = await locator.getInstance(AccountBalanceViewerMoniker);
420
- assertEx2(await accountBalanceViewer.start(), () => "Failed to start BlockViewer");
444
+ assertEx2(await accountBalanceViewer.start(), () => "Failed to start AccountBalanceViewer");
421
445
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
422
446
  const actor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
423
447
  id: "validator-mempool-server",
@@ -432,8 +456,87 @@ async function getServer(context) {
432
456
  return server;
433
457
  }
434
458
  __name(getServer, "getServer");
459
+
460
+ // src/ApiActor.ts
461
+ function _ts_decorate(decorators, target, key, desc) {
462
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
463
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
464
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
465
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
466
+ }
467
+ __name(_ts_decorate, "_ts_decorate");
468
+ var ApiActor = class extends Actor {
469
+ static {
470
+ __name(this, "ApiActor");
471
+ }
472
+ server;
473
+ static async paramsHandler(params) {
474
+ const logger = params?.context?.logger;
475
+ const account = params?.account ?? await Account2.random();
476
+ logger?.info(`Running api for account ${account.address}`);
477
+ return {
478
+ ...await super.paramsHandler({
479
+ ...params,
480
+ account
481
+ })
482
+ };
483
+ }
484
+ async createHandler() {
485
+ await super.createHandler();
486
+ }
487
+ async startHandler() {
488
+ await super.startHandler();
489
+ this.stopServer();
490
+ await this.startServer();
491
+ }
492
+ async stopHandler() {
493
+ await super.stopHandler();
494
+ this.stopServer();
495
+ }
496
+ async startServer() {
497
+ this.server = await getServer({
498
+ config: this.config,
499
+ logger: this.logger
500
+ });
501
+ }
502
+ stopServer() {
503
+ this.server?.close();
504
+ this.server = void 0;
505
+ }
506
+ };
507
+ ApiActor = _ts_decorate([
508
+ creatable()
509
+ ], ApiActor);
510
+
511
+ // src/runApi.ts
512
+ import { exists, IdLogger } from "@xylabs/sdk-js";
513
+ import { Account as Account3 } from "@xyo-network/account";
514
+ var runApi = /* @__PURE__ */ __name(async ({ config, logger, orchestrator, locator }) => {
515
+ const localLogger = logger ?? new IdLogger(logger ?? console, () => "ResolveHelper [runApi]");
516
+ const account = await Account3.random();
517
+ localLogger.info(`Running api for account ${account.address} [random]`);
518
+ const api = await ApiActor.create({
519
+ logger,
520
+ context: {
521
+ config,
522
+ locator,
523
+ singletons: {},
524
+ logger,
525
+ caches: {}
526
+ }
527
+ });
528
+ const actors = [
529
+ api
530
+ ].filter(exists);
531
+ for (const actor of actors) {
532
+ await orchestrator.registerActor(actor);
533
+ }
534
+ await orchestrator.start();
535
+ }, "runApi");
435
536
  export {
537
+ ApiActor,
436
538
  getApp,
437
- getServer
539
+ getServer,
540
+ runApi
438
541
  };
439
542
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'\nimport { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'\nimport { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\n\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig,\n initBalanceSummaryMap,\n initHealthEndpoints,\n initServerNode,\n initServerWallet,\n initStatusReporter, initTransferSummaryMap,\n ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer,\n BalanceStepSummaryContext,\n BlockViewer,\n Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n AccountBalanceViewerMoniker,\n BlockViewerMoniker,\n findMostRecentBlock,\n flattenHydratedBlock,\n payloadMapFromStore,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { buildLocalProviderLocator } from '@xyo-network/xl1-providers'\nimport { Semaphore } from 'async-mutex'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(context: GetServerContext) {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n meterProvider,\n traceProvider,\n singletons: {},\n }\n\n const wallet = await initServerWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (!possibleHead) {\n const chainId = (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = head.chain\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)\n\n const balanceSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balancesSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transfersSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies TransfersStepSummaryContext\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balanceSummaryContext,\n transfersSummaryContext,\n node,\n })\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start BlockViewer')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = config.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n } satisfies ValidatorActorParams)\n\n await actor?.start()\n\n const app = await getApp(apiContext)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","XyoConnectionMoniker","rpcEngineFromConnection","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","Account","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initServerNode","initServerWallet","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","asAttoXL1","StepSizes","AccountBalanceViewerMoniker","BlockViewerMoniker","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","buildLocalProviderLocator","Semaphore","hostname","getServer","context","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","wallet","initServerWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","finalizedArchivist","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","console","info","actor","mempool","enabled","undefined","ValidatorActor","create","id","account","app","getApp","server","listen","log","setTimeout"]}
1
+ {"version":3,"sources":["../../src/ApiActor.ts","../../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","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { Actor, ActorParams } from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n static override async paramsHandler<T extends ApiActor>(params?: Partial<T['params']>) {\n const logger = params?.context?.logger\n\n const account = params?.account ?? await Account.random()\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler({\n ...params,\n account,\n }),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer({ config: this.config, logger: this.logger })\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\n\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx, toEthAddress } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { EthereumChainStakeEventsViewer, EthereumChainStakeViewer } from '@xyo-network/chain-ethereum'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type {\n AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, Config,\n TransfersStepSummaryContext,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,\n DefaultMetricsScrapePorts,\n findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,\n} from '@xyo-network/xl1-sdk'\nimport { Semaphore } from 'async-mutex'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function getServer(params: GetServerContext) {\n const { config, node: providedNode } = params\n const { port } = params.config.api\n\n const logger = assertEx(params.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0', DefaultMetricsScrapePorts.api)\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (!possibleHead) {\n const chainId = (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(wallet, chainId, asAttoXL1(20_000_000_000_000_000_000_000n), config.chain.genesisRewardAddress ?? wallet.address)\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = head.chain\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const chainMap = payloadMapFromStore<WithStorageMeta<Payload>>(writableChainArchivist)\n\n const balanceSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: balancesSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies BalanceStepSummaryContext\n\n const transfersSummaryContext = {\n ...initContext,\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transfersSummaryMap,\n head: async function (): Promise<[Hash, number]> {\n const head = assertEx(await findMostRecentBlock(writableChainArchivist))\n return [head._hash, head.block]\n },\n store: { chainMap },\n chainId,\n } satisfies TransfersStepSummaryContext\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balanceSummaryContext,\n transfersSummaryContext,\n node,\n })\n\n // Conditionally register ETH viewers if enabled in config\n if (canUseEvmProvider({ config })) {\n const provider = await initEvmProvider({ config, logger })\n const contractAddress = assertEx(config.chain.id, () => 'Missing config.chain.chainId') as string\n // Connect to the contract\n const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider)\n\n // Register the contract events viewer\n locator.register(EthereumChainStakeEventsViewer.factory<EthereumChainStakeEventsViewer>(\n EthereumChainStakeEventsViewer.dependencies,\n { contract },\n ))\n\n // Get an instance of the events viewer to pass to the stake viewer\n const stakeEventsViewer = (await locator.getInstance<EthereumChainStakeEventsViewer>(EthereumChainStakeEventsViewer.defaultMoniker))\n assertEx(await stakeEventsViewer.start(), () => 'Failed to start EthereumChainStakeEventsViewer')\n\n // Register the stake viewer\n locator.register(EthereumChainStakeViewer.factory<EthereumChainStakeViewer>(\n EthereumChainStakeViewer.dependencies,\n { contract, stakeEventsViewer },\n ))\n }\n\n const apiContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'api-context',\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = config.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n } satisfies ValidatorActorParams)\n\n await actor?.start()\n\n const app = await getApp(apiContext)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport type {\n BaseContext, Config, ProviderFactoryLocatorInstance,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n locator?: ProviderFactoryLocatorInstance\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, logger, orchestrator, locator,\n}: RunApiContext) => {\n const localLogger = logger ?? new IdLogger(logger ?? console, () => 'ResolveHelper [runApi]')\n const account = await Account.random()\n localLogger.info(`Running api for account ${account.address} [random]`)\n\n // Create actors\n const api = await ApiActor.create({\n logger,\n context: {\n config, locator, singletons: {}, logger, caches: {},\n },\n })\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["creatable","Account","Actor","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","rpcEngineFromConnection","XyoConnectionMoniker","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","toEthAddress","Account","EthereumChainStakeEventsViewer","EthereumChainStakeViewer","buildTelemetryConfig","canUseEvmProvider","initApiWallet","initBalanceSummaryMap","initEvmProvider","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","IStakedXyoChain__factory","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","payloadMapFromStore","StepSizes","Semaphore","hostname","getServer","params","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","chainId","Account","random","address","chain","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","mods","resolve","Promise","all","map","mod","chainMap","payloadMapFromStore","balanceSummaryContext","stepSemaphores","StepSizes","Semaphore","summaryMap","_hash","store","transfersSummaryContext","locator","buildLocalProviderLocator","context","finalizedArchivist","canUseEvmProvider","provider","initEvmProvider","contractAddress","id","contract","IStakedXyoChain__factory","connect","toEthAddress","register","EthereumChainStakeEventsViewer","factory","dependencies","stakeEventsViewer","getInstance","defaultMoniker","EthereumChainStakeViewer","apiContext","blockViewer","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","console","info","actor","mempool","enabled","undefined","ValidatorActor","create","account","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","paramsHandler","params","logger","context","account","Account","random","info","address","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","config","close","undefined","exists","IdLogger","Account","runApi","config","logger","orchestrator","locator","localLogger","IdLogger","console","account","Account","random","info","address","api","ApiActor","create","context","singletons","caches","actors","filter","exists","actor","registerActor","start"]}
@@ -1,4 +1,4 @@
1
- import type { BaseContext, Config } from '@xyo-network/xl1-protocol-sdk';
1
+ import type { BaseContext, Config } from '@xyo-network/xl1-sdk';
2
2
  export interface AppContext extends BaseContext {
3
3
  config: Config;
4
4
  }
@@ -1 +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
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE/D,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,9 @@
1
+ import { type OrchestratorInstance } from '@xyo-network/chain-orchestration';
2
+ import type { BaseContext, Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
3
+ export interface RunApiContext extends BaseContext {
4
+ config: Config;
5
+ locator?: ProviderFactoryLocatorInstance;
6
+ orchestrator: OrchestratorInstance;
7
+ }
8
+ export declare const runApi: ({ config, logger, orchestrator, locator, }: RunApiContext) => Promise<void>;
9
+ //# sourceMappingURL=runApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runApi.d.ts","sourceRoot":"","sources":["../../src/runApi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,EACV,WAAW,EAAE,MAAM,EAAE,8BAA8B,EACpD,MAAM,sBAAsB,CAAA;AAI7B,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,8BAA8B,CAAA;IACxC,YAAY,EAAE,oBAAoB,CAAA;CACnC;AAED,eAAO,MAAM,MAAM,GAAU,4CAE1B,aAAa,kBAoBf,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBAcb,CAAA"}
1
+ {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GACvB,KAAK,OAAO,kBAcb,CAAA"}
@@ -1,11 +1,11 @@
1
1
  import type { Logger } from '@xylabs/sdk-js';
2
2
  import type { NodeInstance } from '@xyo-network/node-model';
3
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
3
+ import type { Config } from '@xyo-network/xl1-sdk';
4
4
  interface GetServerContext {
5
5
  config: Config;
6
6
  logger?: Logger;
7
7
  node?: NodeInstance;
8
8
  }
9
- export declare function getServer(context: GetServerContext): Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
9
+ export declare function getServer(params: GetServerContext): Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
10
10
  export {};
11
11
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAgBlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAIV,MAAM,EAEP,MAAM,+BAA+B,CAAA;AAiBtC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,8HAsIxD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAYlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EACoD,MAAM,EAErE,MAAM,sBAAsB,CAAA;AAc7B,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,8HA+JvD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/chain-api",
3
- "version": "1.18.0",
3
+ "version": "1.18.2",
4
4
  "description": "XYO Layer One API",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -49,30 +49,29 @@
49
49
  "types": "tsc --noEmit -p tsconfig.test.json"
50
50
  },
51
51
  "dependencies": {
52
- "@opentelemetry/instrumentation": "~0.208.0",
53
- "@opentelemetry/instrumentation-express": "~0.57.0",
54
- "@opentelemetry/instrumentation-http": "~0.208.0",
55
- "@xylabs/express": "~5.0.51",
56
- "@xylabs/sdk-js": "~5.0.51",
57
- "@xyo-network/account": "~5.2.17",
58
- "@xyo-network/archivist-model": "~5.2.17",
59
- "@xyo-network/boundwitness-model": "~5.2.17",
60
- "@xyo-network/chain-orchestration": "~1.18.0",
61
- "@xyo-network/chain-services": "~1.18.0",
62
- "@xyo-network/chain-telemetry": "~1.18.0",
63
- "@xyo-network/chain-utils": "~1.18.0",
64
- "@xyo-network/module-abstract": "~5.2.17",
65
- "@xyo-network/module-model": "~5.2.17",
66
- "@xyo-network/node-model": "~5.2.17",
67
- "@xyo-network/payload-builder": "~5.2.17",
68
- "@xyo-network/payload-model": "~5.2.17",
69
- "@xyo-network/xl1-protocol": "~1.14.17",
70
- "@xyo-network/xl1-protocol-sdk": "~1.18.0",
71
- "@xyo-network/xl1-providers": "~1.18.0",
72
- "@xyo-network/xl1-rpc": "~1.18.0",
52
+ "@opentelemetry/instrumentation": "~0.211.0",
53
+ "@opentelemetry/instrumentation-express": "~0.59.0",
54
+ "@opentelemetry/instrumentation-http": "~0.211.0",
55
+ "@xylabs/express": "~5.0.64",
56
+ "@xylabs/sdk-js": "~5.0.64",
57
+ "@xyo-network/account": "~5.2.25",
58
+ "@xyo-network/archivist-model": "~5.2.25",
59
+ "@xyo-network/boundwitness-model": "~5.2.25",
60
+ "@xyo-network/chain-ethereum": "~1.18.2",
61
+ "@xyo-network/chain-orchestration": "~1.18.2",
62
+ "@xyo-network/chain-services": "~1.18.2",
63
+ "@xyo-network/chain-telemetry": "~1.18.2",
64
+ "@xyo-network/chain-utils": "~1.18.2",
65
+ "@xyo-network/module-abstract": "~5.2.25",
66
+ "@xyo-network/module-model": "~5.2.25",
67
+ "@xyo-network/node-model": "~5.2.25",
68
+ "@xyo-network/payload-builder": "~5.2.25",
69
+ "@xyo-network/payload-model": "~5.2.25",
70
+ "@xyo-network/typechain": "~4.1.1",
71
+ "@xyo-network/xl1-sdk": "~1.19.4",
73
72
  "async-mutex": "~0.5.0",
74
73
  "compression": "~1.8.1",
75
- "cors": "~2.8.5",
74
+ "cors": "~2.8.6",
76
75
  "ethers": "^6.16.0",
77
76
  "express": "~5.2.1",
78
77
  "http-status-codes": "~2.3.0"
@@ -81,27 +80,27 @@
81
80
  "@types/compression": "~1.8.1",
82
81
  "@types/cors": "~2.8.19",
83
82
  "@types/express": "5.0.6",
84
- "@types/express-serve-static-core": "~5.1.0",
85
- "@types/node": "~25.0.2",
86
- "@xylabs/sdk-js": "~5.0.51",
87
- "@xylabs/ts-scripts-yarn3": "~7.2.32",
88
- "@xylabs/tsconfig": "~7.2.32",
89
- "@xyo-network/account": "~5.2.17",
90
- "@xyo-network/account-model": "~5.2.17",
91
- "@xyo-network/archivist-abstract": "~5.2.17",
83
+ "@types/express-serve-static-core": "~5.1.1",
84
+ "@types/node": "~25.0.10",
85
+ "@xylabs/sdk-js": "~5.0.64",
86
+ "@xylabs/ts-scripts-yarn3": "~7.3.2",
87
+ "@xylabs/tsconfig": "~7.3.2",
88
+ "@xyo-network/account": "~5.2.25",
89
+ "@xyo-network/account-model": "~5.2.25",
90
+ "@xyo-network/archivist-abstract": "~5.2.25",
92
91
  "@xyo-network/bios-model": "~7.2.0",
93
- "@xyo-network/boundwitness-builder": "~5.2.17",
94
- "@xyo-network/chain-services": "~1.18.0",
95
- "@xyo-network/module-abstract-mongodb": "~5.2.17",
96
- "@xyo-network/module-model-mongodb": "~5.2.17",
97
- "@xyo-network/node-memory": "~5.2.17",
98
- "@xyo-network/xl1-protocol": "~1.14.17",
92
+ "@xyo-network/boundwitness-builder": "~5.2.25",
93
+ "@xyo-network/chain-services": "~1.18.2",
94
+ "@xyo-network/module-abstract-mongodb": "~5.2.25",
95
+ "@xyo-network/module-model-mongodb": "~5.2.25",
96
+ "@xyo-network/node-memory": "~5.2.25",
97
+ "@xyo-network/xl1-sdk": "~1.19.4",
99
98
  "dotenv": "~17.2.3",
100
99
  "eslint": "^9.39.2",
101
100
  "nodemon": "~3.1.11",
102
101
  "tslib": "~2.8.1",
103
102
  "typescript": "~5.9.3",
104
- "vitest": "~4.0.15",
103
+ "vitest": "~4.0.18",
105
104
  "vitest-mock-extended": "~3.1.0"
106
105
  },
107
106
  "engines": {
@@ -111,4 +110,4 @@
111
110
  "publishConfig": {
112
111
  "access": "restricted"
113
112
  }
114
- }
113
+ }
@@ -0,0 +1,54 @@
1
+ import { Server } from 'node:http'
2
+
3
+ import { creatable } from '@xylabs/sdk-js'
4
+ import { Account } from '@xyo-network/account'
5
+ import { Actor, ActorParams } from '@xyo-network/xl1-sdk'
6
+
7
+ import { getServer } from './server/index.ts'
8
+
9
+ export type ApiActorParams = ActorParams<{
10
+
11
+ }>
12
+
13
+ @creatable()
14
+ export class ApiActor extends Actor<ApiActorParams> {
15
+ private server?: Server
16
+
17
+ static override async paramsHandler<T extends ApiActor>(params?: Partial<T['params']>) {
18
+ const logger = params?.context?.logger
19
+
20
+ const account = params?.account ?? await Account.random()
21
+ logger?.info(`Running api for account ${account.address}`)
22
+
23
+ return {
24
+ ...await super.paramsHandler({
25
+ ...params,
26
+ account,
27
+ }),
28
+ }
29
+ }
30
+
31
+ override async createHandler() {
32
+ await super.createHandler()
33
+ }
34
+
35
+ override async startHandler() {
36
+ await super.startHandler()
37
+ this.stopServer()
38
+ await this.startServer()
39
+ }
40
+
41
+ override async stopHandler() {
42
+ await super.stopHandler()
43
+ this.stopServer()
44
+ }
45
+
46
+ private async startServer() {
47
+ this.server = await getServer({ config: this.config, logger: this.logger })
48
+ }
49
+
50
+ private stopServer() {
51
+ this.server?.close()
52
+ this.server = undefined
53
+ }
54
+ }
package/src/ApiContext.ts CHANGED
@@ -3,7 +3,7 @@ import type { WithStorageMeta } from '@xyo-network/payload-model'
3
3
  import type {
4
4
  BalancesStepSummary, CreatableProviderContext, MapType,
5
5
  TransfersStepSummary,
6
- } from '@xyo-network/xl1-protocol-sdk'
6
+ } from '@xyo-network/xl1-sdk'
7
7
 
8
8
  export interface ApiContext extends CreatableProviderContext {
9
9
  balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  assertEx, hexFrom, isDefined, isHex,
3
3
  } from '@xylabs/sdk-js'
4
- import type { Config } from '@xyo-network/xl1-protocol-sdk'
4
+ import type { Config } from '@xyo-network/xl1-sdk'
5
5
 
6
6
  export const canUseChainId = (config: Config): boolean => {
7
7
  return isDefined(config.evm.chainId)
@@ -1,6 +1,6 @@
1
1
  import type { Logger } from '@xylabs/sdk-js'
2
2
  import { assertEx } from '@xylabs/sdk-js'
3
- import type { Config } from '@xyo-network/xl1-protocol-sdk'
3
+ import type { Config } from '@xyo-network/xl1-sdk'
4
4
  import type { Provider } from 'ethers'
5
5
 
6
6
  import { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'
@@ -1,5 +1,5 @@
1
1
  import { assertEx, isDefined } from '@xylabs/sdk-js'
2
- import type { Config } from '@xyo-network/xl1-protocol-sdk'
2
+ import type { Config } from '@xyo-network/xl1-sdk'
3
3
  import type { Provider } from 'ethers'
4
4
  import { InfuraProvider } from 'ethers/providers'
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { assertEx, isDefined } from '@xylabs/sdk-js'
2
- import type { Config } from '@xyo-network/xl1-protocol-sdk'
2
+ import type { Config } from '@xyo-network/xl1-sdk'
3
3
  import { JsonRpcProvider } from 'ethers/providers'
4
4
 
5
5
  import { canUseChainId, getChainId } from './initChainId.ts'
package/src/index.ts CHANGED
@@ -1,2 +1,4 @@
1
+ export * from './ApiActor.ts'
1
2
  export * from './model.ts'
3
+ export * from './runApi.ts'
2
4
  export * from './server/index.ts'
package/src/model.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { BaseContext, Config } from '@xyo-network/xl1-protocol-sdk'
1
+ import type { BaseContext, Config } from '@xyo-network/xl1-sdk'
2
2
 
3
3
  export interface AppContext extends BaseContext {
4
4
  config: Config
package/src/runApi.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { exists, IdLogger } from '@xylabs/sdk-js'
2
+ import { Account } from '@xyo-network/account'
3
+ import { type OrchestratorInstance } from '@xyo-network/chain-orchestration'
4
+ import type {
5
+ BaseContext, Config, ProviderFactoryLocatorInstance,
6
+ } from '@xyo-network/xl1-sdk'
7
+
8
+ import { ApiActor } from './ApiActor.ts'
9
+
10
+ export interface RunApiContext extends BaseContext {
11
+ config: Config
12
+ locator?: ProviderFactoryLocatorInstance
13
+ orchestrator: OrchestratorInstance
14
+ }
15
+
16
+ export const runApi = async ({
17
+ config, logger, orchestrator, locator,
18
+ }: RunApiContext) => {
19
+ const localLogger = logger ?? new IdLogger(logger ?? console, () => 'ResolveHelper [runApi]')
20
+ const account = await Account.random()
21
+ localLogger.info(`Running api for account ${account.address} [random]`)
22
+
23
+ // Create actors
24
+ const api = await ApiActor.create({
25
+ logger,
26
+ context: {
27
+ config, locator, singletons: {}, logger, caches: {},
28
+ },
29
+ })
30
+ const actors = [api].filter(exists)
31
+
32
+ for (const actor of actors) {
33
+ // Register the actor with the orchestrator
34
+ await orchestrator.registerActor(actor)
35
+ }
36
+ // Start the orchestrator => automatically activates the actor
37
+ await orchestrator.start()
38
+ }
@@ -1,7 +1,6 @@
1
1
  import { setRawResponseFormat } from '@xylabs/express'
2
- import type { XyoConnection } from '@xyo-network/xl1-protocol-sdk'
3
- import { XyoConnectionMoniker } from '@xyo-network/xl1-protocol-sdk'
4
- import { rpcEngineFromConnection } from '@xyo-network/xl1-rpc'
2
+ import type { XyoConnection } from '@xyo-network/xl1-sdk'
3
+ import { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'
5
4
  import type { Express } from 'express'
6
5
 
7
6
  export const addRpcRoutes = async (
@@ -1,39 +1,29 @@
1
1
  /* eslint-disable max-statements */
2
2
 
3
3
  import type { Hash, Logger } from '@xylabs/sdk-js'
4
- import { assertEx } from '@xylabs/sdk-js'
4
+ import { assertEx, toEthAddress } from '@xylabs/sdk-js'
5
5
  import { Account } from '@xyo-network/account'
6
+ import { EthereumChainStakeEventsViewer, EthereumChainStakeViewer } from '@xyo-network/chain-ethereum'
6
7
  import type { ValidatorActorParams } from '@xyo-network/chain-orchestration'
7
8
  import {
8
- buildTelemetryConfig,
9
- initBalanceSummaryMap,
10
- initHealthEndpoints,
11
- initServerNode,
12
- initServerWallet,
13
- initStatusReporter, initTransferSummaryMap,
14
- ValidatorActor,
9
+ buildTelemetryConfig, canUseEvmProvider, initApiWallet, initBalanceSummaryMap, initEvmProvider, initHealthEndpoints, initServerNode,
10
+ initStatusReporter, initTransferSummaryMap, ValidatorActor,
15
11
  } from '@xyo-network/chain-orchestration'
16
12
  import { createBootstrapHead } from '@xyo-network/chain-services'
17
13
  import { initTelemetry } from '@xyo-network/chain-telemetry'
18
14
  import { startupSpanAsync } from '@xyo-network/chain-utils'
19
15
  import type { NodeInstance } from '@xyo-network/node-model'
20
16
  import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
21
- import { asAttoXL1, StepSizes } from '@xyo-network/xl1-protocol'
17
+ import { IStakedXyoChain__factory } from '@xyo-network/typechain'
22
18
  import type {
23
- AccountBalanceViewer,
24
- BalanceStepSummaryContext,
25
- BlockViewer,
26
- Config,
19
+ AccountBalanceViewer, BalanceStepSummaryContext, BlockViewer, Config,
27
20
  TransfersStepSummaryContext,
28
- } from '@xyo-network/xl1-protocol-sdk'
21
+ } from '@xyo-network/xl1-sdk'
29
22
  import {
30
- AccountBalanceViewerMoniker,
31
- BlockViewerMoniker,
32
- findMostRecentBlock,
33
- flattenHydratedBlock,
34
- payloadMapFromStore,
35
- } from '@xyo-network/xl1-protocol-sdk'
36
- import { buildLocalProviderLocator } from '@xyo-network/xl1-providers'
23
+ AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator,
24
+ DefaultMetricsScrapePorts,
25
+ findMostRecentBlock, flattenHydratedBlock, payloadMapFromStore, StepSizes,
26
+ } from '@xyo-network/xl1-sdk'
37
27
  import { Semaphore } from 'async-mutex'
38
28
 
39
29
  import type { ApiContext } from '../ApiContext.ts'
@@ -48,11 +38,11 @@ interface GetServerContext {
48
38
  node?: NodeInstance
49
39
  }
50
40
 
51
- export async function getServer(context: GetServerContext) {
52
- const { config, node: providedNode } = context
53
- const { port } = context.config.api
41
+ export async function getServer(params: GetServerContext) {
42
+ const { config, node: providedNode } = params
43
+ const { port } = params.config.api
54
44
 
55
- const logger = assertEx(context.logger, () => 'Logger is required to init server')
45
+ const logger = assertEx(params.logger, () => 'Logger is required to init server')
56
46
 
57
47
  const statusReporter = initStatusReporter({ logger })
58
48
 
@@ -60,7 +50,7 @@ export async function getServer(context: GetServerContext) {
60
50
  config, logger, statusReporter,
61
51
  }))
62
52
 
63
- const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0')
53
+ const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0', DefaultMetricsScrapePorts.api)
64
54
 
65
55
  const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))
66
56
 
@@ -72,9 +62,10 @@ export async function getServer(context: GetServerContext) {
72
62
  meterProvider,
73
63
  traceProvider,
74
64
  singletons: {},
65
+ caches: {},
75
66
  }
76
67
 
77
- const wallet = await initServerWallet(initContext)
68
+ const wallet = await initApiWallet(initContext)
78
69
 
79
70
  const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')
80
71
  const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')
@@ -147,6 +138,30 @@ export async function getServer(context: GetServerContext) {
147
138
  node,
148
139
  })
149
140
 
141
+ // Conditionally register ETH viewers if enabled in config
142
+ if (canUseEvmProvider({ config })) {
143
+ const provider = await initEvmProvider({ config, logger })
144
+ const contractAddress = assertEx(config.chain.id, () => 'Missing config.chain.chainId') as string
145
+ // Connect to the contract
146
+ const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider)
147
+
148
+ // Register the contract events viewer
149
+ locator.register(EthereumChainStakeEventsViewer.factory<EthereumChainStakeEventsViewer>(
150
+ EthereumChainStakeEventsViewer.dependencies,
151
+ { contract },
152
+ ))
153
+
154
+ // Get an instance of the events viewer to pass to the stake viewer
155
+ const stakeEventsViewer = (await locator.getInstance<EthereumChainStakeEventsViewer>(EthereumChainStakeEventsViewer.defaultMoniker))
156
+ assertEx(await stakeEventsViewer.start(), () => 'Failed to start EthereumChainStakeEventsViewer')
157
+
158
+ // Register the stake viewer
159
+ locator.register(EthereumChainStakeViewer.factory<EthereumChainStakeViewer>(
160
+ EthereumChainStakeViewer.dependencies,
161
+ { contract, stakeEventsViewer },
162
+ ))
163
+ }
164
+
150
165
  const apiContext = {
151
166
  ...initContext,
152
167
  node,
@@ -163,7 +178,7 @@ export async function getServer(context: GetServerContext) {
163
178
  assertEx(blk, () => 'No blocks found after initialization')
164
179
 
165
180
  const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))
166
- assertEx(await accountBalanceViewer.start(), () => 'Failed to start BlockViewer')
181
+ assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')
167
182
 
168
183
  console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)
169
184