@agoric/inter-protocol 0.16.2-other-dev-8f8782b.0 → 0.16.2-other-dev-fbe72e7.0.fbe72e7

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 (166) hide show
  1. package/README.md +6 -6
  2. package/package.json +46 -39
  3. package/scripts/build-bundles.js +5 -21
  4. package/src/auction/auctionBook.d.ts +147 -0
  5. package/src/auction/auctionBook.d.ts.map +1 -0
  6. package/src/auction/auctionBook.js +182 -151
  7. package/src/auction/auctionMath.d.ts +17 -0
  8. package/src/auction/auctionMath.d.ts.map +1 -0
  9. package/src/auction/auctionMath.js +81 -0
  10. package/src/auction/auctioneer.d.ts +70 -0
  11. package/src/auction/auctioneer.d.ts.map +1 -0
  12. package/src/auction/auctioneer.js +72 -59
  13. package/src/auction/offerBook.d.ts +46 -0
  14. package/src/auction/offerBook.d.ts.map +1 -0
  15. package/src/auction/offerBook.js +17 -12
  16. package/src/auction/params.d.ts +145 -0
  17. package/src/auction/params.d.ts.map +1 -0
  18. package/src/auction/params.js +11 -9
  19. package/src/auction/scheduleMath.d.ts +5 -0
  20. package/src/auction/scheduleMath.d.ts.map +1 -0
  21. package/src/auction/scheduleMath.js +18 -16
  22. package/src/auction/scheduler.d.ts +50 -0
  23. package/src/auction/scheduler.d.ts.map +1 -0
  24. package/src/auction/scheduler.js +53 -47
  25. package/src/auction/sortedOffers.d.ts +8 -0
  26. package/src/auction/sortedOffers.d.ts.map +1 -0
  27. package/src/auction/sortedOffers.js +10 -9
  28. package/src/auction/util.d.ts +31 -0
  29. package/src/auction/util.d.ts.map +1 -0
  30. package/src/auction/util.js +12 -6
  31. package/src/clientSupport.d.ts +168 -0
  32. package/src/clientSupport.d.ts.map +1 -0
  33. package/src/clientSupport.js +161 -98
  34. package/src/collectFees.d.ts +2 -0
  35. package/src/collectFees.d.ts.map +1 -0
  36. package/src/contractSupport.d.ts +28 -0
  37. package/src/contractSupport.d.ts.map +1 -0
  38. package/src/contractSupport.js +19 -13
  39. package/src/econCommitteeCharter.d.ts +43 -0
  40. package/src/econCommitteeCharter.d.ts.map +1 -0
  41. package/src/econCommitteeCharter.js +25 -20
  42. package/src/feeDistributor.d.ts +224 -0
  43. package/src/feeDistributor.d.ts.map +1 -0
  44. package/src/feeDistributor.js +41 -33
  45. package/src/index.d.ts +2 -0
  46. package/src/index.d.ts.map +1 -0
  47. package/src/index.js +1 -0
  48. package/src/interest-math.d.ts +4 -0
  49. package/src/interest-math.d.ts.map +1 -0
  50. package/src/interest-math.js +5 -1
  51. package/src/interest.d.ts +30 -0
  52. package/src/interest.d.ts.map +1 -0
  53. package/src/interest.js +25 -23
  54. package/src/price/README.md +14 -1
  55. package/src/price/fluxAggregatorContract.d.ts +71 -0
  56. package/src/price/fluxAggregatorContract.d.ts.map +1 -0
  57. package/src/price/fluxAggregatorContract.js +64 -55
  58. package/src/price/fluxAggregatorKit.d.ts +104 -0
  59. package/src/price/fluxAggregatorKit.d.ts.map +1 -0
  60. package/src/price/fluxAggregatorKit.js +55 -42
  61. package/src/price/priceOracleKit.d.ts +39 -0
  62. package/src/price/priceOracleKit.d.ts.map +1 -0
  63. package/src/price/priceOracleKit.js +17 -15
  64. package/src/price/roundsManager.d.ts +204 -0
  65. package/src/price/roundsManager.d.ts.map +1 -0
  66. package/src/price/roundsManager.js +132 -85
  67. package/src/proposals/README.md +2 -3
  68. package/src/proposals/add-auction.js +285 -0
  69. package/src/proposals/addAssetToVault.js +192 -40
  70. package/src/proposals/committee-proposal.js +25 -31
  71. package/src/proposals/core-proposal.js +9 -11
  72. package/src/proposals/deploy-price-feeds.js +341 -0
  73. package/src/proposals/econ-behaviors.js +84 -49
  74. package/src/proposals/price-feed-proposal.js +109 -51
  75. package/src/proposals/replace-fee-distributor.js +198 -0
  76. package/src/proposals/replace-scaledPriceAuthorities.js +124 -0
  77. package/src/proposals/replaceElectorate.js +610 -0
  78. package/src/proposals/startEconCommittee.js +2 -2
  79. package/src/proposals/startPSM.js +44 -29
  80. package/src/proposals/upgrade-scaledPriceAuthorities.js +78 -0
  81. package/src/proposals/upgrade-vaults.js +207 -0
  82. package/src/proposals/utils.d.ts +21 -0
  83. package/src/proposals/utils.d.ts.map +1 -0
  84. package/src/proposals/utils.js +66 -9
  85. package/src/proposals/withdraw-reserve-proposal.js +63 -0
  86. package/src/provisionPool.d.ts +69 -0
  87. package/src/provisionPool.d.ts.map +1 -0
  88. package/src/provisionPool.js +138 -0
  89. package/src/provisionPoolKit.d.ts +129 -0
  90. package/src/provisionPoolKit.d.ts.map +1 -0
  91. package/src/provisionPoolKit.js +608 -0
  92. package/src/psm/psm.d.ts +133 -0
  93. package/src/psm/psm.d.ts.map +1 -0
  94. package/src/psm/psm.js +85 -79
  95. package/src/psm/types-ambient.d.ts +2 -0
  96. package/src/psm/types-ambient.d.ts.map +1 -0
  97. package/src/psm/types-ambient.js +3 -0
  98. package/src/reserve/assetReserve.d.ts +58 -0
  99. package/src/reserve/assetReserve.d.ts.map +1 -0
  100. package/src/reserve/assetReserve.js +42 -34
  101. package/src/reserve/assetReserveKit.d.ts +103 -0
  102. package/src/reserve/assetReserveKit.d.ts.map +1 -0
  103. package/src/reserve/assetReserveKit.js +134 -32
  104. package/src/reserve/params.d.ts +16 -0
  105. package/src/reserve/params.d.ts.map +1 -0
  106. package/src/reserve/params.js +8 -2
  107. package/src/tokens.d.ts +3 -0
  108. package/src/tokens.d.ts.map +1 -0
  109. package/src/tokens.js +5 -0
  110. package/src/vaultFactory/burn.d.ts +2 -0
  111. package/src/vaultFactory/burn.d.ts.map +1 -0
  112. package/src/vaultFactory/burn.js +1 -1
  113. package/src/vaultFactory/liquidation.d.ts +25 -0
  114. package/src/vaultFactory/liquidation.d.ts.map +1 -0
  115. package/src/vaultFactory/liquidation.js +37 -24
  116. package/src/vaultFactory/math.d.ts +11 -0
  117. package/src/vaultFactory/math.d.ts.map +1 -0
  118. package/src/vaultFactory/math.js +11 -10
  119. package/src/vaultFactory/orderedVaultStore.d.ts +94 -0
  120. package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -0
  121. package/src/vaultFactory/orderedVaultStore.js +9 -10
  122. package/src/vaultFactory/params.d.ts +143 -0
  123. package/src/vaultFactory/params.d.ts.map +1 -0
  124. package/src/vaultFactory/params.js +56 -25
  125. package/src/vaultFactory/prioritizedVaults.d.ts +280 -0
  126. package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -0
  127. package/src/vaultFactory/prioritizedVaults.js +7 -4
  128. package/src/vaultFactory/proceeds.d.ts +35 -0
  129. package/src/vaultFactory/proceeds.d.ts.map +1 -0
  130. package/src/vaultFactory/proceeds.js +26 -18
  131. package/src/vaultFactory/storeUtils.d.ts +25 -0
  132. package/src/vaultFactory/storeUtils.d.ts.map +1 -0
  133. package/src/vaultFactory/storeUtils.js +10 -12
  134. package/src/vaultFactory/types-ambient.d.ts +137 -0
  135. package/src/vaultFactory/types-ambient.d.ts.map +1 -0
  136. package/src/vaultFactory/{types.js → types-ambient.js} +47 -44
  137. package/src/vaultFactory/vault.d.ts +344 -0
  138. package/src/vaultFactory/vault.d.ts.map +1 -0
  139. package/src/vaultFactory/vault.js +107 -100
  140. package/src/vaultFactory/vaultDirector.d.ts +347 -0
  141. package/src/vaultFactory/vaultDirector.d.ts.map +1 -0
  142. package/src/vaultFactory/vaultDirector.js +94 -64
  143. package/src/vaultFactory/vaultFactory.d.ts +250 -0
  144. package/src/vaultFactory/vaultFactory.d.ts.map +1 -0
  145. package/src/vaultFactory/vaultFactory.js +56 -33
  146. package/src/vaultFactory/vaultHolder.d.ts +170 -0
  147. package/src/vaultFactory/vaultHolder.d.ts.map +1 -0
  148. package/src/vaultFactory/vaultHolder.js +14 -15
  149. package/src/vaultFactory/vaultKit.d.ts +33 -0
  150. package/src/vaultFactory/vaultKit.d.ts.map +1 -0
  151. package/src/vaultFactory/vaultKit.js +9 -4
  152. package/src/vaultFactory/vaultManager.d.ts +676 -0
  153. package/src/vaultFactory/vaultManager.d.ts.map +1 -0
  154. package/src/vaultFactory/vaultManager.js +286 -167
  155. package/CHANGELOG.md +0 -1041
  156. package/exported.js +0 -2
  157. package/scripts/add-collateral-core.js +0 -112
  158. package/scripts/deploy-contracts.js +0 -100
  159. package/scripts/init-core.js +0 -198
  160. package/scripts/invite-committee-core.js +0 -42
  161. package/scripts/manual-price-feed.js +0 -117
  162. package/scripts/price-feed-core.js +0 -104
  163. package/scripts/start-local-chain.sh +0 -84
  164. package/src/psm/types.js +0 -3
  165. package/src/typeGuards.js +0 -13
  166. package/src/vaultFactory/type-imports.js +0 -4
