@xyo-network/chain-api 1.15.2 → 1.15.4

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 +198 -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 +58 -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 +24 -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,36 +304,83 @@ 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";
330
374
  import { MemorySentinel } from "@xyo-network/sentinel-memory";
375
+ import { StepSizes } from "@xyo-network/xl1-protocol";
331
376
  import { hasMongoConfig } from "@xyo-network/xl1-protocol-sdk";
377
+ import { Semaphore } from "async-mutex";
332
378
 
333
379
  // src/driver/mongo/MongoMap.ts
334
- import { assertEx as assertEx3 } from "@xylabs/assert";
380
+ import { assertEx as assertEx5 } from "@xylabs/assert";
335
381
  import { AbstractCreatable, creatable } from "@xylabs/creatable";
336
382
  import { isNull } from "@xylabs/typeof";
383
+ import { LRUCache } from "lru-cache";
337
384
  function _ts_decorate(decorators, target, key, desc) {
338
385
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
339
386
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -350,13 +397,16 @@ var MongoMap = class extends AbstractCreatable {
350
397
  static {
351
398
  __name(this, "MongoMap");
352
399
  }
400
+ _getCache;
353
401
  get sdk() {
354
- return assertEx3(this.params.sdk, () => "No sdk specified");
402
+ return assertEx5(this.params.sdk, () => "No sdk specified");
355
403
  }
356
404
  async clear() {
405
+ this._getCache?.clear();
357
406
  await this.sdk.deleteMany({});
358
407
  }
359
408
  async delete(id) {
409
+ this._getCache?.delete(id);
360
410
  const filter = {
361
411
  _id: id
362
412
  };
@@ -364,13 +414,35 @@ var MongoMap = class extends AbstractCreatable {
364
414
  return result.deletedCount > 0;
365
415
  }
366
416
  async get(id) {
417
+ if (this._getCache) {
418
+ const getCacheResult = this._getCache.get(id);
419
+ if (getCacheResult) {
420
+ return getCacheResult;
421
+ }
422
+ }
367
423
  const filter = {
368
424
  _id: id
369
425
  };
370
426
  const doc = await this.sdk.findOne(filter);
371
427
  return isNull(doc) ? void 0 : stripMongoId(doc);
372
428
  }
429
+ async getMany(ids) {
430
+ const result = [];
431
+ for (const id of ids) {
432
+ const value = await this.get(id);
433
+ if (value) {
434
+ result.push(value);
435
+ }
436
+ }
437
+ return result;
438
+ }
373
439
  async has(id) {
440
+ if (this._getCache) {
441
+ const getCacheResult = this._getCache.has(id);
442
+ if (getCacheResult) {
443
+ return getCacheResult;
444
+ }
445
+ }
374
446
  const filter = {
375
447
  _id: id
376
448
  };
@@ -388,10 +460,16 @@ var MongoMap = class extends AbstractCreatable {
388
460
  await this.sdk.replaceOne(filter, value, {
389
461
  upsert: true
390
462
  });
391
- return this;
463
+ this._getCache?.set(id, data);
392
464
  }
393
465
  async startHandler() {
394
466
  await super.startHandler();
467
+ if (this.params.getCache?.enabled === true) {
468
+ const maxEntries = this.params.getCache?.maxEntries ?? 5e3;
469
+ this._getCache = new LRUCache({
470
+ max: maxEntries
471
+ });
472
+ }
395
473
  }
396
474
  };
397
475
  MongoMap = _ts_decorate([
@@ -413,10 +491,11 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
413
491
  port: 9465
414
492
  }
415
493
  });
416
- if (isDefined2(logger)) AbstractModule.defaultLogger = logger;
494
+ if (isDefined4(logger)) AbstractModule.defaultLogger = logger;
417
495
  const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
418
496
  const locator = new ModuleFactoryLocator();
419
- let summaryMap = /* @__PURE__ */ new Map();
497
+ let balanceSummaryMap;
498
+ let transferSummaryMap;
420
499
  const mongoConfig = config.storage?.mongo;
421
500
  if (hasMongoConfig(mongoConfig)) {
422
501
  const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
@@ -434,22 +513,44 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
434
513
  traceProvider
435
514
  };
436
515
  locator.register(MongoDBArchivistV2.factory(params), void 0, true);
437
- const sdk = new BaseMongoSdk({
516
+ const sdkBalanceSummaryMap = new BaseMongoSdk({
438
517
  ...payloadSdkConfig,
439
518
  collection: "balance_summary_map"
440
519
  });
441
- summaryMap = await MongoMap.create({
442
- sdk
520
+ balanceSummaryMap = await MongoMap.create({
521
+ sdk: sdkBalanceSummaryMap,
522
+ getCache: {
523
+ enabled: true,
524
+ maxEntries: 5e3
525
+ }
526
+ });
527
+ const sdkTransferSummaryMap = new BaseMongoSdk({
528
+ ...payloadSdkConfig,
529
+ collection: "transfer_summary_map"
530
+ });
531
+ transferSummaryMap = await MongoMap.create({
532
+ sdk: sdkTransferSummaryMap,
533
+ getCache: {
534
+ enabled: true,
535
+ maxEntries: 5e3
536
+ }
443
537
  });
444
538
  }
445
- const summaryRepository = balanceSummaryRepositoryFromMap(summaryMap);
446
539
  locator.register(AddressBalanceDivinerV2.factory({
447
540
  traceProvider,
448
541
  meterProvider,
449
542
  statusReporter,
450
- summaryRepository
543
+ summaryMap: balanceSummaryMap,
544
+ stepSemaphores: StepSizes.map(() => new Semaphore(20))
545
+ }));
546
+ locator.register(AddressTransferDiviner.factory({
547
+ traceProvider,
548
+ meterProvider,
549
+ statusReporter,
550
+ summaryMap: transferSummaryMap,
551
+ stepSemaphores: StepSizes.map(() => new Semaphore(20))
451
552
  }));
452
- const chainId = isDefined2(config.chain.id) ? assertEx4(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
553
+ const chainId = isDefined4(config.chain.id) ? assertEx6(asAddress3(config.chain.id), () => "chain.id must be an Address") : ZERO_ADDRESS;
453
554
  locator.register(HeadValidationDiviner.factory({
454
555
  traceProvider,
455
556
  meterProvider,
@@ -541,12 +642,12 @@ var Chain_default = {
541
642
  eventSubscriptions: [
542
643
  {
543
644
  sourceEvent: "inserted",
544
- sourceModule: "Chain:Submissions",
645
+ sourceModule: "Submissions",
545
646
  targetModuleFunction: "divine"
546
647
  }
547
648
  ],
548
- inArchivist: "Chain:Submissions",
549
- outArchivist: "Chain:Validated",
649
+ inArchivist: "Submissions",
650
+ outArchivist: "Validated",
550
651
  name: "HeadValidationDiviner"
551
652
  }
552
653
  },
@@ -577,7 +678,7 @@ var Chain_default = {
577
678
  accountPath: "1/1'/4'",
578
679
  automations: [
579
680
  {
580
- frequency: 6e4,
681
+ frequency: 1e4,
581
682
  frequencyUnits: "millis",
582
683
  schema: "network.xyo.automation.interval",
583
684
  type: "interval"
@@ -593,6 +694,28 @@ var Chain_default = {
593
694
  }
594
695
  ]
595
696
  }
697
+ },
698
+ {
699
+ config: {
700
+ accountPath: "1/1'/5'",
701
+ automations: [
702
+ {
703
+ frequency: 1e4,
704
+ frequencyUnits: "millis",
705
+ schema: "network.xyo.automation.interval",
706
+ type: "interval"
707
+ }
708
+ ],
709
+ name: "AddressTransferPollingSentinel",
710
+ schema: "network.xyo.sentinel.config",
711
+ synchronous: true,
712
+ tasks: [
713
+ {
714
+ mod: "AddressTransferDiviner",
715
+ endPoint: "divine"
716
+ }
717
+ ]
718
+ }
596
719
  }
597
720
  ],
598
721
  public: [
@@ -622,23 +745,38 @@ var Chain_default = {
622
745
  enabled: true,
623
746
  maxEntries: 5e3
624
747
  },
625
- originArchivist: "Chain:Validated",
748
+ originArchivist: "Validated",
626
749
  schema: "network.xyo.archivist.view.config"
627
750
  }
628
751
  },
629
752
  {
630
753
  config: {
631
- accountPath: "1/1/3",
632
- schema: "network.xyo.diviner.chain.address.balance.config",
633
- archivist: "Chain:Validated",
754
+ accountPath: "1/1/3'",
634
755
  name: "AddressBalanceDiviner",
635
- eventSubscriptions: [
636
- {
637
- sourceEvent: "inserted",
638
- sourceModule: "Chain:Validated",
639
- targetModuleFunction: "divine"
756
+ schema: "network.xyo.diviner.chain.address.balance.config",
757
+ map: {
758
+ lmdb: {
759
+ dbName: "summaries",
760
+ storeName: "address_balance",
761
+ location: ".store"
640
762
  }
641
- ]
763
+ },
764
+ archivist: "Validated"
765
+ }
766
+ },
767
+ {
768
+ config: {
769
+ accountPath: "1/1/4'",
770
+ name: "AddressTransferDiviner",
771
+ schema: "network.xyo.diviner.chain.address.transfer.config",
772
+ map: {
773
+ lmdb: {
774
+ dbName: "summaries",
775
+ storeName: "address_transfer",
776
+ location: ".store"
777
+ }
778
+ },
779
+ archivist: "Validated"
642
780
  }
643
781
  }
644
782
  ]
@@ -726,20 +864,41 @@ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
726
864
  }
727
865
  await bios.seedPhraseStore.set("os", seedPhrase);
728
866
  }
729
- return assertEx5(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
867
+ return assertEx7(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
730
868
  }, "getSeedPhrase");
731
869
  var getServer = /* @__PURE__ */ __name(async (context) => {
732
870
  const { config, logger, node } = context;
733
871
  const { mnemonic, port } = context.config.api;
734
872
  const bios = await boot();
735
- const seedPhrase = isDefined3(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
873
+ const seedPhrase = isDefined5(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
736
874
  const wallet = await HDWallet.fromPhrase(seedPhrase);
875
+ const provider = await initInfuraProvider(config);
876
+ const contractAddress = assertEx7(config.chain.id, () => "Missing config.evm.chainId");
877
+ const contract = StakedXyoChainV2__factory.connect(toEthAddress(contractAddress), provider);
737
878
  const nodeContext = {
738
879
  wallet,
739
880
  logger,
740
881
  config
741
882
  };
742
- const app = getApp(node ?? await getNode(nodeContext));
883
+ const eventsReader = new EthereumChainStakeEvents(contract);
884
+ const stakeChainReader = await EthereumChainStake.create({
885
+ contract,
886
+ eventsReader
887
+ });
888
+ await stakeChainReader.start();
889
+ const rootNode = await getNode(nodeContext);
890
+ const archivist = assertEx7(asArchivistInstance2(await rootNode.resolve("Chain:Validated"), {
891
+ required: true
892
+ }), () => "FinalizedArchivist not found in node");
893
+ const chainMap = readPayloadMapFromStore(archivist);
894
+ const app = getApp(node ?? await getNode(nodeContext), eventsReader, {
895
+ chainId: contractAddress,
896
+ stake: stakeChainReader,
897
+ store: {
898
+ chainMap
899
+ },
900
+ head: /* @__PURE__ */ __name(() => ZERO_HASH, "head")
901
+ });
743
902
  const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`));
744
903
  server.setTimeout(2e4);
745
904
  return server;