@xyo-network/chain-api 1.15.2 → 1.15.3

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 (38) hide show
  1. package/dist/node/driver/mongo/MongoMap.d.ts +9 -3
  2. package/dist/node/driver/mongo/MongoMap.d.ts.map +1 -1
  3. package/dist/node/helpers/index.d.ts +5 -0
  4. package/dist/node/helpers/index.d.ts.map +1 -0
  5. package/dist/node/helpers/initChainId.d.ts +4 -0
  6. package/dist/node/helpers/initChainId.d.ts.map +1 -0
  7. package/dist/node/helpers/initEvmProvider.d.ts +11 -0
  8. package/dist/node/helpers/initEvmProvider.d.ts.map +1 -0
  9. package/dist/node/helpers/initInfuraProvider.d.ts +6 -0
  10. package/dist/node/helpers/initInfuraProvider.d.ts.map +1 -0
  11. package/dist/node/helpers/initJsonRpcProvider.d.ts +6 -0
  12. package/dist/node/helpers/initJsonRpcProvider.d.ts.map +1 -0
  13. package/dist/node/index.mjs +194 -39
  14. package/dist/node/index.mjs.map +1 -1
  15. package/dist/node/manifest/getLocator.d.ts.map +1 -1
  16. package/dist/node/server/app.d.ts +2 -1
  17. package/dist/node/server/app.d.ts.map +1 -1
  18. package/dist/node/server/routes/addRoutes.d.ts +2 -1
  19. package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
  20. package/dist/node/server/routes/healthz/get.d.ts +2 -1
  21. package/dist/node/server/routes/healthz/get.d.ts.map +1 -1
  22. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +2 -1
  23. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +1 -1
  24. package/dist/node/server/server.d.ts.map +1 -1
  25. package/package.json +56 -51
  26. package/src/driver/mongo/MongoMap.ts +42 -4
  27. package/src/helpers/index.ts +4 -0
  28. package/src/helpers/initChainId.ts +20 -0
  29. package/src/helpers/initEvmProvider.ts +24 -0
  30. package/src/helpers/initInfuraProvider.ts +27 -0
  31. package/src/helpers/initJsonRpcProvider.ts +21 -0
  32. package/src/manifest/getLocator.ts +22 -9
  33. package/src/manifest/public/Chain.json +52 -15
  34. package/src/server/app.ts +3 -2
  35. package/src/server/routes/addRoutes.ts +3 -2
  36. package/src/server/routes/healthz/get.ts +1 -1
  37. package/src/server/routes/rpc/routes/addRpcRoutes.ts +3 -2
  38. package/src/server/server.ts +23 -2
@@ -1,17 +1,23 @@
1
1
  import { AbstractCreatable, CreatableParams } from '@xylabs/creatable';
2
2
  import { BaseMongoSdk } from '@xylabs/mongo';
3
- import { AsynchronousMap } from '@xyo-network/chain-protocol';
3
+ import { AsynchronousMap } from '@xyo-network/xl1-protocol-sdk';
4
4
  import { Document } from 'mongodb';
5
5
  export interface MongoMapParams<TData extends Document = Document> extends CreatableParams {
6
+ getCache?: {
7
+ enabled: boolean;
8
+ maxEntries?: number;
9
+ };
6
10
  sdk: BaseMongoSdk<TData>;
7
11
  }
