@gzeoneth/gov-tracker 0.2.1-beta.b2eeb41 → 0.2.1-beta.d575294

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 (184) hide show
  1. package/README.md +81 -2
  2. package/dist/abis.d.ts +3 -0
  3. package/dist/abis.d.ts.map +1 -1
  4. package/dist/abis.js +30 -2
  5. package/dist/abis.js.map +1 -1
  6. package/dist/cli/cli.js +265 -27
  7. package/dist/cli/cli.js.map +1 -1
  8. package/dist/cli/lib/cli.d.ts +48 -2
  9. package/dist/cli/lib/cli.d.ts.map +1 -1
  10. package/dist/cli/lib/cli.js +356 -63
  11. package/dist/cli/lib/cli.js.map +1 -1
  12. package/dist/cli/lib/json-state.d.ts +23 -0
  13. package/dist/cli/lib/json-state.d.ts.map +1 -1
  14. package/dist/cli/lib/json-state.js +51 -4
  15. package/dist/cli/lib/json-state.js.map +1 -1
  16. package/dist/constants.d.ts +39 -1
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +47 -2
  19. package/dist/constants.js.map +1 -1
  20. package/dist/data/bundled-cache.json +11061 -1460
  21. package/dist/deduplication.d.ts +132 -0
  22. package/dist/deduplication.d.ts.map +1 -0
  23. package/dist/deduplication.js +270 -0
  24. package/dist/deduplication.js.map +1 -0
  25. package/dist/discovery/governor-discovery.d.ts.map +1 -1
  26. package/dist/discovery/governor-discovery.js +50 -35
  27. package/dist/discovery/governor-discovery.js.map +1 -1
  28. package/dist/discovery/timelock-discovery.d.ts +15 -6
  29. package/dist/discovery/timelock-discovery.d.ts.map +1 -1
  30. package/dist/discovery/timelock-discovery.js +27 -11
  31. package/dist/discovery/timelock-discovery.js.map +1 -1
  32. package/dist/election/contracts.d.ts +8 -0
  33. package/dist/election/contracts.d.ts.map +1 -0
  34. package/dist/election/contracts.js +28 -0
  35. package/dist/election/contracts.js.map +1 -0
  36. package/dist/election/details.d.ts +15 -0
  37. package/dist/election/details.d.ts.map +1 -0
  38. package/dist/election/details.js +157 -0
  39. package/dist/election/details.js.map +1 -0
  40. package/dist/election/index.d.ts +11 -0
  41. package/dist/election/index.d.ts.map +1 -0
  42. package/dist/election/index.js +48 -0
  43. package/dist/election/index.js.map +1 -0
  44. package/dist/election/params.d.ts +13 -0
  45. package/dist/election/params.d.ts.map +1 -0
  46. package/dist/election/params.js +93 -0
  47. package/dist/election/params.js.map +1 -0
  48. package/dist/election/participants.d.ts +6 -0
  49. package/dist/election/participants.d.ts.map +1 -0
  50. package/dist/election/participants.js +104 -0
  51. package/dist/election/participants.js.map +1 -0
  52. package/dist/election/prepare.d.ts +10 -0
  53. package/dist/election/prepare.d.ts.map +1 -0
  54. package/dist/election/prepare.js +52 -0
  55. package/dist/election/prepare.js.map +1 -0
  56. package/dist/election/proposal-ids.d.ts +18 -0
  57. package/dist/election/proposal-ids.d.ts.map +1 -0
  58. package/dist/election/proposal-ids.js +77 -0
  59. package/dist/election/proposal-ids.js.map +1 -0
  60. package/dist/election/status.d.ts +15 -0
  61. package/dist/election/status.d.ts.map +1 -0
  62. package/dist/election/status.js +102 -0
  63. package/dist/election/status.js.map +1 -0
  64. package/dist/election/tracking.d.ts +28 -0
  65. package/dist/election/tracking.d.ts.map +1 -0
  66. package/dist/election/tracking.js +412 -0
  67. package/dist/election/tracking.js.map +1 -0
  68. package/dist/index.d.ts +9 -5
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +72 -8
  71. package/dist/index.js.map +1 -1
  72. package/dist/stages/builder.d.ts +4 -0
  73. package/dist/stages/builder.d.ts.map +1 -1
  74. package/dist/stages/builder.js +7 -0
  75. package/dist/stages/builder.js.map +1 -1
  76. package/dist/stages/l2-to-l1-message.d.ts +3 -1
  77. package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
  78. package/dist/stages/l2-to-l1-message.js +6 -6
  79. package/dist/stages/l2-to-l1-message.js.map +1 -1
  80. package/dist/stages/proposal-created.d.ts +1 -0
  81. package/dist/stages/proposal-created.d.ts.map +1 -1
  82. package/dist/stages/proposal-created.js +1 -0
  83. package/dist/stages/proposal-created.js.map +1 -1
  84. package/dist/stages/proposal-queued.d.ts +1 -0
  85. package/dist/stages/proposal-queued.d.ts.map +1 -1
  86. package/dist/stages/proposal-queued.js +3 -1
  87. package/dist/stages/proposal-queued.js.map +1 -1
  88. package/dist/stages/retryables.js +2 -2
  89. package/dist/stages/retryables.js.map +1 -1
  90. package/dist/stages/timelock.d.ts +3 -1
  91. package/dist/stages/timelock.d.ts.map +1 -1
  92. package/dist/stages/timelock.js +12 -12
  93. package/dist/stages/timelock.js.map +1 -1
  94. package/dist/stages/utils.d.ts +5 -9
  95. package/dist/stages/utils.d.ts.map +1 -1
  96. package/dist/stages/utils.js +34 -29
  97. package/dist/stages/utils.js.map +1 -1
  98. package/dist/stages/voting.d.ts.map +1 -1
  99. package/dist/stages/voting.js +5 -4
  100. package/dist/stages/voting.js.map +1 -1
  101. package/dist/tracker/cache.d.ts +10 -6
  102. package/dist/tracker/cache.d.ts.map +1 -1
  103. package/dist/tracker/cache.js +36 -13
  104. package/dist/tracker/cache.js.map +1 -1
  105. package/dist/tracker/checkpoint-helpers.d.ts +81 -0
  106. package/dist/tracker/checkpoint-helpers.d.ts.map +1 -0
  107. package/dist/tracker/checkpoint-helpers.js +201 -0
  108. package/dist/tracker/checkpoint-helpers.js.map +1 -0
  109. package/dist/tracker/discovery.d.ts +40 -9
  110. package/dist/tracker/discovery.d.ts.map +1 -1
  111. package/dist/tracker/discovery.js +152 -15
  112. package/dist/tracker/discovery.js.map +1 -1
  113. package/dist/tracker/execute.d.ts.map +1 -1
  114. package/dist/tracker/execute.js +1 -25
  115. package/dist/tracker/execute.js.map +1 -1
  116. package/dist/tracker/pipeline.d.ts.map +1 -1
  117. package/dist/tracker/pipeline.js +26 -11
  118. package/dist/tracker/pipeline.js.map +1 -1
  119. package/dist/tracker/query.d.ts +1 -0
  120. package/dist/tracker/query.d.ts.map +1 -1
  121. package/dist/tracker/query.js +14 -61
  122. package/dist/tracker/query.js.map +1 -1
  123. package/dist/tracker/state.d.ts +0 -10
  124. package/dist/tracker/state.d.ts.map +1 -1
  125. package/dist/tracker/state.js +1 -28
  126. package/dist/tracker/state.js.map +1 -1
  127. package/dist/tracker.d.ts +100 -8
  128. package/dist/tracker.d.ts.map +1 -1
  129. package/dist/tracker.js +405 -42
  130. package/dist/tracker.js.map +1 -1
  131. package/dist/types/config.d.ts +49 -0
  132. package/dist/types/config.d.ts.map +1 -1
  133. package/dist/types/core.d.ts +4 -2
  134. package/dist/types/core.d.ts.map +1 -1
  135. package/dist/types/election.d.ts +143 -0
  136. package/dist/types/election.d.ts.map +1 -1
  137. package/dist/types/index.d.ts +5 -7
  138. package/dist/types/index.d.ts.map +1 -1
  139. package/dist/types/index.js +2 -3
  140. package/dist/types/index.js.map +1 -1
  141. package/dist/types/stages.d.ts +72 -7
  142. package/dist/types/stages.d.ts.map +1 -1
  143. package/dist/types/stages.js.map +1 -1
  144. package/dist/types/tracking.d.ts +34 -8
  145. package/dist/types/tracking.d.ts.map +1 -1
  146. package/dist/utils/block-cache.d.ts +50 -0
  147. package/dist/utils/block-cache.d.ts.map +1 -0
  148. package/dist/utils/block-cache.js +80 -0
  149. package/dist/utils/block-cache.js.map +1 -0
  150. package/dist/utils/formatters.d.ts +91 -0
  151. package/dist/utils/formatters.d.ts.map +1 -0
  152. package/dist/utils/formatters.js +327 -0
  153. package/dist/utils/formatters.js.map +1 -0
  154. package/dist/utils/multicall.d.ts +52 -0
  155. package/dist/utils/multicall.d.ts.map +1 -0
  156. package/dist/utils/multicall.js +75 -0
  157. package/dist/utils/multicall.js.map +1 -0
  158. package/dist/utils/rpc-utils.d.ts +7 -1
  159. package/dist/utils/rpc-utils.d.ts.map +1 -1
  160. package/dist/utils/rpc-utils.js +42 -29
  161. package/dist/utils/rpc-utils.js.map +1 -1
  162. package/dist/utils/salt-computation.d.ts.map +1 -1
  163. package/dist/utils/salt-computation.js +33 -7
  164. package/dist/utils/salt-computation.js.map +1 -1
  165. package/dist/utils/sanitize.d.ts.map +1 -1
  166. package/dist/utils/sanitize.js +3 -0
  167. package/dist/utils/sanitize.js.map +1 -1
  168. package/dist/utils/stage-metadata.d.ts +0 -20
  169. package/dist/utils/stage-metadata.d.ts.map +1 -1
  170. package/dist/utils/stage-metadata.js +29 -44
  171. package/dist/utils/stage-metadata.js.map +1 -1
  172. package/dist/utils/timing.d.ts +13 -0
  173. package/dist/utils/timing.d.ts.map +1 -1
  174. package/dist/utils/timing.js +37 -1
  175. package/dist/utils/timing.js.map +1 -1
  176. package/package.json +3 -2
  177. package/dist/election.d.ts +0 -172
  178. package/dist/election.d.ts.map +0 -1
  179. package/dist/election.js +0 -467
  180. package/dist/election.js.map +0 -1
  181. package/dist/types/cross-chain.d.ts +0 -24
  182. package/dist/types/cross-chain.d.ts.map +0 -1
  183. package/dist/types/cross-chain.js +0 -6
  184. package/dist/types/cross-chain.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getContenders = getContenders;
