@xyo-network/chain-orchestration 1.21.3 → 1.23.0

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 (34) hide show
  1. package/dist/browser/index.mjs +15 -1
  2. package/dist/browser/index.mjs.map +1 -1
  3. package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
  4. package/dist/browser/node/config/capabilities/descriptors.d.ts.map +1 -1
  5. package/dist/browser/node/config/locators/index.d.ts +1 -0
  6. package/dist/browser/node/config/locators/index.d.ts.map +1 -1
  7. package/dist/browser/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
  8. package/dist/browser/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
  9. package/dist/browser/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
  10. package/dist/browser/shared/config/actors/Mempool.d.ts +14 -0
  11. package/dist/browser/shared/config/actors/Mempool.d.ts.map +1 -1
  12. package/dist/neutral/index.mjs +15 -1
  13. package/dist/neutral/index.mjs.map +1 -1
  14. package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
  15. package/dist/neutral/node/config/capabilities/descriptors.d.ts.map +1 -1
  16. package/dist/neutral/node/config/locators/index.d.ts +1 -0
  17. package/dist/neutral/node/config/locators/index.d.ts.map +1 -1
  18. package/dist/neutral/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
  19. package/dist/neutral/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
  20. package/dist/neutral/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
  21. package/dist/neutral/shared/config/actors/Mempool.d.ts +14 -0
  22. package/dist/neutral/shared/config/actors/Mempool.d.ts.map +1 -1
  23. package/dist/node/index.mjs +221 -17
  24. package/dist/node/index.mjs.map +1 -1
  25. package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
  26. package/dist/node/node/config/capabilities/descriptors.d.ts.map +1 -1
  27. package/dist/node/node/config/locators/index.d.ts +1 -0
  28. package/dist/node/node/config/locators/index.d.ts.map +1 -1
  29. package/dist/node/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
  30. package/dist/node/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
  31. package/dist/node/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
  32. package/dist/node/shared/config/actors/Mempool.d.ts +14 -0
  33. package/dist/node/shared/config/actors/Mempool.d.ts.map +1 -1
  34. package/package.json +26 -26
