@agoric/inter-protocol 0.13.3 → 0.13.4-dev-d32a66a.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 (140) hide show
  1. package/README.md +26 -20
  2. package/bundles/bundle-auctioneer-js-meta.json +722 -0
  3. package/bundles/bundle-auctioneer.js +1 -0
  4. package/bundles/bundle-econCommitteeCharter-js-meta.json +514 -0
  5. package/bundles/bundle-econCommitteeCharter.js +1 -0
  6. package/bundles/bundle-feeDistributor-js-meta.json +458 -0
  7. package/bundles/bundle-feeDistributor.js +1 -1
  8. package/bundles/bundle-fluxAggregatorKit-js-meta.json +674 -0
  9. package/bundles/bundle-fluxAggregatorKit.js +1 -0
  10. package/bundles/bundle-psm-js-meta.json +666 -0
  11. package/bundles/bundle-psm.js +1 -1
  12. package/bundles/bundle-reserve-js-meta.json +662 -0
  13. package/bundles/bundle-reserve.js +1 -1
  14. package/bundles/bundle-scaledPriceAuthority-js-meta.json +542 -0
  15. package/bundles/bundle-scaledPriceAuthority.js +1 -1
  16. package/bundles/bundle-vaultFactory-js-meta.json +786 -0
  17. package/bundles/bundle-vaultFactory.js +1 -1
  18. package/exported.js +0 -2
  19. package/package.json +34 -31
  20. package/scripts/add-collateral-core.js +14 -4
  21. package/scripts/build-bundles.js +9 -2
  22. package/scripts/deploy-contracts.js +1 -4
  23. package/scripts/init-core.js +20 -38
  24. package/scripts/invite-committee-core.js +1 -1
  25. package/scripts/manual-price-feed.js +2 -2
  26. package/scripts/price-feed-core.js +7 -6
  27. package/scripts/start-local-chain.sh +84 -0
  28. package/src/auction/auctionBook.js +755 -0
  29. package/src/auction/auctioneer.js +720 -0
  30. package/src/auction/offerBook.js +221 -0
  31. package/src/auction/params.js +174 -0
  32. package/src/auction/scheduleMath.js +167 -0
  33. package/src/auction/scheduler.js +370 -0
  34. package/src/auction/sortedOffers.js +136 -0
  35. package/src/auction/util.js +55 -0
  36. package/src/clientSupport.js +324 -0
  37. package/src/collectFees.js +8 -14
  38. package/src/contractSupport.js +24 -68
  39. package/src/econCommitteeCharter.js +161 -77
  40. package/src/feeDistributor.js +60 -20
  41. package/src/index.js +2 -0
  42. package/src/interest-math.js +1 -4
  43. package/src/interest.js +20 -13
  44. package/src/price/README.md +57 -0
  45. package/src/price/fluxAggregatorContract.js +190 -0
  46. package/src/price/fluxAggregatorKit.js +375 -0
  47. package/src/price/priceOracleKit.js +127 -0
  48. package/src/price/roundsManager.js +726 -0
  49. package/src/proposals/addAssetToVault.js +89 -94
  50. package/src/proposals/committee-proposal.js +141 -40
  51. package/src/proposals/core-proposal.js +100 -167
  52. package/src/proposals/econ-behaviors.js +320 -564
  53. package/src/proposals/price-feed-proposal.js +175 -78
  54. package/src/proposals/startEconCommittee.js +25 -12
  55. package/src/proposals/startPSM.js +231 -211
  56. package/src/proposals/utils.js +31 -17
  57. package/src/psm/README.md +71 -0
  58. package/src/psm/psm.js +272 -160
  59. package/src/psm/types.js +2 -0
  60. package/src/reserve/assetReserve.js +56 -413
  61. package/src/reserve/assetReserveKit.js +303 -0
  62. package/src/reserve/doc.md +1 -3
  63. package/src/reserve/params.js +2 -5
  64. package/src/typeGuards.js +13 -0
  65. package/src/vaultFactory/Liquidation.md +100 -0
  66. package/src/vaultFactory/burn.js +2 -1
  67. package/src/vaultFactory/liquidation.js +270 -108
  68. package/src/vaultFactory/math.js +95 -0
  69. package/src/vaultFactory/orderedVaultStore.js +0 -1
  70. package/src/vaultFactory/params.js +133 -112
  71. package/src/vaultFactory/prioritizedVaults.js +36 -79
  72. package/src/vaultFactory/storeUtils.js +67 -9
  73. package/src/vaultFactory/type-imports.js +2 -0
  74. package/src/vaultFactory/types.js +22 -26
  75. package/src/vaultFactory/vault.js +772 -709
  76. package/src/vaultFactory/vaultDirector.js +480 -483
  77. package/src/vaultFactory/vaultFactory.js +99 -60
  78. package/src/vaultFactory/vaultHolder.js +121 -95
  79. package/src/vaultFactory/vaultKit.js +39 -31
  80. package/src/vaultFactory/vaultManager.js +1249 -868
  81. package/bundles/bundle-amm-meta.js +0 -618
  82. package/bundles/bundle-amm.js +0 -1
  83. package/bundles/bundle-feeDistributor-meta.js +0 -346
  84. package/bundles/bundle-interchainPool-meta.js +0 -534
  85. package/bundles/bundle-interchainPool.js +0 -1
  86. package/bundles/bundle-liquidateIncrementally-meta.js +0 -442
  87. package/bundles/bundle-liquidateIncrementally.js +0 -1
  88. package/bundles/bundle-liquidateMinimum-meta.js +0 -442
  89. package/bundles/bundle-liquidateMinimum.js +0 -1
  90. package/bundles/bundle-psm-meta.js +0 -538
  91. package/bundles/bundle-psmCharter-meta.js +0 -418
  92. package/bundles/bundle-psmCharter.js +0 -1
  93. package/bundles/bundle-reserve-meta.js +0 -542
  94. package/bundles/bundle-scaledPriceAuthority-meta.js +0 -442
  95. package/bundles/bundle-stakeFactory-meta.js +0 -574
  96. package/bundles/bundle-stakeFactory.js +0 -1
  97. package/bundles/bundle-vaultFactory-meta.js +0 -598
  98. package/scripts/add-initial-liquidity.js +0 -180
  99. package/src/collect.js +0 -13
  100. package/src/interchainPool.js +0 -135
  101. package/src/makeTracer.js +0 -36
  102. package/src/my-lien.js +0 -85
  103. package/src/proposals/demoIssuers.js +0 -685
  104. package/src/proposals/sim-behaviors.js +0 -40
  105. package/src/psm/psmCharter.js +0 -139
  106. package/src/stakeFactory/README.md +0 -62
  107. package/src/stakeFactory/attestation.js +0 -267
  108. package/src/stakeFactory/attestationTool.js +0 -66
  109. package/src/stakeFactory/constants.js +0 -16
  110. package/src/stakeFactory/params.js +0 -31
  111. package/src/stakeFactory/stakeFactory.js +0 -236
  112. package/src/stakeFactory/stakeFactoryKit.js +0 -455
  113. package/src/stakeFactory/stakeFactoryManager.js +0 -296
  114. package/src/stakeFactory/types.js +0 -42
  115. package/src/vaultFactory/liquidateIncrementally.js +0 -350
  116. package/src/vaultFactory/liquidateMinimum.js +0 -100
  117. package/src/vpool-xyk-amm/AttackersGuide.md +0 -89
  118. package/src/vpool-xyk-amm/addLiquidity.js +0 -222
  119. package/src/vpool-xyk-amm/addPool.js +0 -197
  120. package/src/vpool-xyk-amm/constantProduct/AMM-Trade.jpeg +0 -0
  121. package/src/vpool-xyk-amm/constantProduct/README.md +0 -204
  122. package/src/vpool-xyk-amm/constantProduct/calcFees.js +0 -99
  123. package/src/vpool-xyk-amm/constantProduct/calcSwapPrices.js +0 -85
  124. package/src/vpool-xyk-amm/constantProduct/core.js +0 -153
  125. package/src/vpool-xyk-amm/constantProduct/defaults.js +0 -5
  126. package/src/vpool-xyk-amm/constantProduct/getXY.js +0 -52
  127. package/src/vpool-xyk-amm/constantProduct/internal-types.js +0 -116
  128. package/src/vpool-xyk-amm/constantProduct/invariants.js +0 -43
  129. package/src/vpool-xyk-amm/constantProduct/swap.js +0 -272
  130. package/src/vpool-xyk-amm/constantProduct/types.js +0 -32
  131. package/src/vpool-xyk-amm/doublePool.js +0 -194
  132. package/src/vpool-xyk-amm/estimate.js +0 -155
  133. package/src/vpool-xyk-amm/multipoolMarketMaker.js +0 -520
  134. package/src/vpool-xyk-amm/params.js +0 -61
  135. package/src/vpool-xyk-amm/pool.js +0 -396
  136. package/src/vpool-xyk-amm/priceAuthority.js +0 -94
  137. package/src/vpool-xyk-amm/removeLiquidity.js +0 -31
  138. package/src/vpool-xyk-amm/singlePool.js +0 -73
  139. package/src/vpool-xyk-amm/swap.js +0 -69
  140. package/src/vpool-xyk-amm/types.js +0 -154
