@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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proposal Queued Stage Tracking and Preparation
|
|
3
|
+
*
|
|
4
|
+
* Stage 3: Track when proposal is queued to timelock.
|
|
5
|
+
* Includes preparation functions for queueing and executing proposals.
|
|
6
|
+
*/
|
|
7
|
+
import { BigNumber, ethers } from "ethers";
|
|
8
|
+
import { TrackedStage, CallScheduledData, PrepareResult } from "../types";
|
|
9
|
+
/**
|
|
10
|
+
* Track proposal queued stage
|
|
11
|
+
*
|
|
12
|
+
* This stage links the Governor proposal to the Timelock operation
|
|
13
|
+
*/
|
|
14
|
+
export declare function trackProposalQueued(governorAddress: string, proposalId: string, provider: ethers.providers.Provider,
|
|
15
|
+
/** Block where proposal was created (from Stage 1) */
|
|
16
|
+
fromBlock: number, options?: {
|
|
17
|
+
toBlock?: number;
|
|
18
|
+
/** Voting end block - enables forward search optimization (queuing happens right after voting ends) */
|
|
19
|
+
votingEndBlock?: number;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
stage: TrackedStage;
|
|
22
|
+
timelockAddress?: string;
|
|
23
|
+
operationId?: string;
|
|
24
|
+
callScheduledData?: CallScheduledData[];
|
|
25
|
+
}>;
|
|
26
|
+
export interface GovernorProposalParams {
|
|
27
|
+
targets: string[];
|
|
28
|
+
values: BigNumber[];
|
|
29
|
+
calldatas: string[];
|
|
30
|
+
descriptionHash: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Prepare a queue transaction for a governor proposal.
|
|
34
|
+
*
|
|
35
|
+
* This is stage 3 preparation - queuing a succeeded proposal to the timelock.
|
|
36
|
+
* The proposal must be in the "Succeeded" state (voting passed).
|
|
37
|
+
*/
|
|
38
|
+
export declare function prepareGovernorQueue(governorAddress: string, proposalId: string, params: GovernorProposalParams, provider: ethers.providers.Provider): Promise<PrepareResult>;
|
|
39
|
+
//# sourceMappingURL=proposal-queued.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-queued.d.ts","sourceRoot":"","sources":["../../src/stages/proposal-queued.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAqB1E;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ;AACnC,sDAAsD;AACtD,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,OAAO,CAAC;IACT,KAAK,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACzC,CAAC,CAsED;AAID,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC,aAAa,CAAC,CA6CxB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Proposal Queued Stage Tracking and Preparation
|
|
4
|
+
*
|
|
5
|
+
* Stage 3: Track when proposal is queued to timelock.
|
|
6
|
+
* Includes preparation functions for queueing and executing proposals.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.trackProposalQueued = trackProposalQueued;
|
|
10
|
+
exports.prepareGovernorQueue = prepareGovernorQueue;
|
|
11
|
+
const ethers_1 = require("ethers");
|
|
12
|
+
const constants_1 = require("../constants");
|
|
13
|
+
const abis_1 = require("../abis");
|
|
14
|
+
const security_council_1 = require("../discovery/security-council");
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
const logStage = logger_1.loggers.stage.proposalQueued;
|
|
17
|
+
const logExecution = logger_1.loggers.execution;
|
|
18
|
+
const governor_discovery_1 = require("../discovery/governor-discovery");
|
|
19
|
+
const timelock_discovery_1 = require("../discovery/timelock-discovery");
|
|
20
|
+
const stage_helpers_1 = require("../utils/stage-helpers");
|
|
21
|
+
const base_1 = require("./base");
|
|
22
|
+
const stage_builder_1 = require("./stage-builder");
|
|
23
|
+
/**
|
|
24
|
+
* Track proposal queued stage
|
|
25
|
+
*
|
|
26
|
+
* This stage links the Governor proposal to the Timelock operation
|
|
27
|
+
*/
|
|
28
|
+
async function trackProposalQueued(governorAddress, proposalId, provider,
|
|
29
|
+
/** Block where proposal was created (from Stage 1) */
|
|
30
|
+
fromBlock, options = {}) {
|
|
31
|
+
const builder = new stage_builder_1.StageBuilder("PROPOSAL_QUEUED", "L2");
|
|
32
|
+
// Check proposal state
|
|
33
|
+
const proposalState = await (0, governor_discovery_1.getProposalState)(governorAddress, proposalId, provider);
|
|
34
|
+
// If not yet queued, check state
|
|
35
|
+
if (proposalState === "Pending" || proposalState === "Active") {
|
|
36
|
+
return { stage: builder.status("NOT_STARTED").data({ proposalState }).build() };
|
|
37
|
+
}
|
|
38
|
+
if (proposalState === "Defeated" || proposalState === "Canceled") {
|
|
39
|
+
return { stage: builder.data({ proposalState }).skip("Proposal did not pass").build() };
|
|
40
|
+
}
|
|
41
|
+
// Proposal is queued, executed, or succeeded - find the queue event
|
|
42
|
+
const useForwardSearch = options.votingEndBlock !== undefined;
|
|
43
|
+
const searchStart = options.votingEndBlock ?? fromBlock;
|
|
44
|
+
logStage("searching for ProposalQueued: startBlock=%d direction=%s", searchStart, useForwardSearch ? "forward" : "backward");
|
|
45
|
+
const queueEvent = await (0, governor_discovery_1.findProposalQueuedEvent)(governorAddress, proposalId, provider, {
|
|
46
|
+
startBlock: searchStart,
|
|
47
|
+
endBlock: options.toBlock,
|
|
48
|
+
direction: useForwardSearch ? "forward" : "backward",
|
|
49
|
+
});
|
|
50
|
+
if (!queueEvent) {
|
|
51
|
+
// Succeeded but not yet queued - ready for execution
|
|
52
|
+
if (proposalState === "Succeeded") {
|
|
53
|
+
builder.status("READY").data({ proposalState, canQueue: true, governorAddress, proposalId });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
builder.status("PENDING");
|
|
57
|
+
}
|
|
58
|
+
return { stage: builder.build() };
|
|
59
|
+
}
|
|
60
|
+
// Get timelock address
|
|
61
|
+
let timelockAddress = (0, timelock_discovery_1.getL2TimelockForGovernor)(governorAddress);
|
|
62
|
+
if (!timelockAddress) {
|
|
63
|
+
timelockAddress = await (0, governor_discovery_1.getTimelockAddress)(governorAddress, provider);
|
|
64
|
+
}
|
|
65
|
+
// Find the CallScheduled events from the queue transaction
|
|
66
|
+
const callScheduledData = await (0, timelock_discovery_1.findCallScheduledByTxHash)(queueEvent.txHash, provider);
|
|
67
|
+
const operationId = callScheduledData?.[0]?.operationId;
|
|
68
|
+
const eta = queueEvent.eta.toNumber();
|
|
69
|
+
const timestamp = await (0, base_1.getBlockTimestamp)(queueEvent.blockNumber, provider);
|
|
70
|
+
// Stage is complete - proposal is queued
|
|
71
|
+
builder
|
|
72
|
+
.status("COMPLETED")
|
|
73
|
+
.tx(queueEvent.txHash, queueEvent.blockNumber, "L2", { timestamp })
|
|
74
|
+
.timing({ startedAt: timestamp, eta })
|
|
75
|
+
.data({
|
|
76
|
+
proposalState,
|
|
77
|
+
timelockAddress,
|
|
78
|
+
operationId,
|
|
79
|
+
eta,
|
|
80
|
+
callCount: callScheduledData?.length ?? 0,
|
|
81
|
+
callScheduledData: callScheduledData
|
|
82
|
+
? (0, stage_helpers_1.serializeCallScheduledDataArray)(callScheduledData)
|
|
83
|
+
: undefined,
|
|
84
|
+
});
|
|
85
|
+
return { stage: builder.build(), timelockAddress, operationId, callScheduledData };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Prepare a queue transaction for a governor proposal.
|
|
89
|
+
*
|
|
90
|
+
* This is stage 3 preparation - queuing a succeeded proposal to the timelock.
|
|
91
|
+
* The proposal must be in the "Succeeded" state (voting passed).
|
|
92
|
+
*/
|
|
93
|
+
async function prepareGovernorQueue(governorAddress, proposalId, params, provider) {
|
|
94
|
+
logExecution("Preparing governor queue for proposal %s", proposalId);
|
|
95
|
+
const governor = new ethers_1.ethers.Contract(governorAddress, abis_1.GOVERNOR_ABI, provider);
|
|
96
|
+
const state = await governor.state(proposalId);
|
|
97
|
+
const stateName = constants_1.PROPOSAL_STATE_MAP[state] ?? `Unknown(${state})`;
|
|
98
|
+
logExecution("Proposal state: %s", stateName);
|
|
99
|
+
// Already queued
|
|
100
|
+
if (state === constants_1.PROPOSAL_STATE.QUEUED) {
|
|
101
|
+
return (0, base_1.failPrepare)("Proposal already queued");
|
|
102
|
+
}
|
|
103
|
+
// Must be in Succeeded state
|
|
104
|
+
if (state !== constants_1.PROPOSAL_STATE.SUCCEEDED) {
|
|
105
|
+
return (0, base_1.failPrepare)(`Cannot queue: proposal not in Succeeded state (current: ${stateName})`);
|
|
106
|
+
}
|
|
107
|
+
// Check vetting period for governors that have it
|
|
108
|
+
const vettingInfo = await (0, security_council_1.checkVettingPeriod)(governorAddress, proposalId, provider);
|
|
109
|
+
if (vettingInfo.hasVettingPeriod && vettingInfo.isVettingActive) {
|
|
110
|
+
return (0, base_1.failPrepare)(`Cannot queue: proposal is still in vetting period (deadline: block ${vettingInfo.vettingDeadline?.toString()})`);
|
|
111
|
+
}
|
|
112
|
+
// Build calldata
|
|
113
|
+
const calldata = abis_1.governorInterface.encodeFunctionData("queue", [
|
|
114
|
+
params.targets,
|
|
115
|
+
params.values,
|
|
116
|
+
params.calldatas,
|
|
117
|
+
params.descriptionHash,
|
|
118
|
+
]);
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
prepared: {
|
|
122
|
+
to: governorAddress,
|
|
123
|
+
data: calldata,
|
|
124
|
+
value: "0",
|
|
125
|
+
chain: "L2",
|
|
126
|
+
description: `queue() on Governor (proposal ${proposalId})`,
|
|
127
|
+
operationId: proposalId,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=proposal-queued.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-queued.js","sourceRoot":"","sources":["../../src/stages/proposal-queued.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retryable Ticket Stage Tracking and Preparation
|
|
3
|
+
*
|
|
4
|
+
* Stage 7: Retryable Executed
|
|
5
|
+
*
|
|
6
|
+
* Uses @arbitrum/sdk v4 for retryable ticket tracking.
|
|
7
|
+
* Supports both Arbitrum One and Nova as target chains.
|
|
8
|
+
* Includes preparation functions for retryable redemption.
|
|
9
|
+
*/
|
|
10
|
+
import { ethers } from "ethers";
|
|
11
|
+
import { ParentToChildMessageReader } from "@arbitrum/sdk";
|
|
12
|
+
import { TrackedStage, ChainType, PrepareResult } from "../types";
|
|
13
|
+
import { BulkPrepareResult } from "../utils/stage-helpers";
|
|
14
|
+
/**
|
|
15
|
+
* Result of detecting retryable target chains, including message counts
|
|
16
|
+
*/
|
|
17
|
+
export interface RetryableTargetInfo {
|
|
18
|
+
chain: ChainType;
|
|
19
|
+
inboxAddress: string;
|
|
20
|
+
messageCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect ALL L2 chains that retryables target based on the delayed inboxes used,
|
|
24
|
+
* including the count of messages per chain.
|
|
25
|
+
*
|
|
26
|
+
* The L1 transaction can send messages through multiple Delayed Inboxes:
|
|
27
|
+
* - ARB1_DELAYED_INBOX (0x4Dbd4fc...) → targets Arbitrum One
|
|
28
|
+
* - NOVA_DELAYED_INBOX (0xc4448b7...) → targets Arbitrum Nova
|
|
29
|
+
*
|
|
30
|
+
* A single L1 transaction may create retryables for BOTH chains.
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectAllRetryableTargetChains(l1TxHash: string, l1Provider: ethers.providers.Provider): Promise<RetryableTargetInfo[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Options for tracking retryables
|
|
35
|
+
*/
|
|
36
|
+
export interface TrackRetryablesOptions {
|
|
37
|
+
/** Provider for Arbitrum One (l2Provider) - required for Arb1-targeting retryables */
|
|
38
|
+
l2Provider: ethers.providers.Provider;
|
|
39
|
+
/** Provider for Arbitrum Nova - optional for Nova-targeting retryables */
|
|
40
|
+
novaProvider?: ethers.providers.Provider;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Track retryable execution stage
|
|
44
|
+
*
|
|
45
|
+
* Automatically detects ALL L2 chains the retryables target (Arb1 and/or Nova)
|
|
46
|
+
* based on which Delayed Inbox contracts were used on L1.
|
|
47
|
+
* A single L1 transaction may create retryables for BOTH chains.
|
|
48
|
+
*
|
|
49
|
+
* @param l1ExecutionTxHash - L1 timelock execution transaction hash
|
|
50
|
+
* @param l1Provider - Ethereum L1 provider
|
|
51
|
+
* @param options - L2 provider options (l2Provider required, novaProvider optional)
|
|
52
|
+
*/
|
|
53
|
+
export declare function trackRetryables(l1ExecutionTxHash: string, l1Provider: ethers.providers.Provider, options: TrackRetryablesOptions): Promise<{
|
|
54
|
+
stage: TrackedStage;
|
|
55
|
+
messages: ParentToChildMessageReader[];
|
|
56
|
+
isComplete: boolean;
|
|
57
|
+
/** All target chains for retryables (can be both Arb1 and Nova) */
|
|
58
|
+
targetChains: ("Arb1" | "Nova")[];
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Options for preparing retryable tickets
|
|
62
|
+
*/
|
|
63
|
+
export interface RetryablePrepareOptions {
|
|
64
|
+
/** Force preparation even if stage is completed (for historical validation) */
|
|
65
|
+
force?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Prepare a retryable ticket for redemption.
|
|
69
|
+
*/
|
|
70
|
+
export declare function prepareRetryableRedemption(message: ParentToChildMessageReader, targetChain?: ChainType, options?: RetryablePrepareOptions): Promise<PrepareResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Prepare all retryable tickets from an L1 transaction
|
|
73
|
+
*/
|
|
74
|
+
export declare function prepareAllRetryables(l1TxHash: string, l1Provider: ethers.providers.Provider, l2Provider: ethers.providers.Provider, options?: RetryablePrepareOptions): Promise<BulkPrepareResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Prepare retryable stage for execution
|
|
77
|
+
*/
|
|
78
|
+
export declare function prepareRetryableStage(stage: TrackedStage, l1Provider: ethers.providers.Provider, l2Provider: ethers.providers.Provider, options?: RetryablePrepareOptions): Promise<BulkPrepareResult>;
|
|
79
|
+
//# sourceMappingURL=retryables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryables.d.ts","sourceRoot":"","sources":["../../src/stages/retryables.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAGL,0BAA0B,EAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAWlE,OAAO,EAGL,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAiBhC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GACpC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAgChC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACtC,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC;IACT,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,YAAY,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACnC,CAAC,CAyMD;AAID;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,EACnC,WAAW,GAAE,SAAgB,EAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,aAAa,CAAC,CAkCxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAgB5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAQ5B"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retryable Ticket Stage Tracking and Preparation
|
|
4
|
+
*
|
|
5
|
+
* Stage 7: Retryable Executed
|
|
6
|
+
*
|
|
7
|
+
* Uses @arbitrum/sdk v4 for retryable ticket tracking.
|
|
8
|
+
* Supports both Arbitrum One and Nova as target chains.
|
|
9
|
+
* Includes preparation functions for retryable redemption.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.detectAllRetryableTargetChains = detectAllRetryableTargetChains;
|
|
13
|
+
exports.trackRetryables = trackRetryables;
|
|
14
|
+
exports.prepareRetryableRedemption = prepareRetryableRedemption;
|
|
15
|
+
exports.prepareAllRetryables = prepareAllRetryables;
|
|
16
|
+
exports.prepareRetryableStage = prepareRetryableStage;
|
|
17
|
+
const sdk_1 = require("@arbitrum/sdk");
|
|
18
|
+
const logger_1 = require("../utils/logger");
|
|
19
|
+
const log = logger_1.loggers.retryables;
|
|
20
|
+
const chain_1 = require("../utils/chain");
|
|
21
|
+
const abis_1 = require("../abis");
|
|
22
|
+
const constants_1 = require("../constants");
|
|
23
|
+
const base_1 = require("./base");
|
|
24
|
+
const stage_builder_1 = require("./stage-builder");
|
|
25
|
+
const rpc_utils_1 = require("../utils/rpc-utils");
|
|
26
|
+
const log_filters_1 = require("../utils/log-filters");
|
|
27
|
+
const stage_helpers_1 = require("../utils/stage-helpers");
|
|
28
|
+
/**
|
|
29
|
+
* Detect ALL L2 chains that retryables target based on the delayed inboxes used,
|
|
30
|
+
* including the count of messages per chain.
|
|
31
|
+
*
|
|
32
|
+
* The L1 transaction can send messages through multiple Delayed Inboxes:
|
|
33
|
+
* - ARB1_DELAYED_INBOX (0x4Dbd4fc...) → targets Arbitrum One
|
|
34
|
+
* - NOVA_DELAYED_INBOX (0xc4448b7...) → targets Arbitrum Nova
|
|
35
|
+
*
|
|
36
|
+
* A single L1 transaction may create retryables for BOTH chains.
|
|
37
|
+
*/
|
|
38
|
+
async function detectAllRetryableTargetChains(l1TxHash, l1Provider) {
|
|
39
|
+
const receipt = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getTransactionReceipt(l1TxHash));
|
|
40
|
+
if (!receipt) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
// Count InboxMessageDelivered events grouped by inbox address
|
|
44
|
+
const counts = (0, log_filters_1.countLogsByAddress)(receipt.logs, { topic: constants_1.EVENT_TOPICS.TICKET_CREATED });
|
|
45
|
+
const arb1Count = counts.get(constants_1.ADDRESSES.ARB1_DELAYED_INBOX.toLowerCase()) ?? 0;
|
|
46
|
+
const novaCount = counts.get(constants_1.ADDRESSES.NOVA_DELAYED_INBOX.toLowerCase()) ?? 0;
|
|
47
|
+
const targets = [];
|
|
48
|
+
if (arb1Count > 0) {
|
|
49
|
+
targets.push({
|
|
50
|
+
chain: "L2",
|
|
51
|
+
inboxAddress: constants_1.ADDRESSES.ARB1_DELAYED_INBOX,
|
|
52
|
+
messageCount: arb1Count,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (novaCount > 0) {
|
|
56
|
+
targets.push({
|
|
57
|
+
chain: "NOVA",
|
|
58
|
+
inboxAddress: constants_1.ADDRESSES.NOVA_DELAYED_INBOX,
|
|
59
|
+
messageCount: novaCount,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return targets;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Track retryable execution stage
|
|
66
|
+
*
|
|
67
|
+
* Automatically detects ALL L2 chains the retryables target (Arb1 and/or Nova)
|
|
68
|
+
* based on which Delayed Inbox contracts were used on L1.
|
|
69
|
+
* A single L1 transaction may create retryables for BOTH chains.
|
|
70
|
+
*
|
|
71
|
+
* @param l1ExecutionTxHash - L1 timelock execution transaction hash
|
|
72
|
+
* @param l1Provider - Ethereum L1 provider
|
|
73
|
+
* @param options - L2 provider options (l2Provider required, novaProvider optional)
|
|
74
|
+
*/
|
|
75
|
+
async function trackRetryables(l1ExecutionTxHash, l1Provider, options) {
|
|
76
|
+
const { l2Provider, novaProvider } = options;
|
|
77
|
+
// Detect ALL chains that the retryables target
|
|
78
|
+
const targetInfos = await detectAllRetryableTargetChains(l1ExecutionTxHash, l1Provider);
|
|
79
|
+
// No retryables found
|
|
80
|
+
if (targetInfos.length === 0) {
|
|
81
|
+
return {
|
|
82
|
+
stage: new stage_builder_1.StageBuilder("RETRYABLE_EXECUTED", "L2")
|
|
83
|
+
.skip("No retryable tickets in transaction")
|
|
84
|
+
.build(),
|
|
85
|
+
messages: [],
|
|
86
|
+
isComplete: true,
|
|
87
|
+
targetChains: [],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Get L1 receipt once (shared across all chains)
|
|
91
|
+
const l1Receipt = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getTransactionReceipt(l1ExecutionTxHash));
|
|
92
|
+
if (!l1Receipt) {
|
|
93
|
+
return {
|
|
94
|
+
stage: new stage_builder_1.StageBuilder("RETRYABLE_EXECUTED", "L2")
|
|
95
|
+
.skip("L1 transaction receipt not found")
|
|
96
|
+
.build(),
|
|
97
|
+
messages: [],
|
|
98
|
+
isComplete: true,
|
|
99
|
+
targetChains: [],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const l1Timestamp = await (0, base_1.getBlockTimestamp)(l1Receipt.blockNumber, l1Provider);
|
|
103
|
+
// Collect results from all target chains
|
|
104
|
+
const allMessages = [];
|
|
105
|
+
const allCreationDetails = [];
|
|
106
|
+
const allRedemptionDetails = [];
|
|
107
|
+
const allTransactions = [
|
|
108
|
+
{
|
|
109
|
+
hash: l1ExecutionTxHash,
|
|
110
|
+
blockNumber: l1Receipt.blockNumber,
|
|
111
|
+
chain: "L1",
|
|
112
|
+
timestamp: l1Timestamp,
|
|
113
|
+
logIndex: 0,
|
|
114
|
+
description: "L1 executed",
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
let allRedeemed = true;
|
|
118
|
+
let anyFailed = false;
|
|
119
|
+
for (const { chain: targetChain, messageCount } of targetInfos) {
|
|
120
|
+
const provider = targetChain === "NOVA" ? novaProvider : l2Provider;
|
|
121
|
+
const chainLabel = targetChain === "NOVA" ? "Nova" : "Arb1";
|
|
122
|
+
// Handle missing provider
|
|
123
|
+
if (!provider) {
|
|
124
|
+
log("No provider for %s, marking %d tickets as PROVIDER_NOT_AVAILABLE", chainLabel, messageCount);
|
|
125
|
+
for (let i = 0; i < messageCount; i++) {
|
|
126
|
+
allCreationDetails.push({
|
|
127
|
+
index: allCreationDetails.length,
|
|
128
|
+
targetChain: chainLabel,
|
|
129
|
+
l2TxHash: "unknown",
|
|
130
|
+
});
|
|
131
|
+
allRedemptionDetails.push({
|
|
132
|
+
index: allRedemptionDetails.length,
|
|
133
|
+
targetChain: chainLabel,
|
|
134
|
+
status: "PROVIDER_NOT_AVAILABLE",
|
|
135
|
+
l2TxHash: null,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
allRedeemed = false;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// Get messages for this chain
|
|
142
|
+
const parentReceipt = new sdk_1.ParentTransactionReceipt(l1Receipt);
|
|
143
|
+
const messages = await parentReceipt.getParentToChildMessages(provider);
|
|
144
|
+
allMessages.push(...messages);
|
|
145
|
+
// Add creation details and transactions
|
|
146
|
+
for (const msg of messages) {
|
|
147
|
+
allCreationDetails.push({
|
|
148
|
+
index: allCreationDetails.length,
|
|
149
|
+
targetChain: chainLabel,
|
|
150
|
+
l2TxHash: msg.retryableCreationId,
|
|
151
|
+
});
|
|
152
|
+
allTransactions.push({
|
|
153
|
+
hash: msg.retryableCreationId,
|
|
154
|
+
blockNumber: 0,
|
|
155
|
+
chain: targetChain,
|
|
156
|
+
timestamp: l1Timestamp,
|
|
157
|
+
logIndex: allTransactions.length,
|
|
158
|
+
targetChain: chainLabel,
|
|
159
|
+
description: `${chainLabel} created`,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const redeemResults = await Promise.all(messages.map((message, idx) => (0, rpc_utils_1.queryWithRetry)(() => message.getSuccessfulRedeem()).catch((err) => {
|
|
163
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
log("Warning: failed to get redeem status for message %d: %s", idx, errMsg);
|
|
165
|
+
return { __fetchError: true, message: errMsg };
|
|
166
|
+
})));
|
|
167
|
+
for (let i = 0; i < messages.length; i++) {
|
|
168
|
+
const redeemResult = redeemResults[i];
|
|
169
|
+
const isFetchError = redeemResult && "__fetchError" in redeemResult;
|
|
170
|
+
if (isFetchError) {
|
|
171
|
+
// Fetch error - treat as inconclusive, don't mark as redeemed
|
|
172
|
+
allRedeemed = false;
|
|
173
|
+
allRedemptionDetails.push({
|
|
174
|
+
index: allRedemptionDetails.length,
|
|
175
|
+
targetChain: chainLabel,
|
|
176
|
+
status: "FETCH_ERROR",
|
|
177
|
+
l2TxHash: null,
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const status = redeemResult?.status ?? sdk_1.ParentToChildMessageStatus.NOT_YET_CREATED;
|
|
182
|
+
const statusName = sdk_1.ParentToChildMessageStatus[status];
|
|
183
|
+
let l2TxHash = null;
|
|
184
|
+
if (status === sdk_1.ParentToChildMessageStatus.REDEEMED &&
|
|
185
|
+
redeemResult &&
|
|
186
|
+
"childTxReceipt" in redeemResult &&
|
|
187
|
+
redeemResult.childTxReceipt) {
|
|
188
|
+
const { transactionHash, blockNumber } = redeemResult.childTxReceipt;
|
|
189
|
+
l2TxHash = transactionHash;
|
|
190
|
+
const timestamp = await (0, base_1.getBlockTimestamp)(blockNumber, provider);
|
|
191
|
+
allTransactions.push({
|
|
192
|
+
hash: transactionHash,
|
|
193
|
+
blockNumber,
|
|
194
|
+
chain: targetChain,
|
|
195
|
+
timestamp,
|
|
196
|
+
logIndex: allTransactions.length,
|
|
197
|
+
targetChain: chainLabel,
|
|
198
|
+
description: `${chainLabel} redeemed`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
else if (status === sdk_1.ParentToChildMessageStatus.EXPIRED) {
|
|
202
|
+
anyFailed = true;
|
|
203
|
+
allRedeemed = false;
|
|
204
|
+
}
|
|
205
|
+
else if (status !== sdk_1.ParentToChildMessageStatus.REDEEMED) {
|
|
206
|
+
allRedeemed = false;
|
|
207
|
+
}
|
|
208
|
+
allRedemptionDetails.push({
|
|
209
|
+
index: allRedemptionDetails.length,
|
|
210
|
+
targetChain: chainLabel,
|
|
211
|
+
status: statusName,
|
|
212
|
+
l2TxHash,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Collect unique target chains, converting ChainType to TargetChainType
|
|
217
|
+
// "L2" -> "Arb1", "NOVA" -> "Nova"
|
|
218
|
+
const targetChains = [
|
|
219
|
+
...new Set(targetInfos.map((t) => (t.chain === "L2" ? "Arb1" : "Nova"))),
|
|
220
|
+
];
|
|
221
|
+
// Determine overall status and build stage using StageBuilder
|
|
222
|
+
// Note: chain is "L2" because retryable redemption executes on L2 chains (Arb1/Nova)
|
|
223
|
+
const status = anyFailed ? "FAILED" : allRedeemed ? "COMPLETED" : "READY";
|
|
224
|
+
const builder = new stage_builder_1.StageBuilder("RETRYABLE_EXECUTED", "L2")
|
|
225
|
+
.status(status)
|
|
226
|
+
.transactions(allTransactions)
|
|
227
|
+
.timing({ startedAt: l1Timestamp })
|
|
228
|
+
.data({
|
|
229
|
+
ticketCount: allCreationDetails.length,
|
|
230
|
+
targetChains,
|
|
231
|
+
creationDetails: allCreationDetails,
|
|
232
|
+
redemptionDetails: allRedemptionDetails,
|
|
233
|
+
redeemedCount: allRedemptionDetails.filter((d) => d.status === "REDEEMED").length,
|
|
234
|
+
pendingCount: allRedemptionDetails.filter((d) => d.status === "FUNDS_DEPOSITED_ON_CHILD" || d.status === "NOT_YET_CREATED").length,
|
|
235
|
+
statuses: allRedemptionDetails.map((d) => d.status),
|
|
236
|
+
});
|
|
237
|
+
if (status === "READY") {
|
|
238
|
+
builder.executable(true).timing({ delaySeconds: constants_1.TIMING.RETRYABLE_LIFETIME_SECONDS });
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
stage: builder.build(),
|
|
242
|
+
messages: allMessages,
|
|
243
|
+
isComplete: allRedeemed,
|
|
244
|
+
targetChains,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Prepare a retryable ticket for redemption.
|
|
249
|
+
*/
|
|
250
|
+
async function prepareRetryableRedemption(message, targetChain = "L2", options = {}) {
|
|
251
|
+
const ticketId = message.retryableCreationId;
|
|
252
|
+
log("Preparing retryable redemption for %s", ticketId);
|
|
253
|
+
const status = await (0, rpc_utils_1.queryWithRetry)(() => message.status());
|
|
254
|
+
log("Retryable status: %s", sdk_1.ParentToChildMessageStatus[status]);
|
|
255
|
+
// Skip status check if force=true for historical validation
|
|
256
|
+
if (!options.force) {
|
|
257
|
+
if (status === sdk_1.ParentToChildMessageStatus.REDEEMED) {
|
|
258
|
+
return (0, base_1.failPrepare)("Retryable already redeemed");
|
|
259
|
+
}
|
|
260
|
+
if (status === sdk_1.ParentToChildMessageStatus.EXPIRED) {
|
|
261
|
+
return (0, base_1.failPrepare)("Retryable ticket has expired");
|
|
262
|
+
}
|
|
263
|
+
if (status !== sdk_1.ParentToChildMessageStatus.FUNDS_DEPOSITED_ON_CHILD) {
|
|
264
|
+
return (0, base_1.failPrepare)(`Retryable not ready. Status: ${sdk_1.ParentToChildMessageStatus[status]}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const calldata = abis_1.arbRetryableInterface.encodeFunctionData("redeem", [ticketId]);
|
|
268
|
+
return {
|
|
269
|
+
success: true,
|
|
270
|
+
prepared: {
|
|
271
|
+
to: constants_1.ADDRESSES.ARB_RETRYABLE_TX,
|
|
272
|
+
data: calldata,
|
|
273
|
+
value: "0",
|
|
274
|
+
chain: targetChain,
|
|
275
|
+
description: `Redeem retryable ticket ${ticketId}`,
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Prepare all retryable tickets from an L1 transaction
|
|
281
|
+
*/
|
|
282
|
+
async function prepareAllRetryables(l1TxHash, l1Provider, l2Provider, options = {}) {
|
|
283
|
+
const receipt = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getTransactionReceipt(l1TxHash));
|
|
284
|
+
if (!receipt)
|
|
285
|
+
return (0, stage_helpers_1.bulkPrepareError)("L1 transaction receipt not found", "L2");
|
|
286
|
+
const parentReceipt = new sdk_1.ParentTransactionReceipt(receipt);
|
|
287
|
+
const messages = await parentReceipt.getParentToChildMessages(l2Provider);
|
|
288
|
+
if (messages.length === 0)
|
|
289
|
+
return (0, stage_helpers_1.bulkPrepareError)("No retryable tickets found", "L2");
|
|
290
|
+
const targetChain = await (0, chain_1.getChainType)(l2Provider);
|
|
291
|
+
log("Preparing %d retryable tickets for %s", messages.length, targetChain);
|
|
292
|
+
const results = await Promise.all(messages.map((message) => prepareRetryableRedemption(message, targetChain, options)));
|
|
293
|
+
return { total: messages.length, results, targetChain };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Prepare retryable stage for execution
|
|
297
|
+
*/
|
|
298
|
+
async function prepareRetryableStage(stage, l1Provider, l2Provider, options = {}) {
|
|
299
|
+
const validationError = (0, stage_helpers_1.validateStageForBulkPrepare)(stage, "L2", { force: options.force });
|
|
300
|
+
if (validationError)
|
|
301
|
+
return validationError;
|
|
302
|
+
const l1TxHash = stage.transactions[0]?.hash;
|
|
303
|
+
if (!l1TxHash)
|
|
304
|
+
return (0, stage_helpers_1.bulkPrepareError)("L1 transaction hash not found", "L2");
|
|
305
|
+
return prepareAllRetryables(l1TxHash, l1Provider, l2Provider, options);
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=retryables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryables.js","sourceRoot":"","sources":["../../src/stages/retryables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent API for constructing TrackedStage objects
|
|
3
|
+
*/
|
|
4
|
+
import { ChainType, StageStatus, StageType, StageTransaction, StageTiming, TargetChainType, TrackedStage, TrackedStageData } from "../types";
|
|
5
|
+
export declare class StageBuilder {
|
|
6
|
+
private _stage;
|
|
7
|
+
constructor(type: StageType, chain: ChainType, status?: StageStatus);
|
|
8
|
+
/**
|
|
9
|
+
* Set stage status
|
|
10
|
+
*/
|
|
11
|
+
status(status: StageStatus): this;
|
|
12
|
+
/**
|
|
13
|
+
* Add data to the stage (merges with existing data)
|
|
14
|
+
*/
|
|
15
|
+
data(data: TrackedStageData): this;
|
|
16
|
+
/**
|
|
17
|
+
* Set timing information (merges with existing timing)
|
|
18
|
+
*/
|
|
19
|
+
timing(timing: Partial<StageTiming>): this;
|
|
20
|
+
/**
|
|
21
|
+
* Add a transaction to the stage
|
|
22
|
+
*/
|
|
23
|
+
tx(hash: string, blockNumber: number, chain: ChainType, options?: {
|
|
24
|
+
timestamp?: number;
|
|
25
|
+
logIndex?: number;
|
|
26
|
+
targetChain?: TargetChainType;
|
|
27
|
+
description?: string;
|
|
28
|
+
}): this;
|
|
29
|
+
/**
|
|
30
|
+
* Mark stage as skipped with reason
|
|
31
|
+
*/
|
|
32
|
+
skip(reason: string): this;
|
|
33
|
+
/**
|
|
34
|
+
* Set transactions directly (for merging from multiple sources)
|
|
35
|
+
*/
|
|
36
|
+
transactions(txs: StageTransaction[]): this;
|
|
37
|
+
/**
|
|
38
|
+
* Set executable flag directly
|
|
39
|
+
*/
|
|
40
|
+
executable(value: boolean): this;
|
|
41
|
+
/**
|
|
42
|
+
* Build and return the final stage object
|
|
43
|
+
*/
|
|
44
|
+
build(): TrackedStage;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=stage-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage-builder.d.ts","sourceRoot":"","sources":["../../src/stages/stage-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;gBAEjB,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAE,WAA2B;IAWlF;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMjC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAKlC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAK1C;;OAEG;IACH,EAAE,CACA,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GACL,IAAI;IAUP;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO1B;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAK3C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKhC;;OAEG;IACH,KAAK,IAAI,YAAY;CAGtB"}
|