@xyo-network/chain-orchestration 1.22.0 → 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.
- package/dist/browser/index.mjs +14 -0
- package/dist/browser/index.mjs.map +1 -1
- package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
- package/dist/browser/node/config/capabilities/descriptors.d.ts.map +1 -1
- package/dist/browser/node/config/locators/index.d.ts +1 -0
- package/dist/browser/node/config/locators/index.d.ts.map +1 -1
- package/dist/browser/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
- package/dist/browser/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
- package/dist/browser/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
- package/dist/browser/shared/config/actors/Mempool.d.ts +14 -0
- package/dist/browser/shared/config/actors/Mempool.d.ts.map +1 -1
- package/dist/neutral/index.mjs +14 -0
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
- package/dist/neutral/node/config/capabilities/descriptors.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/index.d.ts +1 -0
- package/dist/neutral/node/config/locators/index.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
- package/dist/neutral/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
- package/dist/neutral/shared/config/actors/Mempool.d.ts +14 -0
- package/dist/neutral/shared/config/actors/Mempool.d.ts.map +1 -1
- package/dist/node/index.mjs +220 -16
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -1
- package/dist/node/node/config/capabilities/descriptors.d.ts.map +1 -1
- package/dist/node/node/config/locators/index.d.ts +1 -0
- package/dist/node/node/config/locators/index.d.ts.map +1 -1
- package/dist/node/node/config/locators/locatorsFromConfig.d.ts.map +1 -1
- package/dist/node/node/config/locators/sharedLocatorFromConfig.d.ts +68 -0
- package/dist/node/node/config/locators/sharedLocatorFromConfig.d.ts.map +1 -0
- package/dist/node/shared/config/actors/Mempool.d.ts +14 -0
- package/dist/node/shared/config/actors/Mempool.d.ts.map +1 -1
- package/package.json +26 -35
|
@@ -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;
|
|
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"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -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) =>
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
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) =>
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|