@@ -1,23 +1,48 @@
1
+ // @ts-nocheck -- lots of type errors. low prio b/c proposals are like scripts
1
2
  import { E } from '@endo/far';
2
- import { makeIssuerKit } from '@agoric/ertp';
3
3
  import {
4
4
  makeStorageNodeChild,
5
5
  assertPathSegment,
6
- } from '@agoric/vats/src/lib-chainStorage.js';
7
- import { deeplyFulfilledObject } from '@agoric/internal';
6
+ } from '@agoric/internal/src/lib-chainStorage.js';
7
+ import { makeTracer } from '@agoric/internal';
8
8
 
9
9
  import { unitAmount } from '@agoric/zoe/src/contractSupport/priceQuote.js';
10
10
  import { reserveThenDeposit, reserveThenGetNames } from './utils.js';
11
11
 
12
- /** @type {(name: string) => void} */
12
+ const trace = makeTracer('RunPriceFeed', true);
13
+
14
+ /** @type {(name: string) => string} */
13
15
  const sanitizePathSegment = name => {
14
16
  const candidate = name.replace(/ /g, '_');
15
17
  assertPathSegment(candidate);
16
18
  return candidate;
17
19
  };
18
20
 
21
+ /**
22
+ * @typedef {{
23
+ * brandIn?: ERef<Brand<'nat'> | undefined>,
24
+ * brandOut?: ERef<Brand<'nat'> | undefined>,
25
+ * IN_BRAND_NAME: string,
26
+ * IN_BRAND_DECIMALS: string,
27
+ * OUT_BRAND_NAME: string,
28
+ * OUT_BRAND_DECIMALS: string,
29
+ * }} PriceFeedOptions
30
+ */
31
+
32
+ /**
33
+ * Create inert brands (no mint or issuer) referred to by price oracles.
34
+ *
35
+ * @param {ChainBootstrapSpace & NamedVatPowers} space
36
+ * @param {{options: {priceFeedOptions: PriceFeedOptions}}} opt
37
+ * @returns {Promise<[Brand<'nat'>, Brand<'nat'>]>}
38
+ */
19
39
  export const ensureOracleBrands = async (
20
- { consume: { agoricNamesAdmin } },
40
+ {
41
+ namedVat: {
42
+ consume: { agoricNames },
43
+ },
44
+ oracleBrand: { produce: oracleBrandProduce },
45
+ },
21
46
  {
22
47
  options: {
23
48
  priceFeedOptions: {
@@ -31,28 +56,19 @@ export const ensureOracleBrands = async (
31
56
  },
32
57
  },
33
58
  ) => {
34
- /** @type {NameAdmin} */
35
- const obAdmin = E(agoricNamesAdmin).lookupAdmin('oracleBrand');
59
+ trace('ensureOracleBrands');
36
60
 
37
61
  const updateFreshBrand = async (brand, name, decimals) => {
38
- const b = await brand;
39
- if (b) {
40
- // Don't update if it was already set.
41
- return b;
62
+ let b = await brand;
63
+ if (!b) {
64
+ // not 1st await
65
+ // eslint-disable-next-line @jessie.js/no-nested-await
66
+ b = await E(agoricNames).provideInertBrand(
67
+ name,
68
+ harden({ decimalPlaces: parseInt(decimals, 10) }),
69
+ );
42
70
  }
43
- const freshBrand = makeIssuerKit(
44
- name,
45
- undefined,
46
- harden({ decimalPlaces: parseInt(decimals, 10) }),
47
- ).brand;
48
-
49
- if (!name) {
50
- // Don't update unnamed brands.
51
- return freshBrand;
52
- }
53
-
54
- // Atomically update if not already set.
55
- return E(obAdmin).default(name, freshBrand);
71
+ oracleBrandProduce[name].resolve(b);
56
72
  };
57
73
 
58
74
  return Promise.all([
@@ -63,23 +79,23 @@ export const ensureOracleBrands = async (
63
79
 
64
80
  /**
65
81
  * @param {ChainBootstrapSpace} powers
66
- * @param {{options: {priceFeedOptions: {AGORIC_INSTANCE_NAME: string, oracleAddresses: UNKNOWN, contractTerms: unknown, IN_BRAND_NAME: string, OUT_BRAND_NAME: string}}}} config
82
+ * @param {{options: {priceFeedOptions: {AGORIC_INSTANCE_NAME: string, oracleAddresses: string[], contractTerms: import('@agoric/inter-protocol/src/price/fluxAggregatorKit.js').ChainlinkConfig, IN_BRAND_NAME: string, OUT_BRAND_NAME: string}}}} config
67
83
  */
68
84
  export const createPriceFeed = async (
69
85
  {
70
86
  consume: {
71
87
  agoricNamesAdmin,
72
- aggregators,
73
88
  board,
74
89
  chainStorage,
75
90
  chainTimerService,
76
91
  client,
92
+ econCharterKit,
93
+ highPrioritySendersManager,
77
94
  namesByAddressAdmin,
78
95
  priceAuthority,
79
96
  priceAuthorityAdmin,
80
- zoe,
97
+ startGovernedUpgradable,
81
98
  },
82
- produce: { aggregators: produceAggregators },
83
99
  },
84
100
  {
85
101
  options: {
@@ -93,18 +109,17 @@ export const createPriceFeed = async (
93
109
  },
94
110
  },
95
111
  ) => {
112
+ trace('createPriceFeed');
96
113
  const STORAGE_PATH = 'priceFeed';
97
114
 
98
- // Default to an empty Map and home.priceAuthority.
99
- produceAggregators.resolve(new Map());
100
- E(client).assignBundle([_addr => ({ priceAuthority })]);
115
+ void E(client).assignBundle([_addr => ({ priceAuthority })]);
101
116
 
102
117
  const timer = await chainTimerService;
103
118
 
104
119
  /**
105
120
  * Values come from economy-template.json, which at this writing had IN:ATOM, OUT:USD
106
121
  *
107
- * @type {[[Brand, Brand], [Installation<import('@agoric/zoe/src/contracts/priceAggregator.js').start>]]}
122
+ * @type {[[Brand<'nat'>, Brand<'nat'>], [Installation<import('@agoric/inter-protocol/src/price/fluxAggregatorContract.js').prepare>]]}
108
123
  */
109
124
  const [[brandIn, brandOut], [priceAggregator]] = await Promise.all([
110
125
  reserveThenGetNames(E(agoricNamesAdmin).lookupAdmin('oracleBrand'), [
@@ -117,61 +132,64 @@ export const createPriceFeed = async (
117
132
  ]);
118
133
 
119
134
  const unitAmountIn = await unitAmount(brandIn);
120
- /** @type {import('@agoric/zoe/src/contracts/priceAggregator.js').PriceAggregatorContract['terms']} */
121
- const terms = await deeplyFulfilledObject(
122
- harden({
123
- ...contractTerms,
124
- description: AGORIC_INSTANCE_NAME,
125
- brandIn,
126
- brandOut,
127
- timer,
128
- unitAmountIn,
129
- }),
130
- );
131
- terms.absent;
135
+ const terms = harden({
136
+ ...contractTerms,
137
+ description: AGORIC_INSTANCE_NAME,
138
+ brandIn,
139
+ brandOut,
140
+ timer,
141
+ unitAmountIn,
142
+ });
143
+ trace('got terms');
144
+
145
+ const label = sanitizePathSegment(AGORIC_INSTANCE_NAME);
132
146
 
133
147
  const storageNode = await makeStorageNodeChild(chainStorage, STORAGE_PATH);
134
- const marshaller = E(board).getReadonlyMarshaller();
148
+ const marshaller = await E(board).getReadonlyMarshaller();
135
149
 
136
- // Create the price feed.
137
- const aggregator = await E(zoe).startInstance(
138
- priceAggregator,
139
- undefined,
140
- terms,
141
- {
142
- storageNode: E(storageNode).makeChildNode(
143
- sanitizePathSegment(AGORIC_INSTANCE_NAME),
144
- ),
150
+ trace('awaiting startInstance');
151
+ const faKit = await E(startGovernedUpgradable)({
152
+ governedParams: {},
153
+ privateArgs: {
154
+ highPrioritySendersManager: await highPrioritySendersManager,
145
155
  marshaller,
156
+ namesByAddressAdmin,
157
+ storageNode: await E(storageNode).makeChildNode(label),
146
158
  },
147
- );
148
- E(aggregators).set(terms, { aggregator });
159
+ terms,
160
+ label,
161
+ installation: priceAggregator,
162
+ });
149
163
 
150
- E(E(agoricNamesAdmin).lookupAdmin('instance')).update(
164
+ E(E(agoricNamesAdmin).lookupAdmin('instance'))
165
+ .update(AGORIC_INSTANCE_NAME, faKit.instance)
166
+ .catch(err =>
167
+ console.error(`🚨 failed to update ${AGORIC_INSTANCE_NAME}`, err),
168
+ );
169
+
170
+ E(E.get(econCharterKit).creatorFacet).addInstance(
171
+ faKit.instance,
172
+ faKit.governorCreatorFacet,
151
173
  AGORIC_INSTANCE_NAME,
152
- aggregator.instance,
153
174
  );
175
+ trace('registered', AGORIC_INSTANCE_NAME, faKit.instance);
154
176
 
155
177
  // Publish price feed in home.priceAuthority.
156
178
  const forceReplace = true;
157
- E(priceAuthorityAdmin)
158
- .registerPriceAuthority(
159
- E(aggregator.publicFacet).getPriceAuthority(),
160
- brandIn,
161
- brandOut,
162
- forceReplace,
163
- )
164
- .then(deleter => E(aggregators).set(terms, { aggregator, deleter }));
179
+ void E(priceAuthorityAdmin).registerPriceAuthority(
180
+ E(faKit.publicFacet).getPriceAuthority(),
181
+ brandIn,
182
+ brandOut,
183
+ forceReplace,
184
+ );
165
185
 
166
186
  /**
167
- * Send an invitation to one of the oracles.
187
+ * Initialize a new oracle and send an invitation to administer it.
168
188
  *
169
189
  * @param {string} addr
170
190
  */
171
- const distributeInvitation = async addr => {
172
- const invitation = await E(aggregator.creatorFacet).makeOracleInvitation(
173
- addr,
174
- );
191
+ const addOracle = async addr => {
192
+ const invitation = await E(faKit.creatorFacet).makeOracleInvitation(addr);
175
193
  await reserveThenDeposit(
176
194
  `${AGORIC_INSTANCE_NAME} member ${addr}`,
177
195
  namesByAddressAdmin,
@@ -180,11 +198,19 @@ export const createPriceFeed = async (
180
198
  );
181
199
  };
182
200
 
183
- await Promise.all(oracleAddresses.map(distributeInvitation));
201
+ trace('distributing invitations', oracleAddresses);
202
+ await Promise.all(oracleAddresses.map(addOracle));
203
+ trace('createPriceFeed complete');
184
204
  };
185
205
 
186
- // Return the manifest, installations, and options.
187
206
  const t = 'priceFeed';
207
+ /**
208
+ * Add a price feed to a running chain, returning the manifest, installations, and options.
209
+ *
210
+ * @param {object} utils
211
+ * @param {(ref: unknown) => Promise<unknown>} [utils.restoreRef]
212
+ * @param {PriceFeedOptions} priceFeedOptions
213
+ */
188
214
  export const getManifestForPriceFeed = async (
189
215
  { restoreRef },
190
216
  priceFeedOptions,
@@ -192,22 +218,27 @@ export const getManifestForPriceFeed = async (
192
218
  manifest: {
193
219
  [createPriceFeed.name]: {
194
220
  consume: {
195
- aggregators: t,
196
221
  agoricNamesAdmin: t,
197
222
  board: t,
198
223
  chainStorage: t,
199
224
  chainTimerService: t,
200
225
  client: t,
226
+ contractGovernor: t,
227
+ econCharterKit: t,
228
+ economicCommitteeCreatorFacet: t,
229
+ highPrioritySendersManager: t,
201
230
  namesByAddressAdmin: t,
202
231
  priceAuthority: t,
203
232
  priceAuthorityAdmin: t,
204
- zoe: t,
233
+ startGovernedUpgradable: t,
205
234
  },
206
- produce: { aggregators: t },
207
235
  },
208
236
  [ensureOracleBrands.name]: {
209
- consume: {
210
- agoricNamesAdmin: t,
237
+ namedVat: {
238
+ consume: { agoricNames: 'agoricNames' },
239
+ },
240
+ oracleBrand: {
241
+ produce: t,
211
242
  },
212
243
  },
213
244
  },
@@ -225,3 +256,69 @@ export const getManifestForPriceFeed = async (
225
256
  },
226
257
  },
227
258
  });
259
+
260
+ /**
261
+ * @param {import('./econ-behaviors').EconomyBootstrapPowers} powers
262
+ * @param {object} [config]
263
+ * @param {object} [config.options]
264
+ * @param {string[]} [config.options.demoOracleAddresses]
265
+ */
266
+ export const startPriceFeeds = async (
267
+ {
268
+ consume,
269
+ produce,
270
+ installation: {
271
+ consume: { priceAggregator },
272
+ },
273
+ },
274
+ { options: { demoOracleAddresses = [] } = {} },
275
+ ) => {
276
+ trace('startPriceFeeds');
277
+
278
+ // eventually this will have be parameterized. for now we just need one contract
279
+ // working well enough to build tooling around.
280
+ const inBrandName = 'ATOM';
281
+ const outBrandName = 'USD';
282
+
283
+ /** @type {ERef<NameAdmin>} */
284
+ const installAdmin = E(consume.agoricNamesAdmin).lookupAdmin('installation');
285
+ await E(installAdmin).update('priceAggregator', priceAggregator);
286
+
287
+ await ensureOracleBrands(
288
+ { consume },
289
+ {
290
+ options: {
291
+ priceFeedOptions: {
292
+ IN_BRAND_NAME: inBrandName,
293
+ IN_BRAND_DECIMALS: '6',
294
+ OUT_BRAND_NAME: outBrandName,
295
+ OUT_BRAND_DECIMALS: '6',
296
+ },
297
+ },
298
+ },
299
+ );
300
+
301
+ await createPriceFeed(
302
+ { consume, produce },
303
+ {
304
+ options: {
305
+ priceFeedOptions: {
306
+ AGORIC_INSTANCE_NAME: `${inBrandName}-${outBrandName} price feed`,
307
+ contractTerms: {
308
+ minSubmissionCount: 2,
309
+ minSubmissionValue: 1,
310
+ maxSubmissionCount: 5,
311
+ maxSubmissionValue: 99999,
312
+ restartDelay: 1n,
313
+ timeout: 10,
314
+ },
315
+ oracleAddresses: demoOracleAddresses,
316
+ IN_BRAND_NAME: inBrandName,
317
+ OUT_BRAND_NAME: outBrandName,
318
+ },
319
+ },
320
+ },
321
+ );
322
+ trace('startPriceFeeds complete');
323
+ };
324
+ harden(startPriceFeeds);
@@ -1,12 +1,11 @@
1
- // @ts-check
1
+ import { makeTracer } from '@agoric/internal';
2
2
  import {
3
3
  assertPathSegment,
4
4
  makeStorageNodeChild,
5
- } from '@agoric/vats/src/lib-chainStorage.js';
5
+ } from '@agoric/internal/src/lib-chainStorage.js';
6
6
  import { E } from '@endo/far';
7
- import { makeTracer } from '../makeTracer.js';
8
7
 
9
- const trace = makeTracer('RunEconBehaviors', false);
8
+ const trace = makeTracer('RunEconCommittee', true);
10
9
 
11
10
  /** @type {(name: string) => string} */
12
11
  const sanitizePathSegment = name => {
@@ -29,8 +28,8 @@ const sanitizePathSegment = name => {
29
28
  */
30
29
  export const startEconomicCommittee = async (
31
30
  {
32
- consume: { board, chainStorage, zoe },
33
- produce: { economicCommitteeCreatorFacet },
31
+ consume: { board, chainStorage, diagnostics, zoe },
32
+ produce: { economicCommitteeKit, economicCommitteeCreatorFacet },
34
33
  installation: {
35
34
  consume: { committee },
36
35
  },
@@ -60,16 +59,26 @@ export const startEconomicCommittee = async (
60
59
  // NB: committee must only publish what it intended to be public
61
60
  const marshaller = await E(board).getPublishingMarshaller();
62
61
 
63
- const { creatorFacet, instance } = await E(zoe).startInstance(
62
+ const privateArgs = {
63
+ storageNode,
64
+ marshaller,
65
+ };
66
+ const startResult = await E(zoe).startInstance(
64
67
  committee,
65
68
  {},
66
69
  { committeeName, committeeSize, ...rest },
67
- {
68
- storageNode,
69
- marshaller,
70
- },
70
+ privateArgs,
71
+ 'economicCommittee',
72
+ );
73
+ const { creatorFacet, instance } = startResult;
74
+
75
+ economicCommitteeKit.resolve(
76
+ // XXX should startInstance return its label?
77
+ harden({ ...startResult, label: 'economicCommittee' }),
71
78
  );
72
79
 
80
+ await E(diagnostics).savePrivateArgs(startResult.instance, privateArgs);
81
+
73
82
  economicCommitteeCreatorFacet.resolve(creatorFacet);
74
83
  economicCommittee.resolve(instance);
75
84
  };
@@ -80,9 +89,13 @@ export const ECON_COMMITTEE_MANIFEST = harden({
80
89
  consume: {
81
90
  board: true,
82
91
  chainStorage: true,
92
+ diagnostics: true,
83
93
  zoe: true,
84
94
  },
85
- produce: { economicCommitteeCreatorFacet: 'economicCommittee' },
95
+ produce: {
96
+ economicCommitteeKit: true,
97
+ economicCommitteeCreatorFacet: 'economicCommittee',
98
+ },
86
99
  installation: {
87
100
  consume: { committee: 'zoe' },
88
101
  },