@gzeoneth/gov-tracker 0.1.2 → 0.2.0-1
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/README.md +3 -0
- package/dist/abis.d.ts +0 -32
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +17 -17
- package/dist/abis.js.map +1 -1
- package/dist/calldata/decoder.d.ts +12 -3
- package/dist/calldata/decoder.d.ts.map +1 -1
- package/dist/calldata/decoder.js +56 -9
- package/dist/calldata/decoder.js.map +1 -1
- package/dist/calldata/index.d.ts +4 -7
- package/dist/calldata/index.d.ts.map +1 -1
- package/dist/calldata/index.js +5 -19
- package/dist/calldata/index.js.map +1 -1
- package/dist/calldata/parameter-decoder.d.ts +11 -2
- package/dist/calldata/parameter-decoder.d.ts.map +1 -1
- package/dist/calldata/parameter-decoder.js +67 -8
- package/dist/calldata/parameter-decoder.js.map +1 -1
- package/dist/calldata/retryable-ticket.d.ts +1 -17
- package/dist/calldata/retryable-ticket.d.ts.map +1 -1
- package/dist/calldata/retryable-ticket.js +10 -17
- package/dist/calldata/retryable-ticket.js.map +1 -1
- package/dist/calldata/signature-lookup.d.ts +0 -11
- package/dist/calldata/signature-lookup.d.ts.map +1 -1
- package/dist/calldata/signature-lookup.js +0 -8
- package/dist/calldata/signature-lookup.js.map +1 -1
- package/dist/cli/lib/cli.d.ts +1 -3
- package/dist/cli/lib/cli.d.ts.map +1 -1
- package/dist/cli/lib/cli.js +12 -27
- package/dist/cli/lib/cli.js.map +1 -1
- package/dist/cli/lib/election-check.d.ts +2 -2
- package/dist/cli/lib/election-check.d.ts.map +1 -1
- package/dist/cli/lib/election-check.js.map +1 -1
- package/dist/cli/lib/json-state.d.ts +2 -29
- package/dist/cli/lib/json-state.d.ts.map +1 -1
- package/dist/cli/lib/json-state.js +12 -56
- package/dist/cli/lib/json-state.js.map +1 -1
- package/dist/cli/monitor.js +1 -2
- package/dist/cli/monitor.js.map +1 -1
- package/dist/constants.d.ts +41 -7
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +64 -4
- package/dist/constants.js.map +1 -1
- package/dist/discovery/timelock-discovery.js +1 -1
- package/dist/discovery/timelock-discovery.js.map +1 -1
- package/dist/election.d.ts.map +1 -1
- package/dist/election.js +7 -4
- package/dist/election.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -26
- package/dist/index.js.map +1 -1
- package/dist/simulation/index.d.ts +3 -4
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +3 -9
- package/dist/simulation/index.js.map +1 -1
- package/dist/simulation/simulation-data.d.ts +6 -31
- package/dist/simulation/simulation-data.d.ts.map +1 -1
- package/dist/simulation/simulation-data.js +25 -58
- package/dist/simulation/simulation-data.js.map +1 -1
- package/dist/stages/{stage-builder.d.ts → builder.d.ts} +14 -9
- package/dist/stages/builder.d.ts.map +1 -0
- package/dist/stages/{stage-builder.js → builder.js} +19 -5
- package/dist/stages/builder.js.map +1 -0
- package/dist/stages/l2-to-l1-message.d.ts +3 -3
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
- package/dist/stages/l2-to-l1-message.js +17 -17
- package/dist/stages/l2-to-l1-message.js.map +1 -1
- package/dist/stages/proposal-created.d.ts +2 -2
- package/dist/stages/proposal-created.d.ts.map +1 -1
- package/dist/stages/proposal-created.js +5 -5
- package/dist/stages/proposal-created.js.map +1 -1
- package/dist/stages/proposal-queued.d.ts +2 -2
- package/dist/stages/proposal-queued.d.ts.map +1 -1
- package/dist/stages/proposal-queued.js +11 -11
- package/dist/stages/proposal-queued.js.map +1 -1
- package/dist/stages/retryables.d.ts +7 -7
- package/dist/stages/retryables.d.ts.map +1 -1
- package/dist/stages/retryables.js +75 -61
- package/dist/stages/retryables.js.map +1 -1
- package/dist/stages/timelock.d.ts +3 -24
- package/dist/stages/timelock.d.ts.map +1 -1
- package/dist/stages/timelock.js +47 -39
- package/dist/stages/timelock.js.map +1 -1
- package/dist/stages/{base.d.ts → utils.d.ts} +78 -35
- package/dist/stages/utils.d.ts.map +1 -0
- package/dist/stages/{base.js → utils.js} +211 -63
- package/dist/stages/utils.js.map +1 -0
- package/dist/stages/voting.d.ts +2 -2
- package/dist/stages/voting.d.ts.map +1 -1
- package/dist/stages/voting.js +2 -2
- package/dist/stages/voting.js.map +1 -1
- package/dist/tracker/cache.d.ts +104 -0
- package/dist/tracker/cache.d.ts.map +1 -0
- package/dist/tracker/cache.js +287 -0
- package/dist/tracker/cache.js.map +1 -0
- package/dist/tracker/execute.js +9 -9
- package/dist/tracker/execute.js.map +1 -1
- package/dist/tracker/pipeline.d.ts +3 -32
- package/dist/tracker/pipeline.d.ts.map +1 -1
- package/dist/tracker/pipeline.js +40 -43
- package/dist/tracker/pipeline.js.map +1 -1
- package/dist/tracker/query.js +4 -4
- package/dist/tracker/query.js.map +1 -1
- package/dist/tracker/state.d.ts +88 -81
- package/dist/tracker/state.d.ts.map +1 -1
- package/dist/tracker/state.js +241 -264
- package/dist/tracker/state.js.map +1 -1
- package/dist/tracker.d.ts +4 -4
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +24 -22
- package/dist/tracker.js.map +1 -1
- package/dist/types/calldata.d.ts +4 -6
- package/dist/types/calldata.d.ts.map +1 -1
- package/dist/types/core.d.ts +36 -34
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +33 -0
- package/dist/types/core.js.map +1 -1
- package/dist/types/cross-chain.d.ts +5 -61
- package/dist/types/cross-chain.d.ts.map +1 -1
- package/dist/types/election.d.ts +3 -6
- package/dist/types/election.d.ts.map +1 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/simulation.d.ts +5 -7
- package/dist/types/simulation.d.ts.map +1 -1
- package/dist/types/stages.d.ts +50 -32
- package/dist/types/stages.d.ts.map +1 -1
- package/dist/types/stages.js +10 -1
- package/dist/types/stages.js.map +1 -1
- package/dist/types/tracking.d.ts +3 -30
- package/dist/types/tracking.d.ts.map +1 -1
- package/dist/utils/chain.d.ts +7 -3
- package/dist/utils/chain.d.ts.map +1 -1
- package/dist/utils/chain.js +13 -9
- package/dist/utils/chain.js.map +1 -1
- package/dist/utils/logger.d.ts +9 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +53 -19
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/rpc-utils.d.ts +7 -8
- package/dist/utils/rpc-utils.d.ts.map +1 -1
- package/dist/utils/rpc-utils.js +20 -2
- package/dist/utils/rpc-utils.js.map +1 -1
- package/dist/utils/salt-computation.d.ts.map +1 -1
- package/dist/utils/salt-computation.js +2 -3
- package/dist/utils/salt-computation.js.map +1 -1
- package/dist/utils/stage-metadata.d.ts +2 -2
- package/dist/utils/stage-metadata.d.ts.map +1 -1
- package/dist/utils/stage-metadata.js +5 -5
- package/dist/utils/stage-metadata.js.map +1 -1
- package/package.json +9 -5
- package/dist/calldata/address-utils.d.ts +0 -23
- package/dist/calldata/address-utils.d.ts.map +0 -1
- package/dist/calldata/address-utils.js +0 -84
- package/dist/calldata/address-utils.js.map +0 -1
- package/dist/calldata/extraction.d.ts +0 -17
- package/dist/calldata/extraction.d.ts.map +0 -1
- package/dist/calldata/extraction.js +0 -56
- package/dist/calldata/extraction.js.map +0 -1
- package/dist/stages/base.d.ts.map +0 -1
- package/dist/stages/base.js.map +0 -1
- package/dist/stages/stage-builder.d.ts.map +0 -1
- package/dist/stages/stage-builder.js.map +0 -1
- package/dist/tracker/context.d.ts +0 -111
- package/dist/tracker/context.d.ts.map +0 -1
- package/dist/tracker/context.js +0 -264
- package/dist/tracker/context.js.map +0 -1
- package/dist/tracker/index.d.ts +0 -18
- package/dist/tracker/index.d.ts.map +0 -1
- package/dist/tracker/index.js +0 -70
- package/dist/tracker/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -22
- package/dist/types.js.map +0 -1
- package/dist/utils/error-classification.d.ts +0 -13
- package/dist/utils/error-classification.d.ts.map +0 -1
- package/dist/utils/error-classification.js +0 -28
- package/dist/utils/error-classification.js.map +0 -1
- package/dist/utils/scoped-logger.d.ts +0 -43
- package/dist/utils/scoped-logger.d.ts.map +0 -1
- package/dist/utils/scoped-logger.js +0 -72
- package/dist/utils/scoped-logger.js.map +0 -1
- package/dist/utils/stage-helpers.d.ts +0 -51
- package/dist/utils/stage-helpers.d.ts.map +0 -1
- package/dist/utils/stage-helpers.js +0 -143
- package/dist/utils/stage-helpers.js.map +0 -1
- package/dist/utils/urls.d.ts +0 -28
- package/dist/utils/urls.d.ts.map +0 -1
- package/dist/utils/urls.js +0 -71
- package/dist/utils/urls.js.map +0 -1
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache utilities for tracker state
|
|
4
|
+
*
|
|
5
|
+
* Provides cache implementations and utility functions.
|
|
6
|
+
* All other state management is handled directly in tracker.ts.
|
|
7
|
+
*
|
|
8
|
+
* Available cache adapters:
|
|
9
|
+
* - FileCache: File-based persistence (Node.js only)
|
|
10
|
+
* - LocalStorageCache: Browser localStorage (web only)
|
|
11
|
+
* - MemoryCache: In-memory, no persistence (universal)
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.MemoryCache = exports.LocalStorageCache = exports.FileCache = void 0;
|
|
48
|
+
exports.txHashCacheKey = txHashCacheKey;
|
|
49
|
+
exports.readCacheStatus = readCacheStatus;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const discovery_1 = require("./discovery");
|
|
52
|
+
/**
|
|
53
|
+
* File-based cache that persists to JSON file.
|
|
54
|
+
* Synchronously loads on construction, persists on every write.
|
|
55
|
+
* Uses a write queue to prevent race conditions from concurrent writes.
|
|
56
|
+
*/
|
|
57
|
+
class FileCache {
|
|
58
|
+
constructor(path) {
|
|
59
|
+
this.writeQueue = Promise.resolve();
|
|
60
|
+
this.path = path;
|
|
61
|
+
this.cache = this.load();
|
|
62
|
+
}
|
|
63
|
+
load() {
|
|
64
|
+
try {
|
|
65
|
+
const data = JSON.parse(fs.readFileSync(this.path, "utf8"));
|
|
66
|
+
return new Map(Object.entries(data));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return new Map();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
persistSync() {
|
|
73
|
+
const obj = Object.fromEntries(this.cache);
|
|
74
|
+
fs.writeFileSync(this.path, JSON.stringify(obj, null, 2));
|
|
75
|
+
}
|
|
76
|
+
async persist() {
|
|
77
|
+
// Chain writes to prevent race conditions
|
|
78
|
+
// Create the write promise that may reject on error
|
|
79
|
+
const writePromise = this.writeQueue.then(() => {
|
|
80
|
+
this.persistSync();
|
|
81
|
+
});
|
|
82
|
+
// Update the queue with error recovery to prevent getting stuck
|
|
83
|
+
// This ensures future writes can proceed even if this one fails
|
|
84
|
+
this.writeQueue = writePromise.catch(() => {
|
|
85
|
+
// Silently recover the queue - error is propagated via writePromise
|
|
86
|
+
});
|
|
87
|
+
// Return the original promise so errors propagate to caller
|
|
88
|
+
return writePromise;
|
|
89
|
+
}
|
|
90
|
+
async get(key) {
|
|
91
|
+
return this.cache.get(key) ?? null;
|
|
92
|
+
}
|
|
93
|
+
async set(key, value) {
|
|
94
|
+
this.cache.set(key, value);
|
|
95
|
+
await this.persist();
|
|
96
|
+
}
|
|
97
|
+
async delete(key) {
|
|
98
|
+
this.cache.delete(key);
|
|
99
|
+
await this.persist();
|
|
100
|
+
}
|
|
101
|
+
async clear() {
|
|
102
|
+
this.cache.clear();
|
|
103
|
+
await this.persist();
|
|
104
|
+
}
|
|
105
|
+
async has(key) {
|
|
106
|
+
return this.cache.has(key);
|
|
107
|
+
}
|
|
108
|
+
keys() {
|
|
109
|
+
return this.cache.keys();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.FileCache = FileCache;
|
|
113
|
+
/**
|
|
114
|
+
* Get localStorage if available (browser environment)
|
|
115
|
+
*/
|
|
116
|
+
function getLocalStorage() {
|
|
117
|
+
// Check for browser environment with localStorage
|
|
118
|
+
if (typeof globalThis !== "undefined") {
|
|
119
|
+
const global = globalThis;
|
|
120
|
+
if (typeof global.localStorage !== "undefined") {
|
|
121
|
+
return global.localStorage;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Browser localStorage-based cache adapter.
|
|
128
|
+
* Persists to localStorage with a configurable key prefix.
|
|
129
|
+
*
|
|
130
|
+
* Limitations:
|
|
131
|
+
* - 5MB storage limit (varies by browser)
|
|
132
|
+
* - Synchronous API (blocks main thread, usually negligible)
|
|
133
|
+
* - String-only storage (JSON serialization handled internally)
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* import { createTracker, LocalStorageCache } from "@gzeoneth/gov-tracker";
|
|
138
|
+
*
|
|
139
|
+
* const tracker = createTracker({
|
|
140
|
+
* l2Provider,
|
|
141
|
+
* l1Provider,
|
|
142
|
+
* cache: new LocalStorageCache("arb-gov:"),
|
|
143
|
+
* });
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
class LocalStorageCache {
|
|
147
|
+
constructor(prefix = "tracker:") {
|
|
148
|
+
this.prefix = prefix;
|
|
149
|
+
}
|
|
150
|
+
fullKey(key) {
|
|
151
|
+
return `${this.prefix}${key}`;
|
|
152
|
+
}
|
|
153
|
+
async get(key) {
|
|
154
|
+
const storage = getLocalStorage();
|
|
155
|
+
if (!storage)
|
|
156
|
+
return null;
|
|
157
|
+
const data = storage.getItem(this.fullKey(key));
|
|
158
|
+
if (data === null)
|
|
159
|
+
return null;
|
|
160
|
+
try {
|
|
161
|
+
return JSON.parse(data);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async set(key, value) {
|
|
168
|
+
const storage = getLocalStorage();
|
|
169
|
+
if (!storage)
|
|
170
|
+
return;
|
|
171
|
+
storage.setItem(this.fullKey(key), JSON.stringify(value));
|
|
172
|
+
}
|
|
173
|
+
async delete(key) {
|
|
174
|
+
const storage = getLocalStorage();
|
|
175
|
+
if (!storage)
|
|
176
|
+
return;
|
|
177
|
+
storage.removeItem(this.fullKey(key));
|
|
178
|
+
}
|
|
179
|
+
async clear() {
|
|
180
|
+
const storage = getLocalStorage();
|
|
181
|
+
if (!storage)
|
|
182
|
+
return;
|
|
183
|
+
const keysToRemove = [];
|
|
184
|
+
for (let i = 0; i < storage.length; i++) {
|
|
185
|
+
const key = storage.key(i);
|
|
186
|
+
if (key?.startsWith(this.prefix)) {
|
|
187
|
+
keysToRemove.push(key);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
191
|
+
}
|
|
192
|
+
async has(key) {
|
|
193
|
+
const storage = getLocalStorage();
|
|
194
|
+
if (!storage)
|
|
195
|
+
return false;
|
|
196
|
+
return storage.getItem(this.fullKey(key)) !== null;
|
|
197
|
+
}
|
|
198
|
+
async keys(prefix) {
|
|
199
|
+
const storage = getLocalStorage();
|
|
200
|
+
if (!storage)
|
|
201
|
+
return [];
|
|
202
|
+
const result = [];
|
|
203
|
+
for (let i = 0; i < storage.length; i++) {
|
|
204
|
+
const fullKey = storage.key(i);
|
|
205
|
+
if (fullKey?.startsWith(this.prefix)) {
|
|
206
|
+
const key = fullKey.slice(this.prefix.length);
|
|
207
|
+
if (!prefix || key.startsWith(prefix)) {
|
|
208
|
+
result.push(key);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.LocalStorageCache = LocalStorageCache;
|
|
216
|
+
/**
|
|
217
|
+
* In-memory cache adapter with no persistence.
|
|
218
|
+
* Useful for testing, short-lived sessions, or as a fallback.
|
|
219
|
+
*
|
|
220
|
+
* Data is lost when the page is refreshed or the process exits.
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* import { createTracker, MemoryCache } from "@gzeoneth/gov-tracker";
|
|
225
|
+
*
|
|
226
|
+
* const tracker = createTracker({
|
|
227
|
+
* l2Provider,
|
|
228
|
+
* l1Provider,
|
|
229
|
+
* cache: new MemoryCache(),
|
|
230
|
+
* });
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
class MemoryCache {
|
|
234
|
+
constructor() {
|
|
235
|
+
this.cache = new Map();
|
|
236
|
+
}
|
|
237
|
+
async get(key) {
|
|
238
|
+
return this.cache.get(key) ?? null;
|
|
239
|
+
}
|
|
240
|
+
async set(key, value) {
|
|
241
|
+
this.cache.set(key, value);
|
|
242
|
+
}
|
|
243
|
+
async delete(key) {
|
|
244
|
+
this.cache.delete(key);
|
|
245
|
+
}
|
|
246
|
+
async clear() {
|
|
247
|
+
this.cache.clear();
|
|
248
|
+
}
|
|
249
|
+
async has(key) {
|
|
250
|
+
return this.cache.has(key);
|
|
251
|
+
}
|
|
252
|
+
keys() {
|
|
253
|
+
return this.cache.keys();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.MemoryCache = MemoryCache;
|
|
257
|
+
/**
|
|
258
|
+
* Generate cache key from transaction hash (primary cache key format)
|
|
259
|
+
*/
|
|
260
|
+
function txHashCacheKey(txHash) {
|
|
261
|
+
return `tx:${txHash.toLowerCase()}`;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Read all cache data without requiring RPC providers.
|
|
265
|
+
* Use this for status/dashboard views that only need cached data.
|
|
266
|
+
*
|
|
267
|
+
* @param cachePath - Path to the cache file
|
|
268
|
+
*/
|
|
269
|
+
async function readCacheStatus(cachePath) {
|
|
270
|
+
const cache = new FileCache(cachePath);
|
|
271
|
+
// Load watermarks from discovery checkpoint (unified format)
|
|
272
|
+
const discoveryCheckpoint = await cache.get(discovery_1.WATERMARKS_KEY);
|
|
273
|
+
const watermarks = discoveryCheckpoint?.cachedData.discoveryWatermarks ?? {};
|
|
274
|
+
const checkpoints = new Map();
|
|
275
|
+
const allKeys = cache.keys();
|
|
276
|
+
const keys = Array.from(allKeys);
|
|
277
|
+
for (const key of keys) {
|
|
278
|
+
if (key.startsWith("tx:")) {
|
|
279
|
+
const checkpoint = await cache.get(key);
|
|
280
|
+
if (checkpoint) {
|
|
281
|
+
checkpoints.set(key, checkpoint);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { watermarks, checkpoints };
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/tracker/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/tracker/execute.js
CHANGED
|
@@ -13,7 +13,7 @@ const proposal_queued_1 = require("../stages/proposal-queued");
|
|
|
13
13
|
const timelock_1 = require("../stages/timelock");
|
|
14
14
|
const l2_to_l1_message_1 = require("../stages/l2-to-l1-message");
|
|
15
15
|
const retryables_1 = require("../stages/retryables");
|
|
16
|
-
const
|
|
16
|
+
const utils_1 = require("../stages/utils");
|
|
17
17
|
const logger_1 = require("../utils/logger");
|
|
18
18
|
const log = logger_1.loggers.execution;
|
|
19
19
|
/**
|
|
@@ -50,11 +50,11 @@ async function prepareTransaction(stage, context, options = {}) {
|
|
|
50
50
|
// Queue a proposal on the governor (calls governor.queue())
|
|
51
51
|
const queueData = (0, types_1.getStageData)(stage, "PROPOSAL_QUEUED");
|
|
52
52
|
if (!queueData) {
|
|
53
|
-
return (0,
|
|
53
|
+
return (0, utils_1.failPrepare)("Stage is not a PROPOSAL_QUEUED stage");
|
|
54
54
|
}
|
|
55
55
|
const { governorAddress, proposalId, targets, values, calldatas, description } = queueData;
|
|
56
56
|
if (!governorAddress || !proposalId || !targets || !values || !calldatas || !description) {
|
|
57
|
-
return (0,
|
|
57
|
+
return (0, utils_1.failPrepare)("Missing proposal queue params in stage data");
|
|
58
58
|
}
|
|
59
59
|
return (0, proposal_queued_1.prepareGovernorQueue)(governorAddress, proposalId, {
|
|
60
60
|
targets,
|
|
@@ -74,7 +74,7 @@ async function prepareTransaction(stage, context, options = {}) {
|
|
|
74
74
|
prepareCompleted: options.prepareCompleted,
|
|
75
75
|
});
|
|
76
76
|
if (results.length === 0) {
|
|
77
|
-
return (0,
|
|
77
|
+
return (0, utils_1.failPrepare)("No messages to prepare");
|
|
78
78
|
}
|
|
79
79
|
// Find first successful result
|
|
80
80
|
const successResult = results.find((r) => r.success);
|
|
@@ -100,17 +100,17 @@ async function prepareTransaction(stage, context, options = {}) {
|
|
|
100
100
|
const targetChain = retryableData?.targetChains?.[0];
|
|
101
101
|
// Validate target chain exists before selecting provider
|
|
102
102
|
if (!targetChain) {
|
|
103
|
-
return (0,
|
|
103
|
+
return (0, utils_1.failPrepare)("No target chain found in retryable stage data");
|
|
104
104
|
}
|
|
105
|
-
const targetProvider = targetChain === "
|
|
105
|
+
const targetProvider = targetChain === "nova" ? novaProvider : l2Provider;
|
|
106
106
|
if (!targetProvider) {
|
|
107
|
-
return (0,
|
|
107
|
+
return (0, utils_1.failPrepare)("Target chain provider not available");
|
|
108
108
|
}
|
|
109
109
|
const { total, results } = await (0, retryables_1.prepareRetryableStage)(stage, l1Provider, targetProvider, {
|
|
110
110
|
prepareCompleted: options.prepareCompleted,
|
|
111
111
|
});
|
|
112
112
|
if (results.length === 0) {
|
|
113
|
-
return (0,
|
|
113
|
+
return (0, utils_1.failPrepare)("No tickets to prepare");
|
|
114
114
|
}
|
|
115
115
|
// Find first successful result
|
|
116
116
|
const successResult = results.find((r) => r.success);
|
|
@@ -132,7 +132,7 @@ async function prepareTransaction(stage, context, options = {}) {
|
|
|
132
132
|
return results[0];
|
|
133
133
|
}
|
|
134
134
|
default:
|
|
135
|
-
return (0,
|
|
135
|
+
return (0, utils_1.failPrepare)(`Preparation not supported for stage type: ${stage.type}`);
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/tracker/execute.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAgDH,gDAgHC;AA9JD,mCAAgC;AAChC,oCAAqF;AACrF,+DAAiE;AACjE,iDAA0D;AAC1D,iEAAuE;AACvE,qDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/tracker/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,44 +4,15 @@
|
|
|
4
4
|
* Pure functions that track stages and return updated state.
|
|
5
5
|
* Each function reads from state, performs tracking, and returns new state.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
export declare function pipelineTrackProposalCreated(state: TrackingContext): Promise<{
|
|
9
|
-
state: TrackingContext;
|
|
10
|
-
found: boolean;
|
|
11
|
-
}>;
|
|
12
|
-
export declare function pipelineTrackVoting(state: TrackingContext): Promise<{
|
|
13
|
-
state: TrackingContext;
|
|
14
|
-
complete: boolean;
|
|
15
|
-
}>;
|
|
16
|
-
export declare function pipelineTrackProposalQueued(state: TrackingContext): Promise<{
|
|
17
|
-
state: TrackingContext;
|
|
18
|
-
queued: boolean;
|
|
19
|
-
}>;
|
|
20
|
-
export declare function pipelineTrackL2Timelock(state: TrackingContext): Promise<{
|
|
21
|
-
state: TrackingContext;
|
|
22
|
-
executed: boolean;
|
|
23
|
-
}>;
|
|
24
|
-
export declare function pipelineTrackL2ToL1Message(state: TrackingContext): Promise<{
|
|
25
|
-
state: TrackingContext;
|
|
26
|
-
executed: boolean;
|
|
27
|
-
needsL1: boolean;
|
|
28
|
-
}>;
|
|
29
|
-
export declare function pipelineTrackL1Timelock(state: TrackingContext): Promise<{
|
|
30
|
-
state: TrackingContext;
|
|
31
|
-
executed: boolean;
|
|
32
|
-
}>;
|
|
33
|
-
export declare function pipelineTrackRetryables(state: TrackingContext): Promise<{
|
|
34
|
-
state: TrackingContext;
|
|
35
|
-
redeemed: boolean;
|
|
36
|
-
}>;
|
|
7
|
+
import { TrackingState } from "./state";
|
|
37
8
|
/**
|
|
38
9
|
* Track full governor proposal pipeline.
|
|
39
10
|
* Returns final state after tracking all stages.
|
|
40
11
|
*/
|
|
41
|
-
export declare function trackGovernorPipeline(state:
|
|
12
|
+
export declare function trackGovernorPipeline(state: TrackingState): Promise<TrackingState>;
|
|
42
13
|
/**
|
|
43
14
|
* Track timelock pipeline (stages 4-7).
|
|
44
15
|
* Used by governor pipeline and direct timelock tracking.
|
|
45
16
|
*/
|
|
46
|
-
export declare function trackTimelockPipeline(state:
|
|
17
|
+
export declare function trackTimelockPipeline(state: TrackingState): Promise<TrackingState>;
|
|
47
18
|
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/tracker/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/tracker/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,aAAa,EAiBd,MAAM,SAAS,CAAC;AAuWjB;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBxF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BxF"}
|
package/dist/tracker/pipeline.js
CHANGED
|
@@ -6,18 +6,11 @@
|
|
|
6
6
|
* Each function reads from state, performs tracking, and returns new state.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.pipelineTrackProposalCreated = pipelineTrackProposalCreated;
|
|
10
|
-
exports.pipelineTrackVoting = pipelineTrackVoting;
|
|
11
|
-
exports.pipelineTrackProposalQueued = pipelineTrackProposalQueued;
|
|
12
|
-
exports.pipelineTrackL2Timelock = pipelineTrackL2Timelock;
|
|
13
|
-
exports.pipelineTrackL2ToL1Message = pipelineTrackL2ToL1Message;
|
|
14
|
-
exports.pipelineTrackL1Timelock = pipelineTrackL1Timelock;
|
|
15
|
-
exports.pipelineTrackRetryables = pipelineTrackRetryables;
|
|
16
9
|
exports.trackGovernorPipeline = trackGovernorPipeline;
|
|
17
10
|
exports.trackTimelockPipeline = trackTimelockPipeline;
|
|
18
11
|
const logger_1 = require("../utils/logger");
|
|
19
|
-
const
|
|
20
|
-
const
|
|
12
|
+
const state_1 = require("./state");
|
|
13
|
+
const utils_1 = require("../stages/utils");
|
|
21
14
|
const proposal_created_1 = require("../stages/proposal-created");
|
|
22
15
|
const voting_1 = require("../stages/voting");
|
|
23
16
|
const proposal_queued_1 = require("../stages/proposal-queued");
|
|
@@ -33,19 +26,22 @@ const { pipeline: log, tracker: logTracker } = logger_1.loggers;
|
|
|
33
26
|
// L1_TIMELOCK is the only L1 stage; RETRYABLE_EXECUTED runs on L2 (Arb1/Nova)
|
|
34
27
|
const L1_STAGES = new Set(["L1_TIMELOCK"]);
|
|
35
28
|
// Helper: create placeholder stage
|
|
36
|
-
const placeholder = (type, status, reason) =>
|
|
29
|
+
const placeholder = (type, status, reason) =>
|
|
30
|
+
// Assertion needed: placeholder stages have partial data that gets filled later
|
|
31
|
+
({
|
|
37
32
|
type,
|
|
38
33
|
status,
|
|
39
|
-
chain: L1_STAGES.has(type) ? "
|
|
34
|
+
chain: L1_STAGES.has(type) ? "ethereum" : "arb1",
|
|
35
|
+
chainId: L1_STAGES.has(type) ? 1 : 42161,
|
|
40
36
|
transactions: [],
|
|
41
37
|
data: { reason },
|
|
42
38
|
});
|
|
43
39
|
// Helper: track with cache check
|
|
44
40
|
async function withCache(state, stageType, key, onCached, onTrack) {
|
|
45
|
-
const cached = (0,
|
|
41
|
+
const cached = (0, state_1.getCompletedStage)(state, stageType);
|
|
46
42
|
if (cached) {
|
|
47
43
|
log("%s: using cached stage", stageType);
|
|
48
|
-
return { state: await (0,
|
|
44
|
+
return { state: await (0, state_1.addStage)(state, cached), [key]: onCached(cached) };
|
|
49
45
|
}
|
|
50
46
|
return onTrack();
|
|
51
47
|
}
|
|
@@ -53,7 +49,7 @@ async function withCache(state, stageType, key, onCached, onTrack) {
|
|
|
53
49
|
async function track(state, stageType, key, tracker) {
|
|
54
50
|
try {
|
|
55
51
|
const { stage, result } = await tracker();
|
|
56
|
-
return { state: await (0,
|
|
52
|
+
return { state: await (0, state_1.addStage)(state, stage), [key]: result };
|
|
57
53
|
}
|
|
58
54
|
catch (error) {
|
|
59
55
|
throw new Error(`Failed to track ${stageType}: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -61,11 +57,11 @@ async function track(state, stageType, key, tracker) {
|
|
|
61
57
|
}
|
|
62
58
|
// Governor Stages (1-3)
|
|
63
59
|
async function pipelineTrackProposalCreated(state) {
|
|
64
|
-
const governorAddress = (0,
|
|
65
|
-
const proposalId = (0,
|
|
60
|
+
const governorAddress = (0, state_1.getGovernorAddress)(state);
|
|
61
|
+
const proposalId = (0, state_1.getProposalId)(state);
|
|
66
62
|
if (!governorAddress || !proposalId)
|
|
67
63
|
return { state, found: false };
|
|
68
|
-
if ((0,
|
|
64
|
+
if ((0, state_1.getIsElection)(state))
|
|
69
65
|
return { state, found: false };
|
|
70
66
|
return withCache(state, "PROPOSAL_CREATED", "found", () => true, async () => {
|
|
71
67
|
log("PROPOSAL_CREATED: tracking");
|
|
@@ -79,9 +75,9 @@ async function pipelineTrackProposalCreated(state) {
|
|
|
79
75
|
});
|
|
80
76
|
}
|
|
81
77
|
async function pipelineTrackVoting(state) {
|
|
82
|
-
const governorAddress = (0,
|
|
83
|
-
const proposalId = (0,
|
|
84
|
-
const proposalData = (0,
|
|
78
|
+
const governorAddress = (0, state_1.getGovernorAddress)(state);
|
|
79
|
+
const proposalId = (0, state_1.getProposalId)(state);
|
|
80
|
+
const proposalData = (0, state_1.getProposalData)(state);
|
|
85
81
|
if (!governorAddress || !proposalId || !proposalData)
|
|
86
82
|
return { state, complete: false };
|
|
87
83
|
return withCache(state, "VOTING_ACTIVE", "complete", (c) => c.status === "COMPLETED", async () => {
|
|
@@ -93,9 +89,9 @@ async function pipelineTrackVoting(state) {
|
|
|
93
89
|
});
|
|
94
90
|
}
|
|
95
91
|
async function pipelineTrackProposalQueued(state) {
|
|
96
|
-
const governorAddress = (0,
|
|
97
|
-
const proposalId = (0,
|
|
98
|
-
const proposalData = (0,
|
|
92
|
+
const governorAddress = (0, state_1.getGovernorAddress)(state);
|
|
93
|
+
const proposalId = (0, state_1.getProposalId)(state);
|
|
94
|
+
const proposalData = (0, state_1.getProposalData)(state);
|
|
99
95
|
if (!governorAddress || !proposalId)
|
|
100
96
|
return { state, queued: false };
|
|
101
97
|
return withCache(state, "PROPOSAL_QUEUED", "queued", () => true, async () => {
|
|
@@ -103,7 +99,7 @@ async function pipelineTrackProposalQueued(state) {
|
|
|
103
99
|
return track(state, "PROPOSAL_QUEUED", "queued", async () => {
|
|
104
100
|
// Voting deadline is L1 block number - convert to L2 for searching
|
|
105
101
|
// Use bounds to speed up binary search: min=creation block, max=creation+7M (~20 days)
|
|
106
|
-
const votingDeadlineL1 = (0,
|
|
102
|
+
const votingDeadlineL1 = (0, state_1.getVotingEndBlock)(state);
|
|
107
103
|
let votingEndBlock;
|
|
108
104
|
if (votingDeadlineL1) {
|
|
109
105
|
const creationBlock = proposalData?.creationBlock ?? 0;
|
|
@@ -116,7 +112,8 @@ async function pipelineTrackProposalQueued(state) {
|
|
|
116
112
|
}
|
|
117
113
|
const r = await (0, proposal_queued_1.trackProposalQueued)(governorAddress, proposalId, state.providers.l2, proposalData?.creationBlock ?? 0, { votingEndBlock });
|
|
118
114
|
let stage = r.stage;
|
|
119
|
-
if (stage.status === "READY" && proposalData) {
|
|
115
|
+
if (stage.type === "PROPOSAL_QUEUED" && stage.status === "READY" && proposalData) {
|
|
116
|
+
// Enrich stage data with proposal info for READY state
|
|
120
117
|
stage = {
|
|
121
118
|
...stage,
|
|
122
119
|
data: {
|
|
@@ -134,16 +131,16 @@ async function pipelineTrackProposalQueued(state) {
|
|
|
134
131
|
}
|
|
135
132
|
// Timelock Stage (4)
|
|
136
133
|
async function pipelineTrackL2Timelock(state) {
|
|
137
|
-
const timelockAddress = (0,
|
|
138
|
-
const operationId = (0,
|
|
139
|
-
const firstCallScheduledData = (0,
|
|
134
|
+
const timelockAddress = (0, state_1.getTimelockAddress)(state);
|
|
135
|
+
const operationId = (0, state_1.getOperationId)(state);
|
|
136
|
+
const firstCallScheduledData = (0, state_1.getFirstCallScheduledData)(state);
|
|
140
137
|
if (!timelockAddress || !operationId || !firstCallScheduledData)
|
|
141
138
|
return { state, executed: false };
|
|
142
139
|
return withCache(state, "L2_TIMELOCK", "executed", (c) => c.status === "COMPLETED", async () => {
|
|
143
140
|
log("L2_TIMELOCK: tracking");
|
|
144
141
|
return track(state, "L2_TIMELOCK", "executed", async () => {
|
|
145
|
-
const r = await (0, timelock_1.trackL2Timelock)(timelockAddress, operationId, state.providers.l2, (0,
|
|
146
|
-
cachedExecutionTxHash: (0,
|
|
142
|
+
const r = await (0, timelock_1.trackL2Timelock)(timelockAddress, operationId, state.providers.l2, (0, state_1.getQueueBlockNumber)(state) ?? 0, firstCallScheduledData, {
|
|
143
|
+
cachedExecutionTxHash: (0, state_1.getL2ExecutionTxHash)(state),
|
|
147
144
|
allStages: state.stages,
|
|
148
145
|
});
|
|
149
146
|
return { stage: r.stage, result: r.executionTxHash !== null };
|
|
@@ -155,13 +152,13 @@ const L1_ROUNDTRIP_STAGES = ["L2_TO_L1_MESSAGE", "L1_TIMELOCK", "RETRYABLE_EXECU
|
|
|
155
152
|
async function addSkippedL1Stages(state) {
|
|
156
153
|
let s = state;
|
|
157
154
|
for (const type of L1_ROUNDTRIP_STAGES)
|
|
158
|
-
s = await (0,
|
|
155
|
+
s = await (0, state_1.addStage)(s, placeholder(type, "SKIPPED", "L2-only path"));
|
|
159
156
|
return s;
|
|
160
157
|
}
|
|
161
158
|
async function pipelineTrackL2ToL1Message(state) {
|
|
162
|
-
const l2ExecutionTxHash = (0,
|
|
163
|
-
const addressForPath = (0,
|
|
164
|
-
const needsL1 = addressForPath ? (0,
|
|
159
|
+
const l2ExecutionTxHash = (0, state_1.getL2ExecutionTxHash)(state);
|
|
160
|
+
const addressForPath = (0, state_1.getGovernorAddress)(state) ?? (0, state_1.getTimelockAddress)(state);
|
|
161
|
+
const needsL1 = addressForPath ? (0, utils_1.isConstitutional)(addressForPath) : true;
|
|
165
162
|
if (!needsL1) {
|
|
166
163
|
log("L2_TO_L1_MESSAGE: L2-only path, skipping L1 stages");
|
|
167
164
|
return { state: await addSkippedL1Stages(state), executed: false, needsL1: false };
|
|
@@ -169,14 +166,14 @@ async function pipelineTrackL2ToL1Message(state) {
|
|
|
169
166
|
if (!l2ExecutionTxHash)
|
|
170
167
|
return { state, executed: false, needsL1: true };
|
|
171
168
|
// Check completed cache
|
|
172
|
-
const cached = (0,
|
|
169
|
+
const cached = (0, state_1.getCompletedStage)(state, "L2_TO_L1_MESSAGE");
|
|
173
170
|
if (cached) {
|
|
174
171
|
log("L2_TO_L1_MESSAGE: using cached stage");
|
|
175
|
-
return { state: await (0,
|
|
172
|
+
return { state: await (0, state_1.addStage)(state, cached), executed: true, needsL1: true };
|
|
176
173
|
}
|
|
177
174
|
// Fast-path for pending (still in challenge period)
|
|
178
|
-
const pending = (0,
|
|
179
|
-
if (pending?.status === "PENDING") {
|
|
175
|
+
const pending = (0, state_1.getCachedStage)(state, "L2_TO_L1_MESSAGE");
|
|
176
|
+
if (pending?.type === "L2_TO_L1_MESSAGE" && pending.status === "PENDING") {
|
|
180
177
|
const firstExec = pending.data.firstExecutableBlock;
|
|
181
178
|
if (firstExec) {
|
|
182
179
|
const { blockNumber: currentL1Block, timestamp } = await (0, timing_2.getCurrentBlockInfo)(state.providers.l1);
|
|
@@ -191,7 +188,7 @@ async function pipelineTrackL2ToL1Message(state) {
|
|
|
191
188
|
delaySeconds: remainingSeconds,
|
|
192
189
|
},
|
|
193
190
|
};
|
|
194
|
-
return { state: await (0,
|
|
191
|
+
return { state: await (0, state_1.addStage)(state, updated), executed: false, needsL1: true };
|
|
195
192
|
}
|
|
196
193
|
}
|
|
197
194
|
}
|
|
@@ -209,8 +206,8 @@ async function pipelineTrackL1Timelock(state) {
|
|
|
209
206
|
log("L1_TIMELOCK: tracking");
|
|
210
207
|
return track(state, "L1_TIMELOCK", "executed", async () => {
|
|
211
208
|
const r = await (0, timelock_1.trackL1Timelock)(state.providers.l1, {
|
|
212
|
-
outboxExecutionTx: (0,
|
|
213
|
-
fromBlock: (0,
|
|
209
|
+
outboxExecutionTx: (0, state_1.getOutboxExecutionTx)(state),
|
|
210
|
+
fromBlock: (0, state_1.getFirstExecutableBlock)(state),
|
|
214
211
|
allStages: state.stages,
|
|
215
212
|
});
|
|
216
213
|
return { stage: r.stage, result: r.executionTxHash !== null };
|
|
@@ -219,7 +216,7 @@ async function pipelineTrackL1Timelock(state) {
|
|
|
219
216
|
}
|
|
220
217
|
// Retryable Stage (7)
|
|
221
218
|
async function pipelineTrackRetryables(state) {
|
|
222
|
-
const l1ExecutionTxHash = (0,
|
|
219
|
+
const l1ExecutionTxHash = (0, state_1.getL1ExecutionTxHash)(state);
|
|
223
220
|
if (!l1ExecutionTxHash)
|
|
224
221
|
return { state, redeemed: false };
|
|
225
222
|
return withCache(state, "RETRYABLE_EXECUTED", "redeemed", (c) => c.status === "COMPLETED", async () => {
|
|
@@ -237,7 +234,7 @@ async function pipelineTrackRetryables(state) {
|
|
|
237
234
|
async function addPlaceholders(state, types, reason) {
|
|
238
235
|
let s = state;
|
|
239
236
|
for (const type of types)
|
|
240
|
-
s = await (0,
|
|
237
|
+
s = await (0, state_1.addStage)(s, placeholder(type, "NOT_STARTED", reason));
|
|
241
238
|
return s;
|
|
242
239
|
}
|
|
243
240
|
const RETRYABLE_STAGES = ["RETRYABLE_EXECUTED"];
|