@@ -0,0 +1,610 @@
1
+ /**
2
+ * @file A proposal to replace the EC committee and charter.
3
+ *
4
+ * This script manages configuration updates, distributes invitations, and
5
+ * establishes committees using specified voter addresses and related
6
+ * parameters.
7
+ *
8
+ * See `@agoric/builders/scripts/inter-protocol/replace-electorate-core.js` for
9
+ * the proposal builder.
10
+ */
11
+
12
+ // @ts-check
13
+ import { E } from '@endo/eventual-send';
14
+ import {
15
+ assertPathSegment,
16
+ makeStorageNodeChild,
17
+ } from '@agoric/internal/src/lib-chainStorage.js';
18
+ import { provideRetiredInstances, reserveThenDeposit } from './utils.js';
19
+
20
+ /** @import {EconomyBootstrapPowers} from './econ-behaviors.js' */
21
+ /** @import {EconCharterStartResult} from './econ-behaviors.js' */
22
+ /** @import {CommitteeElectorateCreatorFacet} from '@agoric/governance/src/committee.js'; */
23
+
24
+ const trace = (...args) => console.log('GovReplaceCommiteeAndCharter', ...args);
25
+
26
+ const traced = (label, x) => {
27
+ trace(label, x);
28
+ return x;
29
+ };
30
+
31
+ const { values } = Object;
32
+
33
+ /** @type {<X, Y>(xs: X[], ys: Y[]) => [X, Y][]} */
34
+ const zip = (xs, ys) => xs.map((x, i) => [x, ys[i]]);
35
+
36
+ /** @type {(name: string) => string} */
37
+ const sanitizePathSegment = name => {
38
+ const candidate = name.replace(/[ ,]/g, '_');
39
+ assertPathSegment(candidate);
40
+ return candidate;
41
+ };
42
+
43
+ /**
44
+ * Handles the configuration updates for high-priority senders list by adding or
45
+ * removing addresses.
46
+ *
47
+ * @param {EconomyBootstrapPowers} powers - The bootstrap powers required for
48
+ * economic operations.
49
+ * @param {{
50
+ * options: {
51
+ * highPrioritySendersConfig: {
52
+ * addressesToAdd: string[];
53
+ * addressesToRemove: string[];
54
+ * };
55
+ * };
56
+ * }} config
57
+ * - The configuration object containing lists of addresses to add or remove.
58
+ */
59
+ const handlehighPrioritySendersList = async (
60
+ { consume: { highPrioritySendersManager: highPrioritySendersManagerP } },
61
+ { options: { highPrioritySendersConfig } },
62
+ ) => {
63
+ const HIGH_PRIORITY_SENDERS_NAMESPACE = 'economicCommittee';
64
+ const highPrioritySendersManager = await highPrioritySendersManagerP;
65
+
66
+ if (!highPrioritySendersManager) {
67
+ throw assert.error(`highPrioritySendersManager is not defined`);
68
+ }
69
+
70
+ const { addressesToAdd, addressesToRemove } = highPrioritySendersConfig;
71
+
72
+ await Promise.all(
73
+ addressesToAdd.map(addr =>
74
+ E(highPrioritySendersManager).add(
75
+ HIGH_PRIORITY_SENDERS_NAMESPACE,
76
+ traced('High Priority Senders: adding', addr),
77
+ ),
78
+ ),
79
+ );
80
+
81
+ await Promise.all(
82
+ addressesToRemove.map(addr =>
83
+ E(highPrioritySendersManager).remove(
84
+ HIGH_PRIORITY_SENDERS_NAMESPACE,
85
+ traced('High Priority Senders: removing', addr),
86
+ ),
87
+ ),
88
+ );
89
+ };
90
+
91
+ /**
92
+ * Invites Economic Committee (EC) members by distributing voting invitations to
93
+ * the specified addresses.
94
+ *
95
+ * @param {EconomyBootstrapPowers} powers - The bootstrap powers required for
96
+ * economic operations, including `namesByAddressAdmin` used for managing
97
+ * names.
98
+ * @param {{
99
+ * options: {
100
+ * voterAddresses: Record<string, string>;
101
+ * economicCommitteeCreatorFacet: CommitteeElectorateCreatorFacet;
102
+ * };
103
+ * }} config
104
+ * - The configuration object containing voter addresses and the economic
105
+ * committee facet to create voter invitations.
106
+ *
107
+ * @returns {Promise<void>} A promise that resolves once the invitations have
108
+ * been distributed.
109
+ */
110
+ const inviteECMembers = async (
111
+ { consume: { namesByAddressAdmin } },
112
+ { options: { voterAddresses = {}, economicCommitteeCreatorFacet } },
113
+ ) => {
114
+ trace('Create invitations for new committee');
115
+
116
+ const invitations = await E(
117
+ economicCommitteeCreatorFacet,
118
+ ).getVoterInvitations();
119
+ assert.equal(invitations.length, values(voterAddresses).length);
120
+
121
+ trace('Distribute invitations');
122
+ /** @param {[string, Promise<Invitation>][]} addrInvitations */
123
+ const distributeInvitations = async addrInvitations => {
124
+ await Promise.all(
125
+ addrInvitations.map(async ([addr, invitationP]) => {
126
+ const [voterInvitation] = await Promise.all([invitationP]);
127
+ trace('Sending voting invitations to', addr);
128
+ await reserveThenDeposit(
129
+ `econ committee member ${addr}`,
130
+ namesByAddressAdmin,
131
+ addr,
132
+ [voterInvitation],
133
+ );
134
+ }),
135
+ );
136
+ };
137
+
138
+ await distributeInvitations(zip(values(voterAddresses), invitations));
139
+ };
140
+
141
+ /**
142
+ * Invites members to the Economic Charter by creating and distributing charter
143
+ * member invitations to the specified voter addresses.
144
+ *
145
+ * @param {EconomyBootstrapPowers} powers - The bootstrap powers required for
146
+ * economic operations, including `namesByAddressAdmin` used for managing
147
+ * names and deposits.
148
+ * @param {{
149
+ * options: {
150
+ * voterAddresses: Record<string, string>;
151
+ * econCharterKit: {
152
+ * creatorFacet: {
153
+ * makeCharterMemberInvitation: () => Promise<Invitation>;
154
+ * };
155
+ * };
156
+ * };
157
+ * }} opts
158
+ * - The configuration object containing voter addresses and the econ charter kit
159
+ * for creating charter member invitations.
160
+ *
161
+ * @returns {Promise<void>} This function does not explicitly return a value. It
162
+ * processes all charter member invitations asynchronously.
163
+ */
164
+ const inviteToEconCharter = async (
165
+ { consume: { namesByAddressAdmin } },
166
+ { options: { voterAddresses, econCharterKit } },
167
+ ) => {
168
+ const { creatorFacet } = E.get(econCharterKit);
169
+
170
+ void Promise.all(
171
+ values(voterAddresses).map(async addr => {
172
+ const debugName = `econ charter member ${addr}`;
173
+ reserveThenDeposit(debugName, namesByAddressAdmin, addr, [
174
+ E(creatorFacet).makeCharterMemberInvitation(),
175
+ ]).catch(err => console.error(`failed deposit to ${debugName}`, err));
176
+ }),
177
+ );
178
+ };
179
+
180
+ /**
181
+ * Starts a new Economic Committee (EC) by creating an instance with the
182
+ * provided committee specifications.
183
+ *
184
+ * @param {EconomyBootstrapPowers &
185
+ * PromiseSpaceOf<{ retiredContractInstances: MapStore<string, Instance> }>} powers
186
+ * - The resources and capabilities required to start the committee.
187
+ *
188
+ * @param {{
189
+ * options: {
190
+ * committeeName: string;
191
+ * committeeSize: number;
192
+ * };
193
+ * }} config
194
+ * - Configuration object containing the name and size of the committee.
195
+ *
196
+ * @returns {Promise<CommitteeElectorateCreatorFacet>} A promise that resolves
197
+ * to the creator facet of the newly created EC instance.
198
+ */
199
+ const startNewEconomicCommittee = async (
200
+ {
201
+ consume: {
202
+ board,
203
+ chainStorage,
204
+ startUpgradable,
205
+ retiredContractInstances: retiredInstancesP,
206
+ },
207
+ produce: {
208
+ economicCommitteeKit,
209
+ economicCommitteeCreatorFacet,
210
+ retiredContractInstances: produceRetiredInstances,
211
+ },
212
+ installation: {
213
+ consume: { committee },
214
+ },
215
+ instance: {
216
+ consume: { economicCommittee: economicCommitteeOriginalP },
217
+ produce: { economicCommittee },
218
+ },
219
+ },
220
+ { options: { committeeName, committeeSize } },
221
+ ) => {
222
+ const COMMITTEES_ROOT = 'committees';
223
+
224
+ trace('startNewEconomicCommittee');
225
+
226
+ trace(`committeeName ${committeeName}`);
227
+ trace(`committeeSize ${committeeSize}`);
228
+
229
+ const retiredInstances = await provideRetiredInstances(
230
+ retiredInstancesP,
231
+ produceRetiredInstances,
232
+ );
233
+
234
+ // Record the retired electorate instance so we can manage it later.
235
+ const economicCommitteeOriginal = await economicCommitteeOriginalP;
236
+ const boardID = await E(board).getId(economicCommitteeOriginal);
237
+ retiredInstances.init(
238
+ `economicCommittee-${boardID}`,
239
+ economicCommitteeOriginal,
240
+ );
241
+
242
+ const committeesNode = await makeStorageNodeChild(
243
+ chainStorage,
244
+ COMMITTEES_ROOT,
245
+ );
246
+ const storageNode = await E(committeesNode).makeChildNode(
247
+ sanitizePathSegment(committeeName),
248
+ );
249
+
250
+ const marshaller = await E(board).getPublishingMarshaller();
251
+
252
+ trace('Starting new EC Committee Instance');
253
+
254
+ const privateArgs = {
255
+ storageNode,
256
+ marshaller,
257
+ };
258
+
259
+ const terms = {
260
+ committeeName,
261
+ committeeSize,
262
+ };
263
+
264
+ const startResult = await E(startUpgradable)({
265
+ label: 'economicCommittee',
266
+ installation: committee,
267
+ privateArgs,
268
+ terms,
269
+ });
270
+
271
+ const { instance, creatorFacet } = startResult;
272
+
273
+ trace('Started new EC Committee Instance Successfully');
274
+ economicCommitteeKit.reset();
275
+ economicCommitteeKit.resolve(
276
+ harden({ ...startResult, label: 'economicCommittee' }),
277
+ );
278
+
279
+ economicCommittee.reset();
280
+ economicCommittee.resolve(instance);
281
+
282
+ economicCommitteeCreatorFacet.reset();
283
+ economicCommitteeCreatorFacet.resolve(creatorFacet);
284
+
285
+ return creatorFacet;
286
+ };
287
+
288
+ /**
289
+ * Starts a new Economic Committee Charter by creating an instance with the
290
+ * provided committee specifications.
291
+ *
292
+ * @param {EconomyBootstrapPowers &
293
+ * PromiseSpaceOf<{ retiredContractInstances: MapStore<string, Instance> }>} powers
294
+ * - The resources and capabilities required to start the committee.
295
+ *
296
+ * @returns {Promise<EconCharterStartResult>} A promise that resolves to the
297
+ * charter kit result.
298
+ */
299
+ const startNewEconCharter = async ({
300
+ consume: {
301
+ board,
302
+ startUpgradable,
303
+ contractKits: contractKitsP,
304
+ econCharterKit: econCharterKitP,
305
+ retiredContractInstances: retiredContractInstancesP,
306
+ },
307
+ produce: {
308
+ econCharterKit: produceEconCharterKit,
309
+ retiredContractInstances: produceRetiredInstances,
310
+ },
311
+ installation: {
312
+ consume: { binaryVoteCounter: counterP, econCommitteeCharter: installP },
313
+ },
314
+ instance: {
315
+ produce: { econCommitteeCharter },
316
+ consume: { econCommitteeCharter: previousInstanceP },
317
+ },
318
+ }) => {
319
+ const [
320
+ charterInstall,
321
+ counterInstall,
322
+ previousInstance,
323
+ contractKits,
324
+ econCharterKit,
325
+ retiredInstances,
326
+ ] = await Promise.all([
327
+ installP,
328
+ counterP,
329
+ previousInstanceP,
330
+ contractKitsP,
331
+ econCharterKitP,
332
+ provideRetiredInstances(retiredContractInstancesP, produceRetiredInstances),
333
+ ]);
334
+
335
+ const label = 'econCommitteeCharter';
336
+ const previousCharterKit = { ...econCharterKit, label };
337
+
338
+ const boardID = await E(board).getId(previousCharterKit.instance);
339
+ const identifier = `${label}-${boardID}`;
340
+ trace('Saving previous EC Charter Instance', label);
341
+
342
+ // save the old charter instance kit so we can manage it later
343
+ if (retiredInstances.has(identifier)) {
344
+ // bootstrap tests start having already run this upgrade. Actual upgrades on
345
+ // mainNet or testnets should start with the promiseSpace post upgrade-17,
346
+ // which doesn't have this entry in the map.
347
+ trace(
348
+ '⚠️ WARNING: collision on storing Charter in retireInstances not' +
349
+ ' expected during chain upgrade. It IS normal during bootstrap tests',
350
+ );
351
+ } else {
352
+ retiredInstances.init(identifier, previousCharterKit.instance);
353
+ }
354
+ if (contractKits.has(previousInstance)) {
355
+ // bootstrap tests start having already run this upgrade. Actual upgrades on
356
+ // mainNet or testnets should start with the promiseSpace post upgrade-17,
357
+ // which doesn't have this entry in the map.
358
+ trace(
359
+ '⚠️ WARNING: collision on storing Charter in contractKits not' +
360
+ ' expected during chain upgrade. It IS normal during bootstrap tests',
361
+ );
362
+ } else {
363
+ contractKits.init(previousInstance, previousCharterKit);
364
+ }
365
+
366
+ trace('Starting new EC Charter Instance');
367
+
368
+ const terms = harden({
369
+ binaryVoteCounterInstallation: counterInstall,
370
+ });
371
+ const startResult = await E(startUpgradable)({
372
+ label,
373
+ installation: charterInstall,
374
+ terms,
375
+ });
376
+
377
+ trace('Started new EC Charter Instance Successfully');
378
+
379
+ econCommitteeCharter.reset();
380
+ econCommitteeCharter.resolve(E.get(startResult).instance);
381
+
382
+ produceEconCharterKit.reset();
383
+ produceEconCharterKit.resolve(startResult);
384
+ return startResult;
385
+ };
386
+
387
+ /**
388
+ * @typedef {PromiseSpaceOf<{
389
+ * auctionUpgradeNewInstance: Instance;
390
+ * auctionUpgradeNewGovCreator: any;
391
+ * retiredContractInstances: MapStore<string, Instance>;
392
+ * }>} interlockPowers
393
+ */
394
+
395
+ /**
396
+ * Adds governors to an existing Economic Committee Charter
397
+ *
398
+ * @param {EconomyBootstrapPowers & interlockPowers} powers
399
+ *
400
+ * - The resources and capabilities required to start the committee.
401
+ *
402
+ * @param {{
403
+ * options: {
404
+ * econCharterKit: EconCharterStartResult;
405
+ * };
406
+ * }} options
407
+ * - Configuration object containing the name and size of the committee.
408
+ *
409
+ * @returns {Promise<void>} A promise that resolves once all the governors have
410
+ * been successfully added to the economic charter
411
+ */
412
+ const addGovernorsToEconCharter = async (
413
+ {
414
+ consume: {
415
+ auctionUpgradeNewInstance: auctionUpgradeNewInstanceP,
416
+ auctionUpgradeNewGovCreator: auctionUpgradeNewGovCreatorP,
417
+ psmKit,
418
+ governedContractKits,
419
+ },
420
+ produce: {
421
+ auctionUpgradeNewGovCreator: auctionUpgradeNewGovCreatorProduce,
422
+ },
423
+ },
424
+ { options: { econCharterKit } },
425
+ ) => {
426
+ const { creatorFacet: ecCreatorFacet } = E.get(econCharterKit);
427
+
428
+ const psmKitMap = await psmKit;
429
+
430
+ for (const { psm, psmGovernorCreatorFacet, label } of psmKitMap.values()) {
431
+ await E(ecCreatorFacet).addInstance(psm, psmGovernorCreatorFacet, label);
432
+ }
433
+
434
+ const governedContractKitMap = await governedContractKits;
435
+ for (const {
436
+ instance,
437
+ governorCreatorFacet,
438
+ label,
439
+ } of governedContractKitMap.values()) {
440
+ // The auctioneer was updated in this same release, getting values directly
441
+ // (there might be more than one auctioneer instance, but the others don't
442
+ // need to be registered.)
443
+ if (label !== 'auctioneer') {
444
+ await E(ecCreatorFacet).addInstance(
445
+ instance,
446
+ governorCreatorFacet,
447
+ label,
448
+ );
449
+ }
450
+ }
451
+
452
+ const [auctionUpgradeNewInstance, auctionUpgradeNewGovCreator] =
453
+ await Promise.all([
454
+ auctionUpgradeNewInstanceP,
455
+ auctionUpgradeNewGovCreatorP,
456
+ ]);
457
+ // reset after use. auctionUpgradeNewInstance is reset by upgrade-vault.js
458
+ auctionUpgradeNewGovCreatorProduce.reset();
459
+
460
+ await E(ecCreatorFacet).addInstance(
461
+ auctionUpgradeNewInstance,
462
+ auctionUpgradeNewGovCreator,
463
+ 'auctioneer',
464
+ );
465
+ };
466
+
467
+ /**
468
+ * Replaces the electorate for governance contracts by creating a new Economic
469
+ * Committee and updating contracts with the new electorate's creator facet.
470
+ *
471
+ * @param {EconomyBootstrapPowers & interlockPowers} permittedPowers - The
472
+ * resources and capabilities needed for operations, including access to
473
+ * governance contracts and the PSM kit.
474
+ * @param {{
475
+ * options: {
476
+ * committeeName: string;
477
+ * voterAddresses: Record<string, string>;
478
+ * highPrioritySendersConfig: {
479
+ * addressesToAdd: string[];
480
+ * addressesToRemove: string[];
481
+ * };
482
+ * };
483
+ * }} config
484
+ * - Configuration object containing the committee details and governance options.
485
+ *
486
+ * @returns {Promise<void>} A promise that resolves when the electorate has been
487
+ * replaced.
488
+ */
489
+ export const replaceAllElectorates = async (permittedPowers, config) => {
490
+ const { committeeName, voterAddresses, highPrioritySendersConfig } =
491
+ config.options;
492
+
493
+ const economicCommitteeCreatorFacet = await startNewEconomicCommittee(
494
+ permittedPowers,
495
+ {
496
+ options: {
497
+ committeeName,
498
+ committeeSize: values(voterAddresses).length,
499
+ },
500
+ },
501
+ );
502
+
503
+ const governedContractKitsMap =
504
+ await permittedPowers.consume.governedContractKits;
505
+ const psmKitMap = await permittedPowers.consume.psmKit;
506
+
507
+ const governanceDetails = [
508
+ ...[...governedContractKitsMap.values()].map(governedContractKit => ({
509
+ creatorFacet: governedContractKit.governorCreatorFacet,
510
+ label: governedContractKit.label,
511
+ })),
512
+ ...[...psmKitMap.values()].map(psmKit => ({
513
+ creatorFacet: psmKit.psmGovernorCreatorFacet,
514
+ label: psmKit.label,
515
+ })),
516
+ ];
517
+
518
+ await Promise.all(
519
+ governanceDetails.map(async ({ creatorFacet, label }) => {
520
+ trace(`Getting PoserInvitation for ${label}...`);
521
+ const newElectoratePoser = await E(
522
+ economicCommitteeCreatorFacet,
523
+ ).getPoserInvitation();
524
+ trace(`Successfully received newElectoratePoser for ${label}`);
525
+
526
+ trace(`Replacing electorate for ${label}`);
527
+ await E(creatorFacet).replaceElectorate(newElectoratePoser);
528
+ trace(`Successfully replaced electorate for ${label}`);
529
+ }),
530
+ );
531
+
532
+ await inviteECMembers(permittedPowers, {
533
+ options: {
534
+ voterAddresses,
535
+ economicCommitteeCreatorFacet,
536
+ },
537
+ });
538
+
539
+ await handlehighPrioritySendersList(permittedPowers, {
540
+ options: {
541
+ highPrioritySendersConfig,
542
+ },
543
+ });
544
+
545
+ trace('Installed New Economic Committee');
546
+
547
+ const econCharterKit = await startNewEconCharter(permittedPowers);
548
+ await addGovernorsToEconCharter(permittedPowers, {
549
+ options: { econCharterKit },
550
+ });
551
+
552
+ await inviteToEconCharter(permittedPowers, {
553
+ options: { voterAddresses, econCharterKit },
554
+ });
555
+
556
+ trace('Installed New EC Charter');
557
+ };
558
+
559
+ harden(replaceAllElectorates);
560
+
561
+ export const getManifestForReplaceAllElectorates = async (
562
+ { economicCommitteeRef: _economicCommitteeRef },
563
+ options,
564
+ ) => ({
565
+ manifest: {
566
+ [replaceAllElectorates.name]: {
567
+ consume: {
568
+ agoricNames: true,
569
+ auctionUpgradeNewGovCreator: true,
570
+ auctionUpgradeNewInstance: true,
571
+ psmKit: true,
572
+ contractKits: true,
573
+ econCharterKit: true,
574
+ governedContractKits: true,
575
+ chainStorage: true,
576
+ highPrioritySendersManager: true,
577
+ namesByAddressAdmin: true,
578
+ retiredContractInstances: true,
579
+ // Rest of these are designed to be widely shared
580
+ board: true,
581
+ startUpgradable: true,
582
+ },
583
+ produce: {
584
+ econCharterKit: true,
585
+ economicCommitteeKit: true,
586
+ economicCommitteeCreatorFacet: true,
587
+ auctionUpgradeNewGovCreator: true,
588
+ retiredContractInstances: true,
589
+ },
590
+ installation: {
591
+ consume: {
592
+ committee: true,
593
+ binaryVoteCounter: true,
594
+ econCommitteeCharter: true,
595
+ },
596
+ },
597
+ instance: {
598
+ produce: {
599
+ economicCommittee: true,
600
+ econCommitteeCharter: true,
601
+ },
602
+ consume: {
603
+ economicCommittee: true,
604
+ econCommitteeCharter: true,
605
+ },
606
+ },
607
+ },
608
+ },
609
+ options: { ...options },
610
+ });
@@ -21,8 +21,8 @@ const sanitizePathSegment = name => {
21
21
  */
22
22
 
23
23
  /**
24
- * @param {import('./econ-behaviors').EconomyBootstrapPowers} powers
25
- * @param {object} [config]
24
+ * @param {import('./econ-behaviors.js').EconomyBootstrapPowers} powers
25
+ * @param {object} config
26
26
  * @param {object} [config.options]
27
27
  * @param {EconCommitteeOptions} [config.options.econCommitteeOptions]
28
28
  */