4
+ exports.getNomineesWithVotes = getNomineesWithVotes;
5
+ exports.getExcludedNominees = getExcludedNominees;
6
+ const ethers_1 = require("ethers");
7
+ const constants_1 = require("../constants");
8
+ const rpc_utils_1 = require("../utils/rpc-utils");
9
+ const abis_1 = require("../abis");
10
+ const logger_1 = require("../utils/logger");
11
+ const multicall_1 = require("../utils/multicall");
12
+ const contracts_1 = require("./contracts");
13
+ const log = logger_1.loggers.election;
14
+ async function getContenders(proposalId, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
15
+ log("getContenders for proposal %s", proposalId);
16
+ const governor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress, provider);
17
+ const iface = abis_1.nomineeElectionGovernorInterface;
18
+ const { fromBlock, toBlock } = await (0, contracts_1.getLogQueryBlockRange)(governor, proposalId, provider);
19
+ const logs = await (0, rpc_utils_1.queryWithRetry)(() => provider.getLogs({
20
+ address: nomineeGovernorAddress,
21
+ topics: [
22
+ iface.getEventTopic("ContenderAdded"),
23
+ ethers_1.ethers.utils.hexZeroPad(ethers_1.BigNumber.from(proposalId).toHexString(), 32),
24
+ ],
25
+ fromBlock,
26
+ toBlock,
27
+ }));
28
+ const contenders = logs.flatMap((eventLog) => {
29
+ try {
30
+ const parsed = iface.parseLog(eventLog);
31
+ return [
32
+ {
33
+ address: parsed.args.contender.toLowerCase(),
34
+ registeredAtBlock: eventLog.blockNumber,
35
+ registrationTxHash: eventLog.transactionHash,
36
+ },
37
+ ];
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ });
43
+ log("Found %d contenders for proposal %s", contenders.length, proposalId);
44
+ return contenders;
45
+ }
46
+ async function getNomineesWithVotes(proposalId, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
47
+ log("getNomineesWithVotes for proposal %s", proposalId);
48
+ const governor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress, provider);
49
+ const nomineeAddresses = await (0, rpc_utils_1.queryWithRetry)(() => governor.nominees(proposalId));
50
+ if (nomineeAddresses.length === 0) {
51
+ return [];
52
+ }
53
+ const calls = nomineeAddresses.flatMap((addr) => [
54
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "votesReceived", [proposalId, addr]),
55
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "isExcluded", [proposalId, addr]),
56
+ ]);
57
+ const results = await (0, multicall_1.multicall)(provider, calls);
58
+ const nominees = nomineeAddresses.map((addr, i) => ({
59
+ address: addr.toLowerCase(),
60
+ votesReceived: results[i * 2] ?? ethers_1.BigNumber.from(0),
61
+ isExcluded: results[i * 2 + 1] ?? false,
62
+ }));
63
+ log("Found %d nominees for proposal %s", nominees.length, proposalId);
64
+ return nominees;
65
+ }
66
+ async function getExcludedNominees(proposalId, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
67
+ log("getExcludedNominees for proposal %s", proposalId);
68
+ const governor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress, provider);
69
+ const iface = abis_1.nomineeElectionGovernorInterface;
70
+ const { fromBlock, toBlock } = await (0, contracts_1.getLogQueryBlockRange)(governor, proposalId, provider, 0);
71
+ const logs = await (0, rpc_utils_1.queryWithRetry)(() => provider.getLogs({
72
+ address: nomineeGovernorAddress,
73
+ topics: [
74
+ iface.getEventTopic("NomineeExcluded"),
75
+ ethers_1.ethers.utils.hexZeroPad(ethers_1.BigNumber.from(proposalId).toHexString(), 32),
76
+ ],
77
+ fromBlock,
78
+ toBlock,
79
+ }));
80
+ const parsedLogs = logs.flatMap((eventLog) => {
81
+ try {
82
+ const parsed = iface.parseLog(eventLog);
83
+ return [{ eventLog, nominee: parsed.args.nominee }];
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ });
89
+ if (parsedLogs.length === 0) {
90
+ return [];
91
+ }
92
+ const calls = parsedLogs.map(({ nominee }) => (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "votesReceived", [proposalId, nominee]));
93
+ const results = await (0, multicall_1.multicall)(provider, calls);
94
+ const excluded = parsedLogs.map(({ eventLog, nominee }, i) => ({
95
+ address: nominee.toLowerCase(),
96
+ votesReceived: results[i] ?? ethers_1.BigNumber.from(0),
97
+ isExcluded: true,
98
+ excludedAtBlock: eventLog.blockNumber,
99
+ exclusionTxHash: eventLog.transactionHash,
100
+ }));
101
+ log("Found %d excluded nominees for proposal %s", excluded.length, proposalId);
102
+ return excluded;
103
+ }
104
+ //# sourceMappingURL=participants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"participants.js","sourceRoot":"","sources":["../../src/election/participants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ethers } from "ethers";
2
+ import { ElectionProposalStatus, ElectionStatus, PreparedTransaction } from "../types";
3
+ export interface PreparedElectionCreation {
4
+ transaction: PreparedTransaction;
5
+ electionIndex: number;
6
+ }
7
+ export declare function prepareElectionCreation(electionStatus: Pick<ElectionStatus, "electionCount">, nomineeGovernorAddress?: string): PreparedElectionCreation;
8
+ export declare function prepareMemberElectionTrigger(electionStatus: Pick<ElectionProposalStatus, "electionIndex" | "canProceedToMemberPhase">, provider: ethers.providers.Provider, nomineeGovernorAddress?: string): Promise<PreparedTransaction | null>;
9
+ export declare function prepareMemberElectionExecution(electionStatus: Pick<ElectionProposalStatus, "electionIndex" | "canExecuteMember">, provider: ethers.providers.Provider, memberGovernorAddress?: string): Promise<PreparedTransaction | null>;
10
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/election/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAWvF,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,EACrD,sBAAsB,GAAE,MAA4C,GACnE,wBAAwB,CAe1B;AAED,wBAAsB,4BAA4B,CAChD,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,yBAAyB,CAAC,EACzF,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,sBAAsB,GAAE,MAA4C,GACnE,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAwBrC;AAED,wBAAsB,8BAA8B,CAClD,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,kBAAkB,CAAC,EAClF,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,qBAAqB,GAAE,MAA2C,GACjE,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAwBrC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareElectionCreation = prepareElectionCreation;
4
+ exports.prepareMemberElectionTrigger = prepareMemberElectionTrigger;
5
+ exports.prepareMemberElectionExecution = prepareMemberElectionExecution;
6
+ const constants_1 = require("../constants");
7
+ const logger_1 = require("../utils/logger");
8
+ const contracts_1 = require("./contracts");
9
+ const params_1 = require("./params");
10
+ const log = logger_1.loggers.election;
11
+ function prepareElectionCreation(electionStatus, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
12
+ const governor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress);
13
+ const calldata = governor.interface.encodeFunctionData("createElection", []);
14
+ return {
15
+ transaction: {
16
+ to: nomineeGovernorAddress,
17
+ data: calldata,
18
+ value: "0",
19
+ chain: "arb1",
20
+ chainId: 42161,
21
+ description: `createElection() on SecurityCouncilNomineeElectionGovernor for election #${electionStatus.electionCount}`,
22
+ },
23
+ electionIndex: electionStatus.electionCount,
24
+ };
25
+ }
26
+ async function prepareMemberElectionTrigger(electionStatus, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
27
+ log("prepareMemberElectionTrigger for election %d", electionStatus.electionIndex);
28
+ if (!electionStatus.canProceedToMemberPhase) {
29
+ log("Cannot proceed to member phase - not ready");
30
+ return null;
31
+ }
32
+ const params = await (0, params_1.getElectionProposalParams)(electionStatus.electionIndex, provider, nomineeGovernorAddress);
33
+ if (!params) {
34
+ log("Could not find proposal params for election %d", electionStatus.electionIndex);
35
+ return null;
36
+ }
37
+ return (0, params_1.buildExecuteTransaction)(params, nomineeGovernorAddress, `execute() on NomineeElectionGovernor to trigger member election #${electionStatus.electionIndex}`);
38
+ }
39
+ async function prepareMemberElectionExecution(electionStatus, provider, memberGovernorAddress = constants_1.ADDRESSES.ELECTION_MEMBER_GOVERNOR) {
40
+ log("prepareMemberElectionExecution for election %d", electionStatus.electionIndex);
41
+ if (!electionStatus.canExecuteMember) {
42
+ log("Cannot execute member election - not ready");
43
+ return null;
44
+ }
45
+ const params = await (0, params_1.getMemberElectionProposalParams)(electionStatus.electionIndex, provider, memberGovernorAddress);
46
+ if (!params) {
47
+ log("Could not find proposal params for member election %d", electionStatus.electionIndex);
48
+ return null;
49
+ }
50
+ return (0, params_1.buildExecuteTransaction)(params, memberGovernorAddress, `execute() on MemberElectionGovernor to install new Security Council members for election #${electionStatus.electionIndex}`);
51
+ }
52
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/election/prepare.ts"],"names":[],"mappings":";;AAkBA,0DAkBC;AAED,oEA4BC;AAED,wEA4BC;AA/FD,4CAAyC;AAEzC,4CAA0C;AAC1C,2CAAiD;AACjD,qCAIkB;AAElB,MAAM,GAAG,GAAG,gBAAO,CAAC,QAAQ,CAAC;AAO7B,SAAgB,uBAAuB,CACrC,cAAqD,EACrD,yBAAiC,qBAAS,CAAC,yBAAyB;IAEpE,MAAM,QAAQ,GAAG,IAAA,8BAAkB,EAAC,sBAAsB,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAE7E,OAAO;QACL,WAAW,EAAE;YACX,EAAE,EAAE,sBAAsB;YAC1B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,4EAA4E,cAAc,CAAC,aAAa,EAAE;SACxH;QACD,aAAa,EAAE,cAAc,CAAC,aAAa;KAC5C,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAChD,cAAyF,EACzF,QAAmC,EACnC,yBAAiC,qBAAS,CAAC,yBAAyB;IAEpE,GAAG,CAAC,8CAA8C,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IAElF,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;QAC5C,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAyB,EAC5C,cAAc,CAAC,aAAa,EAC5B,QAAQ,EACR,sBAAsB,CACvB,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,gDAAgD,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAA,gCAAuB,EAC5B,MAAM,EACN,sBAAsB,EACtB,oEAAoE,cAAc,CAAC,aAAa,EAAE,CACnG,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,8BAA8B,CAClD,cAAkF,EAClF,QAAmC,EACnC,wBAAgC,qBAAS,CAAC,wBAAwB;IAElE,GAAG,CAAC,gDAAgD,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IAEpF,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACrC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,wCAA+B,EAClD,cAAc,CAAC,aAAa,EAC5B,QAAQ,EACR,qBAAqB,CACtB,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,uDAAuD,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAA,gCAAuB,EAC5B,MAAM,EACN,qBAAqB,EACrB,6FAA6F,cAAc,CAAC,aAAa,EAAE,CAC5H,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ethers } from "ethers";
2
+ export interface ElectionProposalIds {
3
+ nomineeProposalId: string | null;
4
+ memberProposalId: string | null;
5
+ }
6
+ export interface GetElectionProposalIdsOptions {
7
+ nomineeGovernorAddress?: string;
8
+ memberGovernorAddress?: string;
9
+ blockNumber?: number;
10
+ skipCache?: boolean;
11
+ }
12
+ export declare function clearElectionProposalIdsCache(): void;
13
+ export declare function clearElectionCache(): void;
14
+ export declare function computeElectionProposalId(electionIndex: number, governor: ethers.Contract): Promise<string>;
15
+ export declare function getElectionProposalId(electionIndex: number, provider: ethers.providers.Provider, nomineeGovernorAddress?: string): Promise<string | null>;
16
+ export declare function getMemberElectionProposalId(electionIndex: number, provider: ethers.providers.Provider, memberGovernorAddress?: string): Promise<string>;
17
+ export declare function getElectionProposalIds(electionIndex: number, provider: ethers.providers.Provider, options?: GetElectionProposalIdsOptions): Promise<ElectionProposalIds>;
18
+ //# sourceMappingURL=proposal-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-ids.d.ts","sourceRoot":"","sources":["../../src/election/proposal-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAS3C,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,6BAA6B;IAC5C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAQD,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACxB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,sBAAsB,GAAE,MAA4C,GACnE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxB;AAED,wBAAsB,2BAA2B,CAC/C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,qBAAqB,GAAE,MAA2C,GACjE,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAuC9B"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearElectionProposalIdsCache = clearElectionProposalIdsCache;
4
+ exports.clearElectionCache = clearElectionCache;
5
+ exports.computeElectionProposalId = computeElectionProposalId;
6
+ exports.getElectionProposalId = getElectionProposalId;
7
+ exports.getMemberElectionProposalId = getMemberElectionProposalId;
8
+ exports.getElectionProposalIds = getElectionProposalIds;
9
+ const ethers_1 = require("ethers");
10
+ const constants_1 = require("../constants");
11
+ const rpc_utils_1 = require("../utils/rpc-utils");
12
+ const abis_1 = require("../abis");
13
+ const multicall_1 = require("../utils/multicall");
14
+ const salt_computation_1 = require("../utils/salt-computation");
15
+ const block_cache_1 = require("../utils/block-cache");
16
+ const contracts_1 = require("./contracts");
17
+ const electionProposalIdsCache = new block_cache_1.BlockScopedCache({
18
+ isImmutable: (result) => {
19
+ return result.nomineeProposalId === null || result.memberProposalId !== null;
20
+ },
21
+ });
22
+ function clearElectionProposalIdsCache() {
23
+ electionProposalIdsCache.clear();
24
+ }
25
+ function clearElectionCache() {
26
+ clearElectionProposalIdsCache();
27
+ }
28
+ async function computeElectionProposalId(electionIndex, governor) {
29
+ const proposeArgs = (await (0, rpc_utils_1.queryWithRetry)(() => governor.getProposeArgs(electionIndex)));
30
+ const [targets, values, calldatas, description] = proposeArgs;
31
+ const descriptionHash = (0, salt_computation_1.saltFromDescription)(description);
32
+ const proposalId = await (0, rpc_utils_1.queryWithRetry)(() => governor.hashProposal(targets, values, calldatas, descriptionHash));
33
+ return ethers_1.BigNumber.from(proposalId).toString();
34
+ }
35
+ async function getElectionProposalId(electionIndex, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
36
+ const governor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress, provider);
37
+ const proposalId = await computeElectionProposalId(electionIndex, governor);
38
+ try {
39
+ await (0, rpc_utils_1.queryWithRetry)(() => governor.state(proposalId));
40
+ return proposalId;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ async function getMemberElectionProposalId(electionIndex, provider, memberGovernorAddress = constants_1.ADDRESSES.ELECTION_MEMBER_GOVERNOR) {
47
+ const governor = (0, contracts_1.getMemberGovernor)(memberGovernorAddress, provider);
48
+ return computeElectionProposalId(electionIndex, governor);
49
+ }
50
+ async function getElectionProposalIds(electionIndex, provider, options = {}) {
51
+ const { nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR, memberGovernorAddress = constants_1.ADDRESSES.ELECTION_MEMBER_GOVERNOR, blockNumber, skipCache, } = options;
52
+ const cached = electionProposalIdsCache.get(electionIndex, blockNumber, { skipCache });
53
+ if (cached) {
54
+ return cached;
55
+ }
56
+ const nomineeGovernor = (0, contracts_1.getNomineeGovernor)(nomineeGovernorAddress, provider);
57
+ const memberGovernor = (0, contracts_1.getMemberGovernor)(memberGovernorAddress, provider);
58
+ const [nomineeProposalId, computedMemberProposalId] = await Promise.all([
59
+ computeElectionProposalId(electionIndex, nomineeGovernor),
60
+ computeElectionProposalId(electionIndex, memberGovernor),
61
+ ]);
62
+ const stateResults = await (0, multicall_1.multicall)(provider, [
63
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.governorInterface, "state", [nomineeProposalId]),
64
+ (0, multicall_1.buildCallInput)(memberGovernorAddress, abis_1.governorInterface, "state", [
65
+ computedMemberProposalId,
66
+ ]),
67
+ ]);
68
+ const nomineeStateResult = stateResults[0];
69
+ const memberStateResult = stateResults[1];
70
+ const result = {
71
+ nomineeProposalId: nomineeStateResult !== null ? nomineeProposalId : null,
72
+ memberProposalId: memberStateResult !== null ? computedMemberProposalId : null,
73
+ };
74
+ electionProposalIdsCache.set(electionIndex, result, blockNumber);
75
+ return result;
76
+ }
77
+ //# sourceMappingURL=proposal-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-ids.js","sourceRoot":"","sources":["../../src/election/proposal-ids.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { ethers } from "ethers";
2
+ import { ElectionPhase, ElectionStatus, ProposalState } from "../types";
3
+ /**
4
+ * Get the current election count without fetching full status.
5
+ * This is a lightweight call that only fetches the count (single multicall).
6
+ *
7
+ * @param l2Provider - Arbitrum One provider
8
+ * @param nomineeGovernorAddress - Optional custom nominee governor address
9
+ * @returns The number of elections that have been created
10
+ */
11
+ export declare function getElectionCount(l2Provider: ethers.providers.Provider, nomineeGovernorAddress?: string): Promise<number>;
12
+ export declare function determineElectionPhase(nomineeProposalState: ProposalState | null, memberProposalId: string | null, memberProposalState: ProposalState | null, isInVettingPeriod: boolean): ElectionPhase;
13
+ export declare function checkElectionStatus(l2Provider: ethers.providers.Provider, l1Provider: ethers.providers.Provider, nomineeGovernorAddress?: string): Promise<ElectionStatus>;
14
+ export declare function hasVettingPeriod(governorAddress: string, provider: ethers.providers.Provider): Promise<boolean>;
15
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/election/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAI3C,OAAO,EAAc,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASpF;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,sBAAsB,GAAE,MAA4C,GACnE,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,sBAAsB,CACpC,oBAAoB,EAAE,aAAa,GAAG,IAAI,EAC1C,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,mBAAmB,EAAE,aAAa,GAAG,IAAI,EACzC,iBAAiB,EAAE,OAAO,GACzB,aAAa,CAuBf;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,sBAAsB,GAAE,MAA4C,GACnE,OAAO,CAAC,cAAc,CAAC,CAkEzB;AAED,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC,OAAO,CAAC,CASlB"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getElectionCount = getElectionCount;
4
+ exports.determineElectionPhase = determineElectionPhase;
5
+ exports.checkElectionStatus = checkElectionStatus;
6
+ exports.hasVettingPeriod = hasVettingPeriod;
7
+ const constants_1 = require("../constants");
8
+ const formatters_1 = require("../utils/formatters");
9
+ const rpc_utils_1 = require("../utils/rpc-utils");
10
+ const timing_1 = require("../utils/timing");
11
+ const logger_1 = require("../utils/logger");
12
+ const abis_1 = require("../abis");
13
+ const contracts_1 = require("./contracts");
14
+ const multicall_1 = require("../utils/multicall");
15
+ const log = logger_1.loggers.election;
16
+ /**
17
+ * Get the current election count without fetching full status.
18
+ * This is a lightweight call that only fetches the count (single multicall).
19
+ *
20
+ * @param l2Provider - Arbitrum One provider
21
+ * @param nomineeGovernorAddress - Optional custom nominee governor address
22
+ * @returns The number of elections that have been created
23
+ */
24
+ async function getElectionCount(l2Provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
25
+ log("getElectionCount for %s", nomineeGovernorAddress);
26
+ const [electionCount] = await (0, multicall_1.multicall)(l2Provider, [
27
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "electionCount", []),
28
+ ]);
29
+ return electionCount.toNumber();
30
+ }
31
+ function determineElectionPhase(nomineeProposalState, memberProposalId, memberProposalState, isInVettingPeriod) {
32
+ if (memberProposalState === "Executed") {
33
+ return "COMPLETED";
34
+ }
35
+ if (memberProposalId) {
36
+ if (memberProposalState === "Succeeded" || memberProposalState === "Queued") {
37
+ return "PENDING_EXECUTION";
38
+ }
39
+ return "MEMBER_ELECTION";
40
+ }
41
+ if (nomineeProposalState === "Executed") {
42
+ return "PENDING_EXECUTION";
43
+ }
44
+ if (isInVettingPeriod) {
45
+ return "VETTING_PERIOD";
46
+ }
47
+ if (nomineeProposalState === "Active" || nomineeProposalState === "Pending") {
48
+ return "NOMINEE_SELECTION";
49
+ }
50
+ if (nomineeProposalState === "Succeeded") {
51
+ return "PENDING_EXECUTION";
52
+ }
53
+ return "NOT_STARTED";
54
+ }
55
+ async function checkElectionStatus(l2Provider, l1Provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
56
+ log("checkElectionStatus for %s", nomineeGovernorAddress);
57
+ const [l1BlockNumber, electionCountResult] = await Promise.all([
58
+ (0, timing_1.getL1BlockNumberFromL2)(l2Provider),
59
+ (0, multicall_1.multicall)(l2Provider, [
60
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "electionCount", []),
61
+ ]),
62
+ ]);
63
+ const electionCount = electionCountResult[0];
64
+ log("L1 block number from L2: %s", l1BlockNumber.toString());
65
+ const l1Block = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getBlock(l1BlockNumber.toNumber()));
66
+ if (!l1Block) {
67
+ throw new Error(`L1 block ${l1BlockNumber.toString()} not found. ` +
68
+ `If using a fork, ensure L1 is forked at a block >= ${l1BlockNumber.toString()}`);
69
+ }
70
+ const currentL1Timestamp = l1Block.timestamp;
71
+ log("L1 timestamp: %d", currentL1Timestamp);
72
+ const electionResults = await (0, multicall_1.multicall)(l2Provider, [
73
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "electionToTimestamp", [electionCount]),
74
+ (0, multicall_1.buildCallInput)(nomineeGovernorAddress, abis_1.nomineeElectionGovernorInterface, "electionIndexToCohort", [electionCount]),
75
+ ]);
76
+ const nextElectionTimestamp = electionResults[0];
77
+ const cohort = electionResults[1];
78
+ log("electionCount=%s nextTimestamp=%s cohort=%d", electionCount.toString(), nextElectionTimestamp.toString(), cohort);
79
+ const secondsUntilElection = Math.max(0, nextElectionTimestamp.toNumber() - currentL1Timestamp);
80
+ const canCreateElection = secondsUntilElection === 0;
81
+ const result = {
82
+ electionCount: electionCount.toNumber(),
83
+ cohort: cohort,
84
+ nextElectionTimestamp: nextElectionTimestamp.toNumber(),
85
+ currentL1Timestamp,
86
+ canCreateElection,
87
+ secondsUntilElection,
88
+ timeUntilElection: (0, formatters_1.formatDuration)(secondsUntilElection),
89
+ };
90
+ return result;
91
+ }
92
+ async function hasVettingPeriod(governorAddress, provider) {
93
+ const governor = (0, contracts_1.getNomineeGovernor)(governorAddress, provider);
94
+ try {
95
+ await (0, rpc_utils_1.queryWithRetry)(() => governor.nomineeVetter());
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/election/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ethers } from "ethers";
2
+ import { ElectionProposalStatus } from "../types";
3
+ export declare function trackElectionProposal(electionIndex: number, l2Provider: ethers.providers.Provider, l1Provider: ethers.providers.Provider, options?: {
4
+ nomineeGovernorAddress?: string;
5
+ memberGovernorAddress?: string;
6
+ novaProvider?: ethers.providers.Provider;
7
+ l2BlockNumber?: number;
8
+ timestamp?: number;
9
+ skipCache?: boolean;
10
+ }): Promise<ElectionProposalStatus>;
11
+ export declare function trackAllElections(l2Provider: ethers.providers.Provider, l1Provider: ethers.providers.Provider, options?: {
12
+ includeNext?: boolean;
13
+ novaProvider?: ethers.providers.Provider;
14
+ l2BlockNumber?: number;
15
+ timestamp?: number;
16
+ skipCache?: boolean;
17
+ }): Promise<ElectionProposalStatus[]>;
18
+ export declare function trackIncompleteElections(l2Provider: ethers.providers.Provider, l1Provider: ethers.providers.Provider, options?: {
19
+ novaProvider?: ethers.providers.Provider;
20
+ l2BlockNumber?: number;
21
+ timestamp?: number;
22
+ skipCache?: boolean;
23
+ }): Promise<ElectionProposalStatus[]>;
24
+ export declare function getElectionIndexForProposalId(proposalId: string, l2Provider: ethers.providers.Provider, l1Provider: ethers.providers.Provider, options?: {
25
+ novaProvider?: ethers.providers.Provider;
26
+ blockNumber?: number;
27
+ }): Promise<number | null>;
28
+ //# sourceMappingURL=tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/election/tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAG3C,OAAO,EAEL,sBAAsB,EAIvB,MAAM,UAAU,CAAC;AA0MlB,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC,sBAAsB,CAAC,CA4QjC;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA+CnC;AAED,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAQnC;AAED,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/E,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoCxB"}