@lodestar/builder 1.48.0-dev.e9c9b8835d → 1.48.0-dev.fd70e5fc15
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/lib/builder.d.ts +1 -11
- package/lib/builder.d.ts.map +1 -1
- package/lib/builder.js +2 -30
- package/lib/builder.js.map +1 -1
- package/lib/identity.d.ts +1 -0
- package/lib/identity.d.ts.map +1 -1
- package/lib/identity.js +4 -11
- package/lib/identity.js.map +1 -1
- package/package.json +10 -10
- package/src/builder.ts +3 -45
- package/src/identity.ts +6 -13
- package/lib/services/bidLedger.d.ts +0 -61
- package/lib/services/bidLedger.d.ts.map +0 -1
- package/lib/services/bidLedger.js +0 -154
- package/lib/services/bidLedger.js.map +0 -1
- package/lib/services/bidPolicy.d.ts +0 -30
- package/lib/services/bidPolicy.d.ts.map +0 -1
- package/lib/services/bidPolicy.js +0 -37
- package/lib/services/bidPolicy.js.map +0 -1
- package/lib/services/blockObserver.d.ts +0 -48
- package/lib/services/blockObserver.d.ts.map +0 -1
- package/lib/services/blockObserver.js +0 -172
- package/lib/services/blockObserver.js.map +0 -1
- package/lib/services/payloadStore.d.ts +0 -25
- package/lib/services/payloadStore.d.ts.map +0 -1
- package/lib/services/payloadStore.js +0 -25
- package/lib/services/payloadStore.js.map +0 -1
- package/lib/services/proposerPreferencesTracker.d.ts +0 -15
- package/lib/services/proposerPreferencesTracker.d.ts.map +0 -1
- package/lib/services/proposerPreferencesTracker.js +0 -68
- package/lib/services/proposerPreferencesTracker.js.map +0 -1
- package/src/services/bidLedger.ts +0 -245
- package/src/services/bidPolicy.ts +0 -65
- package/src/services/blockObserver.ts +0 -231
- package/src/services/payloadStore.ts +0 -51
- package/src/services/proposerPreferencesTracker.ts +0 -74
package/lib/builder.d.ts
CHANGED
|
@@ -4,20 +4,14 @@ import { ClockOptions, IClock } from "@lodestar/state-transition";
|
|
|
4
4
|
import { BuilderIndex, ExecutionAddress } from "@lodestar/types";
|
|
5
5
|
import { Logger } from "@lodestar/utils";
|
|
6
6
|
import { Metrics } from "./metrics.js";
|
|
7
|
-
import { BlockObserver } from "./services/blockObserver.js";
|
|
8
7
|
import { BuilderSigner, Keypair } from "./services/builderSigner.js";
|
|
9
8
|
import { BuilderStatusTracker } from "./services/builderStatusTracker.js";
|
|
10
|
-
import { PayloadStore } from "./services/payloadStore.js";
|
|
11
|
-
import { ProposerPreferencesTracker } from "./services/proposerPreferencesTracker.js";
|
|
12
9
|
export type BuilderModules = {
|
|
13
10
|
opts: BuilderOptions;
|
|
14
11
|
builderSigner: BuilderSigner;
|
|
15
|
-
blockObserver: BlockObserver;
|
|
16
12
|
builderStatusTracker: BuilderStatusTracker;
|
|
17
|
-
proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
18
13
|
clock: IClock;
|
|
19
14
|
index: BuilderIndex;
|
|
20
|
-
store: PayloadStore;
|
|
21
15
|
};
|
|
22
16
|
export type BuilderOptions = {
|
|
23
17
|
logger: Logger;
|
|
@@ -34,18 +28,14 @@ export type BuilderOptions = {
|
|
|
34
28
|
*/
|
|
35
29
|
export declare class Builder {
|
|
36
30
|
readonly builderSigner: BuilderSigner;
|
|
37
|
-
readonly proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
38
|
-
private readonly blockObserver;
|
|
39
31
|
private readonly builderStatusTracker;
|
|
40
32
|
private readonly controller;
|
|
41
33
|
private readonly clock;
|
|
42
34
|
private readonly index;
|
|
43
35
|
private readonly logger;
|
|
44
36
|
private readonly executionFeeRecipient;
|
|
45
|
-
|
|
46
|
-
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index, store, }: BuilderModules);
|
|
37
|
+
constructor({ opts, builderSigner, builderStatusTracker, clock, index }: BuilderModules);
|
|
47
38
|
static init(opts: BuilderOptions): Promise<Builder>;
|
|
48
|
-
private onSlot;
|
|
49
39
|
close(): Promise<void>;
|
|
50
40
|
}
|
|
51
41
|
//# sourceMappingURL=builder.d.ts.map
|
package/lib/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAQ,YAAY,EAAE,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAQ,YAAY,EAAE,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,aAAa,EAAE,OAAO,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAC;AAExE,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,qBAAqB,EAAE,gBAAgB,CAAC;IACxC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAmB;IAEzD,YAAY,EAAC,IAAI,EAAE,aAAa,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAC,EAAE,cAAc,EAiBpF;IAED,OAAa,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BxD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
package/lib/builder.js
CHANGED
|
@@ -4,41 +4,29 @@ import { toHex, toRootHex } from "@lodestar/utils";
|
|
|
4
4
|
import { waitForGenesis } from "./genesis.js";
|
|
5
5
|
import { resolveBuilderIdentity } from "./identity.js";
|
|
6
6
|
import { logNodeVersion, waitForNodeReady } from "./readiness.js";
|
|
7
|
-
import { BlockObserver } from "./services/blockObserver.js";
|
|
8
7
|
import { BuilderSigner } from "./services/builderSigner.js";
|
|
9
8
|
import { BuilderStatusTracker } from "./services/builderStatusTracker.js";
|
|
10
|
-
import { PayloadStore } from "./services/payloadStore.js";
|
|
11
|
-
import { ProposerPreferencesTracker } from "./services/proposerPreferencesTracker.js";
|
|
12
9
|
/**
|
|
13
10
|
* Main class for the Builder client.
|
|
14
11
|
*/
|
|
15
12
|
export class Builder {
|
|
16
13
|
builderSigner;
|
|
17
|
-
proposerPreferencesTracker;
|
|
18
|
-
blockObserver;
|
|
19
14
|
builderStatusTracker;
|
|
20
15
|
controller;
|
|
21
16
|
clock;
|
|
22
17
|
index;
|
|
23
18
|
logger;
|
|
24
19
|
executionFeeRecipient;
|
|
25
|
-
|
|
26
|
-
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index, store, }) {
|
|
20
|
+
constructor({ opts, builderSigner, builderStatusTracker, clock, index }) {
|
|
27
21
|
this.builderSigner = builderSigner;
|
|
28
|
-
this.blockObserver = blockObserver;
|
|
29
22
|
this.builderStatusTracker = builderStatusTracker;
|
|
30
|
-
this.proposerPreferencesTracker = proposerPreferencesTracker;
|
|
31
23
|
this.clock = clock;
|
|
32
24
|
this.controller = opts.abortController;
|
|
33
25
|
this.logger = opts.logger;
|
|
34
26
|
this.index = index;
|
|
35
|
-
this.store = store;
|
|
36
27
|
this.executionFeeRecipient = opts.executionFeeRecipient;
|
|
37
|
-
this.clock.runEverySlot(async (slot) => this.onSlot(slot));
|
|
38
28
|
this.clock.runEveryEpoch((epoch) => this.builderStatusTracker.poll(epoch));
|
|
39
29
|
this.clock.start(this.controller.signal);
|
|
40
|
-
this.blockObserver.start(this.controller.signal);
|
|
41
|
-
this.proposerPreferencesTracker.start(this.controller.signal);
|
|
42
30
|
this.logger.info("Builder client initialized", {
|
|
43
31
|
index: this.index,
|
|
44
32
|
executionFeeRecipient: toHex(this.executionFeeRecipient),
|
|
@@ -60,23 +48,7 @@ export class Builder {
|
|
|
60
48
|
const clock = new Clock(config, logger, { genesisTime: Number(genesis.genesisTime), ...opts.clock });
|
|
61
49
|
const index = await resolveBuilderIdentity(api, logger, builderSigner.getPubkeyHex(), opts.abortController.signal, clock, config);
|
|
62
50
|
const builderStatusTracker = new BuilderStatusTracker(api, logger, index, opts.metrics);
|
|
63
|
-
|
|
64
|
-
const proposerPreferencesTracker = new ProposerPreferencesTracker(api, logger);
|
|
65
|
-
const store = new PayloadStore();
|
|
66
|
-
return new Builder({
|
|
67
|
-
opts,
|
|
68
|
-
builderSigner,
|
|
69
|
-
blockObserver,
|
|
70
|
-
builderStatusTracker,
|
|
71
|
-
proposerPreferencesTracker,
|
|
72
|
-
clock,
|
|
73
|
-
index,
|
|
74
|
-
store,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
async onSlot(slot) {
|
|
78
|
-
this.store.prune(slot);
|
|
79
|
-
this.proposerPreferencesTracker.prune(slot);
|
|
51
|
+
return new Builder({ opts, builderSigner, builderStatusTracker, clock, index });
|
|
80
52
|
}
|
|
81
53
|
async close() {
|
|
82
54
|
this.controller.abort();
|
package/lib/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAC,KAAK,EAAuB,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EAAS,KAAK,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,sBAAsB,EAAC,MAAM,eAAe,CAAC;AAErD,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
package/lib/identity.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { ChainForkConfig } from "@lodestar/config";
|
|
|
3
3
|
import { IClock } from "@lodestar/state-transition";
|
|
4
4
|
import { BuilderIndex, BuilderStatus } from "@lodestar/types";
|
|
5
5
|
import { Logger } from "@lodestar/utils";
|
|
6
|
+
export declare const WAITING_FOR_BUILDER_POLL_MS: number;
|
|
6
7
|
export declare function resolveBuilderIdentity(api: ApiClient, logger: Logger, id: routes.beacon.BuilderId, signal: AbortSignal, clock: IClock, config: ChainForkConfig): Promise<BuilderIndex>;
|
|
7
8
|
export declare function getBuilderStatus(api: ApiClient, logger: Logger, id: routes.beacon.BuilderId): Promise<{
|
|
8
9
|
status: BuilderStatus;
|
package/lib/identity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAA4B,MAAM,EAAC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAA4B,MAAM,EAAC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAe,MAAM,EAA2C,MAAM,iBAAiB,CAAC;AAE/F,eAAO,MAAM,2BAA2B,QAAY,CAAC;AAErD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAC3B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,CAAC,CAgBvB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,GAC1B,OAAO,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAAC,CAe1D"}
|
package/lib/identity.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ApiError, HttpStatusCode } from "@lodestar/api";
|
|
2
2
|
import { PAYLOAD_BUILDER_VERSION } from "@lodestar/params";
|
|
3
|
-
import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
4
3
|
import { ErrorAborted, TimeoutError, isFetchError, sleep, toHex } from "@lodestar/utils";
|
|
4
|
+
export const WAITING_FOR_BUILDER_POLL_MS = 10 * 1000;
|
|
5
5
|
export async function resolveBuilderIdentity(api, logger, id, signal, clock, config) {
|
|
6
6
|
const builderEntry = await waitForBuilder(api, logger, id, signal, clock, config);
|
|
7
7
|
if (builderEntry.builder.version !== PAYLOAD_BUILDER_VERSION) {
|
|
@@ -44,7 +44,7 @@ async function waitForBuilder(api, logger, id, signal, clock, config) {
|
|
|
44
44
|
currentEpoch,
|
|
45
45
|
slot: clock.getCurrentSlot(),
|
|
46
46
|
});
|
|
47
|
-
await sleep(
|
|
47
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
48
48
|
continue;
|
|
49
49
|
}
|
|
50
50
|
let builder = null;
|
|
@@ -60,7 +60,7 @@ async function waitForBuilder(api, logger, id, signal, clock, config) {
|
|
|
60
60
|
currentEpoch,
|
|
61
61
|
slot: clock.getCurrentSlot(),
|
|
62
62
|
});
|
|
63
|
-
await sleep(
|
|
63
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
64
64
|
continue;
|
|
65
65
|
}
|
|
66
66
|
throw e;
|
|
@@ -73,12 +73,11 @@ async function waitForBuilder(api, logger, id, signal, clock, config) {
|
|
|
73
73
|
}
|
|
74
74
|
if (builder?.status === "pending") {
|
|
75
75
|
logger.info("Waiting for builder deposit to be finalized", { id, slot: clock.getCurrentSlot() });
|
|
76
|
-
await sleep(msToNextEpochPoll(clock), signal);
|
|
77
76
|
}
|
|
78
77
|
else {
|
|
79
78
|
logger.info("Waiting for builder to be known to the beacon node", { id, slot: clock.getCurrentSlot() });
|
|
80
|
-
await sleep(msToNextSlotPoll(clock), signal);
|
|
81
79
|
}
|
|
80
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
82
81
|
}
|
|
83
82
|
throw new ErrorAborted("waitForBuilder");
|
|
84
83
|
}
|
|
@@ -111,10 +110,4 @@ async function fetchBuilder(api, logger, id) {
|
|
|
111
110
|
throw e;
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
|
-
function msToNextEpochPoll(clock) {
|
|
115
|
-
return clock.msToSlot(computeStartSlotAtEpoch(clock.getCurrentEpoch() + 1));
|
|
116
|
-
}
|
|
117
|
-
function msToNextSlotPoll(clock) {
|
|
118
|
-
return clock.msToSlot(clock.getCurrentSlot() + 1);
|
|
119
|
-
}
|
|
120
113
|
//# sourceMappingURL=identity.js.map
|
package/lib/identity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,QAAQ,EAAE,cAAc,EAAS,MAAM,eAAe,CAAC;AAE1E,OAAO,EAAC,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodestar/builder",
|
|
3
|
-
"version": "1.48.0-dev.
|
|
3
|
+
"version": "1.48.0-dev.fd70e5fc15",
|
|
4
4
|
"description": "A Typescript implementation of the builder client",
|
|
5
5
|
"author": "ChainSafe Systems",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -48,16 +48,16 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@chainsafe/lodestar-z": "catalog:",
|
|
50
50
|
"@chainsafe/ssz": "^1.7.0",
|
|
51
|
-
"@lodestar/api": "^1.48.0-dev.
|
|
52
|
-
"@lodestar/config": "^1.48.0-dev.
|
|
53
|
-
"@lodestar/params": "^1.48.0-dev.
|
|
54
|
-
"@lodestar/state-transition": "^1.48.0-dev.
|
|
55
|
-
"@lodestar/types": "^1.48.0-dev.
|
|
56
|
-
"@lodestar/utils": "^1.48.0-dev.
|
|
51
|
+
"@lodestar/api": "^1.48.0-dev.fd70e5fc15",
|
|
52
|
+
"@lodestar/config": "^1.48.0-dev.fd70e5fc15",
|
|
53
|
+
"@lodestar/params": "^1.48.0-dev.fd70e5fc15",
|
|
54
|
+
"@lodestar/state-transition": "^1.48.0-dev.fd70e5fc15",
|
|
55
|
+
"@lodestar/types": "^1.48.0-dev.fd70e5fc15",
|
|
56
|
+
"@lodestar/utils": "^1.48.0-dev.fd70e5fc15"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@lodestar/logger": "^1.48.0-dev.
|
|
60
|
-
"@lodestar/test-utils": "^1.48.0-dev.
|
|
59
|
+
"@lodestar/logger": "^1.48.0-dev.fd70e5fc15",
|
|
60
|
+
"@lodestar/test-utils": "^1.48.0-dev.fd70e5fc15"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "dbc49c8fa4a2870bc2b4b102fe61a4d2909621fa"
|
|
63
63
|
}
|
package/src/builder.ts
CHANGED
|
@@ -7,21 +7,15 @@ import {waitForGenesis} from "./genesis.js";
|
|
|
7
7
|
import {resolveBuilderIdentity} from "./identity.js";
|
|
8
8
|
import {Metrics} from "./metrics.js";
|
|
9
9
|
import {logNodeVersion, waitForNodeReady} from "./readiness.js";
|
|
10
|
-
import {BlockObserver} from "./services/blockObserver.js";
|
|
11
10
|
import {BuilderSigner, Keypair} from "./services/builderSigner.js";
|
|
12
11
|
import {BuilderStatusTracker} from "./services/builderStatusTracker.js";
|
|
13
|
-
import {PayloadStore} from "./services/payloadStore.js";
|
|
14
|
-
import {ProposerPreferencesTracker} from "./services/proposerPreferencesTracker.js";
|
|
15
12
|
|
|
16
13
|
export type BuilderModules = {
|
|
17
14
|
opts: BuilderOptions;
|
|
18
15
|
builderSigner: BuilderSigner;
|
|
19
|
-
blockObserver: BlockObserver;
|
|
20
16
|
builderStatusTracker: BuilderStatusTracker;
|
|
21
|
-
proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
22
17
|
clock: IClock;
|
|
23
18
|
index: BuilderIndex;
|
|
24
|
-
store: PayloadStore;
|
|
25
19
|
};
|
|
26
20
|
|
|
27
21
|
export type BuilderOptions = {
|
|
@@ -40,43 +34,25 @@ export type BuilderOptions = {
|
|
|
40
34
|
*/
|
|
41
35
|
export class Builder {
|
|
42
36
|
readonly builderSigner: BuilderSigner;
|
|
43
|
-
readonly proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
44
|
-
private readonly blockObserver: BlockObserver;
|
|
45
37
|
private readonly builderStatusTracker: BuilderStatusTracker;
|
|
46
38
|
private readonly controller: AbortController;
|
|
47
39
|
private readonly clock: IClock;
|
|
48
40
|
private readonly index: BuilderIndex;
|
|
49
41
|
private readonly logger: Logger;
|
|
50
42
|
private readonly executionFeeRecipient: ExecutionAddress;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
constructor({
|
|
54
|
-
opts,
|
|
55
|
-
builderSigner,
|
|
56
|
-
blockObserver,
|
|
57
|
-
builderStatusTracker,
|
|
58
|
-
proposerPreferencesTracker,
|
|
59
|
-
clock,
|
|
60
|
-
index,
|
|
61
|
-
store,
|
|
62
|
-
}: BuilderModules) {
|
|
43
|
+
|
|
44
|
+
constructor({opts, builderSigner, builderStatusTracker, clock, index}: BuilderModules) {
|
|
63
45
|
this.builderSigner = builderSigner;
|
|
64
|
-
this.blockObserver = blockObserver;
|
|
65
46
|
this.builderStatusTracker = builderStatusTracker;
|
|
66
|
-
this.proposerPreferencesTracker = proposerPreferencesTracker;
|
|
67
47
|
this.clock = clock;
|
|
68
48
|
this.controller = opts.abortController;
|
|
69
49
|
this.logger = opts.logger;
|
|
70
50
|
this.index = index;
|
|
71
|
-
this.store = store;
|
|
72
51
|
|
|
73
52
|
this.executionFeeRecipient = opts.executionFeeRecipient;
|
|
74
53
|
|
|
75
|
-
this.clock.runEverySlot(async (slot) => this.onSlot(slot));
|
|
76
54
|
this.clock.runEveryEpoch((epoch) => this.builderStatusTracker.poll(epoch));
|
|
77
55
|
this.clock.start(this.controller.signal);
|
|
78
|
-
this.blockObserver.start(this.controller.signal);
|
|
79
|
-
this.proposerPreferencesTracker.start(this.controller.signal);
|
|
80
56
|
|
|
81
57
|
this.logger.info("Builder client initialized", {
|
|
82
58
|
index: this.index,
|
|
@@ -113,26 +89,8 @@ export class Builder {
|
|
|
113
89
|
);
|
|
114
90
|
|
|
115
91
|
const builderStatusTracker = new BuilderStatusTracker(api, logger, index, opts.metrics);
|
|
116
|
-
const blockObserver = new BlockObserver(config, logger, api);
|
|
117
|
-
const proposerPreferencesTracker = new ProposerPreferencesTracker(api, logger);
|
|
118
|
-
|
|
119
|
-
const store = new PayloadStore();
|
|
120
|
-
|
|
121
|
-
return new Builder({
|
|
122
|
-
opts,
|
|
123
|
-
builderSigner,
|
|
124
|
-
blockObserver,
|
|
125
|
-
builderStatusTracker,
|
|
126
|
-
proposerPreferencesTracker,
|
|
127
|
-
clock,
|
|
128
|
-
index,
|
|
129
|
-
store,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
92
|
|
|
133
|
-
|
|
134
|
-
this.store.prune(slot);
|
|
135
|
-
this.proposerPreferencesTracker.prune(slot);
|
|
93
|
+
return new Builder({opts, builderSigner, builderStatusTracker, clock, index});
|
|
136
94
|
}
|
|
137
95
|
|
|
138
96
|
async close(): Promise<void> {
|
package/src/identity.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {ApiClient, ApiError, HttpStatusCode, routes} from "@lodestar/api";
|
|
2
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
3
|
import {PAYLOAD_BUILDER_VERSION} from "@lodestar/params";
|
|
4
|
-
import {IClock
|
|
4
|
+
import {IClock} from "@lodestar/state-transition";
|
|
5
5
|
import {BuilderIndex, BuilderStatus} from "@lodestar/types";
|
|
6
6
|
import {ErrorAborted, Logger, TimeoutError, isFetchError, sleep, toHex} from "@lodestar/utils";
|
|
7
7
|
|
|
8
|
+
export const WAITING_FOR_BUILDER_POLL_MS = 10 * 1000;
|
|
9
|
+
|
|
8
10
|
export async function resolveBuilderIdentity(
|
|
9
11
|
api: ApiClient,
|
|
10
12
|
logger: Logger,
|
|
@@ -69,7 +71,7 @@ async function waitForBuilder(
|
|
|
69
71
|
currentEpoch,
|
|
70
72
|
slot: clock.getCurrentSlot(),
|
|
71
73
|
});
|
|
72
|
-
await sleep(
|
|
74
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
73
75
|
continue;
|
|
74
76
|
}
|
|
75
77
|
|
|
@@ -85,7 +87,7 @@ async function waitForBuilder(
|
|
|
85
87
|
currentEpoch,
|
|
86
88
|
slot: clock.getCurrentSlot(),
|
|
87
89
|
});
|
|
88
|
-
await sleep(
|
|
90
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
89
91
|
continue;
|
|
90
92
|
}
|
|
91
93
|
throw e;
|
|
@@ -99,11 +101,10 @@ async function waitForBuilder(
|
|
|
99
101
|
}
|
|
100
102
|
if (builder?.status === "pending") {
|
|
101
103
|
logger.info("Waiting for builder deposit to be finalized", {id, slot: clock.getCurrentSlot()});
|
|
102
|
-
await sleep(msToNextEpochPoll(clock), signal);
|
|
103
104
|
} else {
|
|
104
105
|
logger.info("Waiting for builder to be known to the beacon node", {id, slot: clock.getCurrentSlot()});
|
|
105
|
-
await sleep(msToNextSlotPoll(clock), signal);
|
|
106
106
|
}
|
|
107
|
+
await sleep(WAITING_FOR_BUILDER_POLL_MS, signal);
|
|
107
108
|
}
|
|
108
109
|
throw new ErrorAborted("waitForBuilder");
|
|
109
110
|
}
|
|
@@ -144,11 +145,3 @@ async function fetchBuilder(
|
|
|
144
145
|
throw e;
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
|
-
|
|
148
|
-
function msToNextEpochPoll(clock: IClock): number {
|
|
149
|
-
return clock.msToSlot(computeStartSlotAtEpoch(clock.getCurrentEpoch() + 1));
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function msToNextSlotPoll(clock: IClock): number {
|
|
153
|
-
return clock.msToSlot(clock.getCurrentSlot() + 1);
|
|
154
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import type { Epoch, RootHex, Slot } from "@lodestar/types";
|
|
2
|
-
import { LodestarError } from "@lodestar/utils";
|
|
3
|
-
export type SubmittedBid = {
|
|
4
|
-
slot: Slot;
|
|
5
|
-
parentBlockHash: RootHex;
|
|
6
|
-
parentBlockRoot: RootHex;
|
|
7
|
-
blockHash: RootHex;
|
|
8
|
-
valueGwei: number;
|
|
9
|
-
signedBidRoot: RootHex;
|
|
10
|
-
};
|
|
11
|
-
export type BidIdentity = Pick<SubmittedBid, "slot" | "parentBlockHash" | "parentBlockRoot" | "blockHash">;
|
|
12
|
-
export type BidLedgerRecord = SubmittedBid & {
|
|
13
|
-
wonBlockRoots: RootHex[];
|
|
14
|
-
};
|
|
15
|
-
export declare enum BidLedgerErrorCode {
|
|
16
|
-
INVALID_BID_VALUE = "BID_LEDGER_ERROR_INVALID_BID_VALUE",
|
|
17
|
-
DUPLICATE_BID = "BID_LEDGER_ERROR_DUPLICATE_BID",
|
|
18
|
-
REVEAL_CONFLICT = "BID_LEDGER_ERROR_REVEAL_CONFLICT",
|
|
19
|
-
UNSETTLED_VALUE_OVERFLOW = "BID_LEDGER_ERROR_UNSETTLED_VALUE_OVERFLOW"
|
|
20
|
-
}
|
|
21
|
-
export type BidLedgerErrorType = {
|
|
22
|
-
code: BidLedgerErrorCode.INVALID_BID_VALUE;
|
|
23
|
-
valueGwei: number;
|
|
24
|
-
} | {
|
|
25
|
-
code: BidLedgerErrorCode.DUPLICATE_BID;
|
|
26
|
-
slot: Slot;
|
|
27
|
-
parentBlockHash: RootHex;
|
|
28
|
-
parentBlockRoot: RootHex;
|
|
29
|
-
} | {
|
|
30
|
-
code: BidLedgerErrorCode.REVEAL_CONFLICT;
|
|
31
|
-
blockRoot: RootHex;
|
|
32
|
-
blockHash: RootHex;
|
|
33
|
-
revealedBlockHash: RootHex;
|
|
34
|
-
envelopeRoot: RootHex;
|
|
35
|
-
revealedEnvelopeRoot: RootHex;
|
|
36
|
-
} | {
|
|
37
|
-
code: BidLedgerErrorCode.UNSETTLED_VALUE_OVERFLOW;
|
|
38
|
-
currentEpoch: Epoch;
|
|
39
|
-
};
|
|
40
|
-
export declare class BidLedgerError extends LodestarError<BidLedgerErrorType> {
|
|
41
|
-
}
|
|
42
|
-
/** Tracks at most one bid per (slot, parentBlockHash, parentBlockRoot) and its reveal obligations. */
|
|
43
|
-
export declare class BidLedger {
|
|
44
|
-
private readonly bidsBySlot;
|
|
45
|
-
private readonly revealedPayloadByBlockRoot;
|
|
46
|
-
hasSubmitted(slot: Slot, parentBlockHash: RootHex, parentBlockRoot: RootHex): boolean;
|
|
47
|
-
recordBid(bid: SubmittedBid): BidLedgerRecord;
|
|
48
|
-
recordWin(identity: BidIdentity & Pick<SubmittedBid, "signedBidRoot">, blockRoot: RootHex): BidLedgerRecord | null;
|
|
49
|
-
/** Release a winning bid liability only after its payment is known to be reflected in Builder balance. */
|
|
50
|
-
recordPaymentSettled(identity: BidIdentity): BidLedgerRecord | null;
|
|
51
|
-
canReveal(blockRoot: RootHex, blockHash: RootHex, envelopeRoot: RootHex): boolean;
|
|
52
|
-
hasRevealed(blockRoot: RootHex): boolean;
|
|
53
|
-
hasPublishedReveal(blockRoot: RootHex): boolean;
|
|
54
|
-
recordReveal(slot: Slot, blockRoot: RootHex, blockHash: RootHex, envelopeRoot: RootHex): void;
|
|
55
|
-
recordRevealPublished(slot: Slot, blockRoot: RootHex, blockHash: RootHex, envelopeRoot: RootHex): void;
|
|
56
|
-
getUnsettledValueGwei(currentEpoch: Epoch): number;
|
|
57
|
-
getBidsForSlot(slot: Slot): BidLedgerRecord[];
|
|
58
|
-
prune(currentSlot: Slot): number;
|
|
59
|
-
private getBid;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=bidLedger.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bidLedger.d.ts","sourceRoot":"","sources":["../../src/services/bidLedger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
2
|
-
import { LodestarError } from "@lodestar/utils";
|
|
3
|
-
export var BidLedgerErrorCode;
|
|
4
|
-
(function (BidLedgerErrorCode) {
|
|
5
|
-
BidLedgerErrorCode["INVALID_BID_VALUE"] = "BID_LEDGER_ERROR_INVALID_BID_VALUE";
|
|
6
|
-
BidLedgerErrorCode["DUPLICATE_BID"] = "BID_LEDGER_ERROR_DUPLICATE_BID";
|
|
7
|
-
BidLedgerErrorCode["REVEAL_CONFLICT"] = "BID_LEDGER_ERROR_REVEAL_CONFLICT";
|
|
8
|
-
BidLedgerErrorCode["UNSETTLED_VALUE_OVERFLOW"] = "BID_LEDGER_ERROR_UNSETTLED_VALUE_OVERFLOW";
|
|
9
|
-
})(BidLedgerErrorCode || (BidLedgerErrorCode = {}));
|
|
10
|
-
export class BidLedgerError extends LodestarError {
|
|
11
|
-
}
|
|
12
|
-
const RECORD_RETENTION_EPOCHS = 3;
|
|
13
|
-
const KEEP_SLOTS = RECORD_RETENTION_EPOCHS * SLOTS_PER_EPOCH;
|
|
14
|
-
/** Tracks at most one bid per (slot, parentBlockHash, parentBlockRoot) and its reveal obligations. */
|
|
15
|
-
export class BidLedger {
|
|
16
|
-
bidsBySlot = new Map();
|
|
17
|
-
revealedPayloadByBlockRoot = new Map();
|
|
18
|
-
hasSubmitted(slot, parentBlockHash, parentBlockRoot) {
|
|
19
|
-
return this.bidsBySlot.get(slot)?.has(tupleKey(parentBlockHash, parentBlockRoot)) ?? false;
|
|
20
|
-
}
|
|
21
|
-
recordBid(bid) {
|
|
22
|
-
if (!Number.isSafeInteger(bid.valueGwei) || bid.valueGwei < 0) {
|
|
23
|
-
throw new BidLedgerError({ code: BidLedgerErrorCode.INVALID_BID_VALUE, valueGwei: bid.valueGwei }, `Invalid bid value valueGwei=${bid.valueGwei}`);
|
|
24
|
-
}
|
|
25
|
-
let bidsForSlot = this.bidsBySlot.get(bid.slot);
|
|
26
|
-
if (bidsForSlot === undefined) {
|
|
27
|
-
bidsForSlot = new Map();
|
|
28
|
-
this.bidsBySlot.set(bid.slot, bidsForSlot);
|
|
29
|
-
}
|
|
30
|
-
const key = tupleKey(bid.parentBlockHash, bid.parentBlockRoot);
|
|
31
|
-
if (bidsForSlot.has(key)) {
|
|
32
|
-
throw new BidLedgerError({
|
|
33
|
-
code: BidLedgerErrorCode.DUPLICATE_BID,
|
|
34
|
-
slot: bid.slot,
|
|
35
|
-
parentBlockHash: bid.parentBlockHash,
|
|
36
|
-
parentBlockRoot: bid.parentBlockRoot,
|
|
37
|
-
}, `Bid already recorded slot=${bid.slot} parentBlockHash=${bid.parentBlockHash} parentBlockRoot=${bid.parentBlockRoot}`);
|
|
38
|
-
}
|
|
39
|
-
const record = { ...bid, wonBlockRoots: new Set(), paymentSettled: false };
|
|
40
|
-
bidsForSlot.set(key, record);
|
|
41
|
-
return toRecord(record);
|
|
42
|
-
}
|
|
43
|
-
recordWin(identity, blockRoot) {
|
|
44
|
-
const record = this.getBid(identity.slot, identity.parentBlockHash, identity.parentBlockRoot);
|
|
45
|
-
if (record === null || record.blockHash !== identity.blockHash || record.signedBidRoot !== identity.signedBidRoot) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
record.wonBlockRoots.add(blockRoot);
|
|
49
|
-
return toRecord(record);
|
|
50
|
-
}
|
|
51
|
-
/** Release a winning bid liability only after its payment is known to be reflected in Builder balance. */
|
|
52
|
-
recordPaymentSettled(identity) {
|
|
53
|
-
const record = this.getBid(identity.slot, identity.parentBlockHash, identity.parentBlockRoot);
|
|
54
|
-
if (record === null || record.blockHash !== identity.blockHash || record.wonBlockRoots.size === 0) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
record.paymentSettled = true;
|
|
58
|
-
return toRecord(record);
|
|
59
|
-
}
|
|
60
|
-
canReveal(blockRoot, blockHash, envelopeRoot) {
|
|
61
|
-
const revealedPayload = this.revealedPayloadByBlockRoot.get(blockRoot);
|
|
62
|
-
return (revealedPayload === undefined ||
|
|
63
|
-
(revealedPayload.blockHash === blockHash && revealedPayload.envelopeRoot === envelopeRoot));
|
|
64
|
-
}
|
|
65
|
-
hasRevealed(blockRoot) {
|
|
66
|
-
return this.revealedPayloadByBlockRoot.has(blockRoot);
|
|
67
|
-
}
|
|
68
|
-
hasPublishedReveal(blockRoot) {
|
|
69
|
-
return this.revealedPayloadByBlockRoot.get(blockRoot)?.published ?? false;
|
|
70
|
-
}
|
|
71
|
-
recordReveal(slot, blockRoot, blockHash, envelopeRoot) {
|
|
72
|
-
const revealedPayload = this.revealedPayloadByBlockRoot.get(blockRoot);
|
|
73
|
-
if (revealedPayload !== undefined) {
|
|
74
|
-
if (revealedPayload.blockHash !== blockHash || revealedPayload.envelopeRoot !== envelopeRoot) {
|
|
75
|
-
throw new BidLedgerError({
|
|
76
|
-
code: BidLedgerErrorCode.REVEAL_CONFLICT,
|
|
77
|
-
blockRoot,
|
|
78
|
-
blockHash,
|
|
79
|
-
revealedBlockHash: revealedPayload.blockHash,
|
|
80
|
-
envelopeRoot,
|
|
81
|
-
revealedEnvelopeRoot: revealedPayload.envelopeRoot,
|
|
82
|
-
}, `Different envelope already recorded blockRoot=${blockRoot} envelopeRoot=${revealedPayload.envelopeRoot}`);
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
this.revealedPayloadByBlockRoot.set(blockRoot, { slot, blockHash, envelopeRoot, published: false });
|
|
87
|
-
}
|
|
88
|
-
recordRevealPublished(slot, blockRoot, blockHash, envelopeRoot) {
|
|
89
|
-
this.recordReveal(slot, blockRoot, blockHash, envelopeRoot);
|
|
90
|
-
const revealedPayload = this.revealedPayloadByBlockRoot.get(blockRoot);
|
|
91
|
-
if (revealedPayload !== undefined) {
|
|
92
|
-
revealedPayload.published = true;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
getUnsettledValueGwei(currentEpoch) {
|
|
96
|
-
let total = 0;
|
|
97
|
-
for (const bidsForSlot of this.bidsBySlot.values()) {
|
|
98
|
-
for (const record of bidsForSlot.values()) {
|
|
99
|
-
if (record.wonBlockRoots.size === 0 || record.paymentSettled) {
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
total += record.valueGwei;
|
|
103
|
-
if (!Number.isSafeInteger(total)) {
|
|
104
|
-
throw new BidLedgerError({ code: BidLedgerErrorCode.UNSETTLED_VALUE_OVERFLOW, currentEpoch }, `Unsettled bid value exceeds the safe integer range currentEpoch=${currentEpoch}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return total;
|
|
109
|
-
}
|
|
110
|
-
getBidsForSlot(slot) {
|
|
111
|
-
return Array.from(this.bidsBySlot.get(slot)?.values() ?? [], toRecord);
|
|
112
|
-
}
|
|
113
|
-
prune(currentSlot) {
|
|
114
|
-
let removed = 0;
|
|
115
|
-
for (const [slot, bidsForSlot] of this.bidsBySlot) {
|
|
116
|
-
if (slot >= currentSlot - KEEP_SLOTS) {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
for (const [key, record] of bidsForSlot) {
|
|
120
|
-
if (record.wonBlockRoots.size === 0 || record.paymentSettled) {
|
|
121
|
-
bidsForSlot.delete(key);
|
|
122
|
-
removed++;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
if (bidsForSlot.size === 0) {
|
|
126
|
-
this.bidsBySlot.delete(slot);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
for (const [blockRoot, revealedPayload] of this.revealedPayloadByBlockRoot) {
|
|
130
|
-
if (revealedPayload.slot < currentSlot - KEEP_SLOTS) {
|
|
131
|
-
this.revealedPayloadByBlockRoot.delete(blockRoot);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return removed;
|
|
135
|
-
}
|
|
136
|
-
getBid(slot, parentBlockHash, parentBlockRoot) {
|
|
137
|
-
return this.bidsBySlot.get(slot)?.get(tupleKey(parentBlockHash, parentBlockRoot)) ?? null;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function tupleKey(parentBlockHash, parentBlockRoot) {
|
|
141
|
-
return `${parentBlockHash}:${parentBlockRoot}`;
|
|
142
|
-
}
|
|
143
|
-
function toRecord(record) {
|
|
144
|
-
return {
|
|
145
|
-
slot: record.slot,
|
|
146
|
-
parentBlockHash: record.parentBlockHash,
|
|
147
|
-
parentBlockRoot: record.parentBlockRoot,
|
|
148
|
-
blockHash: record.blockHash,
|
|
149
|
-
valueGwei: record.valueGwei,
|
|
150
|
-
signedBidRoot: record.signedBidRoot,
|
|
151
|
-
wonBlockRoots: Array.from(record.wonBlockRoots),
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=bidLedger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bidLedger.js","sourceRoot":"","sources":["../../src/services/bidLedger.ts"],"names":[],"mappings":"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"}
|