@@ -0,0 +1,68 @@
1
+ import type { ActorConfig, CachingContext, Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
2
+ /**
3
+ * Names of the actors this builder supports. Outside this set, `locatorsFromConfig`
4
+ * routes to the legacy per-actor child-locator path.
5
+ */
6
+ export declare const SHARED_LOCATOR_SUPPORTED_ACTORS: readonly string[];
7
+ /**
8
+ * Returns true iff the configured actors are exactly the full canary trio
9
+ * (`api`, `mempool`, `finalizer`) running in one process AND the run is
10
+ * in-memory (no `remote.rpc`) AND no actor opts into stateless mode.
11
+ *
12
+ * The shared path was designed for the canary case where all three actors
13
+ * co-locate and share a single registry, so each provider is instantiated
14
+ * exactly once. Any subset has a transitive-dependency problem the union
15
+ * of `ACTOR_MIRRORS` cannot satisfy:
16
+ *
17
+ * - Solo `api` — `SimpleXyoConnectionRunner` (chosen for `XyoConnection`)
18
+ * requires a local `MempoolRunner`, only registered when `mempool` is in
19
+ * the union. Crash:
20
+ * "No provider instance for the supplied config moniker [MempoolRunner]"
21
+ * - Solo `mempool` — `SimpleMempoolRunner` requires a local
22
+ * `BlockValidationViewer`, only registered when `finalizer` is in the
23
+ * union. Crash:
24
+ * "No provider instance for the supplied config moniker [BlockValidationViewer]"
25
+ * - Solo `finalizer` and `[api, finalizer]` etc. — same class of mismatch.
26
+ *
27
+ * Multi-process deployments (`xl1 start api` in one proc, `xl1 start mempool`
28
+ * in another) fall under "subset" and must therefore route to the legacy
29
+ * `_root` path. `localLocatorFromConfig` registers `LOCAL_LEGACY_NEEDS`
30
+ * (every canary moniker) on `_root`, which the per-actor child locators
31
+ * inherit — so each subset finds its transitive deps via `_root`.
32
+ */
33
+ export declare function canUseSharedLocator(actors: readonly ActorConfig[], config: Omit<Config, 'actors'>): boolean;
34
+ export interface SharedLocatorFromConfigResult {
35
+ /**
36
+ * Per-actor view locators. Each is a thin wrapper that shares `shared`'s
37
+ * registry by reference (`registry === shared.registry`) but has its own
38
+ * `context` carrying the actor-specific config block. Hand these to the
39
+ * actor constructors — `getApiActor`, `getMempoolActor`, `getFinalizerActor`
40
+ * pull their actor-specific config from `locator.context.config`.
41
+ */
42
+ readonly perActor: Record<string, ProviderFactoryLocatorInstance>;
43
+ /**
44
+ * The single underlying locator that owns the shared registry. Tests and
45
+ * the dump tool can introspect this directly to see the unique factory set.
46
+ */
47
+ readonly shared: ProviderFactoryLocatorInstance;
48
+ }
49
+ export interface SharedLocatorFromConfigOptions {
50
+ readonly onInsecureGenesisConfirm?: () => Promise<void>;
51
+ }
52
+ /**
53
+ * Builds a single shared locator driven by the union of the configured actors'
54
+ * declared `needs`, plus the EVM/memory contract+stake providers from
55
+ * `initEvmProvidersIfAvailable`. Each actor receives a thin view locator that
56
+ * shares the registry by reference, so every provider exists exactly once
57
+ * per process.
58
+ *
59
+ * Replaces the legacy `_root` + per-actor child-locator layering for the
60
+ * canary actor combos (api+mempool+finalizer subset). Eliminates Symptoms 2
61
+ * and 3 from the double-loading findings: no cross-locator duplicates, no
62
+ * empty actor-locator shells.
63
+ *
64
+ * Stateless API and remote-RPC paths are NOT supported here — the caller
65
+ * (`locatorsFromConfig`) routes those to the existing builders.
66
+ */
67
+ export declare function sharedLocatorFromConfig(context: CachingContext, actors: readonly ActorConfig[], config: Omit<Config, 'actors'>, options?: SharedLocatorFromConfigOptions): Promise<SharedLocatorFromConfigResult>;
68
+ //# sourceMappingURL=sharedLocatorFromConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedLocatorFromConfig.d.ts","sourceRoot":"","sources":["../../../../../src/node/config/locators/sharedLocatorFromConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACd,MAAM,EACN,8BAA8B,EAC/B,MAAM,sBAAsB,CAAA;AAgJ7B;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAAoC,CAAA;AAEjG;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,CAgB3G;AAED,MAAM,WAAW,6BAA6B;IAC5C;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAA;IACjE;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAA;CAChD;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACxD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC9B,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,6BAA6B,CAAC,CA2DxC"}
@@ -3,6 +3,8 @@ import type { BaseConfigContext } from '@xyo-network/xl1-sdk';
3
3
  import { z } from 'zod';
4
4
  export declare const DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL = 1000;
5
5
  export declare const DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL = 1000;
6
+ export declare const DEFAULT_MEMPOOL_DEMOTION_THRESHOLD = 3;
7
+ export declare const DEFAULT_MEMPOOL_MAX_PENDING_TRANSACTIONS = 0;
6
8
  export declare const MempoolConfigZod: z.ZodObject<{
7
9
  chain: z.ZodDefault<z.ZodObject<{
8
10
  id: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@xylabs/sdk-js").BrandedHex, string>>>;
@@ -90,6 +92,8 @@ export declare const MempoolConfigZod: z.ZodObject<{
90
92
  port: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
91
93
  enabled: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>>, z.ZodTransform<boolean, string | boolean>>;
92
94
  blockPruneInterval: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
95
+ demotionThreshold: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
96
+ maxPendingTransactions: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
93
97
  transactionPruneInterval: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
94
98
  }, z.core.$strip>;
95
99
  export type MempoolConfig = z.infer<typeof MempoolConfigZod>;
@@ -171,6 +175,8 @@ export declare const isMempoolConfig: <T>(value: T) => value is T & {
171
175
  port: number;
172
176
  enabled: boolean;
173
177
  blockPruneInterval: number;
178
+ demotionThreshold: number;
179
+ maxPendingTransactions: number;
174
180
  transactionPruneInterval: number;
175
181
  dataLake?: import("@xyo-network/xl1-sdk").DataLakeConfig | undefined;
176
182
  accountPath?: string | undefined;
@@ -255,6 +261,8 @@ export declare const asMempoolConfig: {
255
261
  port: number;
256
262
  enabled: boolean;
257
263
  blockPruneInterval: number;
264
+ demotionThreshold: number;
265
+ maxPendingTransactions: number;
258
266
  transactionPruneInterval: number;
259
267
  dataLake?: import("@xyo-network/xl1-sdk").DataLakeConfig | undefined;
260
268
  accountPath?: string | undefined;
@@ -338,6 +346,8 @@ export declare const asMempoolConfig: {
338
346
  port: number;
339
347
  enabled: boolean;
340
348
  blockPruneInterval: number;
349
+ demotionThreshold: number;
350
+ maxPendingTransactions: number;
341
351
  transactionPruneInterval: number;
342
352
  dataLake?: import("@xyo-network/xl1-sdk").DataLakeConfig | undefined;
343
353
  accountPath?: string | undefined;
@@ -423,6 +433,8 @@ export declare const toMempoolConfig: {
423
433
  port: number;
424
434
  enabled: boolean;
425
435
  blockPruneInterval: number;
436
+ demotionThreshold: number;
437
+ maxPendingTransactions: number;
426
438
  transactionPruneInterval: number;
427
439
  dataLake?: import("@xyo-network/xl1-sdk").DataLakeConfig | undefined;
428
440
  accountPath?: string | undefined;
@@ -506,6 +518,8 @@ export declare const toMempoolConfig: {
506
518
  port: number;
507
519
  enabled: boolean;
508
520
  blockPruneInterval: number;
521
+ demotionThreshold: number;
522
+ maxPendingTransactions: number;
509
523
  transactionPruneInterval: number;
510
524
  dataLake?: import("@xyo-network/xl1-sdk").DataLakeConfig | undefined;
511
525
  accountPath?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Mempool.d.ts","sourceRoot":"","sources":["../../../../../src/shared/config/actors/Mempool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAAgB,YAAY,EACzC,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,EAAkB,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvC,eAAO,MAAM,oCAAoC,OAAO,CAAA;AACxD,eAAO,MAAM,0CAA0C,OAAO,CAAA;AAE9D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4B3B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiC,CAAA;AAC7D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAEhF,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC7E,MAAM,EAAE,aAAa,CAAA;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAA6D,CAAA;AAE9H,eAAO,MAAM,sBAAsB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,oBAAyD,CAAA;AAC5H,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAgE,CAAA;AACzJ,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAgE,CAAA"}
1
+ {"version":3,"file":"Mempool.d.ts","sourceRoot":"","sources":["../../../../../src/shared/config/actors/Mempool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAAgB,YAAY,EACzC,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,EAAkB,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvC,eAAO,MAAM,oCAAoC,OAAO,CAAA;AACxD,eAAO,MAAM,0CAA0C,OAAO,CAAA;AAC9D,eAAO,MAAM,kCAAkC,IAAI,CAAA;AACnD,eAAO,MAAM,wCAAwC,IAAI,CAAA;AAEzD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsC3B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiC,CAAA;AAC7D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAEhF,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC7E,MAAM,EAAE,aAAa,CAAA;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAA6D,CAAA;AAE9H,eAAO,MAAM,sBAAsB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,oBAAyD,CAAA;AAC5H,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAgE,CAAA;AACzJ,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,oBAAoB,CAAC,CAAgE,CAAA"}
@@ -333,7 +333,7 @@ var DEFAULT_FIXED_FEE = toHex(XL1(1000n) * AttoXL1ConvertFactor.xl1);
333
333
  var DEFAULT_VARIABLE_FEE_BASIS_POINTS = 300;
334
334
  var DEFAULT_HARDHAT_BRIDGE_CONTRACT = toAddress("2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6");
335
335
  var DEFAULT_HARDHAT_CHAIN_ID = toHex("7A69");
336
- var DEFAULT_HARDHAT_REMOTE_CHAIN_WALLET_PRIVATE_KEY = toHex("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80");
336
+ var DEFAULT_HARDHAT_REMOTE_CHAIN_WALLET_PRIVATE_KEY = toHex("0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d");
337
337
  var DEFAULT_HARDHAT_TOKEN_CONTRACT = toAddress("5FbDB2315678afecb367f032d93F642f64180aa3");
338
338
  var DEFAULT_MAX_BRIDGE_AMOUNT = toHex(XL1(1000000n) * AttoXL1ConvertFactor.xl1);
339
339
  var DEFAULT_MIN_BRIDGE_AMOUNT = toHex(XL1(1500n) * AttoXL1ConvertFactor.xl1);
@@ -484,6 +484,8 @@ import { BaseConfigContextZod as BaseConfigContextZod4, HostActorConfigZod as Ho
484
484
  import { globalRegistry as globalRegistry3, z as z5 } from "zod";
485
485
  var DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL = 1e3;
486
486
  var DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL = 1e3;
487
+ var DEFAULT_MEMPOOL_DEMOTION_THRESHOLD = 3;
488
+ var DEFAULT_MEMPOOL_MAX_PENDING_TRANSACTIONS = 0;
487
489
  var MempoolConfigZod = HostActorConfigZod4.extend({
488
490
  enabled: z5.union([
489
491
  z5.string(),
@@ -520,6 +522,16 @@ var MempoolConfigZod = HostActorConfigZod4.extend({
520
522
  title: "mempool.blockPruneInterval",
521
523
  type: "number"
522
524
  }),
525
+ demotionThreshold: z5.coerce.number().int().positive().default(DEFAULT_MEMPOOL_DEMOTION_THRESHOLD).register(globalRegistry3, {
526
+ description: "Number of times a transaction may be handed out to producers without being included in a block before it is considered demoted",
527
+ title: "mempool.demotionThreshold",
528
+ type: "number"
529
+ }),
530
+ maxPendingTransactions: z5.coerce.number().int().nonnegative().default(DEFAULT_MEMPOOL_MAX_PENDING_TRANSACTIONS).register(globalRegistry3, {
531
+ description: "Maximum number of pending transactions in the pool. When exceeded, demoted transactions are evicted first, then oldest by sequence. 0 disables the cap.",
532
+ title: "mempool.maxPendingTransactions",
533
+ type: "number"
534
+ }),
523
535
  transactionPruneInterval: z5.coerce.number().default(DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL).register(globalRegistry3, {
524
536
  description: "The interval time (in milliseconds) between pending transaction prune attempts",
525
537
  title: "mempool.transactionPruneInterval",
@@ -1364,6 +1376,14 @@ __name(createDefaultCapabilityRegistry, "createDefaultCapabilityRegistry");
1364
1376
 
1365
1377
  // src/node/config/capabilities/descriptors.ts
1366
1378
  import { SimpleAccountBalanceViewer, SimpleBlockValidationViewer, SimpleBlockViewer, SimpleDeadLetterQueueRunner, SimpleDeadLetterQueueViewer, SimpleFinalizationRunner, SimpleFinalizationViewer, SimpleMempoolRunner, SimpleMempoolViewer, SimpleTransactionValidationViewer, SimpleTransactionViewer, SimpleWindowedBlockViewer, SimpleXyoConnectionViewer, SimpleXyoViewer } from "@xyo-network/xl1-sdk";
1379
+ function readMempoolTuning(ctx) {
1380
+ const cfg = ctx.actorContext.config;
1381
+ return {
1382
+ demotionThreshold: cfg?.mempool?.demotionThreshold,
1383
+ maxPendingTransactions: cfg?.mempool?.maxPendingTransactions
1384
+ };
1385
+ }
1386
+ __name(readMempoolTuning, "readMempoolTuning");
1367
1387
  var passes = /* @__PURE__ */ __name(() => true, "passes");
1368
1388
  var localTier1Descriptors = [
1369
1389
  {
@@ -1380,10 +1400,14 @@ var localTier1Descriptors = [
1380
1400
  ],
1381
1401
  surface: "node",
1382
1402
  preconditions: passes,
1383
- build: /* @__PURE__ */ __name((ctx) => SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
1384
- pendingTransactionsArchivist: ctx.process.pendingTransactionsArchivist,
1385
- pendingBlocksArchivist: ctx.process.pendingBlocksArchivist
1386
- }), "build")
1403
+ build: /* @__PURE__ */ __name((ctx) => {
1404
+ const { demotionThreshold } = readMempoolTuning(ctx);
1405
+ return SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
1406
+ pendingTransactionsArchivist: ctx.process.pendingTransactionsArchivist,
1407
+ pendingBlocksArchivist: ctx.process.pendingBlocksArchivist,
1408
+ demotionThreshold
1409
+ });
1410
+ }, "build")
1387
1411
  },
1388
1412
  {
1389
1413
  id: "SimpleMempoolRunner",
@@ -1399,10 +1423,14 @@ var localTier1Descriptors = [
1399
1423
  ],
1400
1424
  surface: "node",
1401
1425
  preconditions: passes,
1402
- build: /* @__PURE__ */ __name((ctx) => SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {
1403
- pendingTransactionsArchivist: ctx.process.pendingTransactionsArchivist,
1404
- pendingBlocksArchivist: ctx.process.pendingBlocksArchivist
1405
- }), "build")
1426
+ build: /* @__PURE__ */ __name((ctx) => {
1427
+ const { maxPendingTransactions } = readMempoolTuning(ctx);
1428
+ return SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {
1429
+ pendingTransactionsArchivist: ctx.process.pendingTransactionsArchivist,
1430
+ pendingBlocksArchivist: ctx.process.pendingBlocksArchivist,
1431
+ maxPendingTransactions
1432
+ });
1433
+ }, "build")
1406
1434
  },
1407
1435
  {
1408
1436
  id: "SimpleAccountBalanceViewer",
@@ -2461,7 +2489,7 @@ async function localLocatorFromConfig(context, validateDepsOnRegister = false, o
2461
2489
  __name(localLocatorFromConfig, "localLocatorFromConfig");
2462
2490
 
2463
2491
  // src/node/config/locators/locatorsFromConfig.ts
2464
- import { deepMerge as deepMerge2 } from "@xylabs/sdk-js";
2492
+ import { deepMerge as deepMerge3 } from "@xylabs/sdk-js";
2465
2493
 
2466
2494
  // src/node/config/locators/actors/apiLocatorFromConfig.ts
2467
2495
  import { AccountBalanceViewerMoniker as AccountBalanceViewerMoniker3, BlockViewerMoniker as BlockViewerMoniker3, FinalizationViewerMoniker as FinalizationViewerMoniker3, MempoolViewerMoniker as MempoolViewerMoniker3, ProviderFactoryLocator as ProviderFactoryLocator2, SimpleXyoConnectionRunner, SimpleXyoGateway, SimpleXyoRunner, TransactionViewerMoniker as TransactionViewerMoniker3, XyoConnectionMoniker as XyoConnectionMoniker3, XyoViewerMoniker as XyoViewerMoniker3 } from "@xyo-network/xl1-sdk";
@@ -2673,18 +2701,189 @@ async function rootLocatorFromConfig(context, validateDepsOnRegister = false, on
2673
2701
  }
2674
2702
  __name(rootLocatorFromConfig, "rootLocatorFromConfig");
2675
2703
 
2704
+ // src/node/config/locators/sharedLocatorFromConfig.ts
2705
+ import { deepMerge as deepMerge2 } from "@xylabs/sdk-js";
2706
+ import { AccountBalanceViewerMoniker as AccountBalanceViewerMoniker4, BlockValidationViewerMoniker as BlockValidationViewerMoniker3, BlockViewerMoniker as BlockViewerMoniker4, commonLocatorFromConfig as commonLocatorFromConfig2, DeadLetterQueueRunnerMoniker as DeadLetterQueueRunnerMoniker3, FinalizationRunnerMoniker as FinalizationRunnerMoniker3, FinalizationViewerMoniker as FinalizationViewerMoniker4, MempoolRunnerMoniker as MempoolRunnerMoniker3, MempoolViewerMoniker as MempoolViewerMoniker4, ProviderFactoryLocator as ProviderFactoryLocator8, SimpleXyoConnectionRunner as SimpleXyoConnectionRunner4, SimpleXyoGateway as SimpleXyoGateway2, SimpleXyoRunner as SimpleXyoRunner4, TransactionValidationViewerMoniker as TransactionValidationViewerMoniker3, TransactionViewerMoniker as TransactionViewerMoniker4, WindowedBlockViewerMoniker as WindowedBlockViewerMoniker3, XyoConnectionMoniker as XyoConnectionMoniker4, XyoGatewayMoniker, XyoRunnerMoniker, XyoViewerMoniker as XyoViewerMoniker4 } from "@xyo-network/xl1-sdk";
2707
+ var apiNeeds = {
2708
+ required: [
2709
+ AccountBalanceViewerMoniker4,
2710
+ BlockViewerMoniker4,
2711
+ FinalizationViewerMoniker4,
2712
+ MempoolViewerMoniker4,
2713
+ TransactionViewerMoniker4,
2714
+ XyoConnectionMoniker4,
2715
+ XyoGatewayMoniker,
2716
+ XyoRunnerMoniker,
2717
+ XyoViewerMoniker4
2718
+ ]
2719
+ };
2720
+ var mempoolNeeds = {
2721
+ required: [
2722
+ MempoolRunnerMoniker3,
2723
+ // SimpleMempoolRunner.dependencies includes TransactionValidationViewer
2724
+ // — not resolved by the actor directly but pulled in at construction.
2725
+ TransactionValidationViewerMoniker3,
2726
+ // SimpleMempoolViewer.dependencies includes WindowedBlockViewer — the
2727
+ // mempool viewer is built when api/finalizer resolve MempoolViewer.
2728
+ WindowedBlockViewerMoniker3
2729
+ ]
2730
+ };
2731
+ var finalizerNeeds = {
2732
+ required: [
2733
+ BlockValidationViewerMoniker3,
2734
+ BlockViewerMoniker4,
2735
+ FinalizationRunnerMoniker3,
2736
+ MempoolViewerMoniker4
2737
+ ],
2738
+ optional: [
2739
+ DeadLetterQueueRunnerMoniker3
2740
+ ]
2741
+ };
2742
+ var ACTOR_MIRRORS = {
2743
+ api: apiNeeds,
2744
+ mempool: mempoolNeeds,
2745
+ finalizer: finalizerNeeds
2746
+ };
2747
+ var apiExtraDescriptors = [
2748
+ {
2749
+ id: "SimpleXyoRunner",
2750
+ satisfies: [
2751
+ XyoRunnerMoniker
2752
+ ],
2753
+ tier: 1,
2754
+ backings: [],
2755
+ surface: "node",
2756
+ preconditions: /* @__PURE__ */ __name(() => true, "preconditions"),
2757
+ build: /* @__PURE__ */ __name(() => SimpleXyoRunner4.factory(SimpleXyoRunner4.dependencies, {}), "build")
2758
+ },
2759
+ {
2760
+ id: "SimpleXyoConnectionRunner",
2761
+ satisfies: [
2762
+ XyoConnectionMoniker4
2763
+ ],
2764
+ // Same tier as `SimpleXyoConnectionViewer`; higher priority wins the
2765
+ // `XyoConnection` moniker in any actor mix that includes the API.
2766
+ tier: 1,
2767
+ priority: 100,
2768
+ backings: [],
2769
+ surface: "node",
2770
+ preconditions: /* @__PURE__ */ __name(() => true, "preconditions"),
2771
+ build: /* @__PURE__ */ __name(() => SimpleXyoConnectionRunner4.factory(SimpleXyoConnectionRunner4.dependencies, {}), "build")
2772
+ },
2773
+ {
2774
+ id: "SimpleXyoGateway",
2775
+ satisfies: [
2776
+ XyoGatewayMoniker
2777
+ ],
2778
+ tier: 1,
2779
+ backings: [],
2780
+ surface: "node",
2781
+ preconditions: /* @__PURE__ */ __name(() => true, "preconditions"),
2782
+ build: /* @__PURE__ */ __name(() => SimpleXyoGateway2.factory(SimpleXyoGateway2.dependencies, {}), "build")
2783
+ }
2784
+ ];
2785
+ var ACTOR_EXTRA_DESCRIPTORS = {
2786
+ api: apiExtraDescriptors
2787
+ };
2788
+ var ACTOR_CONFIG_PARSERS = {
2789
+ api: ApiConfigZod,
2790
+ mempool: MempoolConfigZod,
2791
+ finalizer: FinalizerConfigZod
2792
+ };
2793
+ var SHARED_LOCATOR_SUPPORTED_ACTORS = [
2794
+ "api",
2795
+ "mempool",
2796
+ "finalizer"
2797
+ ];
2798
+ function canUseSharedLocator(actors, config) {
2799
+ if (actors.length === 0) return false;
2800
+ if (config.remote?.rpc) return false;
2801
+ const names = new Set(actors.map((a) => a.name));
2802
+ const fullCanary = SHARED_LOCATOR_SUPPORTED_ACTORS.every((name) => names.has(name));
2803
+ if (!fullCanary) return false;
2804
+ return actors.every((actor) => {
2805
+ if (!SHARED_LOCATOR_SUPPORTED_ACTORS.includes(actor.name)) return false;
2806
+ if (actor.name === "api") {
2807
+ const merged = ApiConfigZod.parse(deepMerge2(config, actor));
2808
+ if (merged.stateless === true) return false;
2809
+ }
2810
+ return true;
2811
+ });
2812
+ }
2813
+ __name(canUseSharedLocator, "canUseSharedLocator");
2814
+ async function sharedLocatorFromConfig(context, actors, config, options = {}) {
2815
+ const unionNeeds2 = {
2816
+ required: dedupe(actors.flatMap((a) => ACTOR_MIRRORS[a.name]?.required ?? [])),
2817
+ optional: dedupe(actors.flatMap((a) => ACTOR_MIRRORS[a.name]?.optional ?? []))
2818
+ };
2819
+ const extraDescriptors = actors.flatMap((a) => ACTOR_EXTRA_DESCRIPTORS[a.name] ?? []);
2820
+ const commonContext = {
2821
+ ...context,
2822
+ config: {
2823
+ ...config,
2824
+ name: "_shared_common"
2825
+ }
2826
+ };
2827
+ const commonLocator = await commonLocatorFromConfig2(commonContext);
2828
+ const sharedContext = {
2829
+ ...commonLocator.context,
2830
+ config: {
2831
+ ...config,
2832
+ name: "_shared"
2833
+ }
2834
+ };
2835
+ const result = await locatorFromActorNeeds(sharedContext, [
2836
+ unionNeeds2
2837
+ ], {
2838
+ extraDescriptors,
2839
+ onInsecureGenesisConfirm: options.onInsecureGenesisConfirm,
2840
+ validateDepsOnRegister: false
2841
+ });
2842
+ const sharedWithEvm = await initEvmProvidersIfAvailable(result.locator);
2843
+ sharedWithEvm.freeze();
2844
+ const perActor = {};
2845
+ for (const actor of actors) {
2846
+ const parser = ACTOR_CONFIG_PARSERS[actor.name];
2847
+ const actorConfig = parser ? parser.parse(deepMerge2(config, actor)) : actor;
2848
+ const actorContext = {
2849
+ ...sharedWithEvm.context,
2850
+ config: actorConfig
2851
+ };
2852
+ const view = new ProviderFactoryLocator8(actorContext, sharedWithEvm.registry);
2853
+ view.freeze();
2854
+ perActor[actor.name] = view;
2855
+ }
2856
+ return {
2857
+ shared: sharedWithEvm,
2858
+ perActor
2859
+ };
2860
+ }
2861
+ __name(sharedLocatorFromConfig, "sharedLocatorFromConfig");
2862
+ function dedupe(items) {
2863
+ return [
2864
+ ...new Set(items)
2865
+ ];
2866
+ }
2867
+ __name(dedupe, "dedupe");
2868
+
2676
2869
  // src/node/config/locators/locatorsFromConfig.ts
2677
2870
  function allActorsAreSelfSufficient(actors, config) {
2678
2871
  if (actors.length === 0) return false;
2679
2872
  return actors.every((actor) => {
2680
2873
  if (actor.name !== "api") return false;
2681
- const merged = ApiConfigZod.parse(deepMerge2(config, actor));
2874
+ const merged = ApiConfigZod.parse(deepMerge3(config, actor));
2682
2875
  return merged.stateless === true;
2683
2876
  });
2684
2877
  }
2685
2878
  __name(allActorsAreSelfSufficient, "allActorsAreSelfSufficient");
2686
2879
  async function locatorsFromConfig(context, { actors, ...config }, onInsecureGenesisConfirm) {
2687
2880
  const result = {};
2881
+ if (canUseSharedLocator(actors, config)) {
2882
+ const { perActor } = await sharedLocatorFromConfig(context, actors, config, {
2883
+ onInsecureGenesisConfirm
2884
+ });
2885
+ return perActor;
2886
+ }
2688
2887
  const skipRoot = allActorsAreSelfSufficient(actors, config);
2689
2888
  if (!skipRoot) {
2690
2889
  const rootContext = {
@@ -2701,42 +2900,42 @@ async function locatorsFromConfig(context, { actors, ...config }, onInsecureGene
2701
2900
  case "producer": {
2702
2901
  result[actorConfig.name] = await producerLocatorFromConfig({
2703
2902
  ...context,
2704
- config: ProducerConfigZod.parse(deepMerge2(config, actorConfig))
2903
+ config: ProducerConfigZod.parse(deepMerge3(config, actorConfig))
2705
2904
  }, result._root);
2706
2905
  break;
2707
2906
  }
2708
2907
  case "api": {
2709
2908
  result[actorConfig.name] = await apiLocatorFromConfig({
2710
2909
  ...context,
2711
- config: ApiConfigZod.parse(deepMerge2(config, actorConfig))
2910
+ config: ApiConfigZod.parse(deepMerge3(config, actorConfig))
2712
2911
  }, result._root);
2713
2912
  break;
2714
2913
  }
2715
2914
  case "mempool": {
2716
2915
  result[actorConfig.name] = await mempoolLocatorFromConfig({
2717
2916
  ...context,
2718
- config: MempoolConfigZod.parse(deepMerge2(config, actorConfig))
2917
+ config: MempoolConfigZod.parse(deepMerge3(config, actorConfig))
2719
2918
  }, result._root);
2720
2919
  break;
2721
2920
  }
2722
2921
  case "finalizer": {
2723
2922
  result[actorConfig.name] = await finalizerLocatorFromConfig({
2724
2923
  ...context,
2725
- config: FinalizerConfigZod.parse(deepMerge2(config, actorConfig))
2924
+ config: FinalizerConfigZod.parse(deepMerge3(config, actorConfig))
2726
2925
  }, result._root);
2727
2926
  break;
2728
2927
  }
2729
2928
  case "bridge": {
2730
2929
  result[actorConfig.name] = await bridgeLocatorFromConfig({
2731
2930
  ...context,
2732
- config: BridgeConfigZod.parse(deepMerge2(config, actorConfig))
2931
+ config: BridgeConfigZod.parse(deepMerge3(config, actorConfig))
2733
2932
  }, result._root);
2734
2933
  break;
2735
2934
  }
2736
2935
  case "rewardRedemption": {
2737
2936
  result[actorConfig.name] = await rewardRedemptionLocatorFromConfig({
2738
2937
  ...context,
2739
- config: RewardRedemptionConfigZod.parse(deepMerge2(config, actorConfig))
2938
+ config: RewardRedemptionConfigZod.parse(deepMerge3(config, actorConfig))
2740
2939
  }, result._root);
2741
2940
  break;
2742
2941
  }
@@ -2824,6 +3023,8 @@ export {
2824
3023
  DEFAULT_ACTOR_ACCOUNT_PATH,
2825
3024
  DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL,
2826
3025
  DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL,
3026
+ DEFAULT_MEMPOOL_DEMOTION_THRESHOLD,
3027
+ DEFAULT_MEMPOOL_MAX_PENDING_TRANSACTIONS,
2827
3028
  DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL,
2828
3029
  DefaultServiceProvider,
2829
3030
  DerivationPathCollisionError,
@@ -2846,6 +3047,7 @@ export {
2846
3047
  RewardRedemptionConfigContext,
2847
3048
  RewardRedemptionConfigZod,
2848
3049
  SHARED_ACCOUNT_REPORT_COUNT,
3050
+ SHARED_LOCATOR_SUPPORTED_ACTORS,
2849
3051
  ServiceLifetime,
2850
3052
  SimpleRejectedTransactionsArchivistProvider,
2851
3053
  asApiConfig,
@@ -2868,6 +3070,7 @@ export {
2868
3070
  buildProcessSharedResources,
2869
3071
  buildStatelessApiLocator,
2870
3072
  buildTelemetryConfig,
3073
+ canUseSharedLocator,
2871
3074
  clearResolvedWalletReport,
2872
3075
  contextFromConfigWithoutLocator,
2873
3076
  createCapabilityRegistry,
@@ -2923,6 +3126,7 @@ export {
2923
3126
  resolveWalletForActor,
2924
3127
  resolveWalletReport,
2925
3128
  rootLocatorFromConfig,
3129
+ sharedLocatorFromConfig,
2926
3130
  telemetryContextFromConfig,
2927
3131
  toApiConfig,
2928
3132
  toApiConfigContext,