@agoric/inter-protocol 0.16.2-upgrade-14-dev-c8f9e7b.0 → 0.16.2-upgrade-16-fi-dev-8879538.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 (175) hide show
  1. package/package.json +41 -34
  2. package/scripts/build-bundles.js +5 -21
  3. package/src/auction/auctionBook.d.ts +84 -0
  4. package/src/auction/auctionBook.d.ts.map +1 -0
  5. package/src/auction/auctionBook.js +135 -103
  6. package/src/auction/auctioneer.d.ts +83 -0
  7. package/src/auction/auctioneer.d.ts.map +1 -0
  8. package/src/auction/auctioneer.js +63 -49
  9. package/src/auction/offerBook.d.ts +45 -0
  10. package/src/auction/offerBook.d.ts.map +1 -0
  11. package/src/auction/offerBook.js +13 -12
  12. package/src/auction/params.d.ts +149 -0
  13. package/src/auction/params.d.ts.map +1 -0
  14. package/src/auction/params.js +10 -9
  15. package/src/auction/scheduleMath.d.ts +5 -0
  16. package/src/auction/scheduleMath.d.ts.map +1 -0
  17. package/src/auction/scheduleMath.js +17 -15
  18. package/src/auction/scheduler.d.ts +49 -0
  19. package/src/auction/scheduler.d.ts.map +1 -0
  20. package/src/auction/scheduler.js +51 -43
  21. package/src/auction/sortedOffers.d.ts +8 -0
  22. package/src/auction/sortedOffers.d.ts.map +1 -0
  23. package/src/auction/sortedOffers.js +9 -7
  24. package/src/auction/util.d.ts +32 -0
  25. package/src/auction/util.d.ts.map +1 -0
  26. package/src/auction/util.js +6 -4
  27. package/src/clientSupport.d.ts +167 -0
  28. package/src/clientSupport.d.ts.map +1 -0
  29. package/src/clientSupport.js +97 -40
  30. package/src/collectFees.d.ts +2 -0
  31. package/src/collectFees.d.ts.map +1 -0
  32. package/src/contractSupport.d.ts +28 -0
  33. package/src/contractSupport.d.ts.map +1 -0
  34. package/src/contractSupport.js +14 -12
  35. package/src/econCommitteeCharter.d.ts +39 -0
  36. package/src/econCommitteeCharter.d.ts.map +1 -0
  37. package/src/econCommitteeCharter.js +21 -20
  38. package/src/feeDistributor.d.ts +224 -0
  39. package/src/feeDistributor.d.ts.map +1 -0
  40. package/src/feeDistributor.js +37 -33
  41. package/src/index.d.ts +2 -0
  42. package/src/index.d.ts.map +1 -0
  43. package/src/index.js +1 -0
  44. package/src/interest-math.d.ts +3 -0
  45. package/src/interest-math.d.ts.map +1 -0
  46. package/src/interest.d.ts +28 -0
  47. package/src/interest.d.ts.map +1 -0
  48. package/src/interest.js +21 -16
  49. package/src/price/README.md +13 -0
  50. package/src/price/fluxAggregatorContract.d.ts +70 -0
  51. package/src/price/fluxAggregatorContract.d.ts.map +1 -0
  52. package/src/price/fluxAggregatorContract.js +62 -55
  53. package/src/price/fluxAggregatorKit.d.ts +103 -0
  54. package/src/price/fluxAggregatorKit.d.ts.map +1 -0
  55. package/src/price/fluxAggregatorKit.js +50 -37
  56. package/src/price/priceOracleKit.d.ts +38 -0
  57. package/src/price/priceOracleKit.d.ts.map +1 -0
  58. package/src/price/priceOracleKit.js +11 -13
  59. package/src/price/roundsManager.d.ts +238 -0
  60. package/src/price/roundsManager.d.ts.map +1 -0
  61. package/src/price/roundsManager.js +77 -82
  62. package/src/proposals/README.md +2 -3
  63. package/src/proposals/add-auction.d.ts +69 -0
  64. package/src/proposals/add-auction.d.ts.map +1 -0
  65. package/src/proposals/add-auction.js +181 -0
  66. package/src/proposals/addAssetToVault.d.ts +160 -0
  67. package/src/proposals/addAssetToVault.d.ts.map +1 -0
  68. package/src/proposals/addAssetToVault.js +172 -38
  69. package/src/proposals/committee-proposal.d.ts +113 -0
  70. package/src/proposals/committee-proposal.d.ts.map +1 -0
  71. package/src/proposals/committee-proposal.js +25 -31
  72. package/src/proposals/core-proposal.d.ts +149 -0
  73. package/src/proposals/core-proposal.d.ts.map +1 -0
  74. package/src/proposals/core-proposal.js +9 -11
  75. package/src/proposals/econ-behaviors.d.ts +1169 -0
  76. package/src/proposals/econ-behaviors.d.ts.map +1 -0
  77. package/src/proposals/econ-behaviors.js +66 -45
  78. package/src/proposals/price-feed-proposal.d.ts +84 -0
  79. package/src/proposals/price-feed-proposal.d.ts.map +1 -0
  80. package/src/proposals/price-feed-proposal.js +108 -51
  81. package/src/proposals/startEconCommittee.d.ts +34 -0
  82. package/src/proposals/startEconCommittee.d.ts.map +1 -0
  83. package/src/proposals/startEconCommittee.js +2 -2
  84. package/src/proposals/startPSM.d.ts +59 -0
  85. package/src/proposals/startPSM.d.ts.map +1 -0
  86. package/src/proposals/startPSM.js +38 -27
  87. package/src/proposals/upgrade-scaledPriceAuthorities.d.ts +24 -0
  88. package/src/proposals/upgrade-scaledPriceAuthorities.d.ts.map +1 -0
  89. package/src/proposals/upgrade-scaledPriceAuthorities.js +78 -0
  90. package/src/proposals/upgrade-vaults.d.ts +35 -0
  91. package/src/proposals/upgrade-vaults.d.ts.map +1 -0
  92. package/src/proposals/upgrade-vaults.js +202 -0
  93. package/src/proposals/utils.d.ts +17 -0
  94. package/src/proposals/utils.d.ts.map +1 -0
  95. package/src/proposals/utils.js +34 -7
  96. package/src/provisionPool.d.ts +167 -0
  97. package/src/provisionPool.d.ts.map +1 -0
  98. package/src/provisionPool.js +122 -0
  99. package/src/provisionPoolKit.d.ts +770 -0
  100. package/src/provisionPoolKit.d.ts.map +1 -0
  101. package/src/provisionPoolKit.js +463 -0
  102. package/src/psm/psm.d.ts +122 -0
  103. package/src/psm/psm.d.ts.map +1 -0
  104. package/src/psm/psm.js +73 -69
  105. package/src/psm/types-ambient.d.ts +2 -0
  106. package/src/psm/types-ambient.d.ts.map +1 -0
  107. package/src/psm/types-ambient.js +3 -0
  108. package/src/reserve/assetReserve.d.ts +47 -0
  109. package/src/reserve/assetReserve.d.ts.map +1 -0
  110. package/src/reserve/assetReserve.js +28 -19
  111. package/src/reserve/assetReserveKit.d.ts +74 -0
  112. package/src/reserve/assetReserveKit.d.ts.map +1 -0
  113. package/src/reserve/assetReserveKit.js +18 -24
  114. package/src/reserve/params.d.ts +10 -0
  115. package/src/reserve/params.d.ts.map +1 -0
  116. package/src/tokens.d.ts +3 -0
  117. package/src/tokens.d.ts.map +1 -0
  118. package/src/tokens.js +5 -0
  119. package/src/vaultFactory/burn.d.ts +2 -0
  120. package/src/vaultFactory/burn.d.ts.map +1 -0
  121. package/src/vaultFactory/burn.js +1 -1
  122. package/src/vaultFactory/liquidation.d.ts +163 -0
  123. package/src/vaultFactory/liquidation.d.ts.map +1 -0
  124. package/src/vaultFactory/liquidation.js +36 -22
  125. package/src/vaultFactory/math.d.ts +11 -0
  126. package/src/vaultFactory/math.d.ts.map +1 -0
  127. package/src/vaultFactory/math.js +10 -9
  128. package/src/vaultFactory/orderedVaultStore.d.ts +360 -0
  129. package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -0
  130. package/src/vaultFactory/orderedVaultStore.js +8 -11
  131. package/src/vaultFactory/params.d.ts +145 -0
  132. package/src/vaultFactory/params.d.ts.map +1 -0
  133. package/src/vaultFactory/params.js +52 -24
  134. package/src/vaultFactory/prioritizedVaults.d.ts +992 -0
  135. package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -0
  136. package/src/vaultFactory/prioritizedVaults.js +4 -4
  137. package/src/vaultFactory/proceeds.d.ts +35 -0
  138. package/src/vaultFactory/proceeds.d.ts.map +1 -0
  139. package/src/vaultFactory/proceeds.js +26 -18
  140. package/src/vaultFactory/storeUtils.d.ts +25 -0
  141. package/src/vaultFactory/storeUtils.d.ts.map +1 -0
  142. package/src/vaultFactory/storeUtils.js +10 -12
  143. package/src/vaultFactory/types-ambient.d.ts +234 -0
  144. package/src/vaultFactory/types-ambient.d.ts.map +1 -0
  145. package/src/vaultFactory/{types.js → types-ambient.js} +42 -42
  146. package/src/vaultFactory/vault.d.ts +402 -0
  147. package/src/vaultFactory/vault.d.ts.map +1 -0
  148. package/src/vaultFactory/vault.js +99 -93
  149. package/src/vaultFactory/vaultDirector.d.ts +388 -0
  150. package/src/vaultFactory/vaultDirector.d.ts.map +1 -0
  151. package/src/vaultFactory/vaultDirector.js +61 -50
  152. package/src/vaultFactory/vaultFactory.d.ts +277 -0
  153. package/src/vaultFactory/vaultFactory.d.ts.map +1 -0
  154. package/src/vaultFactory/vaultFactory.js +49 -32
  155. package/src/vaultFactory/vaultHolder.d.ts +270 -0
  156. package/src/vaultFactory/vaultHolder.d.ts.map +1 -0
  157. package/src/vaultFactory/vaultHolder.js +10 -14
  158. package/src/vaultFactory/vaultKit.d.ts +102 -0
  159. package/src/vaultFactory/vaultKit.d.ts.map +1 -0
  160. package/src/vaultFactory/vaultKit.js +5 -4
  161. package/src/vaultFactory/vaultManager.d.ts +819 -0
  162. package/src/vaultFactory/vaultManager.d.ts.map +1 -0
  163. package/src/vaultFactory/vaultManager.js +248 -151
  164. package/CHANGELOG.md +0 -1066
  165. package/exported.js +0 -2
  166. package/scripts/add-collateral-core.js +0 -113
  167. package/scripts/deploy-contracts.js +0 -100
  168. package/scripts/init-core.js +0 -200
  169. package/scripts/invite-committee-core.js +0 -42
  170. package/scripts/manual-price-feed.js +0 -117
  171. package/scripts/price-feed-core.js +0 -104
  172. package/scripts/start-local-chain.sh +0 -84
  173. package/src/psm/types.js +0 -3
  174. package/src/typeGuards.js +0 -13
  175. package/src/vaultFactory/type-imports.js +0 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisionPoolKit.d.ts","sourceRoot":"","sources":["provisionPoolKit.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,463 @@
