@agoric/inter-protocol 0.16.2-other-dev-3eb1a1d.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 (145) hide show
  1. package/package.json +36 -35
  2. package/src/auction/auctionBook.d.ts +6 -6
  3. package/src/auction/auctionBook.d.ts.map +1 -1
  4. package/src/auction/auctionBook.js +51 -26
  5. package/src/auction/auctionMath.d.ts +1 -1
  6. package/src/auction/auctionMath.d.ts.map +1 -1
  7. package/src/auction/auctioneer.d.ts +5 -4
  8. package/src/auction/auctioneer.d.ts.map +1 -1
  9. package/src/auction/auctioneer.js +2 -0
  10. package/src/auction/offerBook.d.ts +3 -2
  11. package/src/auction/offerBook.d.ts.map +1 -1
  12. package/src/auction/offerBook.js +5 -1
  13. package/src/auction/params.d.ts +2 -1
  14. package/src/auction/params.d.ts.map +1 -1
  15. package/src/auction/params.js +1 -0
  16. package/src/auction/scheduler.d.ts +1 -1
  17. package/src/auction/util.d.ts +2 -1
  18. package/src/auction/util.d.ts.map +1 -1
  19. package/src/auction/util.js +4 -1
  20. package/src/clientSupport.d.ts +1 -0
  21. package/src/clientSupport.d.ts.map +1 -1
  22. package/src/clientSupport.js +6 -1
  23. package/src/contractSupport.d.ts +2 -2
  24. package/src/contractSupport.d.ts.map +1 -1
  25. package/src/econCommitteeCharter.d.ts +8 -5
  26. package/src/econCommitteeCharter.d.ts.map +1 -1
  27. package/src/econCommitteeCharter.js +4 -0
  28. package/src/feeDistributor.d.ts +33 -33
  29. package/src/feeDistributor.d.ts.map +1 -1
  30. package/src/feeDistributor.js +4 -0
  31. package/src/interest-math.d.ts +1 -0
  32. package/src/interest-math.d.ts.map +1 -1
  33. package/src/interest-math.js +5 -1
  34. package/src/interest.d.ts +3 -1
  35. package/src/interest.d.ts.map +1 -1
  36. package/src/interest.js +2 -5
  37. package/src/price/README.md +1 -1
  38. package/src/price/fluxAggregatorContract.d.ts +6 -6
  39. package/src/price/fluxAggregatorContract.d.ts.map +1 -1
  40. package/src/price/fluxAggregatorKit.d.ts +6 -5
  41. package/src/price/fluxAggregatorKit.d.ts.map +1 -1
  42. package/src/price/fluxAggregatorKit.js +3 -2
  43. package/src/price/priceOracleKit.d.ts +2 -1
  44. package/src/price/priceOracleKit.d.ts.map +1 -1
  45. package/src/price/priceOracleKit.js +5 -1
  46. package/src/price/roundsManager.d.ts +2 -2
  47. package/src/price/roundsManager.d.ts.map +1 -1
  48. package/src/price/roundsManager.js +1 -0
  49. package/src/proposals/add-auction.js +31 -2
  50. package/src/proposals/addAssetToVault.js +1 -1
  51. package/src/proposals/deploy-price-feeds.js +28 -3
  52. package/src/proposals/econ-behaviors.js +21 -5
  53. package/src/proposals/replace-fee-distributor.js +5 -2
  54. package/src/proposals/replaceElectorate.js +105 -16
  55. package/src/proposals/upgrade-vaults.js +7 -2
  56. package/src/proposals/utils.d.ts +2 -0
  57. package/src/proposals/utils.d.ts.map +1 -1
  58. package/src/proposals/utils.js +24 -1
  59. package/src/proposals/withdraw-reserve-proposal.js +63 -0
  60. package/src/provisionPool.d.ts +19 -113
  61. package/src/provisionPool.d.ts.map +1 -1
  62. package/src/provisionPool.js +29 -13
  63. package/src/provisionPoolKit.d.ts +36 -266
  64. package/src/provisionPoolKit.d.ts.map +1 -1
  65. package/src/provisionPoolKit.js +193 -107
  66. package/src/psm/psm.d.ts +15 -7
  67. package/src/psm/psm.d.ts.map +1 -1
  68. package/src/psm/psm.js +6 -1
  69. package/src/reserve/assetReserve.d.ts +15 -4
  70. package/src/reserve/assetReserve.d.ts.map +1 -1
  71. package/src/reserve/assetReserve.js +16 -17
  72. package/src/reserve/assetReserveKit.d.ts +32 -3
  73. package/src/reserve/assetReserveKit.d.ts.map +1 -1
  74. package/src/reserve/assetReserveKit.js +110 -2
  75. package/src/reserve/params.d.ts +9 -3
  76. package/src/reserve/params.d.ts.map +1 -1
  77. package/src/reserve/params.js +8 -2
  78. package/src/vaultFactory/burn.d.ts +1 -1
  79. package/src/vaultFactory/burn.d.ts.map +1 -1
  80. package/src/vaultFactory/liquidation.d.ts +2 -0
  81. package/src/vaultFactory/liquidation.d.ts.map +1 -1
  82. package/src/vaultFactory/liquidation.js +5 -5
  83. package/src/vaultFactory/math.d.ts +1 -1
  84. package/src/vaultFactory/math.d.ts.map +1 -1
  85. package/src/vaultFactory/math.js +1 -1
  86. package/src/vaultFactory/orderedVaultStore.d.ts +19 -18
  87. package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -1
  88. package/src/vaultFactory/orderedVaultStore.js +4 -2
  89. package/src/vaultFactory/params.d.ts +5 -2
  90. package/src/vaultFactory/params.d.ts.map +1 -1
  91. package/src/vaultFactory/params.js +5 -2
  92. package/src/vaultFactory/prioritizedVaults.d.ts +58 -57
  93. package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -1
  94. package/src/vaultFactory/prioritizedVaults.js +5 -2
  95. package/src/vaultFactory/storeUtils.d.ts +2 -2
  96. package/src/vaultFactory/storeUtils.d.ts.map +1 -1
  97. package/src/vaultFactory/types-ambient.d.ts +2 -2
  98. package/src/vaultFactory/types-ambient.d.ts.map +1 -1
  99. package/src/vaultFactory/types-ambient.js +5 -2
  100. package/src/vaultFactory/vault.d.ts +11 -10
  101. package/src/vaultFactory/vault.d.ts.map +1 -1
  102. package/src/vaultFactory/vault.js +2 -1
  103. package/src/vaultFactory/vaultDirector.d.ts +53 -47
  104. package/src/vaultFactory/vaultDirector.d.ts.map +1 -1
  105. package/src/vaultFactory/vaultDirector.js +10 -2
  106. package/src/vaultFactory/vaultFactory.d.ts +63 -15
  107. package/src/vaultFactory/vaultFactory.d.ts.map +1 -1
  108. package/src/vaultFactory/vaultFactory.js +6 -2
  109. package/src/vaultFactory/vaultHolder.d.ts +68 -24
  110. package/src/vaultFactory/vaultHolder.d.ts.map +1 -1
  111. package/src/vaultFactory/vaultHolder.js +4 -0
  112. package/src/vaultFactory/vaultKit.d.ts +8 -7
  113. package/src/vaultFactory/vaultKit.d.ts.map +1 -1
  114. package/src/vaultFactory/vaultKit.js +5 -1
  115. package/src/vaultFactory/vaultManager.d.ts +65 -63
  116. package/src/vaultFactory/vaultManager.d.ts.map +1 -1
  117. package/src/vaultFactory/vaultManager.js +58 -38
  118. package/src/proposals/add-auction.d.ts +0 -109
  119. package/src/proposals/add-auction.d.ts.map +0 -1
  120. package/src/proposals/addAssetToVault.d.ts +0 -173
  121. package/src/proposals/addAssetToVault.d.ts.map +0 -1
  122. package/src/proposals/committee-proposal.d.ts +0 -113
  123. package/src/proposals/committee-proposal.d.ts.map +0 -1
  124. package/src/proposals/core-proposal.d.ts +0 -149
  125. package/src/proposals/core-proposal.d.ts.map +0 -1
  126. package/src/proposals/deploy-price-feeds.d.ts +0 -76
  127. package/src/proposals/deploy-price-feeds.d.ts.map +0 -1
  128. package/src/proposals/econ-behaviors.d.ts +0 -541
  129. package/src/proposals/econ-behaviors.d.ts.map +0 -1
  130. package/src/proposals/price-feed-proposal.d.ts +0 -84
  131. package/src/proposals/price-feed-proposal.d.ts.map +0 -1
  132. package/src/proposals/replace-fee-distributor.d.ts +0 -48
  133. package/src/proposals/replace-fee-distributor.d.ts.map +0 -1
  134. package/src/proposals/replace-scaledPriceAuthorities.d.ts +0 -30
  135. package/src/proposals/replace-scaledPriceAuthorities.d.ts.map +0 -1
  136. package/src/proposals/replaceElectorate.d.ts +0 -55
  137. package/src/proposals/replaceElectorate.d.ts.map +0 -1
  138. package/src/proposals/startEconCommittee.d.ts +0 -34
  139. package/src/proposals/startEconCommittee.d.ts.map +0 -1
  140. package/src/proposals/startPSM.d.ts +0 -59
  141. package/src/proposals/startPSM.d.ts.map +0 -1
  142. package/src/proposals/upgrade-scaledPriceAuthorities.d.ts +0 -24
  143. package/src/proposals/upgrade-scaledPriceAuthorities.d.ts.map +0 -1
  144. package/src/proposals/upgrade-vaults.d.ts +0 -41
  145. package/src/proposals/upgrade-vaults.d.ts.map +0 -1
