@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,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Voting Stage Tracking
|
|
4
|
+
*
|
|
5
|
+
* Stage 2: Track voting period including extensions and vetting
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT: Vetting deadline uses L1 block numbers, not L2 block numbers.
|
|
8
|
+
* When calculating ETA for vetting period, we must use L1 block time.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.trackVotingStage = trackVotingStage;
|
|
12
|
+
const governor_discovery_1 = require("../discovery/governor-discovery");
|
|
13
|
+
const security_council_1 = require("../discovery/security-council");
|
|
14
|
+
const stage_builder_1 = require("./stage-builder");
|
|
15
|
+
const timing_1 = require("../utils/timing");
|
|
16
|
+
const constants_1 = require("../constants");
|
|
17
|
+
/**
|
|
18
|
+
* Track voting stage for a proposal
|
|
19
|
+
*/
|
|
20
|
+
async function trackVotingStage(governorAddress, proposalId, proposalData, provider) {
|
|
21
|
+
const builder = new stage_builder_1.StageBuilder("VOTING_ACTIVE", "L2");
|
|
22
|
+
// Get current block info
|
|
23
|
+
const { blockNumber: currentBlock, timestamp: currentTimestamp } = await (0, timing_1.getCurrentBlockInfo)(provider);
|
|
24
|
+
// Check if voting has started
|
|
25
|
+
if (proposalData.startBlock.gt(currentBlock)) {
|
|
26
|
+
// Voting not started yet
|
|
27
|
+
const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(proposalData.startBlock.toNumber(), currentBlock, constants_1.BLOCK_TIMES.L2);
|
|
28
|
+
builder
|
|
29
|
+
.status("NOT_STARTED")
|
|
30
|
+
.timing({ startedAt: currentTimestamp, eta: currentTimestamp + remainingSeconds })
|
|
31
|
+
.data({
|
|
32
|
+
startBlock: proposalData.startBlock.toString(),
|
|
33
|
+
currentBlock: currentBlock.toString(),
|
|
34
|
+
});
|
|
35
|
+
return { stage: builder.build(), votingData: null };
|
|
36
|
+
}
|
|
37
|
+
// Get voting data from governor
|
|
38
|
+
const votingData = await (0, governor_discovery_1.getVotingData)(governorAddress, proposalId, provider);
|
|
39
|
+
// Check for vetting period - only Security Council governors have vetting
|
|
40
|
+
const proposalType = (0, governor_discovery_1.detectProposalType)(governorAddress);
|
|
41
|
+
const isElectionProposal = proposalType === "ELECTION_NOMINEE" || proposalType === "ELECTION_MEMBER";
|
|
42
|
+
const vettingInfo = isElectionProposal
|
|
43
|
+
? await (0, security_council_1.checkVettingPeriod)(governorAddress, proposalId, provider)
|
|
44
|
+
: {
|
|
45
|
+
hasVettingPeriod: false,
|
|
46
|
+
vettingDeadline: null,
|
|
47
|
+
isVettingActive: false,
|
|
48
|
+
vetterAddress: null,
|
|
49
|
+
};
|
|
50
|
+
// Check if voting was extended
|
|
51
|
+
const wasExtended = votingData.extendedDeadline !== undefined &&
|
|
52
|
+
!votingData.extendedDeadline.eq(votingData.deadline);
|
|
53
|
+
const extensionPossible = !votingData.isVotingPeriodOver && !votingData.hasReachedQuorum;
|
|
54
|
+
// Add voting statistics
|
|
55
|
+
builder.data({
|
|
56
|
+
forVotes: votingData.forVotes.toString(),
|
|
57
|
+
againstVotes: votingData.againstVotes.toString(),
|
|
58
|
+
abstainVotes: votingData.abstainVotes.toString(),
|
|
59
|
+
quorum: votingData.quorum.toString(),
|
|
60
|
+
quorumReached: votingData.hasReachedQuorum,
|
|
61
|
+
deadline: votingData.deadline.toString(),
|
|
62
|
+
extendedDeadline: votingData.extendedDeadline?.toString(),
|
|
63
|
+
wasExtended,
|
|
64
|
+
extensionPossible,
|
|
65
|
+
hasVettingPeriod: vettingInfo.hasVettingPeriod,
|
|
66
|
+
vettingDeadline: vettingInfo.vettingDeadline?.toString(),
|
|
67
|
+
isVettingActive: vettingInfo.isVettingActive,
|
|
68
|
+
});
|
|
69
|
+
// Determine voting status
|
|
70
|
+
const proposalState = await (0, governor_discovery_1.getProposalState)(governorAddress, proposalId, provider);
|
|
71
|
+
builder.data({ proposalState });
|
|
72
|
+
if (proposalState === "Active") {
|
|
73
|
+
const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(votingData.deadline.toNumber(), currentBlock, constants_1.BLOCK_TIMES.L2);
|
|
74
|
+
builder.status("PENDING").timing({
|
|
75
|
+
startedAt: currentTimestamp,
|
|
76
|
+
eta: currentTimestamp + remainingSeconds,
|
|
77
|
+
delaySeconds: remainingSeconds,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else if (proposalState === "Succeeded" ||
|
|
81
|
+
proposalState === "Queued" ||
|
|
82
|
+
proposalState === "Executed") {
|
|
83
|
+
// Check vetting period first
|
|
84
|
+
if (vettingInfo.isVettingActive && vettingInfo.vettingDeadline) {
|
|
85
|
+
const currentL1Block = await (0, timing_1.getL1BlockNumberFromL2)(provider);
|
|
86
|
+
const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(vettingInfo.vettingDeadline.toNumber(), currentL1Block.toNumber(), constants_1.BLOCK_TIMES.L1);
|
|
87
|
+
builder
|
|
88
|
+
.status("PENDING")
|
|
89
|
+
.data({ waitingForVetting: true })
|
|
90
|
+
.timing({
|
|
91
|
+
eta: currentTimestamp + remainingSeconds,
|
|
92
|
+
delaySeconds: remainingSeconds,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
builder.status("COMPLETED");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (proposalState === "Defeated" ||
|
|
100
|
+
proposalState === "Canceled" ||
|
|
101
|
+
proposalState === "Expired") {
|
|
102
|
+
builder.status("FAILED");
|
|
103
|
+
}
|
|
104
|
+
else if (proposalState === "Pending") {
|
|
105
|
+
builder.status("NOT_STARTED");
|
|
106
|
+
}
|
|
107
|
+
return { stage: builder.build(), votingData };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=voting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.js","sourceRoot":"","sources":["../../src/stages/voting.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAqBH,4CA2HC;AA5ID,wEAIyC;AACzC,oEAAmE;AACnE,mDAA+C;AAC/C,4CAIyB;AACzB,4CAA2C;AAE3C;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,eAAuB,EACvB,UAAkB,EAClB,YAA0B,EAC1B,QAAmC;IAKnC,MAAM,OAAO,GAAG,IAAI,4BAAY,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAExD,yBAAyB;IACzB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAC9D,MAAM,IAAA,4BAAmB,EAAC,QAAQ,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,yBAAyB;QACzB,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAChD,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,EAClC,YAAY,EACZ,uBAAW,CAAC,EAAE,CACf,CAAC;QAEF,OAAO;aACJ,MAAM,CAAC,aAAa,CAAC;aACrB,MAAM,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;aACjF,IAAI,CAAC;YACJ,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC9C,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;SACtC,CAAC,CAAC;QAEL,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,gCAAgC;IAChC,MAAM,UAAU,GAAG,MAAM,IAAA,kCAAa,EAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9E,0EAA0E;IAC1E,MAAM,YAAY,GAAG,IAAA,uCAAkB,EAAC,eAAe,CAAC,CAAC;IACzD,MAAM,kBAAkB,GACtB,YAAY,KAAK,kBAAkB,IAAI,YAAY,KAAK,iBAAiB,CAAC;IAE5E,MAAM,WAAW,GAAG,kBAAkB;QACpC,CAAC,CAAC,MAAM,IAAA,qCAAkB,EAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC;QACjE,CAAC,CAAC;YACE,gBAAgB,EAAE,KAAK;YACvB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,IAAI;SACpB,CAAC;IAEN,+BAA+B;IAC/B,MAAM,WAAW,GACf,UAAU,CAAC,gBAAgB,KAAK,SAAS;QACzC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,iBAAiB,GAAG,CAAC,UAAU,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAEzF,wBAAwB;IACxB,OAAO,CAAC,IAAI,CAAC;QACX,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxC,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;QAChD,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;QAChD,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpC,aAAa,EAAE,UAAU,CAAC,gBAAgB;QAC1C,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,EAAE,QAAQ,EAAE;QACzD,WAAW;QACX,iBAAiB;QACjB,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,eAAe,EAAE,WAAW,CAAC,eAAe,EAAE,QAAQ,EAAE;QACxD,eAAe,EAAE,WAAW,CAAC,eAAe;KAC7C,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,aAAa,GAAG,MAAM,IAAA,qCAAgB,EAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhC,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAChD,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAC9B,YAAY,EACZ,uBAAW,CAAC,EAAE,CACf,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC/B,SAAS,EAAE,gBAAgB;YAC3B,GAAG,EAAE,gBAAgB,GAAG,gBAAgB;YACxC,YAAY,EAAE,gBAAgB;SAC/B,CAAC,CAAC;IACL,CAAC;SAAM,IACL,aAAa,KAAK,WAAW;QAC7B,aAAa,KAAK,QAAQ;QAC1B,aAAa,KAAK,UAAU,EAC5B,CAAC;QACD,6BAA6B;QAC7B,IAAI,WAAW,CAAC,eAAe,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;YAC/D,MAAM,cAAc,GAAG,MAAM,IAAA,+BAAsB,EAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAChD,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,EACtC,cAAc,CAAC,QAAQ,EAAE,EACzB,uBAAW,CAAC,EAAE,CACf,CAAC;YACF,OAAO;iBACJ,MAAM,CAAC,SAAS,CAAC;iBACjB,IAAI,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;iBACjC,MAAM,CAAC;gBACN,GAAG,EAAE,gBAAgB,GAAG,gBAAgB;gBACxC,YAAY,EAAE,gBAAgB;aAC/B,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,IACL,aAAa,KAAK,UAAU;QAC5B,aAAa,KAAK,UAAU;QAC5B,aAAa,KAAK,SAAS,EAC3B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrackingContext - Functional state management for pipeline tracking
|
|
3
|
+
*
|
|
4
|
+
* This module provides a purely functional approach to tracking context:
|
|
5
|
+
* - TrackingContext interface defines the immutable state shape
|
|
6
|
+
* - Pure functions transform state and derive values
|
|
7
|
+
* - No classes, no mutation, no hidden state
|
|
8
|
+
*
|
|
9
|
+
* Benefits:
|
|
10
|
+
* - Easy testing: just create plain objects
|
|
11
|
+
* - Transparent: can log/inspect full state anytime
|
|
12
|
+
* - Predictable: same input → same output
|
|
13
|
+
* - Composable: mix and match functions freely
|
|
14
|
+
* - Debuggable: save/restore state snapshots
|
|
15
|
+
*/
|
|
16
|
+
import { ethers } from "ethers";
|
|
17
|
+
import { TrackedStage, TrackingCheckpoint, TrackingInput, StageType, CallScheduledData, ProposalData, ProposalType, ProposalState, OnProgressCallback, ChunkingConfig } from "../types";
|
|
18
|
+
/**
|
|
19
|
+
* Providers for multi-chain operations
|
|
20
|
+
*/
|
|
21
|
+
export interface Providers {
|
|
22
|
+
readonly l2: ethers.providers.Provider;
|
|
23
|
+
readonly l1: ethers.providers.Provider;
|
|
24
|
+
readonly nova: ethers.providers.Provider;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Options for creating a TrackingContext
|
|
28
|
+
*/
|
|
29
|
+
export interface CreateTrackingContextOptions {
|
|
30
|
+
providers: Providers;
|
|
31
|
+
input: TrackingInput;
|
|
32
|
+
onProgress?: OnProgressCallback;
|
|
33
|
+
chunkingConfig?: ChunkingConfig;
|
|
34
|
+
checkpoint?: TrackingCheckpoint;
|
|
35
|
+
cacheKey?: string;
|
|
36
|
+
/** Bootstrap data for timelock-only tracking */
|
|
37
|
+
callScheduledData?: CallScheduledData[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* TrackingContext - Immutable state for pipeline tracking
|
|
41
|
+
*
|
|
42
|
+
* All values are derived from stages. This interface represents
|
|
43
|
+
* a snapshot of the pipeline at a point in time.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* let ctx = createTrackingContext({ providers, input });
|
|
48
|
+
* ctx = await addStage(ctx, proposalCreatedStage);
|
|
49
|
+
* const opId = getOperationId(ctx);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export interface TrackingContext {
|
|
53
|
+
readonly providers: Providers;
|
|
54
|
+
readonly chunkingConfig: ChunkingConfig;
|
|
55
|
+
readonly onProgress?: OnProgressCallback;
|
|
56
|
+
readonly cacheKey?: string;
|
|
57
|
+
readonly input: TrackingInput;
|
|
58
|
+
readonly callScheduledData?: CallScheduledData[];
|
|
59
|
+
readonly stages: TrackedStage[];
|
|
60
|
+
readonly stageIndex: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a new TrackingContext.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createTrackingContext(options: CreateTrackingContextOptions): TrackingContext;
|
|
66
|
+
/**
|
|
67
|
+
* Add or update a stage. Returns new context.
|
|
68
|
+
*/
|
|
69
|
+
export declare function addStage(ctx: TrackingContext, stage: TrackedStage): Promise<TrackingContext>;
|
|
70
|
+
/** Check if a stage is completed (COMPLETED or SKIPPED). */
|
|
71
|
+
export declare function isStageCompleted(ctx: TrackingContext, type: StageType): boolean;
|
|
72
|
+
/** Get a completed stage for zero-RPC resume. */
|
|
73
|
+
export declare function getCompletedStage(ctx: TrackingContext, type: StageType): TrackedStage | undefined;
|
|
74
|
+
/** Get a cached stage (any status). */
|
|
75
|
+
export declare function getCachedStage(ctx: TrackingContext, type: StageType): TrackedStage | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Check if all stages are complete.
|
|
78
|
+
*/
|
|
79
|
+
export declare function isComplete(ctx: TrackingContext): boolean;
|
|
80
|
+
export declare const getGovernorAddress: (ctx: TrackingContext) => string | undefined;
|
|
81
|
+
export declare const getProposalId: (ctx: TrackingContext) => string | undefined;
|
|
82
|
+
export declare function getTimelockAddress(ctx: TrackingContext): string | undefined;
|
|
83
|
+
export declare function getOperationId(ctx: TrackingContext): string | undefined;
|
|
84
|
+
export declare function getCallScheduledData(ctx: TrackingContext): CallScheduledData[] | undefined;
|
|
85
|
+
export declare const getFirstCallScheduledData: (ctx: TrackingContext) => CallScheduledData | undefined;
|
|
86
|
+
export declare const getQueueBlockNumber: (ctx: TrackingContext) => number | undefined;
|
|
87
|
+
/** Proposal data from PROPOSAL_CREATED stage */
|
|
88
|
+
export declare function getProposalData(ctx: TrackingContext): ProposalData | undefined;
|
|
89
|
+
export declare function getProposalType(ctx: TrackingContext): ProposalType | undefined;
|
|
90
|
+
export declare const getIsElection: (ctx: TrackingContext) => boolean;
|
|
91
|
+
export declare const getProposalState: (ctx: TrackingContext) => ProposalState | undefined;
|
|
92
|
+
export declare function getVotingEndBlock(ctx: TrackingContext): number | undefined;
|
|
93
|
+
export declare function getL2ExecutionTxHash(ctx: TrackingContext): string | undefined;
|
|
94
|
+
export declare const getFirstExecutableBlock: (ctx: TrackingContext) => number | undefined;
|
|
95
|
+
export declare function getOutboxExecutionTx(ctx: TrackingContext): {
|
|
96
|
+
hash: string;
|
|
97
|
+
blockNumber: number;
|
|
98
|
+
} | undefined;
|
|
99
|
+
export declare function getL1ExecutionTxHash(ctx: TrackingContext): string | undefined;
|
|
100
|
+
export declare function createCheckpoint(ctx: TrackingContext): TrackingCheckpoint;
|
|
101
|
+
export declare function toResult(ctx: TrackingContext): {
|
|
102
|
+
input: TrackingInput;
|
|
103
|
+
stages: TrackedStage[];
|
|
104
|
+
checkpoint: TrackingCheckpoint;
|
|
105
|
+
isComplete: boolean;
|
|
106
|
+
proposalType: ProposalType | undefined;
|
|
107
|
+
proposalData: ProposalData | undefined;
|
|
108
|
+
currentState: ProposalState | undefined;
|
|
109
|
+
isElection: boolean;
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tracker/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TrackingContext - Functional state management for pipeline tracking
|
|
4
|
+
*
|
|
5
|
+
* This module provides a purely functional approach to tracking context:
|
|
6
|
+
* - TrackingContext interface defines the immutable state shape
|
|
7
|
+
* - Pure functions transform state and derive values
|
|
8
|
+
* - No classes, no mutation, no hidden state
|
|
9
|
+
*
|
|
10
|
+
* Benefits:
|
|
11
|
+
* - Easy testing: just create plain objects
|
|
12
|
+
* - Transparent: can log/inspect full state anytime
|
|
13
|
+
* - Predictable: same input → same output
|
|
14
|
+
* - Composable: mix and match functions freely
|
|
15
|
+
* - Debuggable: save/restore state snapshots
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.getFirstExecutableBlock = exports.getProposalState = exports.getIsElection = exports.getQueueBlockNumber = exports.getFirstCallScheduledData = exports.getProposalId = exports.getGovernorAddress = void 0;
|
|
19
|
+
exports.createTrackingContext = createTrackingContext;
|
|
20
|
+
exports.addStage = addStage;
|
|
21
|
+
exports.isStageCompleted = isStageCompleted;
|
|
22
|
+
exports.getCompletedStage = getCompletedStage;
|
|
23
|
+
exports.getCachedStage = getCachedStage;
|
|
24
|
+
exports.isComplete = isComplete;
|
|
25
|
+
exports.getTimelockAddress = getTimelockAddress;
|
|
26
|
+
exports.getOperationId = getOperationId;
|
|
27
|
+
exports.getCallScheduledData = getCallScheduledData;
|
|
28
|
+
exports.getProposalData = getProposalData;
|
|
29
|
+
exports.getProposalType = getProposalType;
|
|
30
|
+
exports.getVotingEndBlock = getVotingEndBlock;
|
|
31
|
+
exports.getL2ExecutionTxHash = getL2ExecutionTxHash;
|
|
32
|
+
exports.getOutboxExecutionTx = getOutboxExecutionTx;
|
|
33
|
+
exports.getL1ExecutionTxHash = getL1ExecutionTxHash;
|
|
34
|
+
exports.createCheckpoint = createCheckpoint;
|
|
35
|
+
exports.toResult = toResult;
|
|
36
|
+
const ethers_1 = require("ethers");
|
|
37
|
+
const logger_1 = require("../utils/logger");
|
|
38
|
+
const base_1 = require("../stages/base");
|
|
39
|
+
const governor_discovery_1 = require("../discovery/governor-discovery");
|
|
40
|
+
const constants_1 = require("../constants");
|
|
41
|
+
const { tracker: logTracker } = logger_1.loggers;
|
|
42
|
+
// State Creation
|
|
43
|
+
/**
|
|
44
|
+
* Create a new TrackingContext.
|
|
45
|
+
*/
|
|
46
|
+
function createTrackingContext(options) {
|
|
47
|
+
// Initialize stages based on tracking path
|
|
48
|
+
const includeProposal = options.input.type === "governor";
|
|
49
|
+
const addressForPath = options.input.type === "governor"
|
|
50
|
+
? options.input.governorAddress
|
|
51
|
+
: options.input.type === "timelock"
|
|
52
|
+
? options.input.timelockAddress
|
|
53
|
+
: "";
|
|
54
|
+
const initialStages = (0, base_1.initializeStagesForPath)(addressForPath, includeProposal);
|
|
55
|
+
let ctx = {
|
|
56
|
+
providers: options.providers,
|
|
57
|
+
chunkingConfig: options.chunkingConfig ?? constants_1.DEFAULT_CHUNKING_CONFIG,
|
|
58
|
+
onProgress: options.onProgress,
|
|
59
|
+
cacheKey: options.cacheKey,
|
|
60
|
+
input: options.input,
|
|
61
|
+
callScheduledData: options.callScheduledData,
|
|
62
|
+
stages: initialStages,
|
|
63
|
+
stageIndex: 0,
|
|
64
|
+
};
|
|
65
|
+
// Load from checkpoint if provided
|
|
66
|
+
if (options.checkpoint?.cachedData.completedStages?.length) {
|
|
67
|
+
ctx = loadFromCheckpoint(ctx, options.checkpoint);
|
|
68
|
+
}
|
|
69
|
+
return ctx;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Load stages from a checkpoint.
|
|
73
|
+
*/
|
|
74
|
+
function loadFromCheckpoint(ctx, checkpoint) {
|
|
75
|
+
const completedStages = checkpoint.cachedData.completedStages;
|
|
76
|
+
if (!completedStages?.length)
|
|
77
|
+
return ctx;
|
|
78
|
+
logTracker("RESUME: loading %d completed stages from checkpoint", completedStages.length);
|
|
79
|
+
let stages = ctx.stages;
|
|
80
|
+
for (const stage of completedStages) {
|
|
81
|
+
stages = (0, base_1.updateStageInList)(stages, stage);
|
|
82
|
+
}
|
|
83
|
+
return { ...ctx, stages, stageIndex: completedStages.length };
|
|
84
|
+
}
|
|
85
|
+
// Stage Management
|
|
86
|
+
/**
|
|
87
|
+
* Add or update a stage. Returns new context.
|
|
88
|
+
*/
|
|
89
|
+
async function addStage(ctx, stage) {
|
|
90
|
+
const newStages = (0, base_1.updateStageInList)(ctx.stages, stage);
|
|
91
|
+
const newCtx = {
|
|
92
|
+
...ctx,
|
|
93
|
+
stages: newStages,
|
|
94
|
+
stageIndex: ctx.stageIndex + 1,
|
|
95
|
+
};
|
|
96
|
+
await emitProgress(newCtx, stage);
|
|
97
|
+
return newCtx;
|
|
98
|
+
}
|
|
99
|
+
// Stage lookup helper (defined early for use in stage management functions)
|
|
100
|
+
const findStage = (ctx, type) => ctx.stages.find((s) => s.type === type);
|
|
101
|
+
/** Check if a stage is completed (COMPLETED or SKIPPED). */
|
|
102
|
+
function isStageCompleted(ctx, type) {
|
|
103
|
+
const s = findStage(ctx, type);
|
|
104
|
+
return s?.status === "COMPLETED" || s?.status === "SKIPPED";
|
|
105
|
+
}
|
|
106
|
+
/** Get a completed stage for zero-RPC resume. */
|
|
107
|
+
function getCompletedStage(ctx, type) {
|
|
108
|
+
const s = findStage(ctx, type);
|
|
109
|
+
return s?.status === "COMPLETED" || s?.status === "SKIPPED" ? s : undefined;
|
|
110
|
+
}
|
|
111
|
+
/** Get a cached stage (any status). */
|
|
112
|
+
function getCachedStage(ctx, type) {
|
|
113
|
+
return findStage(ctx, type);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if all stages are complete.
|
|
117
|
+
*/
|
|
118
|
+
function isComplete(ctx) {
|
|
119
|
+
return (0, base_1.areAllStagesComplete)(ctx.stages);
|
|
120
|
+
}
|
|
121
|
+
// Stage data helpers
|
|
122
|
+
const stageData = (ctx, type) => findStage(ctx, type)?.data;
|
|
123
|
+
const execTx = (s) => s?.transactions?.find((tx) => tx.description === "executed");
|
|
124
|
+
const chainTx = (s, chain) => s?.transactions?.find((tx) => tx.chain === chain);
|
|
125
|
+
// Derived Getters - Input-based
|
|
126
|
+
const getGovernorAddress = (ctx) => ctx.input.type === "governor" ? ctx.input.governorAddress : undefined;
|
|
127
|
+
exports.getGovernorAddress = getGovernorAddress;
|
|
128
|
+
const getProposalId = (ctx) => ctx.input.type === "governor" ? ctx.input.proposalId : undefined;
|
|
129
|
+
exports.getProposalId = getProposalId;
|
|
130
|
+
// Derived Getters - Multi-source lookups
|
|
131
|
+
function getTimelockAddress(ctx) {
|
|
132
|
+
if (ctx.input.type === "timelock")
|
|
133
|
+
return ctx.input.timelockAddress;
|
|
134
|
+
return (stageData(ctx, "PROPOSAL_QUEUED")?.timelockAddress ??
|
|
135
|
+
stageData(ctx, "L2_TIMELOCK")?.timelockAddress);
|
|
136
|
+
}
|
|
137
|
+
function getOperationId(ctx) {
|
|
138
|
+
if (ctx.input.type === "timelock")
|
|
139
|
+
return ctx.input.operationId;
|
|
140
|
+
return (stageData(ctx, "PROPOSAL_QUEUED")?.operationId ??
|
|
141
|
+
stageData(ctx, "L2_TIMELOCK")?.operationId);
|
|
142
|
+
}
|
|
143
|
+
function getCallScheduledData(ctx) {
|
|
144
|
+
if (ctx.callScheduledData)
|
|
145
|
+
return ctx.callScheduledData;
|
|
146
|
+
const qData = stageData(ctx, "PROPOSAL_QUEUED")?.callScheduledData;
|
|
147
|
+
if (qData?.length)
|
|
148
|
+
return (0, base_1.deserializeCallScheduledDataArray)(qData);
|
|
149
|
+
const l2Data = stageData(ctx, "L2_TIMELOCK")?.callScheduledData;
|
|
150
|
+
return l2Data?.length ? (0, base_1.deserializeCallScheduledDataArray)(l2Data) : undefined;
|
|
151
|
+
}
|
|
152
|
+
const getFirstCallScheduledData = (ctx) => getCallScheduledData(ctx)?.[0];
|
|
153
|
+
exports.getFirstCallScheduledData = getFirstCallScheduledData;
|
|
154
|
+
const getQueueBlockNumber = (ctx) => (0, exports.getFirstCallScheduledData)(ctx)?.blockNumber;
|
|
155
|
+
exports.getQueueBlockNumber = getQueueBlockNumber;
|
|
156
|
+
/** Proposal data from PROPOSAL_CREATED stage */
|
|
157
|
+
function getProposalData(ctx) {
|
|
158
|
+
const s = findStage(ctx, "PROPOSAL_CREATED");
|
|
159
|
+
if (!s || s.status === "NOT_STARTED")
|
|
160
|
+
return undefined;
|
|
161
|
+
const data = s.data;
|
|
162
|
+
const tx = s.transactions?.[0];
|
|
163
|
+
if (!data.proposalId ||
|
|
164
|
+
!data.startBlock ||
|
|
165
|
+
!data.endBlock ||
|
|
166
|
+
!data.proposer ||
|
|
167
|
+
!data.targets ||
|
|
168
|
+
!data.values ||
|
|
169
|
+
!data.signatures ||
|
|
170
|
+
!data.calldatas ||
|
|
171
|
+
!tx)
|
|
172
|
+
return undefined;
|
|
173
|
+
return {
|
|
174
|
+
proposalId: data.proposalId,
|
|
175
|
+
proposer: data.proposer,
|
|
176
|
+
description: data.description,
|
|
177
|
+
targets: data.targets,
|
|
178
|
+
values: data.values.map((v) => ethers_1.BigNumber.from(v)),
|
|
179
|
+
signatures: data.signatures,
|
|
180
|
+
calldatas: data.calldatas,
|
|
181
|
+
startBlock: ethers_1.BigNumber.from(data.startBlock),
|
|
182
|
+
endBlock: ethers_1.BigNumber.from(data.endBlock),
|
|
183
|
+
creationBlock: tx.blockNumber,
|
|
184
|
+
creationTxHash: tx.hash,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function getProposalType(ctx) {
|
|
188
|
+
const data = stageData(ctx, "PROPOSAL_CREATED");
|
|
189
|
+
if (data?.proposalType)
|
|
190
|
+
return data.proposalType;
|
|
191
|
+
const addr = (0, exports.getGovernorAddress)(ctx);
|
|
192
|
+
return addr ? (0, governor_discovery_1.detectProposalType)(addr) : undefined;
|
|
193
|
+
}
|
|
194
|
+
const getIsElection = (ctx) => {
|
|
195
|
+
const type = getProposalType(ctx);
|
|
196
|
+
return type ? (0, governor_discovery_1.isElectionProposal)(type) : false;
|
|
197
|
+
};
|
|
198
|
+
exports.getIsElection = getIsElection;
|
|
199
|
+
const getProposalState = (ctx) => stageData(ctx, "VOTING_ACTIVE")?.proposalState;
|
|
200
|
+
exports.getProposalState = getProposalState;
|
|
201
|
+
function getVotingEndBlock(ctx) {
|
|
202
|
+
const data = stageData(ctx, "VOTING_ACTIVE");
|
|
203
|
+
if (!data?.deadline)
|
|
204
|
+
return undefined;
|
|
205
|
+
const deadline = parseInt(data.deadline, 10);
|
|
206
|
+
const extended = data.extendedDeadline ? parseInt(data.extendedDeadline, 10) : 0;
|
|
207
|
+
return extended > deadline ? extended : deadline;
|
|
208
|
+
}
|
|
209
|
+
function getL2ExecutionTxHash(ctx) {
|
|
210
|
+
const s = findStage(ctx, "L2_TIMELOCK");
|
|
211
|
+
return s?.status === "COMPLETED" ? execTx(s)?.hash : undefined;
|
|
212
|
+
}
|
|
213
|
+
const getFirstExecutableBlock = (ctx) => stageData(ctx, "L2_TO_L1_MESSAGE")?.firstExecutableBlock;
|
|
214
|
+
exports.getFirstExecutableBlock = getFirstExecutableBlock;
|
|
215
|
+
function getOutboxExecutionTx(ctx) {
|
|
216
|
+
const s = findStage(ctx, "L2_TO_L1_MESSAGE");
|
|
217
|
+
if (s?.status !== "COMPLETED")
|
|
218
|
+
return undefined;
|
|
219
|
+
const tx = chainTx(s, "L1");
|
|
220
|
+
return tx ? { hash: tx.hash, blockNumber: tx.blockNumber } : undefined;
|
|
221
|
+
}
|
|
222
|
+
function getL1ExecutionTxHash(ctx) {
|
|
223
|
+
const s = findStage(ctx, "L1_TIMELOCK");
|
|
224
|
+
return s?.status === "COMPLETED" ? execTx(s)?.hash : undefined;
|
|
225
|
+
}
|
|
226
|
+
// Checkpoint & Result
|
|
227
|
+
function createCheckpoint(ctx) {
|
|
228
|
+
const completedStages = ctx.stages.filter((s) => s.status !== "NOT_STARTED");
|
|
229
|
+
const lastProcessedStage = [...ctx.stages].reverse().find((s) => s.status !== "NOT_STARTED")?.type ?? null;
|
|
230
|
+
return {
|
|
231
|
+
version: 1,
|
|
232
|
+
createdAt: Date.now(),
|
|
233
|
+
input: ctx.input,
|
|
234
|
+
lastProcessedStage,
|
|
235
|
+
lastProcessedBlock: { l1: 0, l2: 0, nova: 0 },
|
|
236
|
+
cachedData: { completedStages },
|
|
237
|
+
metadata: { errorCount: 0, lastTrackedAt: Date.now() },
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
async function emitProgress(ctx, s) {
|
|
241
|
+
if (!ctx.onProgress)
|
|
242
|
+
return;
|
|
243
|
+
const idx = ctx.stages.findIndex((x) => x.type === s.type);
|
|
244
|
+
await ctx.onProgress({
|
|
245
|
+
stage: s,
|
|
246
|
+
stages: ctx.stages,
|
|
247
|
+
currentIndex: idx >= 0 ? idx : ctx.stageIndex,
|
|
248
|
+
totalStages: ctx.stages.length,
|
|
249
|
+
isComplete: isComplete(ctx),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function toResult(ctx) {
|
|
253
|
+
return {
|
|
254
|
+
input: ctx.input,
|
|
255
|
+
stages: ctx.stages,
|
|
256
|
+
checkpoint: createCheckpoint(ctx),
|
|
257
|
+
isComplete: isComplete(ctx),
|
|
258
|
+
proposalType: getProposalType(ctx),
|
|
259
|
+
proposalData: getProposalData(ctx),
|
|
260
|
+
currentState: (0, exports.getProposalState)(ctx),
|
|
261
|
+
isElection: (0, exports.getIsElection)(ctx),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tracker/context.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAgGH,sDA6BC;AAwBD,4BAaC;AAOD,4CAGC;AAGD,8CAGC;AAGD,wCAEC;AAKD,gCAEC;AAiBD,gDAMC;AAED,wCAMC;AAED,oDAMC;AAOD,0CA8BC;AAED,0CAKC;AAUD,8CAMC;AAED,oDAGC;AAKD,oDAOC;AAED,oDAGC;AAID,4CAaC;AAcD,4BAWC;AA/VD,mCAA2C;AAC3C,4CAA0C;AAmB1C,yCAKwB;AACxB,wEAAyF;AACzF,4CAAuD;AAEvD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,gBAAO,CAAC;AA4DxC,iBAAiB;AAEjB;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAqC;IACzE,2CAA2C;IAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;IAC1D,MAAM,cAAc,GAClB,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe;QAC/B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;YACjC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe;YAC/B,CAAC,CAAC,EAAE,CAAC;IAEX,MAAM,aAAa,GAAG,IAAA,8BAAuB,EAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAE/E,IAAI,GAAG,GAAoB;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mCAAuB;QACjE,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,CAAC;KACd,CAAC;IAEF,mCAAmC;IACnC,IAAI,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QAC3D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAoB,EAAE,UAA8B;IAC9E,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC;IAC9D,IAAI,CAAC,eAAe,EAAE,MAAM;QAAE,OAAO,GAAG,CAAC;IAEzC,UAAU,CAAC,qDAAqD,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAE1F,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,GAAG,IAAA,wBAAiB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,mBAAmB;AAEnB;;GAEG;AACI,KAAK,UAAU,QAAQ,CAC5B,GAAoB,EACpB,KAAmB;IAEnB,MAAM,SAAS,GAAG,IAAA,wBAAiB,EAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,MAAM,GAAoB;QAC9B,GAAG,GAAG;QACN,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC;KAC/B,CAAC;IAEF,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4EAA4E;AAC5E,MAAM,SAAS,GAAG,CAAC,GAAoB,EAAE,IAAe,EAAE,EAAE,CAC1D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAE1C,4DAA4D;AAC5D,SAAgB,gBAAgB,CAAC,GAAoB,EAAE,IAAe;IACpE,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,KAAK,WAAW,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;AAC9D,CAAC;AAED,iDAAiD;AACjD,SAAgB,iBAAiB,CAAC,GAAoB,EAAE,IAAe;IACrE,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,KAAK,WAAW,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,uCAAuC;AACvC,SAAgB,cAAc,CAAC,GAAoB,EAAE,IAAe;IAClE,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,GAAoB;IAC7C,OAAO,IAAA,2BAAoB,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,SAAS,GAAG,CAAI,GAAoB,EAAE,IAAe,EAAE,EAAE,CAC7D,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAqB,CAAC;AAC9C,MAAM,MAAM,GAAG,CAAC,CAA2B,EAAE,EAAE,CAC7C,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG,CAAC,CAA2B,EAAE,KAAgB,EAAE,EAAE,CAChE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAEpD,gCAAgC;AACzB,MAAM,kBAAkB,GAAG,CAAC,GAAoB,EAAE,EAAE,CACzD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;AAD3D,QAAA,kBAAkB,sBACyC;AACjE,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAE,EAAE,CACpD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AADtD,QAAA,aAAa,iBACyC;AAEnE,yCAAyC;AACzC,SAAgB,kBAAkB,CAAC,GAAoB;IACrD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;IACpE,OAAO,CACL,SAAS,CAAqB,GAAG,EAAE,iBAAiB,CAAC,EAAE,eAAe;QACtE,SAAS,CAAoB,GAAG,EAAE,aAAa,CAAC,EAAE,eAAe,CAClE,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,GAAoB;IACjD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;IAChE,OAAO,CACL,SAAS,CAAqB,GAAG,EAAE,iBAAiB,CAAC,EAAE,WAAW;QAClE,SAAS,CAAoB,GAAG,EAAE,aAAa,CAAC,EAAE,WAAW,CAC9D,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAoB;IACvD,IAAI,GAAG,CAAC,iBAAiB;QAAE,OAAO,GAAG,CAAC,iBAAiB,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,CAAqB,GAAG,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACvF,IAAI,KAAK,EAAE,MAAM;QAAE,OAAO,IAAA,wCAAiC,EAAC,KAAK,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,SAAS,CAAoB,GAAG,EAAE,aAAa,CAAC,EAAE,iBAAiB,CAAC;IACnF,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAA,wCAAiC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAEM,MAAM,yBAAyB,GAAG,CAAC,GAAoB,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAArF,QAAA,yBAAyB,6BAA4D;AAC3F,MAAM,mBAAmB,GAAG,CAAC,GAAoB,EAAE,EAAE,CAC1D,IAAA,iCAAyB,EAAC,GAAG,CAAC,EAAE,WAAW,CAAC;AADjC,QAAA,mBAAmB,uBACc;AAE9C,gDAAgD;AAChD,SAAgB,eAAe,CAAC,GAAoB;IAClD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,CAAC,IAA2B,CAAC;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,IACE,CAAC,IAAI,CAAC,UAAU;QAChB,CAAC,IAAI,CAAC,UAAU;QAChB,CAAC,IAAI,CAAC,QAAQ;QACd,CAAC,IAAI,CAAC,QAAQ;QACd,CAAC,IAAI,CAAC,OAAO;QACb,CAAC,IAAI,CAAC,MAAM;QACZ,CAAC,IAAI,CAAC,UAAU;QAChB,CAAC,IAAI,CAAC,SAAS;QACf,CAAC,EAAE;QAEH,OAAO,SAAS,CAAC;IACnB,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAC3C,QAAQ,EAAE,kBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,aAAa,EAAE,EAAE,CAAC,WAAW;QAC7B,cAAc,EAAE,EAAE,CAAC,IAAI;KACxB,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,GAAoB;IAClD,MAAM,IAAI,GAAG,SAAS,CAAsB,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACrE,IAAI,IAAI,EAAE,YAAY;QAAE,OAAO,IAAI,CAAC,YAA4B,CAAC;IACjE,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,uCAAkB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAEM,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,uCAAkB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB;AAEK,MAAM,gBAAgB,GAAG,CAAC,GAAoB,EAAE,EAAE,CACvD,SAAS,CAAmB,GAAG,EAAE,eAAe,CAAC,EAAE,aAA0C,CAAC;AADnF,QAAA,gBAAgB,oBACmE;AAEhG,SAAgB,iBAAiB,CAAC,GAAoB;IACpD,MAAM,IAAI,GAAG,SAAS,CAAmB,GAAG,EAAE,eAAe,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI,EAAE,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAoB;IACvD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAEM,MAAM,uBAAuB,GAAG,CAAC,GAAoB,EAAE,EAAE,CAC9D,SAAS,CAAyB,GAAG,EAAE,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;AADtE,QAAA,uBAAuB,2BAC+C;AAEnF,SAAgB,oBAAoB,CAClC,GAAoB;IAEpB,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAoB;IACvD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED,sBAAsB;AAEtB,SAAgB,gBAAgB,CAAC,GAAoB;IACnD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IAC7E,MAAM,kBAAkB,GACtB,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IAClF,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,kBAAkB;QAClB,kBAAkB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;QAC7C,UAAU,EAAE,EAAE,eAAe,EAAE;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;KACvD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAoB,EAAE,CAAe;IAC/D,IAAI,CAAC,GAAG,CAAC,UAAU;QAAE,OAAO;IAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,GAAG,CAAC,UAAU,CAAC;QACnB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU;QAC7C,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QAC9B,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAoB;IAC3C,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC;QACjC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;QAC3B,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC;QAClC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC;QAClC,YAAY,EAAE,IAAA,wBAAgB,EAAC,GAAG,CAAC;QACnC,UAAU,EAAE,IAAA,qBAAa,EAAC,GAAG,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracker Discovery Module
|
|
3
|
+
*
|
|
4
|
+
* Handles discovery of proposals and timelock operations.
|
|
5
|
+
* Provides unified discovery API with watermark management.
|
|
6
|
+
*/
|
|
7
|
+
import { ethers } from "ethers";
|
|
8
|
+
import { DiscoveryWatermarks, DiscoveryTargets, CacheAdapter } from "../types";
|
|
9
|
+
import { DiscoveredProposal } from "../discovery/governor-discovery";
|
|
10
|
+
import { DiscoveredTimelockOp } from "../discovery/timelock-discovery";
|
|
11
|
+
export { DiscoveredProposal, DiscoveredTimelockOp };
|
|
12
|
+
/**
|
|
13
|
+
* Cache key for discovery watermarks checkpoint.
|
|
14
|
+
* Uses "discovery:" prefix to follow checkpoint pattern.
|
|
15
|
+
*/
|
|
16
|
+
export declare const WATERMARKS_KEY = "discovery:watermarks";
|
|
17
|
+
/**
|
|
18
|
+
* Load discovery watermarks from cache.
|
|
19
|
+
* Watermarks are stored as a TrackingCheckpoint for unified cache format.
|
|
20
|
+
* Returns empty object if no watermarks are cached.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadWatermarks(cache: CacheAdapter | undefined): Promise<DiscoveryWatermarks>;
|
|
23
|
+
/**
|
|
24
|
+
* Save discovery watermarks to cache.
|
|
25
|
+
* Watermarks are stored as TrackingCheckpoint with proper metadata,
|
|
26
|
+
* following the same pattern as proposal/timelock checkpoints.
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveWatermarks(watermarks: DiscoveryWatermarks, cache: CacheAdapter | undefined): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Discover proposals from a governor in a block range.
|
|
31
|
+
*
|
|
32
|
+
* @param governorAddress - Governor contract address
|
|
33
|
+
* @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
|
|
34
|
+
* @param toBlock - End block (inclusive)
|
|
35
|
+
* @param l2Provider - L2 provider
|
|
36
|
+
* @param options.chunkSize - Optional chunk size for log searches
|
|
37
|
+
* @returns Array of discovered proposals
|
|
38
|
+
*/
|
|
39
|
+
export declare function discoverProposals(governorAddress: string, fromBlock: number, toBlock: number, l2Provider: ethers.providers.Provider, options?: {
|
|
40
|
+
chunkSize?: number;
|
|
41
|
+
}): Promise<DiscoveredProposal[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Discover timelock operations from a timelock in a block range.
|
|
44
|
+
*
|
|
45
|
+
* @param timelockAddress - Timelock contract address
|
|
46
|
+
* @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
|
|
47
|
+
* @param toBlock - End block (inclusive)
|
|
48
|
+
* @param l2Provider - L2 provider
|
|
49
|
+
* @param options.chunkSize - Optional chunk size for log searches
|
|
50
|
+
* @returns Array of discovered timelock operations
|
|
51
|
+
*/
|
|
52
|
+
export declare function discoverTimelockOps(timelockAddress: string, fromBlock: number, toBlock: number, l2Provider: ethers.providers.Provider, options?: {
|
|
53
|
+
chunkSize?: number;
|
|
54
|
+
}): Promise<DiscoveredTimelockOp[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Create pending checkpoints for discovered proposals.
|
|
57
|
+
* This ensures they can be retracked even if the current run times out.
|
|
58
|
+
*
|
|
59
|
+
* Note: We don't create pending checkpoints for timelock ops because:
|
|
60
|
+
* 1. Most timelock ops are tracked as part of governor proposals
|
|
61
|
+
* 2. The monitor-loop skips timelock ops that were tracked via governor
|
|
62
|
+
* 3. Creating pending checkpoints for all timelock ops causes double-counting
|
|
63
|
+
*/
|
|
64
|
+
export declare function createPendingCheckpoints(proposals: DiscoveredProposal[], _timelockOps: DiscoveredTimelockOp[], cache: CacheAdapter | undefined): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Discover all proposals and timelock operations with auto-watermark management.
|
|
67
|
+
*
|
|
68
|
+
* This is the unified discovery API that handles everything internally:
|
|
69
|
+
* - Loads watermarks from provided watermarks or starts from governance deployment
|
|
70
|
+
* - Discovers from all enabled targets in parallel (with scoped logging)
|
|
71
|
+
* - Creates pending checkpoints for discovered items
|
|
72
|
+
* - Returns updated watermarks for saving
|
|
73
|
+
*
|
|
74
|
+
* @param targets - Which governors/timelocks to scan
|
|
75
|
+
* @param toBlock - End block for discovery
|
|
76
|
+
* @param l2Provider - L2 provider
|
|
77
|
+
* @param cache - Cache adapter for pending checkpoint creation
|
|
78
|
+
* @param fromWatermarks - Starting watermarks
|
|
79
|
+
* @param options.chunkSize - Optional chunk size for log searches
|
|
80
|
+
* @returns Discovered proposals, timelock ops, and updated watermarks
|
|
81
|
+
*/
|
|
82
|
+
export declare function discoverAll(targets: DiscoveryTargets, toBlock: number, l2Provider: ethers.providers.Provider, cache: CacheAdapter | undefined, fromWatermarks: DiscoveryWatermarks, options?: {
|
|
83
|
+
chunkSize?: number;
|
|
84
|
+
}): Promise<{
|
|
85
|
+
proposals: DiscoveredProposal[];
|
|
86
|
+
timelockOps: DiscoveredTimelockOp[];
|
|
87
|
+
watermarks: DiscoveryWatermarks;
|
|
88
|
+
}>;
|
|
89
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tracker/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAsB,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnG,OAAO,EAEL,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAG/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,kBAAkB,EAAE,EAC/B,YAAY,EAAE,oBAAoB,EAAE,EACpC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,cAAc,EAAE,mBAAmB,EACnC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC;IACT,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC,CA6HD"}
|