@gzeoneth/gov-tracker 0.1.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/LICENSE +191 -0
- package/README.md +201 -0
- package/dist/abis.d.ts +79 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +159 -0
- package/dist/abis.js.map +1 -0
- package/dist/cli/lib/cli.d.ts +92 -0
- package/dist/cli/lib/cli.d.ts.map +1 -0
- package/dist/cli/lib/cli.js +562 -0
- package/dist/cli/lib/cli.js.map +1 -0
- package/dist/cli/lib/election-check.d.ts +46 -0
- package/dist/cli/lib/election-check.d.ts.map +1 -0
- package/dist/cli/lib/election-check.js +136 -0
- package/dist/cli/lib/election-check.js.map +1 -0
- package/dist/cli/lib/json-state.d.ts +100 -0
- package/dist/cli/lib/json-state.d.ts.map +1 -0
- package/dist/cli/lib/json-state.js +225 -0
- package/dist/cli/lib/json-state.js.map +1 -0
- package/dist/cli/monitor.d.ts +3 -0
- package/dist/cli/monitor.d.ts.map +1 -0
- package/dist/cli/monitor.js +442 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/constants.d.ts +235 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +293 -0
- package/dist/constants.js.map +1 -0
- package/dist/discovery/governor-discovery.d.ts +84 -0
- package/dist/discovery/governor-discovery.d.ts.map +1 -0
- package/dist/discovery/governor-discovery.js +310 -0
- package/dist/discovery/governor-discovery.js.map +1 -0
- package/dist/discovery/security-council.d.ts +68 -0
- package/dist/discovery/security-council.d.ts.map +1 -0
- package/dist/discovery/security-council.js +181 -0
- package/dist/discovery/security-council.js.map +1 -0
- package/dist/discovery/timelock-discovery.d.ts +99 -0
- package/dist/discovery/timelock-discovery.d.ts.map +1 -0
- package/dist/discovery/timelock-discovery.js +322 -0
- package/dist/discovery/timelock-discovery.js.map +1 -0
- package/dist/election.d.ts +172 -0
- package/dist/election.d.ts.map +1 -0
- package/dist/election.js +464 -0
- package/dist/election.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +164 -0
- package/dist/index.js.map +1 -0
- package/dist/stages/base.d.ts +127 -0
- package/dist/stages/base.d.ts.map +1 -0
- package/dist/stages/base.js +280 -0
- package/dist/stages/base.js.map +1 -0
- package/dist/stages/l2-to-l1-message.d.ts +108 -0
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
- package/dist/stages/l2-to-l1-message.js +422 -0
- package/dist/stages/l2-to-l1-message.js.map +1 -0
- package/dist/stages/proposal-created.d.ts +20 -0
- package/dist/stages/proposal-created.d.ts.map +1 -0
- package/dist/stages/proposal-created.js +62 -0
- package/dist/stages/proposal-created.js.map +1 -0
- package/dist/stages/proposal-queued.d.ts +39 -0
- package/dist/stages/proposal-queued.d.ts.map +1 -0
- package/dist/stages/proposal-queued.js +131 -0
- package/dist/stages/proposal-queued.js.map +1 -0
- package/dist/stages/retryables.d.ts +79 -0
- package/dist/stages/retryables.d.ts.map +1 -0
- package/dist/stages/retryables.js +307 -0
- package/dist/stages/retryables.js.map +1 -0
- package/dist/stages/stage-builder.d.ts +46 -0
- package/dist/stages/stage-builder.d.ts.map +1 -0
- package/dist/stages/stage-builder.js +87 -0
- package/dist/stages/stage-builder.js.map +1 -0
- package/dist/stages/timelock.d.ts +100 -0
- package/dist/stages/timelock.d.ts.map +1 -0
- package/dist/stages/timelock.js +552 -0
- package/dist/stages/timelock.js.map +1 -0
- package/dist/stages/voting.d.ts +18 -0
- package/dist/stages/voting.d.ts.map +1 -0
- package/dist/stages/voting.js +109 -0
- package/dist/stages/voting.js.map +1 -0
- package/dist/tracker/context.d.ts +111 -0
- package/dist/tracker/context.d.ts.map +1 -0
- package/dist/tracker/context.js +264 -0
- package/dist/tracker/context.js.map +1 -0
- package/dist/tracker/discovery.d.ts +89 -0
- package/dist/tracker/discovery.d.ts.map +1 -0
- package/dist/tracker/discovery.js +228 -0
- package/dist/tracker/discovery.js.map +1 -0
- package/dist/tracker/execute.d.ts +44 -0
- package/dist/tracker/execute.d.ts.map +1 -0
- package/dist/tracker/execute.js +126 -0
- package/dist/tracker/execute.js.map +1 -0
- package/dist/tracker/index.d.ts +18 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +70 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/pipeline.d.ts +47 -0
- package/dist/tracker/pipeline.d.ts.map +1 -0
- package/dist/tracker/pipeline.js +299 -0
- package/dist/tracker/pipeline.js.map +1 -0
- package/dist/tracker/query.d.ts +45 -0
- package/dist/tracker/query.d.ts.map +1 -0
- package/dist/tracker/query.js +159 -0
- package/dist/tracker/query.js.map +1 -0
- package/dist/tracker/state.d.ts +104 -0
- package/dist/tracker/state.d.ts.map +1 -0
- package/dist/tracker/state.js +287 -0
- package/dist/tracker/state.js.map +1 -0
- package/dist/tracker.d.ts +261 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +556 -0
- package/dist/tracker.js.map +1 -0
- package/dist/types/config.d.ts +81 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/core.d.ts +51 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/cross-chain.d.ts +80 -0
- package/dist/types/cross-chain.d.ts.map +1 -0
- package/dist/types/cross-chain.js +6 -0
- package/dist/types/cross-chain.js.map +1 -0
- package/dist/types/election.d.ts +59 -0
- package/dist/types/election.d.ts.map +1 -0
- package/dist/types/election.js +6 -0
- package/dist/types/election.js.map +1 -0
- package/dist/types/governor.d.ts +71 -0
- package/dist/types/governor.d.ts.map +1 -0
- package/dist/types/governor.js +6 -0
- package/dist/types/governor.js.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/stages.d.ts +189 -0
- package/dist/types/stages.d.ts.map +1 -0
- package/dist/types/stages.js +23 -0
- package/dist/types/stages.js.map +1 -0
- package/dist/types/timelock.d.ts +108 -0
- package/dist/types/timelock.d.ts.map +1 -0
- package/dist/types/timelock.js +6 -0
- package/dist/types/timelock.js.map +1 -0
- package/dist/types/tracking.d.ts +180 -0
- package/dist/types/tracking.d.ts.map +1 -0
- package/dist/types/tracking.js +6 -0
- package/dist/types/tracking.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chain.d.ts +18 -0
- package/dist/utils/chain.d.ts.map +1 -0
- package/dist/utils/chain.js +34 -0
- package/dist/utils/chain.js.map +1 -0
- package/dist/utils/log-filters.d.ts +67 -0
- package/dist/utils/log-filters.d.ts.map +1 -0
- package/dist/utils/log-filters.js +116 -0
- package/dist/utils/log-filters.js.map +1 -0
- package/dist/utils/log-search.d.ts +76 -0
- package/dist/utils/log-search.d.ts.map +1 -0
- package/dist/utils/log-search.js +142 -0
- package/dist/utils/log-search.js.map +1 -0
- package/dist/utils/logger.d.ts +41 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operation-id.d.ts +48 -0
- package/dist/utils/operation-id.d.ts.map +1 -0
- package/dist/utils/operation-id.js +102 -0
- package/dist/utils/operation-id.js.map +1 -0
- package/dist/utils/rpc-utils.d.ts +30 -0
- package/dist/utils/rpc-utils.d.ts.map +1 -0
- package/dist/utils/rpc-utils.js +99 -0
- package/dist/utils/rpc-utils.js.map +1 -0
- package/dist/utils/salt-computation.d.ts +78 -0
- package/dist/utils/salt-computation.d.ts.map +1 -0
- package/dist/utils/salt-computation.js +132 -0
- package/dist/utils/salt-computation.js.map +1 -0
- package/dist/utils/salt-resolver.d.ts +63 -0
- package/dist/utils/salt-resolver.d.ts.map +1 -0
- package/dist/utils/salt-resolver.js +144 -0
- package/dist/utils/salt-resolver.js.map +1 -0
- package/dist/utils/scoped-logger.d.ts +43 -0
- package/dist/utils/scoped-logger.d.ts.map +1 -0
- package/dist/utils/scoped-logger.js +72 -0
- package/dist/utils/scoped-logger.js.map +1 -0
- package/dist/utils/stage-helpers.d.ts +51 -0
- package/dist/utils/stage-helpers.d.ts.map +1 -0
- package/dist/utils/stage-helpers.js +143 -0
- package/dist/utils/stage-helpers.js.map +1 -0
- package/dist/utils/stage-metadata.d.ts +62 -0
- package/dist/utils/stage-metadata.d.ts.map +1 -0
- package/dist/utils/stage-metadata.js +140 -0
- package/dist/utils/stage-metadata.js.map +1 -0
- package/dist/utils/timing.d.ts +115 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +303 -0
- package/dist/utils/timing.js.map +1 -0
- package/dist/utils/urls.d.ts +20 -0
- package/dist/utils/urls.d.ts.map +1 -0
- package/dist/utils/urls.js +51 -0
- package/dist/utils/urls.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pipeline Stage Functions
|
|
4
|
+
*
|
|
5
|
+
* Pure functions that track stages and return updated state.
|
|
6
|
+
* Each function reads from state, performs tracking, and returns new state.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.pipelineTrackProposalCreated = pipelineTrackProposalCreated;
|
|
10
|
+
exports.pipelineTrackVoting = pipelineTrackVoting;
|
|
11
|
+
exports.pipelineTrackProposalQueued = pipelineTrackProposalQueued;
|
|
12
|
+
exports.pipelineTrackL2Timelock = pipelineTrackL2Timelock;
|
|
13
|
+
exports.pipelineTrackL2ToL1Message = pipelineTrackL2ToL1Message;
|
|
14
|
+
exports.pipelineTrackL1Timelock = pipelineTrackL1Timelock;
|
|
15
|
+
exports.pipelineTrackRetryables = pipelineTrackRetryables;
|
|
16
|
+
exports.trackGovernorPipeline = trackGovernorPipeline;
|
|
17
|
+
exports.trackTimelockPipeline = trackTimelockPipeline;
|
|
18
|
+
const logger_1 = require("../utils/logger");
|
|
19
|
+
const context_1 = require("./context");
|
|
20
|
+
const base_1 = require("../stages/base");
|
|
21
|
+
const proposal_created_1 = require("../stages/proposal-created");
|
|
22
|
+
const voting_1 = require("../stages/voting");
|
|
23
|
+
const proposal_queued_1 = require("../stages/proposal-queued");
|
|
24
|
+
const timing_1 = require("../utils/timing");
|
|
25
|
+
const timelock_1 = require("../stages/timelock");
|
|
26
|
+
const l2_to_l1_message_1 = require("../stages/l2-to-l1-message");
|
|
27
|
+
const retryables_1 = require("../stages/retryables");
|
|
28
|
+
const constants_1 = require("../constants");
|
|
29
|
+
const timing_2 = require("../utils/timing");
|
|
30
|
+
// Logging
|
|
31
|
+
const { pipeline: log, tracker: logTracker } = logger_1.loggers;
|
|
32
|
+
// Stage chain mapping for L1 stages
|
|
33
|
+
// L1_TIMELOCK is the only L1 stage; RETRYABLE_EXECUTED runs on L2 (Arb1/Nova)
|
|
34
|
+
const L1_STAGES = new Set(["L1_TIMELOCK"]);
|
|
35
|
+
// Helper: create placeholder stage
|
|
36
|
+
const placeholder = (type, status, reason) => ({
|
|
37
|
+
type,
|
|
38
|
+
status,
|
|
39
|
+
chain: L1_STAGES.has(type) ? "L1" : "L2",
|
|
40
|
+
transactions: [],
|
|
41
|
+
data: { reason },
|
|
42
|
+
});
|
|
43
|
+
// Helper: track with cache check
|
|
44
|
+
async function withCache(state, stageType, key, onCached, onTrack) {
|
|
45
|
+
const cached = (0, context_1.getCompletedStage)(state, stageType);
|
|
46
|
+
if (cached) {
|
|
47
|
+
log("%s: using cached stage", stageType);
|
|
48
|
+
return { state: await (0, context_1.addStage)(state, cached), [key]: onCached(cached) };
|
|
49
|
+
}
|
|
50
|
+
return onTrack();
|
|
51
|
+
}
|
|
52
|
+
// Helper: track stage with error handling
|
|
53
|
+
async function track(state, stageType, key, tracker) {
|
|
54
|
+
try {
|
|
55
|
+
const { stage, result } = await tracker();
|
|
56
|
+
return { state: await (0, context_1.addStage)(state, stage), [key]: result };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw new Error(`Failed to track ${stageType}: ${error instanceof Error ? error.message : String(error)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Governor Stages (1-3)
|
|
63
|
+
async function pipelineTrackProposalCreated(state) {
|
|
64
|
+
const governorAddress = (0, context_1.getGovernorAddress)(state);
|
|
65
|
+
const proposalId = (0, context_1.getProposalId)(state);
|
|
66
|
+
if (!governorAddress || !proposalId)
|
|
67
|
+
return { state, found: false };
|
|
68
|
+
if ((0, context_1.getIsElection)(state))
|
|
69
|
+
return { state, found: false };
|
|
70
|
+
return withCache(state, "PROPOSAL_CREATED", "found", () => true, async () => {
|
|
71
|
+
log("PROPOSAL_CREATED: tracking");
|
|
72
|
+
const creationTxHash = state.input.type === "governor" ? state.input.creationTxHash : undefined;
|
|
73
|
+
return track(state, "PROPOSAL_CREATED", "found", async () => {
|
|
74
|
+
const r = await (0, proposal_created_1.trackProposalCreated)(governorAddress, proposalId, state.providers.l2, {
|
|
75
|
+
creationTxHash,
|
|
76
|
+
});
|
|
77
|
+
return { stage: r.stage, result: r.proposalData !== null };
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function pipelineTrackVoting(state) {
|
|
82
|
+
const governorAddress = (0, context_1.getGovernorAddress)(state);
|
|
83
|
+
const proposalId = (0, context_1.getProposalId)(state);
|
|
84
|
+
const proposalData = (0, context_1.getProposalData)(state);
|
|
85
|
+
if (!governorAddress || !proposalId || !proposalData)
|
|
86
|
+
return { state, complete: false };
|
|
87
|
+
return withCache(state, "VOTING_ACTIVE", "complete", (c) => c.status === "COMPLETED", async () => {
|
|
88
|
+
log("VOTING_ACTIVE: tracking");
|
|
89
|
+
return track(state, "VOTING_ACTIVE", "complete", async () => {
|
|
90
|
+
const r = await (0, voting_1.trackVotingStage)(governorAddress, proposalId, proposalData, state.providers.l2);
|
|
91
|
+
return { stage: r.stage, result: r.stage.status === "COMPLETED" };
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async function pipelineTrackProposalQueued(state) {
|
|
96
|
+
const governorAddress = (0, context_1.getGovernorAddress)(state);
|
|
97
|
+
const proposalId = (0, context_1.getProposalId)(state);
|
|
98
|
+
const proposalData = (0, context_1.getProposalData)(state);
|
|
99
|
+
if (!governorAddress || !proposalId)
|
|
100
|
+
return { state, queued: false };
|
|
101
|
+
return withCache(state, "PROPOSAL_QUEUED", "queued", () => true, async () => {
|
|
102
|
+
log("PROPOSAL_QUEUED: tracking");
|
|
103
|
+
return track(state, "PROPOSAL_QUEUED", "queued", async () => {
|
|
104
|
+
// Voting deadline is L1 block number - convert to L2 for searching
|
|
105
|
+
// Use bounds to speed up binary search: min=creation block, max=creation+7M (~20 days)
|
|
106
|
+
const votingDeadlineL1 = (0, context_1.getVotingEndBlock)(state);
|
|
107
|
+
let votingEndBlock;
|
|
108
|
+
if (votingDeadlineL1) {
|
|
109
|
+
const creationBlock = proposalData?.creationBlock ?? 0;
|
|
110
|
+
const { blockNumber: currentL2Block } = await (0, timing_2.getCurrentBlockInfo)(state.providers.l2);
|
|
111
|
+
const maxL2Block = Math.min(creationBlock + 7000000, currentL2Block);
|
|
112
|
+
votingEndBlock = await (0, timing_1.getFirstL2BlockForL1Block)(state.providers.l2, votingDeadlineL1, {
|
|
113
|
+
minL2Block: creationBlock,
|
|
114
|
+
maxL2Block,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const r = await (0, proposal_queued_1.trackProposalQueued)(governorAddress, proposalId, state.providers.l2, proposalData?.creationBlock ?? 0, { votingEndBlock });
|
|
118
|
+
let stage = r.stage;
|
|
119
|
+
if (stage.status === "READY" && proposalData) {
|
|
120
|
+
stage = {
|
|
121
|
+
...stage,
|
|
122
|
+
data: {
|
|
123
|
+
...stage.data,
|
|
124
|
+
targets: proposalData.targets,
|
|
125
|
+
values: Array.from(proposalData.values).map((v) => v.toString()),
|
|
126
|
+
calldatas: proposalData.calldatas,
|
|
127
|
+
description: proposalData.description,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return { stage, result: r.operationId !== null && r.timelockAddress !== null };
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Timelock Stage (4)
|
|
136
|
+
async function pipelineTrackL2Timelock(state) {
|
|
137
|
+
const timelockAddress = (0, context_1.getTimelockAddress)(state);
|
|
138
|
+
const operationId = (0, context_1.getOperationId)(state);
|
|
139
|
+
const firstCallScheduledData = (0, context_1.getFirstCallScheduledData)(state);
|
|
140
|
+
if (!timelockAddress || !operationId || !firstCallScheduledData)
|
|
141
|
+
return { state, executed: false };
|
|
142
|
+
return withCache(state, "L2_TIMELOCK", "executed", (c) => c.status === "COMPLETED", async () => {
|
|
143
|
+
log("L2_TIMELOCK: tracking");
|
|
144
|
+
return track(state, "L2_TIMELOCK", "executed", async () => {
|
|
145
|
+
const r = await (0, timelock_1.trackL2Timelock)(timelockAddress, operationId, state.providers.l2, (0, context_1.getQueueBlockNumber)(state) ?? 0, firstCallScheduledData, {
|
|
146
|
+
cachedExecutionTxHash: (0, context_1.getL2ExecutionTxHash)(state),
|
|
147
|
+
allStages: state.stages,
|
|
148
|
+
});
|
|
149
|
+
return { stage: r.stage, result: r.executionTxHash !== null };
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// L2→L1 Message Stage (5) - Unified
|
|
154
|
+
const L1_ROUNDTRIP_STAGES = ["L2_TO_L1_MESSAGE", "L1_TIMELOCK", "RETRYABLE_EXECUTED"];
|
|
155
|
+
async function addSkippedL1Stages(state) {
|
|
156
|
+
let s = state;
|
|
157
|
+
for (const type of L1_ROUNDTRIP_STAGES)
|
|
158
|
+
s = await (0, context_1.addStage)(s, placeholder(type, "SKIPPED", "L2-only path"));
|
|
159
|
+
return s;
|
|
160
|
+
}
|
|
161
|
+
async function pipelineTrackL2ToL1Message(state) {
|
|
162
|
+
const l2ExecutionTxHash = (0, context_1.getL2ExecutionTxHash)(state);
|
|
163
|
+
const addressForPath = (0, context_1.getGovernorAddress)(state) ?? (0, context_1.getTimelockAddress)(state);
|
|
164
|
+
const needsL1 = addressForPath ? (0, base_1.isConstitutional)(addressForPath) : true;
|
|
165
|
+
if (!needsL1) {
|
|
166
|
+
log("L2_TO_L1_MESSAGE: L2-only path, skipping L1 stages");
|
|
167
|
+
return { state: await addSkippedL1Stages(state), executed: false, needsL1: false };
|
|
168
|
+
}
|
|
169
|
+
if (!l2ExecutionTxHash)
|
|
170
|
+
return { state, executed: false, needsL1: true };
|
|
171
|
+
// Check completed cache
|
|
172
|
+
const cached = (0, context_1.getCompletedStage)(state, "L2_TO_L1_MESSAGE");
|
|
173
|
+
if (cached) {
|
|
174
|
+
log("L2_TO_L1_MESSAGE: using cached stage");
|
|
175
|
+
return { state: await (0, context_1.addStage)(state, cached), executed: true, needsL1: true };
|
|
176
|
+
}
|
|
177
|
+
// Fast-path for pending (still in challenge period)
|
|
178
|
+
const pending = (0, context_1.getCachedStage)(state, "L2_TO_L1_MESSAGE");
|
|
179
|
+
if (pending?.status === "PENDING") {
|
|
180
|
+
const firstExec = pending.data.firstExecutableBlock;
|
|
181
|
+
if (firstExec) {
|
|
182
|
+
const { blockNumber: currentL1Block, timestamp } = await (0, timing_2.getCurrentBlockInfo)(state.providers.l1);
|
|
183
|
+
if (currentL1Block < firstExec) {
|
|
184
|
+
const remainingSeconds = (firstExec - currentL1Block) * constants_1.BLOCK_TIMES.L1;
|
|
185
|
+
const updated = {
|
|
186
|
+
...pending,
|
|
187
|
+
data: { ...pending.data, currentL1Block, fastPath: true },
|
|
188
|
+
timing: {
|
|
189
|
+
...pending.timing,
|
|
190
|
+
eta: timestamp + remainingSeconds,
|
|
191
|
+
delaySeconds: remainingSeconds,
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
return { state: await (0, context_1.addStage)(state, updated), executed: false, needsL1: true };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Full tracking
|
|
199
|
+
log("L2_TO_L1_MESSAGE: tracking");
|
|
200
|
+
const { state: newState, executed } = await track(state, "L2_TO_L1_MESSAGE", "executed", async () => {
|
|
201
|
+
const r = await (0, l2_to_l1_message_1.trackL2ToL1Message)(l2ExecutionTxHash, state.providers.l2, state.providers.l1);
|
|
202
|
+
return { stage: r.stage, result: r.isExecuted };
|
|
203
|
+
});
|
|
204
|
+
return { state: newState, executed, needsL1: true };
|
|
205
|
+
}
|
|
206
|
+
// L1 Timelock Stage (6)
|
|
207
|
+
async function pipelineTrackL1Timelock(state) {
|
|
208
|
+
return withCache(state, "L1_TIMELOCK", "executed", (c) => c.status === "COMPLETED", async () => {
|
|
209
|
+
log("L1_TIMELOCK: tracking");
|
|
210
|
+
return track(state, "L1_TIMELOCK", "executed", async () => {
|
|
211
|
+
const r = await (0, timelock_1.trackL1Timelock)(state.providers.l1, {
|
|
212
|
+
outboxExecutionTx: (0, context_1.getOutboxExecutionTx)(state),
|
|
213
|
+
fromBlock: (0, context_1.getFirstExecutableBlock)(state),
|
|
214
|
+
allStages: state.stages,
|
|
215
|
+
});
|
|
216
|
+
return { stage: r.stage, result: r.executionTxHash !== null };
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// Retryable Stage (7)
|
|
221
|
+
async function pipelineTrackRetryables(state) {
|
|
222
|
+
const l1ExecutionTxHash = (0, context_1.getL1ExecutionTxHash)(state);
|
|
223
|
+
if (!l1ExecutionTxHash)
|
|
224
|
+
return { state, redeemed: false };
|
|
225
|
+
return withCache(state, "RETRYABLE_EXECUTED", "redeemed", (c) => c.status === "COMPLETED", async () => {
|
|
226
|
+
log("RETRYABLE_EXECUTED: tracking");
|
|
227
|
+
return track(state, "RETRYABLE_EXECUTED", "redeemed", async () => {
|
|
228
|
+
const r = await (0, retryables_1.trackRetryables)(l1ExecutionTxHash, state.providers.l1, {
|
|
229
|
+
l2Provider: state.providers.l2,
|
|
230
|
+
novaProvider: state.providers.nova,
|
|
231
|
+
});
|
|
232
|
+
return { stage: r.stage, result: r.stage.status === "COMPLETED" };
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// Full Pipelines
|
|
237
|
+
async function addPlaceholders(state, types, reason) {
|
|
238
|
+
let s = state;
|
|
239
|
+
for (const type of types)
|
|
240
|
+
s = await (0, context_1.addStage)(s, placeholder(type, "NOT_STARTED", reason));
|
|
241
|
+
return s;
|
|
242
|
+
}
|
|
243
|
+
const RETRYABLE_STAGES = ["RETRYABLE_EXECUTED"];
|
|
244
|
+
/**
|
|
245
|
+
* Track full governor proposal pipeline.
|
|
246
|
+
* Returns final state after tracking all stages.
|
|
247
|
+
*/
|
|
248
|
+
async function trackGovernorPipeline(state) {
|
|
249
|
+
// Stage 1: Proposal Created
|
|
250
|
+
const { state: state1, found } = await pipelineTrackProposalCreated(state);
|
|
251
|
+
if (!found) {
|
|
252
|
+
logTracker("proposal not found, stopping");
|
|
253
|
+
return state1;
|
|
254
|
+
}
|
|
255
|
+
// Stage 2: Voting
|
|
256
|
+
const { state: state2, complete: votingComplete } = await pipelineTrackVoting(state1);
|
|
257
|
+
if (!votingComplete) {
|
|
258
|
+
logTracker("voting not complete, stopping");
|
|
259
|
+
return state2;
|
|
260
|
+
}
|
|
261
|
+
// Stage 3: Proposal Queued
|
|
262
|
+
const { state: state3, queued } = await pipelineTrackProposalQueued(state2);
|
|
263
|
+
if (!queued) {
|
|
264
|
+
logTracker("proposal not queued, stopping");
|
|
265
|
+
return state3;
|
|
266
|
+
}
|
|
267
|
+
// Continue with timelock pipeline
|
|
268
|
+
return trackTimelockPipeline(state3);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Track timelock pipeline (stages 4-7).
|
|
272
|
+
* Used by governor pipeline and direct timelock tracking.
|
|
273
|
+
*/
|
|
274
|
+
async function trackTimelockPipeline(state) {
|
|
275
|
+
// Stage 4: L2 Timelock (unified)
|
|
276
|
+
const { state: state1, executed: l2Executed } = await pipelineTrackL2Timelock(state);
|
|
277
|
+
if (!l2Executed) {
|
|
278
|
+
logTracker("L2 timelock not executed, stopping");
|
|
279
|
+
return addPlaceholders(state1, L1_ROUNDTRIP_STAGES, "L2 timelock not executed");
|
|
280
|
+
}
|
|
281
|
+
// Stage 5: L2→L1 Message (unified)
|
|
282
|
+
const { state: state2, executed: msgExecuted, needsL1, } = await pipelineTrackL2ToL1Message(state1);
|
|
283
|
+
if (!needsL1)
|
|
284
|
+
return state2; // L2-only path, already added SKIPPED stages
|
|
285
|
+
if (!msgExecuted) {
|
|
286
|
+
logTracker("L2→L1 message not executed, stopping");
|
|
287
|
+
return addPlaceholders(state2, L1_ROUNDTRIP_STAGES.slice(1), "Waiting for L2→L1 message");
|
|
288
|
+
}
|
|
289
|
+
// Stage 6: L1 Timelock (unified)
|
|
290
|
+
const { state: state3, executed: l1Executed } = await pipelineTrackL1Timelock(state2);
|
|
291
|
+
if (!l1Executed) {
|
|
292
|
+
logTracker("L1 timelock not executed, stopping");
|
|
293
|
+
return addPlaceholders(state3, RETRYABLE_STAGES, "L1 timelock not executed");
|
|
294
|
+
}
|
|
295
|
+
// Stage 7: Retryables
|
|
296
|
+
const { state: finalState } = await pipelineTrackRetryables(state3);
|
|
297
|
+
return finalState;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/tracker/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracker Query Module
|
|
3
|
+
*
|
|
4
|
+
* Provides checkpoint query and statistics operations.
|
|
5
|
+
* Includes filtering, aggregation, and cache introspection.
|
|
6
|
+
*/
|
|
7
|
+
import { TrackingCheckpoint, TrackerStats, CacheAdapter } from "../types";
|
|
8
|
+
/**
|
|
9
|
+
* List all checkpoint keys in the cache.
|
|
10
|
+
* @param cache - Cache adapter to query
|
|
11
|
+
*/
|
|
12
|
+
export declare function listCheckpointKeys(cache: CacheAdapter | undefined): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a specific checkpoint from cache by key.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCheckpoint(cache: CacheAdapter | undefined, key: string): Promise<TrackingCheckpoint | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Get all checkpoints from cache.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAllCheckpoints(cache: CacheAdapter | undefined): Promise<Map<string, TrackingCheckpoint>>;
|
|
21
|
+
/**
|
|
22
|
+
* Query incomplete checkpoints that should be re-tracked.
|
|
23
|
+
*
|
|
24
|
+
* @param cache - Cache adapter to query
|
|
25
|
+
* @param options.maxAgeDays - Skip items older than this (default: 60)
|
|
26
|
+
* @param options.maxErrorCount - Skip items with more consecutive errors (default: 5)
|
|
27
|
+
*/
|
|
28
|
+
export declare function queryIncompleteCheckpoints(cache: CacheAdapter | undefined, options?: {
|
|
29
|
+
maxAgeDays?: number;
|
|
30
|
+
maxErrorCount?: number;
|
|
31
|
+
}): Promise<Array<{
|
|
32
|
+
key: string;
|
|
33
|
+
checkpoint: TrackingCheckpoint;
|
|
34
|
+
}>>;
|
|
35
|
+
/**
|
|
36
|
+
* Get aggregated cache statistics.
|
|
37
|
+
*
|
|
38
|
+
* Provides a summary of all cached proposals, timelock operations, and elections
|
|
39
|
+
* without making any RPC calls. Useful for dashboards and status displays.
|
|
40
|
+
*
|
|
41
|
+
* @param cache - Cache adapter to query
|
|
42
|
+
* @param maxErrorCount - Items with this many or more errors are counted as "errored" (default: 5)
|
|
43
|
+
*/
|
|
44
|
+
export declare function getStats(cache: CacheAdapter | undefined, maxErrorCount?: number): Promise<TrackerStats>;
|
|
45
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tracker/query.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI1E;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM3F;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGpC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAU1C;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC,CA0CjE;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,YAAY,CAAC,CA6DvB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tracker Query Module
|
|
4
|
+
*
|
|
5
|
+
* Provides checkpoint query and statistics operations.
|
|
6
|
+
* Includes filtering, aggregation, and cache introspection.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.listCheckpointKeys = listCheckpointKeys;
|
|
10
|
+
exports.getCheckpoint = getCheckpoint;
|
|
11
|
+
exports.getAllCheckpoints = getAllCheckpoints;
|
|
12
|
+
exports.queryIncompleteCheckpoints = queryIncompleteCheckpoints;
|
|
13
|
+
exports.getStats = getStats;
|
|
14
|
+
const base_1 = require("../stages/base");
|
|
15
|
+
const constants_1 = require("../constants");
|
|
16
|
+
/**
|
|
17
|
+
* List all checkpoint keys in the cache.
|
|
18
|
+
* @param cache - Cache adapter to query
|
|
19
|
+
*/
|
|
20
|
+
async function listCheckpointKeys(cache) {
|
|
21
|
+
if (!cache)
|
|
22
|
+
return [];
|
|
23
|
+
const allKeys = await cache.keys();
|
|
24
|
+
const keys = Array.isArray(allKeys) ? allKeys : Array.from(allKeys);
|
|
25
|
+
// All tracking checkpoints use tx: prefix
|
|
26
|
+
return keys.filter((k) => k.startsWith("tx:"));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get a specific checkpoint from cache by key.
|
|
30
|
+
*/
|
|
31
|
+
async function getCheckpoint(cache, key) {
|
|
32
|
+
if (!cache)
|
|
33
|
+
return null;
|
|
34
|
+
return await cache.get(key);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get all checkpoints from cache.
|
|
38
|
+
*/
|
|
39
|
+
async function getAllCheckpoints(cache) {
|
|
40
|
+
const map = new Map();
|
|
41
|
+
const keys = await listCheckpointKeys(cache);
|
|
42
|
+
for (const key of keys) {
|
|
43
|
+
const checkpoint = await getCheckpoint(cache, key);
|
|
44
|
+
if (checkpoint) {
|
|
45
|
+
map.set(key, checkpoint);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return map;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Query incomplete checkpoints that should be re-tracked.
|
|
52
|
+
*
|
|
53
|
+
* @param cache - Cache adapter to query
|
|
54
|
+
* @param options.maxAgeDays - Skip items older than this (default: 60)
|
|
55
|
+
* @param options.maxErrorCount - Skip items with more consecutive errors (default: 5)
|
|
56
|
+
*/
|
|
57
|
+
async function queryIncompleteCheckpoints(cache, options = {}) {
|
|
58
|
+
const maxAgeDays = options.maxAgeDays ?? 60;
|
|
59
|
+
const maxErrorCount = options.maxErrorCount ?? 5;
|
|
60
|
+
const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
const results = [];
|
|
63
|
+
const keys = await listCheckpointKeys(cache);
|
|
64
|
+
for (const key of keys) {
|
|
65
|
+
const checkpoint = await getCheckpoint(cache, key);
|
|
66
|
+
if (!checkpoint)
|
|
67
|
+
continue;
|
|
68
|
+
const errorCount = checkpoint.metadata?.errorCount ?? 0;
|
|
69
|
+
const completedStages = checkpoint.cachedData.completedStages ?? [];
|
|
70
|
+
// Skip if already complete
|
|
71
|
+
if (completedStages.length > 0 && (0, base_1.areAllStagesComplete)(completedStages)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Skip if voting failed (terminal state)
|
|
75
|
+
const votingStage = completedStages.find((s) => s.type === "VOTING_ACTIVE");
|
|
76
|
+
if (votingStage?.status === "FAILED") {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Skip if exceeded error threshold
|
|
80
|
+
if (errorCount >= maxErrorCount) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Skip if too old
|
|
84
|
+
const createdAt = checkpoint.createdAt ?? 0;
|
|
85
|
+
if (createdAt > 0 && now - createdAt > maxAgeMs) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
results.push({ key, checkpoint });
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get aggregated cache statistics.
|
|
94
|
+
*
|
|
95
|
+
* Provides a summary of all cached proposals, timelock operations, and elections
|
|
96
|
+
* without making any RPC calls. Useful for dashboards and status displays.
|
|
97
|
+
*
|
|
98
|
+
* @param cache - Cache adapter to query
|
|
99
|
+
* @param maxErrorCount - Items with this many or more errors are counted as "errored" (default: 5)
|
|
100
|
+
*/
|
|
101
|
+
async function getStats(cache, maxErrorCount = 5) {
|
|
102
|
+
const checkpoints = await getAllCheckpoints(cache);
|
|
103
|
+
let proposalTotal = 0, proposalComplete = 0, proposalActive = 0, proposalErrored = 0;
|
|
104
|
+
let timelockTotal = 0, timelockComplete = 0, timelockActive = 0, timelockErrored = 0;
|
|
105
|
+
let electionTotal = 0, electionComplete = 0;
|
|
106
|
+
for (const [, checkpoint] of checkpoints) {
|
|
107
|
+
const completedStages = checkpoint.cachedData?.completedStages ?? [];
|
|
108
|
+
const isComplete = completedStages.length > 0 && (0, base_1.areAllStagesComplete)(completedStages);
|
|
109
|
+
const errorCount = checkpoint.metadata?.errorCount ?? 0;
|
|
110
|
+
const isErrored = errorCount >= maxErrorCount;
|
|
111
|
+
const inputType = checkpoint.input.type;
|
|
112
|
+
if (inputType === "governor") {
|
|
113
|
+
if (checkpoint.input.governorAddress &&
|
|
114
|
+
(0, constants_1.isElectionGovernor)(checkpoint.input.governorAddress)) {
|
|
115
|
+
electionTotal++;
|
|
116
|
+
if (isComplete)
|
|
117
|
+
electionComplete++;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
proposalTotal++;
|
|
121
|
+
if (isComplete)
|
|
122
|
+
proposalComplete++;
|
|
123
|
+
else if (isErrored)
|
|
124
|
+
proposalErrored++;
|
|
125
|
+
else
|
|
126
|
+
proposalActive++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (inputType === "timelock") {
|
|
130
|
+
timelockTotal++;
|
|
131
|
+
if (isComplete)
|
|
132
|
+
timelockComplete++;
|
|
133
|
+
else if (isErrored)
|
|
134
|
+
timelockErrored++;
|
|
135
|
+
else
|
|
136
|
+
timelockActive++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
total: checkpoints.size,
|
|
141
|
+
proposals: {
|
|
142
|
+
total: proposalTotal,
|
|
143
|
+
complete: proposalComplete,
|
|
144
|
+
active: proposalActive,
|
|
145
|
+
errored: proposalErrored,
|
|
146
|
+
},
|
|
147
|
+
timelocks: {
|
|
148
|
+
total: timelockTotal,
|
|
149
|
+
complete: timelockComplete,
|
|
150
|
+
active: timelockActive,
|
|
151
|
+
errored: timelockErrored,
|
|
152
|
+
},
|
|
153
|
+
elections: {
|
|
154
|
+
total: electionTotal,
|
|
155
|
+
complete: electionComplete,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tracker/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache utilities for tracker state
|
|
3
|
+
*
|
|
4
|
+
* Provides cache implementations and utility functions.
|
|
5
|
+
* All other state management is handled directly in tracker.ts.
|
|
6
|
+
*
|
|
7
|
+
* Available cache adapters:
|
|
8
|
+
* - FileCache: File-based persistence (Node.js only)
|
|
9
|
+
* - LocalStorageCache: Browser localStorage (web only)
|
|
10
|
+
* - MemoryCache: In-memory, no persistence (universal)
|
|
11
|
+
*/
|
|
12
|
+
import { TrackingCheckpoint, DiscoveryWatermarks, CacheAdapter } from "../types";
|
|
13
|
+
/**
|
|
14
|
+
* File-based cache that persists to JSON file.
|
|
15
|
+
* Synchronously loads on construction, persists on every write.
|
|
16
|
+
* Uses a write queue to prevent race conditions from concurrent writes.
|
|
17
|
+
*/
|
|
18
|
+
export declare class FileCache implements CacheAdapter {
|
|
19
|
+
private readonly path;
|
|
20
|
+
private cache;
|
|
21
|
+
private writeQueue;
|
|
22
|
+
constructor(path: string);
|
|
23
|
+
private load;
|
|
24
|
+
private persistSync;
|
|
25
|
+
private persist;
|
|
26
|
+
get<T>(key: string): Promise<T | null>;
|
|
27
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
28
|
+
delete(key: string): Promise<void>;
|
|
29
|
+
clear(): Promise<void>;
|
|
30
|
+
has(key: string): Promise<boolean>;
|
|
31
|
+
keys(): IterableIterator<string>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Browser localStorage-based cache adapter.
|
|
35
|
+
* Persists to localStorage with a configurable key prefix.
|
|
36
|
+
*
|
|
37
|
+
* Limitations:
|
|
38
|
+
* - 5MB storage limit (varies by browser)
|
|
39
|
+
* - Synchronous API (blocks main thread, usually negligible)
|
|
40
|
+
* - String-only storage (JSON serialization handled internally)
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* import { createTracker, LocalStorageCache } from "@gzeoneth/gov-tracker";
|
|
45
|
+
*
|
|
46
|
+
* const tracker = createTracker({
|
|
47
|
+
* l2Provider,
|
|
48
|
+
* l1Provider,
|
|
49
|
+
* cache: new LocalStorageCache("arb-gov:"),
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare class LocalStorageCache implements CacheAdapter {
|
|
54
|
+
private readonly prefix;
|
|
55
|
+
constructor(prefix?: string);
|
|
56
|
+
private fullKey;
|
|
57
|
+
get<T>(key: string): Promise<T | null>;
|
|
58
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
59
|
+
delete(key: string): Promise<void>;
|
|
60
|
+
clear(): Promise<void>;
|
|
61
|
+
has(key: string): Promise<boolean>;
|
|
62
|
+
keys(prefix?: string): Promise<string[]>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* In-memory cache adapter with no persistence.
|
|
66
|
+
* Useful for testing, short-lived sessions, or as a fallback.
|
|
67
|
+
*
|
|
68
|
+
* Data is lost when the page is refreshed or the process exits.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* import { createTracker, MemoryCache } from "@gzeoneth/gov-tracker";
|
|
73
|
+
*
|
|
74
|
+
* const tracker = createTracker({
|
|
75
|
+
* l2Provider,
|
|
76
|
+
* l1Provider,
|
|
77
|
+
* cache: new MemoryCache(),
|
|
78
|
+
* });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare class MemoryCache implements CacheAdapter {
|
|
82
|
+
private cache;
|
|
83
|
+
get<T>(key: string): Promise<T | null>;
|
|
84
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
85
|
+
delete(key: string): Promise<void>;
|
|
86
|
+
clear(): Promise<void>;
|
|
87
|
+
has(key: string): Promise<boolean>;
|
|
88
|
+
keys(): IterableIterator<string>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate cache key from transaction hash (primary cache key format)
|
|
92
|
+
*/
|
|
93
|
+
export declare function txHashCacheKey(txHash: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* Read all cache data without requiring RPC providers.
|
|
96
|
+
* Use this for status/dashboard views that only need cached data.
|
|
97
|
+
*
|
|
98
|
+
* @param cachePath - Path to the cache file
|
|
99
|
+
*/
|
|
100
|
+
export declare function readCacheStatus(cachePath: string): Promise<{
|
|
101
|
+
watermarks: DiscoveryWatermarks;
|
|
102
|
+
checkpoints: Map<string, TrackingCheckpoint>;
|
|
103
|
+
}>;
|
|
104
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/tracker/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGjF;;;;GAIG;AACH,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,UAAU,CAAoC;gBAE1C,IAAI,EAAE,MAAM;IAKxB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,WAAW;YAKL,OAAO;IAiBf,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAItC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxC,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;CAGjC;AA2BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,GAAE,MAAmB;IAIvC,OAAO,CAAC,OAAO;IAIT,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMlC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAe/C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,KAAK,CAAmC;IAE1C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAItC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxC,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;CAGjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,UAAU,EAAE,mBAAmB,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC9C,CAAC,CAqBD"}
|