8
- export declare class MongoMap<K = string, V extends Document = Document> extends AbstractCreatable<MongoMapParams<V>> implements AsynchronousMap<K, V> {
12
+ export declare class MongoMap<K extends {} = string, V extends Document = Document> extends AbstractCreatable<MongoMapParams<V>> implements AsynchronousMap<K, V> {
13
+ private _getCache;
9
14
  get sdk(): BaseMongoSdk<V>;
10
15
  clear(): Promise<void>;
11
16
  delete(id: K): Promise<boolean>;
12
17
  get(id: K): Promise<V | undefined>;
18
+ getMany(ids: K[]): Promise<V[]>;
13
19
  has(id: K): Promise<boolean>;
14
- set(id: K, data: V): Promise<this>;
20
+ set(id: K, data: V): Promise<void>;
15
21
  startHandler(): Promise<void>;
16
22
  }
17
23
  //# sourceMappingURL=MongoMap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MongoMap.d.ts","sourceRoot":"","sources":["../../../../src/driver/mongo/MongoMap.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAAa,eAAe,EAC9C,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EACL,QAAQ,EACT,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,cAAc,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,eAAe;IACxF,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CACzB;AAOD,qBACa,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAC3C,YAAW,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAEzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/B,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAMlC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5B,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C"}
1
+ {"version":3,"file":"MongoMap.d.ts","sourceRoot":"","sources":["../../../../src/driver/mongo/MongoMap.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAAa,eAAe,EAC9C,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EACL,QAAQ,EACT,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,cAAc,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,eAAe;IACxF,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CACzB;AAOD,qBACa,QAAQ,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,CACxE,SAAQ,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAC3C,YAAW,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,SAAS,CAA4B;IAE7C,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAEzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/B,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAYlC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAW/B,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5B,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7C"}
@@ -0,0 +1,5 @@
1
+ export * from './initChainId.ts';
2
+ export * from './initEvmProvider.ts';
3
+ export * from './initInfuraProvider.ts';
4
+ export * from './initJsonRpcProvider.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Config } from '@xyo-network/xl1-protocol-sdk';
2
+ export declare const canUseChainId: (config: Config) => boolean;
3
+ export declare const getChainId: (config: Config) => number;
4
+ //# sourceMappingURL=initChainId.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import type { Logger } from '@xylabs/logger';
2
+ import type { Config } from '@xyo-network/xl1-protocol-sdk';
3
+ import type { Provider } from 'ethers';
4
+ export declare const initEvmProvider: ({ config }: {
5
+ config: Config;
6
+ logger?: Logger;
7
+ }) => Promise<Provider>;
8
+ export declare const canUseEvmProvider: ({ config }: {
9
+ config: Config;
10
+ }) => boolean;
11
+ //# sourceMappingURL=initEvmProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initEvmProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initEvmProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAQtC,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"}
@@ -0,0 +1,6 @@
1
+ import type { Config } from '@xyo-network/xl1-protocol-sdk';
2
+ import { InfuraProvider } from 'ethers/providers';
3
+ export declare const initInfuraProvider: (config: Config) => Promise<InfuraProvider>;
4
+ export declare const canUseInfuraProvider: (config: Config) => boolean;
5
+ export declare const getInfuraProviderConfig: (config: Config) => readonly [number, string, string];
6
+ //# sourceMappingURL=initInfuraProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initInfuraProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initInfuraProvider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAMjD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,4BAKhD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,OAIrD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,sCAIrD,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { Config } from '@xyo-network/xl1-protocol-sdk';
2
+ import { JsonRpcProvider } from 'ethers/providers';
3
+ export declare const initJsonRpcProvider: (config: Config) => Promise<JsonRpcProvider>;
4
+ export declare const canUseJsonRpcProvider: (config: Config) => boolean;
5
+ export declare const getJsonRpcProviderConfig: (config: Config) => readonly [string, number];
6
+ //# sourceMappingURL=initJsonRpcProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initJsonRpcProvider.d.ts","sourceRoot":"","sources":["../../../src/helpers/initJsonRpcProvider.ts"],"names":[],"mappings":"AAEA,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"}
@@ -264,10 +264,10 @@ var addDataLakeRoutes = /* @__PURE__ */ __name((app) => {
264
264
  import { setRawResponseFormat as setRawResponseFormat2 } from "@xylabs/express";
265
265
  import { NodeXyoViewer } from "@xyo-network/chain-rpc";
266
266
  import { NodeXyoRunner, rpcEngineFromConnection, XyoBaseConnection } from "@xyo-network/xl1-rpc";
267
- var addRpcRoutes = /* @__PURE__ */ __name((app) => {
267
+ var addRpcRoutes = /* @__PURE__ */ __name((app, eventsReader, stakedChainContext) => {
268
268
  const { node } = app;
269
269
  const runner = new NodeXyoRunner(node);
270
- const viewer = new NodeXyoViewer(node);
270
+ const viewer = new NodeXyoViewer(node, eventsReader, stakedChainContext);
271
271
  const connection = new XyoBaseConnection({
272
272
  runner,
273
273
  viewer
@@ -282,14 +282,14 @@ var addRpcRoutes = /* @__PURE__ */ __name((app) => {
282
282
  }, "addRpcRoutes");
283
283
 
284
284
  // src/server/routes/addRoutes.ts
285
- var addRoutes = /* @__PURE__ */ __name((app) => {
286
- addRpcRoutes(app);
285
+ var addRoutes = /* @__PURE__ */ __name((app, eventsReader, stakedChainContext) => {
286
+ addRpcRoutes(app, eventsReader, stakedChainContext);
287
287
  addDataLakeRoutes(app);
288
288
  addNodeRoutes(app);
289
289
  }, "addRoutes");
290
290
 
291
291
  // src/server/app.ts
292
- var getApp = /* @__PURE__ */ __name((node) => {
292
+ var getApp = /* @__PURE__ */ __name((node, eventsReader, stakedChainContext) => {
293
293
  addInstrumentation();
294
294
  const app = express2();
295
295
  app.set("etag", false);
@@ -304,26 +304,70 @@ var getApp = /* @__PURE__ */ __name((node) => {
304
304
  app.use(customPoweredByHeader);
305
305
  disableCaseSensitiveRouting(app);
306
306
  app.node = node;
307
- addRoutes(app);
307
+ addRoutes(app, eventsReader, stakedChainContext);
308
308
  app.use(standardErrors);
309
309
  return app;
310
310
  }, "getApp");
311
311
 
312
312
  // src/server/server.ts
313
- import { assertEx as assertEx5 } from "@xylabs/assert";
314
- import { isDefined as isDefined3, isString } from "@xylabs/typeof";
313
+ import { assertEx as assertEx7 } from "@xylabs/assert";
314
+ import { toEthAddress, ZERO_HASH } from "@xylabs/hex";
315
+ import { isDefined as isDefined5, isString } from "@xylabs/typeof";
316
+ import { asArchivistInstance as asArchivistInstance2 } from "@xyo-network/archivist-model";
315
317
  import { boot } from "@xyo-network/bios";
318
+ import { EthereumChainStake, EthereumChainStakeEvents } from "@xyo-network/chain-ethereum";
319
+ import { StakedXyoChainV2__factory } from "@xyo-network/typechain";
316
320
  import { HDWallet } from "@xyo-network/wallet";
321
+ import { readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
317
322
 
318
- // src/manifest/getLocator.ts
323
+ // src/helpers/initChainId.ts
324
+ import { assertEx as assertEx3 } from "@xylabs/assert";
325
+ import { hexFrom, isHex } from "@xylabs/hex";
326
+ import { isDefined as isDefined2 } from "@xylabs/typeof";
327
+ var getChainId = /* @__PURE__ */ __name((config) => {
328
+ const chainId = assertEx3(config.evm.chainId, () => "Missing config.evm.chainId");
329
+ if (isHex(chainId, {
330
+ prefix: true
331
+ })) {
332
+ const hex = hexFrom(chainId);
333
+ const parsed = Number.parseInt(hex, 16);
334
+ return parsed;
335
+ } else {
336
+ const parsed = Number.parseInt(chainId, 10);
337
+ return parsed;
338
+ }
339
+ }, "getChainId");
340
+
341
+ // src/helpers/initInfuraProvider.ts
319
342
  import { assertEx as assertEx4 } from "@xylabs/assert";
343
+ import { isDefined as isDefined3 } from "@xylabs/typeof";
344
+ import { InfuraProvider } from "ethers/providers";
345
+ var instance;
346
+ var initInfuraProvider = /* @__PURE__ */ __name((config) => {
347
+ if (instance) return instance;
348
+ const providerConfig = getInfuraProviderConfig(config);
349
+ instance = Promise.resolve(new InfuraProvider(...providerConfig));
350
+ return instance;
351
+ }, "initInfuraProvider");
352
+ var getInfuraProviderConfig = /* @__PURE__ */ __name((config) => {
353
+ const projectId = assertEx4(config.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
354
+ const projectSecret = assertEx4(config.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
355
+ return [
356
+ getChainId(config),
357
+ projectId,
358
+ projectSecret
359
+ ];
360
+ }, "getInfuraProviderConfig");
361
+
362
+ // src/manifest/getLocator.ts
363
+ import { assertEx as assertEx6 } from "@xylabs/assert";
320
364
  import { asAddress as asAddress3, ZERO_ADDRESS } from "@xylabs/hex";
321
365
  import { BaseMongoSdk } from "@xylabs/mongo";
322
- import { isDefined as isDefined2 } from "@xylabs/typeof";
366
+ import { isDefined as isDefined4 } from "@xylabs/typeof";
323
367
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
324
368
  import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
325
369
  import { ViewArchivist } from "@xyo-network/archivist-view";
326
- import { AddressBalanceDivinerV2, ArchivistSyncDiviner, balanceSummaryRepositoryFromMap, HeadValidationDiviner } from "@xyo-network/chain-modules";
370
+ import { AddressBalanceDivinerV2, AddressTransferDiviner, ArchivistSyncDiviner, HeadValidationDiviner } from "@xyo-network/chain-modules";
327
371
  import { initTelemetry } from "@xyo-network/chain-telemetry";
328
372
  import { AbstractModule, LoggerModuleStatusReporter } from "@xyo-network/module-abstract";
329
373
  import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
@@ -331,9 +375,10 @@ import { MemorySentinel } from "@xyo-network/sentinel-memory";
331
375
  import { hasMongoConfig } from "@xyo-network/xl1-protocol-sdk";
332
376
 
333
377
  // src/driver/mongo/MongoMap.ts
334
- import { assertEx as assertEx3 } from "@xylabs/assert";
378
+ import { assertEx as assertEx5 } from "@xylabs/assert";
335
379
  import { AbstractCreatable, creatable } from "@xylabs/creatable";
336
380
  import { isNull } from "@xylabs/typeof";
381
+ import { LRUCache } from "lru-cache";
337
382
  function _ts_decorate(decorators, target, key, desc) {
338
383
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
339
384
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -350,13 +395,16 @@ var MongoMap = class extends AbstractCreatable {
350
395
  static {
351
396
  __name(this, "MongoMap");
352
397
  }
398
+ _getCache;
353
399
  get sdk() {
354
- return assertEx3(this.params.sdk, () => "No sdk specified");
400
+ return assertEx5(this.params.sdk, () => "No sdk specified");
355
401
  }
356
402
  async clear() {
403
+ this._getCache?.clear();
357
404
  await this.sdk.deleteMany({});
358
405
  }
359
406
  async delete(id) {
407
+ this._getCache?.delete(id);
360
408
  const filter = {
361
409
  _id: id
362
410
  };
@@ -364,13 +412,35 @@ var MongoMap = class extends AbstractCreatable {
364
412
  return result.deletedCount > 0;
365
413
  }
366
414
  async get(id) {
415
+ if (this._getCache) {
416
+ const getCacheResult = this._getCache.get(id);
417
+ if (getCacheResult) {
418
+ return getCacheResult;
419
+ }
420
+ }
367
421
  const filter = {
368
422
  _id: id
369
423
  };
370
424
  const doc = await this.sdk.findOne(filter);
371
425
  return isNull(doc) ? void 0 : stripMongoId(doc);
372
426
  }
427
+ async getMany(ids) {
428
+ const result = [];
429
+ for (const id of ids) {
430
+ const value = await this.get(id);
431
+ if (value) {
432
+ result.push(value);
433
+ }
434
+ }
435
+ return result;
436
+ }
373
437
  async has(id) {
438
+ if (this._getCache) {
439
+ const getCacheResult = this._getCache.has(id);
440
+ if (getCacheResult) {
441
+ return getCacheResult;
442
+ }
443
+ }
374
444
  const filter = {
375
445
  _id: id
376
446
  };
@@ -388,10 +458,16 @@ var MongoMap = class extends AbstractCreatable {
388
458
  await this.sdk.replaceOne(filter, value, {
389
459
  upsert: true
390
460
  });
391
- return this;
461
+ this._getCache?.set(id, data);
392
462
  }
393
463
  async startHandler() {
394
464
  await super.startHandler();
465
+ if (this.params.getCache?.enabled === true) {
466
+ const maxEntries = this.params.getCache?.maxEntries ?? 5e3;
467
+ this._getCache = new LRUCache({
468
+ max: maxEntries
469
+ });
470
+ }
395
471
  }
396
472
  };
397
473
  MongoMap = _ts_decorate([
@@ -413,10 +489,11 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
413
489
  port: 9465
414
490
  }
415
491
  });
416
- if (isDefined2(logger)) AbstractModule.defaultLogger = logger;
492
+ if (isDefined4(logger)) AbstractModule.defaultLogger = logger;
417
493
  const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
418
494
  const locator = new ModuleFactoryLocator();
419
- let summaryMap = /* @__PURE__ */ new Map();
495
+ let balanceSummaryMap;
496
+ let transferSummaryMap;
420
497
  const mongoConfig = config.storage?.mongo;
421
498
  if (hasMongoConfig(mongoConfig)) {
422
499
  const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
@@ -434,22 +511,42 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
434
511
  traceProvider
435
512
  };
436
513
  locator.register(MongoDBArchivistV2.factory(params), void 0, true);
437
- const sdk = new BaseMongoSdk({
514
+ const sdkBalanceSummaryMap = new BaseMongoSdk({
438
515
  ...payloadSdkConfig,
439
516
  collection: "balance_summary_map"
440
517
  });
441
- summaryMap = await MongoMap.create({
442
- sdk
518
+ balanceSummaryMap = await MongoMap.create({
519
+ sdk: sdkBalanceSummaryMap,
520
+ getCache: {
521
+ enabled: true,
522
+ maxEntries: 5e3
523
+ }
524
+ });
525
+ const sdkTransferSummaryMap = new BaseMongoSdk({
526
+ ...payloadSdkConfig,
527
+ collection: "transfer_summary_map"
528
+ });
529
+ transferSummaryMap = await MongoMap.create({
530
+ sdk: sdkTransferSummaryMap,
531
+ getCache: {
532
+ enabled: true,
533
+ maxEntries: 5e3
534
+ }
443
535
  });
444
536
  }
445
- const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap);
446
537
  locator.register(AddressBalanceDivinerV2.factory({
447
538
  traceProvider,
448
539
  meterProvider,
449
540
  statusReporter,
450
- summaryRepository
541
+ summaryMap: balanceSummaryMap
542
+ }));
543
+ locator.register(AddressTransferDiviner.factory({
544
+ traceProvider,
545
+ meterProvider,
546
+ statusReporter,
547
+ summaryMap: transferSummaryMap
451
548
  }));
452
- const chainId = isDefined2(config.chain.id) ? assertEx4(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
549
+ const chainId = isDefined4(config.chain.id) ? assertEx6(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
453
550
  locator.register(HeadValidationDiviner.factory({
454
551
  traceProvider,
455
552
  meterProvider,
@@ -541,12 +638,12 @@ var Chain_default = {
541
638
  eventSubscriptions: [
542
639
  {
543
640
  sourceEvent: "inserted",
544
- sourceModule: "Chain:Submissions",
641
+ sourceModule: "Submissions",
545
642
  targetModuleFunction: "divine"
546
643
  }
547
644
  ],
548
- inArchivist: "Chain:Submissions",
549
- outArchivist: "Chain:Validated",
645
+ inArchivist: "Submissions",
646
+ outArchivist: "Validated",
550
647
  name: "HeadValidationDiviner"
551
648
  }
552
649
  },
@@ -577,7 +674,7 @@ var Chain_default = {
577
674
  accountPath: "1/1'/4'",
578
675
  automations: [
579
676
  {
580
- frequency: 6e4,
677
+ frequency: 1e4,
581
678
  frequencyUnits: "millis",
582
679
  schema: "network.xyo.automation.interval",
583
680
  type: "interval"
@@ -593,6 +690,28 @@ var Chain_default = {
593
690
  }
594
691
  ]
595
692
  }
693
+ },
694
+ {
695
+ config: {
696
+ accountPath: "1/1'/5'",
697
+ automations: [
698
+ {
699
+ frequency: 1e4,
700
+ frequencyUnits: "millis",
701
+ schema: "network.xyo.automation.interval",
702
+ type: "interval"
703
+ }
704
+ ],
705
+ name: "AddressTransferPollingSentinel",
706
+ schema: "network.xyo.sentinel.config",
707
+ synchronous: true,
708
+ tasks: [
709
+ {
710
+ mod: "AddressTransferDiviner",
711
+ endPoint: "divine"
712
+ }
713
+ ]
714
+ }
596
715
  }
597
716
  ],
598
717
  public: [
@@ -622,23 +741,38 @@ var Chain_default = {
622
741
  enabled: true,
623
742
  maxEntries: 5e3
624
743
  },
625
- originArchivist: "Chain:Validated",
744
+ originArchivist: "Validated",
626
745
  schema: "network.xyo.archivist.view.config"
627
746
  }
628
747
  },
629
748
  {
630
749
  config: {
631
- accountPath: "1/1/3",
632
- schema: "network.xyo.diviner.chain.address.balance.config",
633
- archivist: "Chain:Validated",
750
+ accountPath: "1/1/3'",
634
751
  name: "AddressBalanceDiviner",
635
- eventSubscriptions: [
636
- {
637
- sourceEvent: "inserted",
638
- sourceModule: "Chain:Validated",
639
- targetModuleFunction: "divine"
752
+ schema: "network.xyo.diviner.chain.address.balance.config",
753
+ map: {
754
+ lmdb: {
755
+ dbName: "summaries",
756
+ storeName: "address_balance",
757
+ location: ".store"
640
758
  }
641
- ]
759
+ },
760
+ archivist: "Validated"
761
+ }
762
+ },
763
+ {
764
+ config: {
765
+ accountPath: "1/1/4'",
766
+ name: "AddressTransferDiviner",
767
+ schema: "network.xyo.diviner.chain.address.transfer.config",
768
+ map: {
769
+ lmdb: {
770
+ dbName: "summaries",
771
+ storeName: "address_transfer",
772
+ location: ".store"
773
+ }
774
+ },
775
+ archivist: "Validated"
642
776
  }
643
777
  }
644
778
  ]
@@ -726,20 +860,41 @@ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
726
860
  }
727
861
  await bios.seedPhraseStore.set("os", seedPhrase);
728
862
  }
729
- return assertEx5(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
863
+ return assertEx7(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
730
864
  }, "getSeedPhrase");
731
865
  var getServer = /* @__PURE__ */ __name(async (context) => {
732
866
  const { config, logger, node } = context;
733
867
  const { mnemonic, port } = context.config.api;
734
868
  const bios = await boot();
735
- const seedPhrase = isDefined3(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
869
+ const seedPhrase = isDefined5(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
736
870
  const wallet = await HDWallet.fromPhrase(seedPhrase);
871
+ const provider = await initInfuraProvider(config);
872
+ const contractAddress = assertEx7(config.chain.id, () => "Missing config.evm.chainId");
873
+ const contract = StakedXyoChainV2__factory.connect(toEthAddress(contractAddress), provider);
737
874
  const nodeContext = {
738
875
  wallet,
739
876
  logger,
740
877
  config
741
878
  };
742
- const app = getApp(node ?? await getNode(nodeContext));
879
+ const eventsReader = new EthereumChainStakeEvents(contract);
880
+ const stakeChainReader = await EthereumChainStake.create({
881
+ contract,
882
+ eventsReader
883
+ });
884
+ await stakeChainReader.start();
885
+ const rootNode = await getNode(nodeContext);
886
+ const archivist = assertEx7(asArchivistInstance2(await rootNode.resolve("Chain:Validated"), {
887
+ required: true
888
+ }), () => "FinalizedArchivist not found in node");
889
+ const chainMap = readPayloadMapFromStore(archivist);
890
+ const app = getApp(node ?? await getNode(nodeContext), eventsReader, {
891
+ chainId: contractAddress,
892
+ stake: stakeChainReader,
893
+ store: {
894
+ chainMap
895
+ },
896
+ head: /* @__PURE__ */ __name(() => ZERO_HASH, "head")
897
+ });
743
898
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
744
899
  server.setTimeout(2e4);
745
900
  return server;