@@ -1,7 +1,6 @@
1
1
  // @ts-check
2
2
  import { X, q, Fail } from '@endo/errors';
3
3
  import { E } from '@endo/far';
4
- import { Far } from '@endo/marshal';
5
4
 
6
5
  import { AmountMath, BrandShape } from '@agoric/ertp';
7
6
  import { deeplyFulfilledObject, makeTracer } from '@agoric/internal';
@@ -15,8 +14,8 @@ import {
15
14
  M,
16
15
  makeScalarBigMapStore,
17
16
  makeScalarBigSetStore,
18
- prepareExoClassKit,
19
17
  } from '@agoric/vat-data';
18
+ import { makeAtomicProvider, makeScalarMapStore } from '@agoric/store';
20
19
  import { PowerFlags } from '@agoric/vats/src/walletFlags.js';
21
20
  import {
22
21
  PublicTopicShape,
@@ -25,16 +24,31 @@ import {
25
24
  import { InstanceHandleShape } from '@agoric/zoe/src/typeGuards.js';
26
25
  import { isUpgradeDisconnection } from '@agoric/internal/src/upgrade-api.js';
27
26
 
27
+ /**
28
+ * @import {EReturn} from '@endo/far';
29
+ * @import {BridgeMessage} from '@agoric/cosmic-swingset/src/types.js';
30
+ * @import {Amount, Brand, Payment, Purse} from '@agoric/ertp';
31
+ * @import {StorageNode} from '@agoric/internal/src/lib-chainStorage.js';
32
+ * @import {ZCF} from '@agoric/zoe';
33
+ * @import {ERef} from '@endo/far'
34
+ * @import {Bank, BankManager} from '@agoric/vats/src/vat-bank.js'
35
+ * @import {MapStore, SetStore} from '@agoric/store';
36
+ */
37
+
28
38
  const trace = makeTracer('ProvPool');
29
39
 
30
40
  const FIRST_UPPER_KEYWORD = /^[A-Z][a-zA-Z0-9_$]*$/;
31
41
  // see https://github.com/Agoric/agoric-sdk/issues/8238
32
42
  const FIRST_LOWER_NEAR_KEYWORD = /^[a-z][a-zA-Z0-9_$]*$/;
33
43
 
44
+ // XXX when inferred, error TS2742: cannot be named without a reference to '../../../node_modules/@endo/exo/src/get-interface.js'. This is likely not portable. A type annotation is necessary.
34
45
  /**
35
- * @import {ERef} from '@endo/far'
36
- * @import {Amount} from '@agoric/ertp/src/types.js'
37
- * @import {Bank, BankManager} from '@agoric/vats/src/vat-bank.js'
46
+ * @typedef {{
47
+ * machine: any;
48
+ * helper: any;
49
+ * forHandler: any;
50
+ * public: any;
51
+ * }} ProvisionPoolKit
38
52
  */
39
53
 
40
54
  /**
@@ -66,28 +80,48 @@ const FIRST_LOWER_NEAR_KEYWORD = /^[a-z][a-zA-Z0-9_$]*$/;
66
80
  * Given attenuated access to the funding purse, handle requests to provision
67
81
  * smart wallets.
68
82
  *
69
- * @param {(depositBank: ERef<Bank>) => Promise<void>} sendInitialPayment
70
- * @param {() => void} onProvisioned
83
+ * @param {import('@agoric/zone').Zone} zone
71
84
  */
72
- export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => {
73
- /** @param {ProvisionPoolKitReferences} refs */
74
- const makeBridgeHandler = ({
75
- bankManager,
76
- namesByAddressAdmin,
77
- walletFactory,
78
- }) =>
79
- Far('provisioningHandler', {
80
- fromBridge: async obj => {
81
- obj.type === 'PLEASE_PROVISION' ||
82
- Fail`Unrecognized request ${obj.type}`;
85
+ export const prepareBridgeProvisionTool = zone =>
86
+ zone.exoClass(
87
+ 'smartWalletProvisioningHandler',
88
+ M.interface('ProvisionBridgeHandlerMaker', {
89
+ fromBridge: M.callWhen(M.record()).returns(),
90
+ }),
91
+ /**
92
+ * @param {ERef<BankManager>} bankManager
93
+ * @param {ERef<
94
+ * EReturn<
95
+ * import('@agoric/smart-wallet/src/walletFactory.js').start
96
+ * >['creatorFacet']
97
+ * >} walletFactory
98
+ * @param {ERef<import('@agoric/vats').NameAdmin>} namesByAddressAdmin
99
+ * @param {ProvisionPoolKit['forHandler']} forHandler
100
+ */
101
+ (bankManager, walletFactory, namesByAddressAdmin, forHandler) => ({
102
+ bankManager,
103
+ walletFactory,
104
+ namesByAddressAdmin,
105
+ forHandler,
106
+ }),
107
+ {
108
+ /** @param {BridgeMessage} obj */
109
+ async fromBridge(obj) {
110
+ if (obj.type !== 'PLEASE_PROVISION')
111
+ throw Fail`Unrecognized request ${obj.type}`;
83
112
  trace('PLEASE_PROVISION', obj);
84
113
  const { address, powerFlags } = obj;
114
+ // XXX expects powerFlags to be an array, but if it's a string then
115
+ // this allows a string that has 'SMART_WALLET' in it.
85
116
  powerFlags.includes(PowerFlags.SMART_WALLET) ||
86
117
  Fail`missing SMART_WALLET in powerFlags`;
87
118
 
119
+ const { bankManager, walletFactory, namesByAddressAdmin, forHandler } =
120
+ this.state;
121
+
88
122
  const bank = E(bankManager).getBankForAddress(address);
89
123
  // only proceed if we can provide funds
90
- await sendInitialPayment(bank);
124
+ await forHandler.sendInitialPayment(bank);
91
125
 
92
126
  const [_, created] = await E(walletFactory).provideSmartWallet(
93
127
  address,
@@ -95,31 +129,44 @@ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => {
95
129
  namesByAddressAdmin,
96
130
  );
97
131
  if (created) {
98
- onProvisioned();
132
+ forHandler.onProvisioned();
99
133
  }
100
134
  trace(created ? 'provisioned' : 're-provisioned', address);
101
135
  },
102
- });
103
- return makeBridgeHandler;
104
- };
136
+ },
137
+ );
105
138
 
106
139
  /**
107
- * @param {import('@agoric/vat-data').Baggage} baggage
140
+ * @param {import('@agoric/zone').Zone} zone
108
141
  * @param {{
109
142
  * makeRecorderKit: import('@agoric/zoe/src/contractSupport/recorder.js').MakeRecorderKit;
110
143
  * params: any;
111
144
  * poolBank: import('@endo/far').ERef<Bank>;
112
145
  * zcf: ZCF;
146
+ * makeBridgeProvisionTool: ReturnType<typeof prepareBridgeProvisionTool>;
113
147
  * }} powers
114
148
  */
115
149
  export const prepareProvisionPoolKit = (
116
- baggage,
117
- { makeRecorderKit, params, poolBank, zcf },
150
+ zone,
151
+ { makeRecorderKit, params, poolBank, zcf, makeBridgeProvisionTool },
118
152
  ) => {
119
153
  const zoe = zcf.getZoeService();
154
+ const ephemeralPurses = makeScalarMapStore('fundingPurseForBrand');
155
+ const purseProvider = makeAtomicProvider(ephemeralPurses);
156
+ const getFundingPurseForBrand = async poolBrand => {
157
+ await null;
158
+ try {
159
+ const purse = await purseProvider.provideAsync(poolBrand, brand =>
160
+ E(poolBank).getPurse(brand),
161
+ );
162
+ return purse;
163
+ } catch (err) {
164
+ trace(`🚨 could not get purse for brand ${poolBrand}`, err);
165
+ throw err;
166
+ }
167
+ };
120
168
 
121
- const makeProvisionPoolKitInternal = prepareExoClassKit(
122
- baggage,
169
+ const makeProvisionPoolKitInternal = zone.exoClassKit(
123
170
  'ProvisionPoolKit',
124
171
  {
125
172
  machine: M.interface('ProvisionPoolKit machine', {
@@ -142,13 +189,14 @@ export const prepareProvisionPoolKit = (
142
189
  ackWallet: M.call(M.string()).returns(M.boolean()),
143
190
  }),
144
191
  helper: UnguardedHelperI,
192
+ forHandler: UnguardedHelperI,
145
193
  public: M.interface('ProvisionPoolKit public', {
146
194
  getPublicTopics: M.call().returns({ metrics: PublicTopicShape }),
147
195
  }),
148
196
  },
149
197
  /**
150
198
  * @param {object} opts
151
- * @param {Purse<'nat'>} opts.fundPurse
199
+ * @param {Purse<'nat'>} [opts.fundPurse]
152
200
  * @param {Brand<'nat'>} opts.poolBrand
153
201
  * @param {StorageNode} opts.metricsNode
154
202
  */
@@ -208,23 +256,24 @@ export const prepareProvisionPoolKit = (
208
256
  const refs = await deeplyFulfilledObject(obj);
209
257
  Object.assign(this.state, refs);
210
258
  },
259
+ /** @returns {import('@agoric/vats').BridgeHandler} */
211
260
  makeHandler() {
212
261
  const { bankManager, namesByAddressAdmin, walletFactory } =
213
262
  this.state;
214
263
  if (!bankManager || !namesByAddressAdmin || !walletFactory) {
215
264
  throw Fail`must set references before handling requests`;
216
265
  }
217
- const { helper } = this.facets;
218
- // a bit obtuse but leave for backwards compatibility with tests
219
- const innerMaker = makeBridgeProvisionTool(
220
- bank => helper.sendInitialPayment(bank),
221
- () => helper.onProvisioned(),
222
- );
223
- return innerMaker({
266
+
267
+ const { forHandler } = this.facets;
268
+
269
+ const provisionHandler = makeBridgeProvisionTool(
224
270
  bankManager,
225
- namesByAddressAdmin,
226
271
  walletFactory,
227
- });
272
+ namesByAddressAdmin,
273
+ forHandler,
274
+ );
275
+
276
+ return provisionHandler;
228
277
  },
229
278
  /**
230
279
  * @param {Brand} brand
@@ -302,66 +351,43 @@ export const prepareProvisionPoolKit = (
302
351
  );
303
352
  facets.helper.publishMetrics();
304
353
  },
305
- onProvisioned() {
306
- const { state, facets } = this;
307
- state.walletsProvisioned += 1n;
308
- facets.helper.publishMetrics();
309
- },
310
- /** @param {ERef<Bank>} destBank */
311
- async sendInitialPayment(destBank) {
312
- const {
313
- facets: { helper },
314
- state: { fundPurse, poolBrand },
315
- } = this;
316
- const perAccountInitialAmount = /** @type {Amount<'nat'>} */ (
317
- params.getPerAccountInitialAmount()
318
- );
319
- const initialPmt = await E(fundPurse).withdraw(
320
- perAccountInitialAmount,
321
- );
354
+ /**
355
+ * @param {Amount} amount
356
+ * @param {ERef<Purse>} srcPurse
357
+ */
358
+ async onPoolDeposit(amount, srcPurse) {
359
+ const { helper } = this.facets;
360
+ const { brandToPSM, poolBrand } = this.state;
322
361
 
323
- const destPurse = E(destBank).getPurse(poolBrand);
324
- return E(destPurse)
325
- .deposit(initialPmt)
326
- .then(amt => {
327
- helper.onSendFunds(perAccountInitialAmount);
328
- trace('provisionPool sent', amt);
329
- })
330
- .catch(reason => {
331
- console.error(X`initial deposit failed: ${q(reason)}`);
332
- void E(fundPurse).deposit(initialPmt);
333
- throw reason;
334
- });
362
+ const { brand } = amount;
363
+ if (AmountMath.isEmpty(amount) || brand === poolBrand) {
364
+ return;
365
+ }
366
+
367
+ // `amount` doesn't match the current `poolBrand`, so we need to swap
368
+ // it.
369
+ if (!brandToPSM.has(brand)) {
370
+ console.error('funds arrived but no PSM instance', brand);
371
+ return;
372
+ }
373
+ const instance = brandToPSM.get(brand);
374
+ const payment = E(srcPurse).withdraw(amount);
375
+ await helper.swap(payment, amount, instance).catch(async reason => {
376
+ console.error(X`swap failed: ${reason}`);
377
+ const resolvedPayment = await payment;
378
+ return E(srcPurse).deposit(resolvedPayment);
379
+ });
335
380
  },
336
381
  /**
337
382
  * @param {ERef<Purse>} exchangePurse
338
383
  * @param {ERef<Brand>} brand
339
384
  */
340
385
  watchCurrentAmount(exchangePurse, brand) {
341
- const {
342
- state: { brandToPSM, poolBrand },
343
- facets: { helper },
344
- } = this;
345
-
386
+ const { helper } = this.facets;
346
387
  void observeNotifier(E(exchangePurse).getCurrentAmountNotifier(), {
347
388
  updateState: async amount => {
348
389
  trace('provisionPool balance update', amount);
349
- if (AmountMath.isEmpty(amount) || amount.brand === poolBrand) {
350
- return;
351
- }
352
- if (!brandToPSM.has(brand)) {
353
- console.error('funds arrived but no PSM instance', brand);
354
- return;
355
- }
356
- const instance = brandToPSM.get(brand);
357
- const payment = E(exchangePurse).withdraw(amount);
358
- await helper
359
- .swap(payment, amount, instance)
360
- .catch(async reason => {
361
- console.error(X`swap failed: ${reason}`);
362
- const resolvedPayment = await payment;
363
- return E(exchangePurse).deposit(resolvedPayment);
364
- });
390
+ await helper.onPoolDeposit(amount, exchangePurse);
365
391
  },
366
392
  fail: reason => {
367
393
  if (isUpgradeDisconnection(reason)) {
@@ -427,40 +453,50 @@ export const prepareProvisionPoolKit = (
427
453
  );
428
454
  },
429
455
  /**
456
+ * @param {Brand<'nat'>} poolBrand
430
457
  * @param {object} [options]
431
458
  * @param {MetricsNotification} [options.metrics]
432
459
  */
433
- start({ metrics } = {}) {
434
- const {
435
- state: { poolBrand },
436
- facets: { helper },
437
- } = this;
460
+ start(poolBrand, { metrics } = {}) {
461
+ const { facets, state } = this;
462
+ const { helper } = facets;
463
+ const lastPoolBrand = state.poolBrand;
438
464
 
439
- // Must match. poolBrand is from durable state and the param is from
440
- // the contract, so it technically can change between incarnations.
441
- // That would be a severe bug.
465
+ // The PerAccountInitialAmount param must use the correct brand for
466
+ // this incarnation.
442
467
  AmountMath.coerce(poolBrand, params.getPerAccountInitialAmount());
443
468
 
444
- void helper.watchAssetSubscription();
445
-
469
+ // Restore old metrics.
446
470
  if (metrics) {
447
- // Restore state.
448
- // we publishMetrics() below
449
471
  const {
450
472
  walletsProvisioned,
451
473
  totalMintedProvided,
452
474
  totalMintedConverted,
453
475
  } = metrics;
454
476
  assert.typeof(walletsProvisioned, 'bigint');
455
- AmountMath.coerce(poolBrand, totalMintedProvided);
456
- AmountMath.coerce(poolBrand, totalMintedConverted);
457
- Object.assign(this.state, {
477
+ AmountMath.coerce(lastPoolBrand, totalMintedProvided);
478
+ AmountMath.coerce(lastPoolBrand, totalMintedConverted);
479
+ Object.assign(state, {
458
480
  walletsProvisioned,
459
481
  totalMintedProvided,
460
482
  totalMintedConverted,
461
483
  });
462
484
  helper.publishMetrics();
463
485
  }
486
+
487
+ // Update as needed when `poolBrand` changes.
488
+ if (poolBrand !== lastPoolBrand) {
489
+ state.poolBrand = poolBrand;
490
+ state.fundPurse = undefined;
491
+ void getFundingPurseForBrand(poolBrand).then(purse =>
492
+ helper.updateFundPurse(purse, poolBrand),
493
+ );
494
+ state.totalMintedProvided = AmountMath.makeEmpty(poolBrand);
495
+ state.totalMintedConverted = AmountMath.makeEmpty(poolBrand);
496
+ helper.publishMetrics();
497
+ }
498
+
499
+ void helper.watchAssetSubscription();
464
500
  },
465
501
  /**
466
502
  * @param {ERef<Payment>} payIn
@@ -468,10 +504,13 @@ export const prepareProvisionPoolKit = (
468
504
  * @param {PsmInstance} instance
469
505
  */
470
506
  async swap(payIn, amount, instance) {
507
+ await null;
508
+ const { facets, state } = this;
509
+ const { helper } = facets;
471
510
  const {
472
- facets: { helper },
473
- state: { fundPurse },
474
- } = this;
511
+ poolBrand,
512
+ fundPurse = await getFundingPurseForBrand(poolBrand),
513
+ } = state;
475
514
  const psmPub = E(zoe).getPublicFacet(instance);
476
515
  const proposal = harden({ give: { In: amount } });
477
516
  const invitation = E(psmPub).makeWantMintedInvitation();
@@ -481,6 +520,52 @@ export const prepareProvisionPoolKit = (
481
520
  helper.onTrade(rxd);
482
521
  return rxd;
483
522
  },
523
+ /**
524
+ * @param {Purse<'nat'>} purse
525
+ * @param {Brand<'nat'>} brand
526
+ */
527
+ updateFundPurse(purse, brand) {
528
+ const { state } = this;
529
+ if (brand !== state.poolBrand || state.fundPurse) return;
530
+ state.fundPurse = purse;
531
+ },
532
+ },
533
+ forHandler: {
534
+ onProvisioned() {
535
+ const { facets, state } = this;
536
+ state.walletsProvisioned += 1n;
537
+ facets.helper.publishMetrics();
538
+ },
539
+ /** @param {ERef<Bank>} destBank */
540
+ async sendInitialPayment(destBank) {
541
+ await null;
542
+ const { facets, state } = this;
543
+ const { helper } = facets;
544
+ const {
545
+ poolBrand,
546
+ fundPurse = await getFundingPurseForBrand(poolBrand),
547
+ } = state;
548
+ const perAccountInitialAmount = /** @type {Amount<'nat'>} */ (
549
+ params.getPerAccountInitialAmount()
550
+ );
551
+ trace('sendInitialPayment withdrawing', perAccountInitialAmount);
552
+ const initialPmt = await E(fundPurse).withdraw(
553
+ perAccountInitialAmount,
554
+ );
555
+
556
+ const destPurse = E(destBank).getPurse(poolBrand);
557
+ return E(destPurse)
558
+ .deposit(initialPmt)
559
+ .then(amt => {
560
+ helper.onSendFunds(perAccountInitialAmount);
561
+ trace('provisionPool sent', amt);
562
+ })
563
+ .catch(reason => {
564
+ console.error(X`initial deposit failed: ${q(reason)}`);
565
+ void E(fundPurse).deposit(initialPmt);
566
+ throw reason;
567
+ });
568
+ },
484
569
  },
485
570
  public: {
486
571
  getPublicTopics() {
@@ -506,9 +591,10 @@ export const prepareProvisionPoolKit = (
506
591
  * @param {object} opts
507
592
  * @param {Brand<'nat'>} opts.poolBrand
508
593
  * @param {ERef<StorageNode>} opts.storageNode
594
+ * @returns {Promise<ProvisionPoolKit>}
509
595
  */
510
596
  const makeProvisionPoolKit = async ({ poolBrand, storageNode }) => {
511
- const fundPurse = await E(poolBank).getPurse(poolBrand);
597
+ const fundPurse = await getFundingPurseForBrand(poolBrand);
512
598
  const metricsNode = await E(storageNode).makeChildNode('metrics');
513
599
 
514
600
  return makeProvisionPoolKitInternal({
package/src/psm/psm.d.ts CHANGED
@@ -5,6 +5,10 @@
5
5
  * economic policies, the fee percentage for trading into and out of the
6
6
  * stable token are specified separately.
7
7
  */
8
+ /**
9
+ * @import {EReturn} from '@endo/far';
10
+ * @import {ContractMeta, FeeMintAccess, Installation} from '@agoric/zoe';
11
+ */
8
12
  /**
9
13
  * @typedef {object} MetricsNotification Metrics naming scheme is that nouns are
10
14
  * present values and past-participles are accumulative.
@@ -47,7 +51,7 @@ export function start(zcf: ZCF<GovernanceTerms<{
47
51
  } & {
48
52
  Electorate: "invitation";
49
53
  }>;
50
- } & import("@endo/pass-style").RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
54
+ } & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
51
55
  get: () => import("@agoric/governance/src/contractGovernance/typedParamManager.js").TypedParamManager<{
52
56
  GiveMintedFee: "ratio";
53
57
  MintLimit: "amount";
@@ -56,11 +60,11 @@ export function start(zcf: ZCF<GovernanceTerms<{
56
60
  Electorate: "invitation";
57
61
  }>;
58
62
  }>;
59
- getInvitation: (name: any) => Promise<Invitation<unknown, undefined>>;
63
+ getInvitation: (name: any) => Promise<globalThis.Invitation>;
60
64
  getLimitedCreatorFacet: () => import("@endo/exo").Guarded<{
61
65
  getRewardAllocation(): Allocation;
62
- makeCollectFeesInvitation(): Promise<Invitation<string, undefined>>;
63
- makeRestoreMetricsInvitation(): Promise<Invitation<void, Omit<MetricsNotification, "anchorPoolBalance">>>;
66
+ makeCollectFeesInvitation(): Promise<globalThis.Invitation<string>>;
67
+ makeRestoreMetricsInvitation(): Promise<globalThis.Invitation<void, Omit<MetricsNotification, "anchorPoolBalance">>>;
64
68
  }>;
65
69
  getGovernedApis: () => GovernedApis;
66
70
  getGovernedApiNames: () => string[];
@@ -85,8 +89,8 @@ export function start(zcf: ZCF<GovernanceTerms<{
85
89
  getPublicTopics(): {
86
90
  metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<MetricsNotification>;
87
91
  };
88
- makeWantMintedInvitation(): Promise<Invitation<void, undefined>>;
89
- makeGiveMintedInvitation(): Promise<Invitation<void, undefined>>;
92
+ makeWantMintedInvitation(): Promise<globalThis.Invitation<void, undefined>>;
93
+ makeGiveMintedInvitation(): Promise<globalThis.Invitation<void, undefined>>;
90
94
  }>;
91
95
  }>;
92
96
  /**
@@ -120,6 +124,10 @@ export type MetricsNotification = {
120
124
  */
121
125
  totalMintedProvided: Amount<"nat">;
122
126
  };
123
- export type PsmPublicFacet = Awaited<ReturnType<typeof start>>["publicFacet"];
127
+ export type PsmPublicFacet = EReturn<typeof start>["publicFacet"];
128
+ import type { ContractMeta } from '@agoric/zoe';
129
+ import type { FeeMintAccess } from '@agoric/zoe';
124
130
  import type { Baggage } from '@agoric/vat-data';
131
+ import type { Installation } from '@agoric/zoe';
132
+ import type { EReturn } from '@endo/far';
125
133
  //# sourceMappingURL=psm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"AAqCA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AAEH,2BAA2B;AAC3B,mBADW,YAAY,CAkCrB;AAsBK,2BAlBI,GAAG,CACT,eAAe,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,QAAQ,CAAC;CACrB,CAAC,GAAG;IACH,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,eAAe,EAAE,KAAK,CAAC;CACxB,CACF,eACO;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,UAAU,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB,WACO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAsU4F,cAAc;kDAAuE,cAAc;;;;;;;;;;;;GAJhN;;;;;;;;;;uBAzYa,MAAM,CAAC,KAAK,CAAC;;;;;uBAEb,MAAM,CAAC,KAAK,CAAC;;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;6BAoYb,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;6BA9XpC,kBAAkB"}
1
+ {"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"AAqCA;;;;;;GAMG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AAEH,2BAA2B;AAC3B,mBADW,YAAY,CAkCrB;AAsBK,2BAlBI,GAAG,CACT,eAAe,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,QAAQ,CAAC;CACrB,CAAC,GAAG;IACH,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,eAAe,EAAE,KAAK,CAAC;CACxB,CACF,eACO;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,UAAU,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB,WACO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkUjB;;;;;;;;;;uBAzYa,MAAM,CAAC,KAAK,CAAC;;;;;uBAEb,MAAM,CAAC,KAAK,CAAC;;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;6BAoYb,QAAQ,OAAO,KAAK,CAAb,CAAe,aAAa,CAAC;kCAlZU,aAAa;mCAAb,aAAa;6BAoB/C,kBAAkB;kCApBgB,aAAa;6BAD/C,WAAW"}
package/src/psm/psm.js CHANGED
@@ -43,6 +43,11 @@ import { makeNatAmountShape } from '../contractSupport.js';
43
43
  * stable token are specified separately.
44
44
  */
45
45
 
46
+ /**
47
+ * @import {EReturn} from '@endo/far';
48
+ * @import {ContractMeta, FeeMintAccess, Installation} from '@agoric/zoe';
49
+ */
50
+
46
51
  /**
47
52
  * @typedef {object} MetricsNotification Metrics naming scheme is that nouns are
48
53
  * present values and past-participles are accumulative.
@@ -442,4 +447,4 @@ export const start = async (zcf, privateArgs, baggage) => {
442
447
  };
443
448
  harden(start);
444
449
 
445
- /** @typedef {Awaited<ReturnType<typeof start>>['publicFacet']} PsmPublicFacet */
450
+ /** @typedef {EReturn<typeof start>['publicFacet']} PsmPublicFacet */
@@ -12,14 +12,19 @@ export function start(zcf: ZCF<GovernanceTerms<{}> & {
12
12
  creatorFacet: GovernedCreatorFacet<import("@endo/exo").Guarded<{
13
13
  addIssuer(issuer: Issuer, keyword: string): Promise<void>;
14
14
  getAllocations(): Allocation;
15
- makeShortfallReportingInvitation(): Promise<Invitation<import("@endo/exo").Guarded<{
15
+ makeShortfallReportingInvitation(): Promise<globalThis.Invitation<import("@endo/exo").Guarded<{
16
16
  increaseLiquidationShortfall(shortfall: Amount<"nat">): void;
17
17
  reduceLiquidationShortfall(reduction: Amount<"nat">): void;
18
18
  }>, undefined>>;
19
+ makeSingleWithdrawalInvitation(): Promise<globalThis.Invitation<any, undefined>>;
20
+ makeRepeatableWithdrawalInvitation(): Promise<globalThis.Invitation<{
21
+ invitationMakers: Partial<any>;
22
+ }, undefined>>;
23
+ revokeOutstandingWithdrawalInvitations(): void;
19
24
  }>>;
20
25
  /** @type {GovernedPublicFacet<typeof assetReserveKit.public>} */
21
26
  publicFacet: GovernedPublicFacet<import("@endo/exo").Guarded<{
22
- makeAddCollateralInvitation(): Promise<Invitation<string, never>>;
27
+ makeAddCollateralInvitation(): Promise<globalThis.Invitation<string, never>>;
23
28
  getPublicTopics(): {
24
29
  metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./assetReserveKit.js").MetricsNotification>;
25
30
  };
@@ -38,10 +43,16 @@ export type AssetReserveLimitedCreatorFacet = {
38
43
  getAllocations: () => Allocation;
39
44
  makeShortfallReportingInvitation: () => Promise<Invitation<ShortfallReporter>>;
40
45
  };
41
- export type AssetReservePublicFacet = Awaited<ReturnType<typeof start>>["publicFacet"];
46
+ export type AssetReservePublicFacet = EReturn<typeof start>["publicFacet"];
42
47
  /**
43
48
  * the creator facet for the governor
44
49
  */
45
- export type AssetReserveCreatorFacet = Awaited<ReturnType<typeof start>>["creatorFacet"];
50
+ export type AssetReserveCreatorFacet = EReturn<typeof start>["creatorFacet"];
51
+ export type ReserveContract = ContractOf<typeof start>;
52
+ import type { ContractMeta } from '@agoric/zoe';
53
+ import type { FeeMintAccess } from '@agoric/zoe';
46
54
  import type { Baggage } from '@agoric/vat-data';
55
+ import type { Allocation } from '@agoric/zoe';
56
+ import type { EReturn } from '@endo/far';
57
+ import type { ContractOf } from '@agoric/zoe/src/zoeService/utils.js';
47
58
  //# sourceMappingURL=assetReserve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assetReserve.d.ts","sourceRoot":"","sources":["assetReserve.js"],"names":[],"mappings":"AAYA,yCAAyC;AACzC,mBADW,YAAY,CAAC,OAAO,KAAK,CAAC,CAGnC;AAgCK,2BAbI,GAAG,CACT,eAAe,CAAC,EAAE,CAAC,GAAG;IACpB,YAAY,EAAE,CAAC,2BAA2B,CAAC,CAAC;CAC7C,CACF,eACO;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,UAAU,CAAC;IACnC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;CAChC,WACO,OAAO;IA6Dd,mEAAmE;kBAAxD,oBAAoB;;;;;;;OAAgC;IAE/D,iEAAiE;iBAAtD,mBAAmB;;;;;OAA+B;GAKhE;sCA9FY;IACR,4BAA4B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;;kCAgGU,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;gCAC3B,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;;;eAK3B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;oBACrC,MAAM,UAAU;sCAChB,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;;sCAG5C,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;;;;uCAEjD,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;6BA1GnC,kBAAkB"}
1
+ {"version":3,"file":"assetReserve.d.ts","sourceRoot":"","sources":["assetReserve.js"],"names":[],"mappings":"AAkBA,yCAAyC;AACzC,mBADW,aAAa,OAAO,KAAK,CAAC,CAGnC;AAgCK,2BAbI,GAAG,CACT,eAAe,CAAC,EAAE,CAAC,GAAG;IACpB,YAAY,EAAE,CAAC,2BAA2B,CAAC,CAAC;CAC7C,CACF,eACO;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,UAAU,CAAC;IACnC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;CAChC,WACO,OAAO;IAoDd,mEAAmE;kBAAxD,oBAAoB;;;;;;;;;;;;OAAgC;IAE/D,iEAAiE;iBAAtD,mBAAmB;;;;;OAA+B;GAKhE;sCArFY;IACR,4BAA4B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;;kCAuFU,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;gCAC3B,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;;;eAK3B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;oBACrC,MAAM,UAAU;sCAChB,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;;sCAG5C,QAAQ,OAAO,KAAK,CAAb,CAAe,aAAa,CAAC;;;;uCAErC,QAAQ,OAAO,KAAK,CAAb,CAAe,cAAc,CAAC;8BAIpC,WAAW,OAAO,KAAK,CAAC;kCAvHkC,aAAa;mCAAb,aAAa;6BAkB1D,kBAAkB;gCAlB2B,aAAa;6BAF3D,WAAW;gCACR,qCAAqC"}
@@ -8,6 +8,12 @@ import {
8
8
  } from '@agoric/zoe/src/contractSupport/index.js';
9
9
  import { prepareAssetReserveKit } from './assetReserveKit.js';
10
10
 
11
+ /**
12
+ * @import {EReturn} from '@endo/far';
13
+ * @import {ContractOf} from '@agoric/zoe/src/zoeService/utils.js';
14
+ * @import {Allocation, ContractMeta, FeeMintAccess, Installation} from '@agoric/zoe';
15
+ */
16
+
11
17
  const trace = makeTracer('AR', true);
12
18
 
13
19
  /** @type {ContractMeta<typeof start>} */
@@ -57,22 +63,13 @@ export const start = async (zcf, privateArgs, baggage) => {
57
63
  privateArgs.marshaller,
58
64
  );
59
65
 
60
- /** @type {() => Promise<ZCFMint<'nat'>>} */
61
- const takeFeeMint = async () => {
62
- if (baggage.has('feeMint')) {
63
- return baggage.get('feeMint');
64
- }
65
-
66
- const feeMintTemp = await zcf.registerFeeMint(
67
- 'Fee',
68
- privateArgs.feeMintAccess,
69
- );
70
- baggage.init('feeMint', feeMintTemp);
71
- return feeMintTemp;
72
- };
73
- trace('awaiting takeFeeMint');
74
- const feeMint = await takeFeeMint();
75
66
  const storageNode = await privateArgs.storageNode;
67
+
68
+ trace('awaiting feeMint');
69
+ const { feeMint } = await provideAll(baggage, {
70
+ feeMint: () => zcf.registerFeeMint('Fee', privateArgs.feeMintAccess),
71
+ });
72
+
76
73
  const makeAssetReserveKit = await prepareAssetReserveKit(baggage, {
77
74
  feeMint,
78
75
  makeRecorderKit,
@@ -127,8 +124,10 @@ harden(start);
127
124
  * @property {() => Promise<Invitation<ShortfallReporter>>} makeShortfallReportingInvitation
128
125
  */
129
126
 
130
- /** @typedef {Awaited<ReturnType<typeof start>>['publicFacet']} AssetReservePublicFacet */
127
+ /** @typedef {EReturn<typeof start>['publicFacet']} AssetReservePublicFacet */
131
128
  /**
132
- * @typedef {Awaited<ReturnType<typeof start>>['creatorFacet']} AssetReserveCreatorFacet
129
+ * @typedef {EReturn<typeof start>['creatorFacet']} AssetReserveCreatorFacet
133
130
  * the creator facet for the governor
134
131
  */
132
+
133
+ /** @typedef {ContractOf<typeof start>} ReserveContract */