1
+ // @ts-check
2
+ import { AmountMath, BrandShape } from '@agoric/ertp';
3
+ import { deeplyFulfilledObject } from '@agoric/internal';
4
+ import { UnguardedHelperI } from '@agoric/internal/src/typeGuards.js';
5
+ import {
6
+ observeIteration,
7
+ observeNotifier,
8
+ subscribeEach,
9
+ } from '@agoric/notifier';
10
+ import {
11
+ M,
12
+ makeScalarBigMapStore,
13
+ makeScalarBigSetStore,
14
+ prepareExoClassKit,
15
+ } from '@agoric/vat-data';
16
+ import { PowerFlags } from '@agoric/vats/src/walletFlags.js';
17
+ import {
18
+ PublicTopicShape,
19
+ makeRecorderTopic,
20
+ } from '@agoric/zoe/src/contractSupport/topics.js';
21
+ import { InstanceHandleShape } from '@agoric/zoe/src/typeGuards.js';
22
+ import { E } from '@endo/far';
23
+ import { Far } from '@endo/marshal';
24
+
25
+ const { details: X, quote: q, Fail } = assert;
26
+
27
+ /**
28
+ * @import {ERef} from '@endo/far'
29
+ * @import {Amount} from '@agoric/ertp/src/types.js'
30
+ * @import {Bank, BankManager} from '@agoric/vats/src/vat-bank.js'
31
+ */
32
+
33
+ /**
34
+ * @typedef {import('@agoric/zoe/src/zoeService/utils.js').Instance<
35
+ * import('@agoric/inter-protocol/src/psm/psm.js').start
36
+ * >} PsmInstance
37
+ */
38
+
39
+ /**
40
+ * @typedef {object} ProvisionPoolKitReferences
41
+ * @property {ERef<BankManager>} bankManager
42
+ * @property {ERef<import('@agoric/vats').NameAdmin>} namesByAddressAdmin
43
+ * @property {ERef<
44
+ * import('@agoric/vats/src/core/startWalletFactory.js').WalletFactoryStartResult['creatorFacet']
45
+ * >} walletFactory
46
+ */
47
+
48
+ /**
49
+ * @typedef {object} MetricsNotification Metrics naming scheme is that nouns are
50
+ * present values and past-participles are accumulative.
51
+ * @property {bigint} walletsProvisioned count of new wallets provisioned
52
+ * @property {Amount<'nat'>} totalMintedProvided running sum of Minted provided
53
+ * to new wallets
54
+ * @property {Amount<'nat'>} totalMintedConverted running sum of Minted ever
55
+ * received by the contract from PSM
56
+ */
57
+
58
+ /**
59
+ * Given attenuated access to the funding purse, handle requests to provision
60
+ * smart wallets.
61
+ *
62
+ * @param {(depositBank: ERef<Bank>) => Promise<void>} sendInitialPayment
63
+ * @param {() => void} onProvisioned
64
+ */
65
+ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => {
66
+ /** @param {ProvisionPoolKitReferences} refs */
67
+ const makeBridgeHandler = ({
68
+ bankManager,
69
+ namesByAddressAdmin,
70
+ walletFactory,
71
+ }) =>
72
+ Far('provisioningHandler', {
73
+ fromBridge: async obj => {
74
+ obj.type === 'PLEASE_PROVISION' ||
75
+ Fail`Unrecognized request ${obj.type}`;
76
+ console.info('PLEASE_PROVISION', obj);
77
+ const { address, powerFlags } = obj;
78
+ powerFlags.includes(PowerFlags.SMART_WALLET) ||
79
+ Fail`missing SMART_WALLET in powerFlags`;
80
+
81
+ const bank = E(bankManager).getBankForAddress(address);
82
+ // only proceed if we can provide funds
83
+ await sendInitialPayment(bank);
84
+
85
+ const [_, created] = await E(walletFactory).provideSmartWallet(
86
+ address,
87
+ bank,
88
+ namesByAddressAdmin,
89
+ );
90
+ if (created) {
91
+ onProvisioned();
92
+ }
93
+ console.info(created ? 'provisioned' : 're-provisioned', address);
94
+ },
95
+ });
96
+ return makeBridgeHandler;
97
+ };
98
+
99
+ /**
100
+ * @param {import('@agoric/vat-data').Baggage} baggage
101
+ * @param {{
102
+ * makeRecorderKit: import('@agoric/zoe/src/contractSupport/recorder.js').MakeRecorderKit;
103
+ * params: any;
104
+ * poolBank: import('@endo/far').ERef<Bank>;
105
+ * zcf: ZCF;
106
+ * }} powers
107
+ */
108
+ export const prepareProvisionPoolKit = (
109
+ baggage,
110
+ { makeRecorderKit, params, poolBank, zcf },
111
+ ) => {
112
+ const zoe = zcf.getZoeService();
113
+
114
+ const makeProvisionPoolKitInternal = prepareExoClassKit(
115
+ baggage,
116
+ 'ProvisionPoolKit',
117
+ {
118
+ machine: M.interface('ProvisionPoolKit machine', {
119
+ addRevivableAddresses: M.call(M.arrayOf(M.string())).returns(),
120
+ getWalletReviver: M.call().returns(
121
+ M.remotable('ProvisionPoolKit wallet reviver'),
122
+ ),
123
+ setReferences: M.callWhen({
124
+ bankManager: M.eref(M.remotable('bankManager')),
125
+ namesByAddressAdmin: M.eref(M.remotable('nameAdmin')),
126
+ walletFactory: M.eref(M.remotable('walletFactory')),
127
+ }).returns(),
128
+ makeHandler: M.call().returns(M.remotable('BridgeHandler')),
129
+ initPSM: M.call(BrandShape, InstanceHandleShape).returns(),
130
+ }),
131
+ walletReviver: M.interface('ProvisionPoolKit wallet reviver', {
132
+ reviveWallet: M.callWhen(M.string()).returns(
133
+ M.remotable('SmartWallet'),
134
+ ),
135
+ ackWallet: M.call(M.string()).returns(M.boolean()),
136
+ }),
137
+ helper: UnguardedHelperI,
138
+ public: M.interface('ProvisionPoolKit public', {
139
+ getPublicTopics: M.call().returns({ metrics: PublicTopicShape }),
140
+ }),
141
+ },
142
+ /**
143
+ * @param {object} opts
144
+ * @param {Purse<'nat'>} opts.fundPurse
145
+ * @param {Brand<'nat'>} opts.poolBrand
146
+ * @param {StorageNode} opts.metricsNode
147
+ */
148
+ ({ fundPurse, poolBrand, metricsNode }) => {
149
+ /** @type {import('@agoric/zoe/src/contractSupport/recorder.js').RecorderKit<MetricsNotification>} */
150
+ const metricsRecorderKit = makeRecorderKit(metricsNode);
151
+
152
+ /** @type {MapStore<Brand, PsmInstance>} */
153
+ const brandToPSM = makeScalarBigMapStore('brandToPSM', { durable: true });
154
+ const revivableAddresses = makeScalarBigSetStore('revivableAddresses', {
155
+ durable: true,
156
+ keyShape: M.string(),
157
+ });
158
+
159
+ /**
160
+ * to be set by `setReferences`
161
+ *
162
+ * @type {Partial<ProvisionPoolKitReferences>}
163
+ */
164
+ const references = {
165
+ bankManager: undefined,
166
+ namesByAddressAdmin: undefined,
167
+ walletFactory: undefined,
168
+ };
169
+
170
+ return {
171
+ brandToPSM,
172
+ fundPurse,
173
+ metricsRecorderKit,
174
+ poolBrand,
175
+ walletsProvisioned: 0n,
176
+ totalMintedProvided: AmountMath.makeEmpty(poolBrand),
177
+ totalMintedConverted: AmountMath.makeEmpty(poolBrand),
178
+ revivableAddresses,
179
+ ...references,
180
+ };
181
+ },
182
+ {
183
+ // aka "limitedCreatorFacet"
184
+ machine: {
185
+ /** @param {string[]} oldAddresses */
186
+ addRevivableAddresses(oldAddresses) {
187
+ console.log('revivableAddresses count', oldAddresses.length);
188
+ this.state.revivableAddresses.addAll(oldAddresses);
189
+ },
190
+ getWalletReviver() {
191
+ return this.facets.walletReviver;
192
+ },
193
+ /** @param {ProvisionPoolKitReferences} erefs */
194
+ async setReferences(erefs) {
195
+ const { bankManager, namesByAddressAdmin, walletFactory } = erefs;
196
+ const obj = harden({
197
+ bankManager,
198
+ namesByAddressAdmin,
199
+ walletFactory,
200
+ });
201
+ const refs = await deeplyFulfilledObject(obj);
202
+ Object.assign(this.state, refs);
203
+ },
204
+ makeHandler() {
205
+ const { bankManager, namesByAddressAdmin, walletFactory } =
206
+ this.state;
207
+ if (!bankManager || !namesByAddressAdmin || !walletFactory) {
208
+ throw Fail`must set references before handling requests`;
209
+ }
210
+ const { helper } = this.facets;
211
+ // a bit obtuse but leave for backwards compatibility with tests
212
+ const innerMaker = makeBridgeProvisionTool(
213
+ bank => helper.sendInitialPayment(bank),
214
+ () => helper.onProvisioned(),
215
+ );
216
+ return innerMaker({
217
+ bankManager,
218
+ namesByAddressAdmin,
219
+ walletFactory,
220
+ });
221
+ },
222
+ /**
223
+ * @param {Brand} brand
224
+ * @param {PsmInstance} instance
225
+ */
226
+ initPSM(brand, instance) {
227
+ const { brandToPSM } = this.state;
228
+ brandToPSM.init(brand, instance);
229
+ },
230
+ },
231
+ walletReviver: {
232
+ /** @param {string} address */
233
+ async reviveWallet(address) {
234
+ const {
235
+ revivableAddresses,
236
+ bankManager,
237
+ namesByAddressAdmin,
238
+ walletFactory,
239
+ } = this.state;
240
+ if (!bankManager || !namesByAddressAdmin || !walletFactory) {
241
+ throw Fail`must set references before handling requests`;
242
+ }
243
+ revivableAddresses.has(address) ||
244
+ Fail`non-revivable address ${address}`;
245
+ const bank = E(bankManager).getBankForAddress(address);
246
+ const [wallet, _created] = await E(walletFactory).provideSmartWallet(
247
+ address,
248
+ bank,
249
+ namesByAddressAdmin,
250
+ );
251
+ return wallet;
252
+ },
253
+ /**
254
+ * @param {string} address
255
+ * @returns {boolean} isRevive
256
+ */
257
+ ackWallet(address) {
258
+ const { revivableAddresses } = this.state;
259
+ if (!revivableAddresses.has(address)) {
260
+ return false;
261
+ }
262
+ revivableAddresses.delete(address);
263
+ return true;
264
+ },
265
+ },
266
+ helper: {
267
+ publishMetrics() {
268
+ const {
269
+ metricsRecorderKit,
270
+ walletsProvisioned,
271
+ totalMintedConverted,
272
+ totalMintedProvided,
273
+ } = this.state;
274
+ void metricsRecorderKit.recorder.write(
275
+ harden({
276
+ walletsProvisioned,
277
+ totalMintedProvided,
278
+ totalMintedConverted,
279
+ }),
280
+ );
281
+ },
282
+ onTrade(converted) {
283
+ const { state, facets } = this;
284
+ state.totalMintedConverted = AmountMath.add(
285
+ state.totalMintedConverted,
286
+ converted,
287
+ );
288
+ facets.helper.publishMetrics();
289
+ },
290
+ onSendFunds(provided) {
291
+ const { state, facets } = this;
292
+ state.totalMintedProvided = AmountMath.add(
293
+ state.totalMintedProvided,
294
+ provided,
295
+ );
296
+ facets.helper.publishMetrics();
297
+ },
298
+ onProvisioned() {
299
+ const { state, facets } = this;
300
+ state.walletsProvisioned += 1n;
301
+ facets.helper.publishMetrics();
302
+ },
303
+ /** @param {ERef<Bank>} destBank */
304
+ async sendInitialPayment(destBank) {
305
+ const {
306
+ facets: { helper },
307
+ state: { fundPurse, poolBrand },
308
+ } = this;
309
+ const perAccountInitialAmount = /** @type {Amount<'nat'>} */ (
310
+ params.getPerAccountInitialAmount()
311
+ );
312
+ const initialPmt = await E(fundPurse).withdraw(
313
+ perAccountInitialAmount,
314
+ );
315
+
316
+ const destPurse = E(destBank).getPurse(poolBrand);
317
+ return E(destPurse)
318
+ .deposit(initialPmt)
319
+ .then(amt => {
320
+ helper.onSendFunds(perAccountInitialAmount);
321
+ console.log('provisionPool sent', amt);
322
+ })
323
+ .catch(reason => {
324
+ console.error(X`initial deposit failed: ${q(reason)}`);
325
+ void E(fundPurse).deposit(initialPmt);
326
+ throw reason;
327
+ });
328
+ },
329
+ /**
330
+ * @param {object} [options]
331
+ * @param {MetricsNotification} [options.metrics]
332
+ */
333
+ start({ metrics } = {}) {
334
+ const {
335
+ state: { brandToPSM, poolBrand },
336
+ facets: { helper },
337
+ } = this;
338
+
339
+ // Must match. poolBrand is from durable state and the param is from
340
+ // the contract, so it technically can change between incarnations.
341
+ // That would be a severe bug.
342
+ AmountMath.coerce(poolBrand, params.getPerAccountInitialAmount());
343
+
344
+ void observeIteration(
345
+ subscribeEach(E(poolBank).getAssetSubscription()),
346
+ {
347
+ updateState: async desc => {
348
+ console.log('provisionPool notified of new asset', desc.brand);
349
+ await zcf.saveIssuer(desc.issuer, desc.issuerName);
350
+ /** @type {ERef<Purse>} */
351
+ const exchangePurse = E(poolBank).getPurse(desc.brand);
352
+ void observeNotifier(
353
+ E(exchangePurse).getCurrentAmountNotifier(),
354
+ {
355
+ updateState: async amount => {
356
+ console.log('provisionPool balance update', amount);
357
+ if (
358
+ AmountMath.isEmpty(amount) ||
359
+ amount.brand === poolBrand
360
+ ) {
361
+ return;
362
+ }
363
+ if (!brandToPSM.has(desc.brand)) {
364
+ console.error(
365
+ 'funds arrived but no PSM instance',
366
+ desc.brand,
367
+ );
368
+ return;
369
+ }
370
+ const instance = brandToPSM.get(desc.brand);
371
+ const payment = E(exchangePurse).withdraw(amount);
372
+ await helper
373
+ .swap(payment, amount, instance)
374
+ .catch(async reason => {
375
+ console.error(X`swap failed: ${reason}`);
376
+ const resolvedPayment = await payment;
377
+ return E(exchangePurse).deposit(resolvedPayment);
378
+ });
379
+ },
380
+ fail: reason => console.error(reason),
381
+ },
382
+ );
383
+ },
384
+ },
385
+ );
386
+
387
+ if (metrics) {
388
+ // Restore state.
389
+ // we publishMetrics() below
390
+ const {
391
+ walletsProvisioned,
392
+ totalMintedProvided,
393
+ totalMintedConverted,
394
+ } = metrics;
395
+ assert.typeof(walletsProvisioned, 'bigint');
396
+ AmountMath.coerce(poolBrand, totalMintedProvided);
397
+ AmountMath.coerce(poolBrand, totalMintedConverted);
398
+ Object.assign(this.state, {
399
+ walletsProvisioned,
400
+ totalMintedProvided,
401
+ totalMintedConverted,
402
+ });
403
+ helper.publishMetrics();
404
+ }
405
+ },
406
+ /**
407
+ * @param {ERef<Payment>} payIn
408
+ * @param {Amount} amount
409
+ * @param {PsmInstance} instance
410
+ */
411
+ async swap(payIn, amount, instance) {
412
+ const {
413
+ facets: { helper },
414
+ state: { fundPurse },
415
+ } = this;
416
+ const psmPub = E(zoe).getPublicFacet(instance);
417
+ const proposal = harden({ give: { In: amount } });
418
+ const invitation = E(psmPub).makeWantMintedInvitation();
419
+ const seat = E(zoe).offer(invitation, proposal, { In: payIn });
420
+ const payout = await E(seat).getPayout('Out');
421
+ const rxd = await E(fundPurse).deposit(payout);
422
+ helper.onTrade(rxd);
423
+ return rxd;
424
+ },
425
+ },
426
+ public: {
427
+ getPublicTopics() {
428
+ return {
429
+ metrics: makeRecorderTopic(
430
+ 'Provision Pool metrics',
431
+ this.state.metricsRecorderKit,
432
+ ),
433
+ };
434
+ },
435
+ },
436
+ },
437
+ {
438
+ finish: ({ facets }) => {
439
+ facets.helper.publishMetrics();
440
+ },
441
+ },
442
+ );
443
+
444
+ /**
445
+ * Prepare synchronous values before passing to real Exo maker
446
+ *
447
+ * @param {object} opts
448
+ * @param {Brand<'nat'>} opts.poolBrand
449
+ * @param {ERef<StorageNode>} opts.storageNode
450
+ */
451
+ const makeProvisionPoolKit = async ({ poolBrand, storageNode }) => {
452
+ const fundPurse = await E(poolBank).getPurse(poolBrand);
453
+ const metricsNode = await E(storageNode).makeChildNode('metrics');
454
+
455
+ return makeProvisionPoolKitInternal({
456
+ fundPurse,
457
+ poolBrand,
458
+ metricsNode,
459
+ });
460
+ };
461
+
462
+ return makeProvisionPoolKit;
463
+ };
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @file The Parity Stability Module supports efficiently minting/burning a
3
+ * stable token at a specified fixed ratio to a reference stable token, which
4
+ * thereby acts as an anchor to provide additional stability. For flexible
5
+ * economic policies, the fee percentage for trading into and out of the
6
+ * stable token are specified separately.
7
+ */
8
+ /**
9
+ * @typedef {object} MetricsNotification Metrics naming scheme is that nouns are
10
+ * present values and past-participles are accumulative.
11
+ * @property {Amount<'nat'>} anchorPoolBalance amount of Anchor token available
12
+ * to be swapped
13
+ * @property {Amount<'nat'>} mintedPoolBalance amount of Minted token
14
+ * outstanding (the amount minted minus the amount burned).
15
+ * @property {Amount<'nat'>} feePoolBalance amount of Minted token fees
16
+ * available to be collected
17
+ * @property {Amount<'nat'>} totalAnchorProvided running sum of Anchor ever
18
+ * given by this contract
19
+ * @property {Amount<'nat'>} totalMintedProvided running sum of Minted ever
20
+ * given by this contract
21
+ */
22
+ /** @import {Baggage} from '@agoric/vat-data' */
23
+ /** @type {ContractMeta} */
24
+ export const meta: ContractMeta;
25
+ export function start(zcf: ZCF<GovernanceTerms<{
26
+ GiveMintedFee: "ratio";
27
+ WantMintedFee: "ratio";
28
+ MintLimit: "amount";
29
+ }> & {
30
+ anchorBrand: Brand<"nat">;
31
+ anchorPerMinted: Ratio;
32
+ }>, privateArgs: {
33
+ feeMintAccess: FeeMintAccess;
34
+ initialPoserInvitation: Invitation;
35
+ storageNode: StorageNode;
36
+ marshaller: Marshaller;
37
+ }, baggage: Baggage): Promise<{
38
+ creatorFacet: import("@endo/exo").Guarded<{
39
+ getParamMgrRetriever: () => {
40
+ get: () => import("@agoric/governance/src/contractGovernance/typedParamManager.js").TypedParamManager<{
41
+ GiveMintedFee: "ratio";
42
+ MintLimit: "amount";
43
+ WantMintedFee: "ratio";
44
+ } & {
45
+ Electorate: "invitation";
46
+ }>;
47
+ } & import("@endo/pass-style").RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
48
+ get: () => import("@agoric/governance/src/contractGovernance/typedParamManager.js").TypedParamManager<{
49
+ GiveMintedFee: "ratio";
50
+ MintLimit: "amount";
51
+ WantMintedFee: "ratio";
52
+ } & {
53
+ Electorate: "invitation";
54
+ }>;
55
+ }>;
56
+ getInvitation: (name: any) => Promise<Invitation<unknown, undefined>>;
57
+ getLimitedCreatorFacet: () => import("@endo/exo").Guarded<{
58
+ getRewardAllocation(): Allocation;
59
+ makeCollectFeesInvitation(): Promise<Invitation<string, undefined>>;
60
+ makeRestoreMetricsInvitation(): Promise<Invitation<void, Omit<MetricsNotification, "anchorPoolBalance">>>;
61
+ }>;
62
+ getGovernedApis: () => globalThis.GovernedApis;
63
+ getGovernedApiNames: () => string[];
64
+ setOfferFilter: (strings: any) => Promise<void>;
65
+ }>;
66
+ publicFacet: import("@endo/exo").Guarded<{
67
+ getAmount: (name: string) => globalThis.Amount;
68
+ getBrand: (name: string) => globalThis.Brand;
69
+ getInstance: (name: string) => Instance;
70
+ getInstallation: (name: string) => Installation<any>;
71
+ getInvitationAmount: (name: string) => import("@agoric/ertp/src/types.js").SetAmount<InvitationDetails>;
72
+ getNat: (name: string) => bigint;
73
+ getRatio: (name: string) => Ratio;
74
+ getString: (name: string) => string;
75
+ getTimestamp: (name: string) => import("@agoric/time").TimestampRecord;
76
+ getRelativeTime: (name: string) => import("@agoric/time").RelativeTimeRecord;
77
+ getUnknown: (name: string) => any;
78
+ getSubscription: () => globalThis.StoredSubscription<globalThis.GovernanceSubscriptionState>;
79
+ getGovernedParams: () => globalThis.ERef<globalThis.ParamStateRecord>;
80
+ getMetrics(): globalThis.Subscriber<MetricsNotification>;
81
+ getPoolBalance(): import("@agoric/ertp/src/types.js").NatAmount;
82
+ getPublicTopics(): {
83
+ metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<MetricsNotification>;
84
+ };
85
+ makeWantMintedInvitation(): Promise<Invitation<void, undefined>>;
86
+ makeGiveMintedInvitation(): Promise<Invitation<void, undefined>>;
87
+ }>;
88
+ }>;
89
+ /**
90
+ * Metrics naming scheme is that nouns are
91
+ * present values and past-participles are accumulative.
92
+ */
93
+ export type MetricsNotification = {
94
+ /**
95
+ * amount of Anchor token available
96
+ * to be swapped
97
+ */
98
+ anchorPoolBalance: Amount<"nat">;
99
+ /**
100
+ * amount of Minted token
101
+ * outstanding (the amount minted minus the amount burned).
102
+ */
103
+ mintedPoolBalance: Amount<"nat">;
104
+ /**
105
+ * amount of Minted token fees
106
+ * available to be collected
107
+ */
108
+ feePoolBalance: Amount<"nat">;
109
+ /**
110
+ * running sum of Anchor ever
111
+ * given by this contract
112
+ */
113
+ totalAnchorProvided: Amount<"nat">;
114
+ /**
115
+ * running sum of Minted ever
116
+ * given by this contract
117
+ */
118
+ totalMintedProvided: Amount<"nat">;
119
+ };
120
+ export type PsmPublicFacet = Awaited<ReturnType<typeof start>>["publicFacet"];
121
+ import type { Baggage } from '@agoric/vat-data';
122
+ //# sourceMappingURL=psm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"AAuCA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AAEH,gDAAgD;AAEhD,2BAA2B;AAC3B,mBADW,YAAY,CAkCrB;AAsBK,2BAlBI,GAAG,CACb,eAAmB,CAAC;IACpB,aAAmB,EAAE,OAAO,CAAC;IAC7B,aAAmB,EAAE,OAAO,CAAC;IAC7B,SAAe,EAAE,QAAQ,CAAC;CACrB,CAAC,GAAG;IACT,WAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,eAAqB,EAAE,KAAK,CAAC;CACxB,CACF,eACO;IACV,aAAiB,EAAE,aAAa,CAAC;IACjC,sBAA0B,EAAE,UAAU,CAAC;IACvC,WAAe,EAAE,WAAW,CAAC;IAC7B,UAAc,EAAE,UAAU,CAAC;CACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuUH;;;;;;;;;;uBA1Ya,MAAM,CAAC,KAAK,CAAC;;;;;uBAEb,MAAM,CAAC,KAAK,CAAC;;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;6BAqYb,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;6BAjYnC,kBAAkB"}