@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.
Files changed (203) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +201 -0
  3. package/dist/abis.d.ts +79 -0
  4. package/dist/abis.d.ts.map +1 -0
  5. package/dist/abis.js +159 -0
  6. package/dist/abis.js.map +1 -0
  7. package/dist/cli/lib/cli.d.ts +92 -0
  8. package/dist/cli/lib/cli.d.ts.map +1 -0
  9. package/dist/cli/lib/cli.js +562 -0
  10. package/dist/cli/lib/cli.js.map +1 -0
  11. package/dist/cli/lib/election-check.d.ts +46 -0
  12. package/dist/cli/lib/election-check.d.ts.map +1 -0
  13. package/dist/cli/lib/election-check.js +136 -0
  14. package/dist/cli/lib/election-check.js.map +1 -0
  15. package/dist/cli/lib/json-state.d.ts +100 -0
  16. package/dist/cli/lib/json-state.d.ts.map +1 -0
  17. package/dist/cli/lib/json-state.js +225 -0
  18. package/dist/cli/lib/json-state.js.map +1 -0
  19. package/dist/cli/monitor.d.ts +3 -0
  20. package/dist/cli/monitor.d.ts.map +1 -0
  21. package/dist/cli/monitor.js +442 -0
  22. package/dist/cli/monitor.js.map +1 -0
  23. package/dist/constants.d.ts +235 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +293 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/discovery/governor-discovery.d.ts +84 -0
  28. package/dist/discovery/governor-discovery.d.ts.map +1 -0
  29. package/dist/discovery/governor-discovery.js +310 -0
  30. package/dist/discovery/governor-discovery.js.map +1 -0
  31. package/dist/discovery/security-council.d.ts +68 -0
  32. package/dist/discovery/security-council.d.ts.map +1 -0
  33. package/dist/discovery/security-council.js +181 -0
  34. package/dist/discovery/security-council.js.map +1 -0
  35. package/dist/discovery/timelock-discovery.d.ts +99 -0
  36. package/dist/discovery/timelock-discovery.d.ts.map +1 -0
  37. package/dist/discovery/timelock-discovery.js +322 -0
  38. package/dist/discovery/timelock-discovery.js.map +1 -0
  39. package/dist/election.d.ts +172 -0
  40. package/dist/election.d.ts.map +1 -0
  41. package/dist/election.js +464 -0
  42. package/dist/election.js.map +1 -0
  43. package/dist/index.d.ts +56 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +164 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/stages/base.d.ts +127 -0
  48. package/dist/stages/base.d.ts.map +1 -0
  49. package/dist/stages/base.js +280 -0
  50. package/dist/stages/base.js.map +1 -0
  51. package/dist/stages/l2-to-l1-message.d.ts +108 -0
  52. package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
  53. package/dist/stages/l2-to-l1-message.js +422 -0
  54. package/dist/stages/l2-to-l1-message.js.map +1 -0
  55. package/dist/stages/proposal-created.d.ts +20 -0
  56. package/dist/stages/proposal-created.d.ts.map +1 -0
  57. package/dist/stages/proposal-created.js +62 -0
  58. package/dist/stages/proposal-created.js.map +1 -0
  59. package/dist/stages/proposal-queued.d.ts +39 -0
  60. package/dist/stages/proposal-queued.d.ts.map +1 -0
  61. package/dist/stages/proposal-queued.js +131 -0
  62. package/dist/stages/proposal-queued.js.map +1 -0
  63. package/dist/stages/retryables.d.ts +79 -0
  64. package/dist/stages/retryables.d.ts.map +1 -0
  65. package/dist/stages/retryables.js +307 -0
  66. package/dist/stages/retryables.js.map +1 -0
  67. package/dist/stages/stage-builder.d.ts +46 -0
  68. package/dist/stages/stage-builder.d.ts.map +1 -0
  69. package/dist/stages/stage-builder.js +87 -0
  70. package/dist/stages/stage-builder.js.map +1 -0
  71. package/dist/stages/timelock.d.ts +100 -0
  72. package/dist/stages/timelock.d.ts.map +1 -0
  73. package/dist/stages/timelock.js +552 -0
  74. package/dist/stages/timelock.js.map +1 -0
  75. package/dist/stages/voting.d.ts +18 -0
  76. package/dist/stages/voting.d.ts.map +1 -0
  77. package/dist/stages/voting.js +109 -0
  78. package/dist/stages/voting.js.map +1 -0
  79. package/dist/tracker/context.d.ts +111 -0
  80. package/dist/tracker/context.d.ts.map +1 -0
  81. package/dist/tracker/context.js +264 -0
  82. package/dist/tracker/context.js.map +1 -0
  83. package/dist/tracker/discovery.d.ts +89 -0
  84. package/dist/tracker/discovery.d.ts.map +1 -0
  85. package/dist/tracker/discovery.js +228 -0
  86. package/dist/tracker/discovery.js.map +1 -0
  87. package/dist/tracker/execute.d.ts +44 -0
  88. package/dist/tracker/execute.d.ts.map +1 -0
  89. package/dist/tracker/execute.js +126 -0
  90. package/dist/tracker/execute.js.map +1 -0
  91. package/dist/tracker/index.d.ts +18 -0
  92. package/dist/tracker/index.d.ts.map +1 -0
  93. package/dist/tracker/index.js +70 -0
  94. package/dist/tracker/index.js.map +1 -0
  95. package/dist/tracker/pipeline.d.ts +47 -0
  96. package/dist/tracker/pipeline.d.ts.map +1 -0
  97. package/dist/tracker/pipeline.js +299 -0
  98. package/dist/tracker/pipeline.js.map +1 -0
  99. package/dist/tracker/query.d.ts +45 -0
  100. package/dist/tracker/query.d.ts.map +1 -0
  101. package/dist/tracker/query.js +159 -0
  102. package/dist/tracker/query.js.map +1 -0
  103. package/dist/tracker/state.d.ts +104 -0
  104. package/dist/tracker/state.d.ts.map +1 -0
  105. package/dist/tracker/state.js +287 -0
  106. package/dist/tracker/state.js.map +1 -0
  107. package/dist/tracker.d.ts +261 -0
  108. package/dist/tracker.d.ts.map +1 -0
  109. package/dist/tracker.js +556 -0
  110. package/dist/tracker.js.map +1 -0
  111. package/dist/types/config.d.ts +81 -0
  112. package/dist/types/config.d.ts.map +1 -0
  113. package/dist/types/config.js +6 -0
  114. package/dist/types/config.js.map +1 -0
  115. package/dist/types/core.d.ts +51 -0
  116. package/dist/types/core.d.ts.map +1 -0
  117. package/dist/types/core.js +6 -0
  118. package/dist/types/core.js.map +1 -0
  119. package/dist/types/cross-chain.d.ts +80 -0
  120. package/dist/types/cross-chain.d.ts.map +1 -0
  121. package/dist/types/cross-chain.js +6 -0
  122. package/dist/types/cross-chain.js.map +1 -0
  123. package/dist/types/election.d.ts +59 -0
  124. package/dist/types/election.d.ts.map +1 -0
  125. package/dist/types/election.js +6 -0
  126. package/dist/types/election.js.map +1 -0
  127. package/dist/types/governor.d.ts +71 -0
  128. package/dist/types/governor.d.ts.map +1 -0
  129. package/dist/types/governor.js +6 -0
  130. package/dist/types/governor.js.map +1 -0
  131. package/dist/types/index.d.ts +22 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +21 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/types/stages.d.ts +189 -0
  136. package/dist/types/stages.d.ts.map +1 -0
  137. package/dist/types/stages.js +23 -0
  138. package/dist/types/stages.js.map +1 -0
  139. package/dist/types/timelock.d.ts +108 -0
  140. package/dist/types/timelock.d.ts.map +1 -0
  141. package/dist/types/timelock.js +6 -0
  142. package/dist/types/timelock.js.map +1 -0
  143. package/dist/types/tracking.d.ts +180 -0
  144. package/dist/types/tracking.d.ts.map +1 -0
  145. package/dist/types/tracking.js +6 -0
  146. package/dist/types/tracking.js.map +1 -0
  147. package/dist/types.d.ts +6 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +22 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/utils/chain.d.ts +18 -0
  152. package/dist/utils/chain.d.ts.map +1 -0
  153. package/dist/utils/chain.js +34 -0
  154. package/dist/utils/chain.js.map +1 -0
  155. package/dist/utils/log-filters.d.ts +67 -0
  156. package/dist/utils/log-filters.d.ts.map +1 -0
  157. package/dist/utils/log-filters.js +116 -0
  158. package/dist/utils/log-filters.js.map +1 -0
  159. package/dist/utils/log-search.d.ts +76 -0
  160. package/dist/utils/log-search.d.ts.map +1 -0
  161. package/dist/utils/log-search.js +142 -0
  162. package/dist/utils/log-search.js.map +1 -0
  163. package/dist/utils/logger.d.ts +41 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +50 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/dist/utils/operation-id.d.ts +48 -0
  168. package/dist/utils/operation-id.d.ts.map +1 -0
  169. package/dist/utils/operation-id.js +102 -0
  170. package/dist/utils/operation-id.js.map +1 -0
  171. package/dist/utils/rpc-utils.d.ts +30 -0
  172. package/dist/utils/rpc-utils.d.ts.map +1 -0
  173. package/dist/utils/rpc-utils.js +99 -0
  174. package/dist/utils/rpc-utils.js.map +1 -0
  175. package/dist/utils/salt-computation.d.ts +78 -0
  176. package/dist/utils/salt-computation.d.ts.map +1 -0
  177. package/dist/utils/salt-computation.js +132 -0
  178. package/dist/utils/salt-computation.js.map +1 -0
  179. package/dist/utils/salt-resolver.d.ts +63 -0
  180. package/dist/utils/salt-resolver.d.ts.map +1 -0
  181. package/dist/utils/salt-resolver.js +144 -0
  182. package/dist/utils/salt-resolver.js.map +1 -0
  183. package/dist/utils/scoped-logger.d.ts +43 -0
  184. package/dist/utils/scoped-logger.d.ts.map +1 -0
  185. package/dist/utils/scoped-logger.js +72 -0
  186. package/dist/utils/scoped-logger.js.map +1 -0
  187. package/dist/utils/stage-helpers.d.ts +51 -0
  188. package/dist/utils/stage-helpers.d.ts.map +1 -0
  189. package/dist/utils/stage-helpers.js +143 -0
  190. package/dist/utils/stage-helpers.js.map +1 -0
  191. package/dist/utils/stage-metadata.d.ts +62 -0
  192. package/dist/utils/stage-metadata.d.ts.map +1 -0
  193. package/dist/utils/stage-metadata.js +140 -0
  194. package/dist/utils/stage-metadata.js.map +1 -0
  195. package/dist/utils/timing.d.ts +115 -0
  196. package/dist/utils/timing.d.ts.map +1 -0
  197. package/dist/utils/timing.js +303 -0
  198. package/dist/utils/timing.js.map +1 -0
  199. package/dist/utils/urls.d.ts +20 -0
  200. package/dist/utils/urls.d.ts.map +1 -0
  201. package/dist/utils/urls.js +51 -0
  202. package/dist/utils/urls.js.map +1 -0
  203. 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"}