@agoric/inter-protocol 0.13.2-dev-8f9e16b.0 → 0.13.2-dev-8ed2bf6.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 (31) hide show
  1. package/bundles/bundle-amm-meta.js +127 -127
  2. package/bundles/bundle-amm.js +1 -1
  3. package/bundles/bundle-econCommitteeCharter-meta.js +70 -70
  4. package/bundles/bundle-econCommitteeCharter.js +1 -1
  5. package/bundles/bundle-feeDistributor-meta.js +53 -53
  6. package/bundles/bundle-feeDistributor.js +1 -1
  7. package/bundles/bundle-interchainPool-meta.js +103 -103
  8. package/bundles/bundle-interchainPool.js +1 -1
  9. package/bundles/bundle-liquidateIncrementally-meta.js +68 -68
  10. package/bundles/bundle-liquidateIncrementally.js +1 -1
  11. package/bundles/bundle-liquidateMinimum-meta.js +73 -73
  12. package/bundles/bundle-liquidateMinimum.js +1 -1
  13. package/bundles/bundle-priceAggregatorChainlink-meta.js +72 -72
  14. package/bundles/bundle-priceAggregatorChainlink.js +1 -1
  15. package/bundles/bundle-psm-meta.js +106 -106
  16. package/bundles/bundle-psm.js +1 -1
  17. package/bundles/bundle-reserve-meta.js +180 -180
  18. package/bundles/bundle-reserve.js +1 -1
  19. package/bundles/bundle-scaledPriceAuthority-meta.js +68 -68
  20. package/bundles/bundle-scaledPriceAuthority.js +1 -1
  21. package/bundles/bundle-stakeFactory-meta.js +114 -114
  22. package/bundles/bundle-stakeFactory.js +1 -1
  23. package/bundles/bundle-vaultFactory-meta.js +123 -123
  24. package/bundles/bundle-vaultFactory.js +1 -1
  25. package/package.json +15 -15
  26. package/src/contractSupport.js +42 -1
  27. package/src/vaultFactory/vault.js +619 -605
  28. package/src/vaultFactory/vaultDirector.js +42 -15
  29. package/src/vaultFactory/vaultHolder.js +103 -93
  30. package/src/vaultFactory/vaultKit.js +31 -32
  31. package/src/vaultFactory/vaultManager.js +853 -829
@@ -16,8 +16,10 @@ import { Far } from '@endo/marshal';
16
16
  import { AmountMath, AmountShape, BrandShape, IssuerShape } from '@agoric/ertp';
17
17
  import {
18
18
  makeStoredPublisherKit,
19
+ makeStoredSubscriber,
19
20
  observeIteration,
20
21
  SubscriberShape,
22
+ vivifyDurablePublishKit,
21
23
  } from '@agoric/notifier';
22
24
  import {
23
25
  defineDurableFarClassKit,
@@ -26,7 +28,6 @@ import {
26
28
  } from '@agoric/vat-data';
27
29
  import { assertKeywordName } from '@agoric/zoe/src/cleanProposal.js';
28
30
  import { makeMakeCollectFeesInvitation } from '../collectFees.js';
29
- import { makeMetricsPublisherKit } from '../contractSupport.js';
30
31
  import {
31
32
  CHARGING_PERIOD_KEY,
32
33
  makeVaultParamManager,
@@ -34,17 +35,18 @@ import {
34
35
  SHORTFALL_INVITATION_KEY,
35
36
  vaultParamPattern,
36
37
  } from './params.js';
37
- import { makeVaultManager } from './vaultManager.js';
38
+ import { vivifyVaultManagerKit } from './vaultManager.js';
39
+ import { provideChildBaggage } from '../contractSupport.js';
38
40
 
39
41
  const { details: X, quote: q, Fail } = assert;
40
42
 
41
43
  /** @typedef {{
42
44
  * debtMint: ZCFMint<'nat'>,
43
45
  * directorParamManager: import('@agoric/governance/src/contractGovernance/typedParamManager').TypedParamManager<import('./params.js').VaultDirectorParams>,
46
+ * managerBaggages: *,
44
47
  * marshaller: ERef<Marshaller>,
45
- * metricsPublication: IterationObserver<MetricsNotification>
46
- * metricsSubscription: StoredSubscription<MetricsNotification>
47
48
  * shortfallReporter: import('../reserve/assetReserve.js').ShortfallReporter,
49
+ * storedMetricsSubscriber: StoredSubscriber<MetricsNotification>,
48
50
  * storageNode: ERef<StorageNode>,
49
51
  * vaultParamManagers: Store<Brand, import('./params.js').VaultParamManager>,
50
52
  * zcf: import('./vaultFactory.js').VaultFactoryZCF,
@@ -70,6 +72,8 @@ const ephemera = {};
70
72
  *
71
73
  * @typedef {Readonly<{
72
74
  * collateralTypes: Store<Brand,VaultManager>,
75
+ * metricsPublisher: Publisher<MetricsNotification>
76
+ * metricsSubscriber: Subscriber<MetricsNotification>
73
77
  * mintSeat: ZCFSeat,
74
78
  * rewardPoolSeat: ZCFSeat,
75
79
  * shortfallInvitation: Invitation,
@@ -92,7 +96,7 @@ const ephemera = {};
92
96
  * state: State;
93
97
  * }>} MethodContext
94
98
  */
95
- // FIXME find a way to type 'finish' with the context (state and facets)
99
+ // TODO find a way to type 'finish' with the context (state and facets)
96
100
 
97
101
  /**
98
102
  * @param {ERef<ZoeService>} zoe
@@ -143,6 +147,16 @@ const metricsOf = state => {
143
147
  });
144
148
  };
145
149
 
150
+ // UNTIL https://github.com/Agoric/agoric-sdk/issues/6791
151
+ const baggage = makeScalarBigMapStore('Vault Director baggage', {
152
+ durable: true,
153
+ });
154
+
155
+ const makeVaultDirectorMetricsPublishKit = vivifyDurablePublishKit(
156
+ baggage,
157
+ 'Vault Director metrics',
158
+ );
159
+
146
160
  /**
147
161
  * @param {Ephemera['zcf']} zcf
148
162
  * @param {Ephemera['directorParamManager']} directorParamManager
@@ -170,18 +184,23 @@ const initState = (
170
184
  // In the event they're needed they can be reconstructed from contract terms and off-chain data.
171
185
  const vaultParamManagers = makeScalarMap('vaultParamManagers');
172
186
 
173
- const { metricsPublication, metricsSubscription } = makeMetricsPublisherKit(
174
- storageNode,
187
+ const { publisher: metricsPublisher, subscriber: metricsSubscriber } =
188
+ makeVaultDirectorMetricsPublishKit();
189
+
190
+ const storedMetricsSubscriber = makeStoredSubscriber(
191
+ metricsSubscriber,
192
+ E(storageNode).makeChildNode('metrics'),
175
193
  marshaller,
176
194
  );
177
195
 
196
+ const managerBaggages = provideChildBaggage(baggage, 'Vault Manager baggage');
197
+
178
198
  Object.assign(ephemera, {
179
199
  debtMint,
180
200
  directorParamManager,
201
+ managerBaggages,
181
202
  marshaller,
182
- metricsPublication,
183
- // Subscription can't yet be held durably https://github.com/Agoric/agoric-sdk/issues/4567
184
- metricsSubscription,
203
+ storedMetricsSubscriber,
185
204
  storageNode,
186
205
  vaultParamManagers,
187
206
  zcf,
@@ -190,6 +209,8 @@ const initState = (
190
209
  return {
191
210
  collateralTypes,
192
211
  managerCounter: 0,
212
+ metricsPublisher,
213
+ metricsSubscriber,
193
214
  mintSeat,
194
215
  rewardPoolSeat,
195
216
  // @ts-expect-error defined in finish()
@@ -445,7 +466,15 @@ const makeVaultDirector = defineDurableFarClassKit(
445
466
  burnDebt,
446
467
  });
447
468
 
448
- const vm = makeVaultManager(
469
+ const { managerBaggages } = ephemera;
470
+ // alleged okay because used only as a diagnostic tag
471
+ const brandName = await E(collateralBrand).getAllegedName();
472
+ const makeVaultManager = managerBaggages.addChild(
473
+ brandName,
474
+ vivifyVaultManagerKit,
475
+ );
476
+
477
+ const { self: vm } = makeVaultManager(
449
478
  zcf,
450
479
  debtMint,
451
480
  collateralBrand,
@@ -479,9 +508,7 @@ const makeVaultDirector = defineDurableFarClassKit(
479
508
  },
480
509
  updateMetrics() {
481
510
  const { state } = this;
482
- return ephemera.metricsPublication.updateState(
483
- metricsOf(harden(state)),
484
- );
511
+ return state.metricsPublisher.publish(metricsOf(harden(state)));
485
512
  },
486
513
  // XXX accessors for tests
487
514
  getRewardAllocation() {
@@ -527,7 +554,7 @@ const makeVaultDirector = defineDurableFarClassKit(
527
554
  );
528
555
  },
529
556
  getMetrics() {
530
- return ephemera.metricsSubscription;
557
+ return ephemera.storedMetricsSubscriber;
531
558
  },
532
559
  /**
533
560
  * @deprecated use getCollateralManager and then makeVaultInvitation instead
@@ -2,119 +2,129 @@
2
2
  * @file Use-object for the owner of a vault
3
3
  */
4
4
  import { AmountShape } from '@agoric/ertp';
5
- import { makeStoredPublishKit, SubscriberShape } from '@agoric/notifier';
6
- import { defineDurableFarClassKit, M, makeKindHandle } from '@agoric/vat-data';
5
+ import {
6
+ makeStoredSubscriber,
7
+ SubscriberShape,
8
+ vivifyDurablePublishKit,
9
+ } from '@agoric/notifier';
10
+ import { M, vivifyFarClassKit } from '@agoric/vat-data';
7
11
  import { makeEphemeraProvider } from '../contractSupport.js';
12
+ import { UnguardedHelperI } from '../typeGuards.js';
8
13
 
9
14
  const { Fail } = assert;
10
15
 
11
- // XXX durable key to an ephemeral object
12
- // UNTIL https://github.com/Agoric/agoric-sdk/issues/4567
13
- let holderId = 0n;
14
-
15
16
  /**
16
- * @type {(key: bigint) => {
17
- * publisher: StoredPublishKit<VaultNotification>['publisher'],
18
- * subscriber: StoredPublishKit<VaultNotification>['subscriber'],
17
+ * Ephemera are the elements of state that cannot (or need not) be durable.
18
+ *
19
+ * @type {(durableSubscriber: Subscriber<VaultNotification>) => {
20
+ * storedSubscriber: StoredSubscriber<VaultNotification>,
19
21
  * }} */
20
22
  // @ts-expect-error not yet defined
21
23
  const provideEphemera = makeEphemeraProvider(() => ({}));
22
24
 
23
25
  /**
24
26
  * @typedef {{
25
- * holderId: bigint,
27
+ * publisher: PublishKit<VaultNotification>['publisher'],
28
+ * subscriber: PublishKit<VaultNotification>['subscriber'],
26
29
  * vault: Vault | null,
27
30
  * }} State
28
31
  */
29
32
 
33
+ const HolderI = M.interface('holder', {
34
+ getCollateralAmount: M.call().returns(AmountShape),
35
+ getCurrentDebt: M.call().returns(AmountShape),
36
+ getNormalizedDebt: M.call().returns(AmountShape),
37
+ getSubscriber: M.call().returns(SubscriberShape),
38
+ makeAdjustBalancesInvitation: M.call().returns(M.promise()),
39
+ makeCloseInvitation: M.call().returns(M.promise()),
40
+ makeTransferInvitation: M.call().returns(M.promise()),
41
+ });
30
42
  /**
31
43
  *
32
- * @param {Vault} vault
33
- * @param {ERef<StorageNode>} storageNode
34
- * @param {ERef<Marshaller>} marshaller
35
- * @returns {State}
44
+ * @param {import('@agoric/ertp').Baggage} baggage
36
45
  */
37
- const initState = (vault, storageNode, marshaller) => {
38
- /** @type {StoredPublishKit<VaultNotification>} */
39
- const { subscriber, publisher } = makeStoredPublishKit(
40
- storageNode,
41
- marshaller,
46
+ export const vivifyVaultHolder = baggage => {
47
+ const makeVaultHolderPublishKit = vivifyDurablePublishKit(
48
+ baggage,
49
+ 'Vault Holder publish kit',
42
50
  );
43
51
 
44
- holderId += 1n;
45
- const ephemera = provideEphemera(holderId);
46
- // UNTIL https://github.com/Agoric/agoric-sdk/issues/4567
47
- Object.assign(ephemera, { subscriber, publisher });
52
+ const makeVaultHolderKit = vivifyFarClassKit(
53
+ baggage,
54
+ 'Vault Holder',
55
+ {
56
+ helper: UnguardedHelperI,
57
+ holder: HolderI,
58
+ },
59
+ /**
60
+ *
61
+ * @param {Vault} vault
62
+ * @param {ERef<StorageNode>} storageNode
63
+ * @param {ERef<Marshaller>} marshaller
64
+ * @returns {State}
65
+ */
66
+ (vault, storageNode, marshaller) => {
67
+ /** @type {PublishKit<VaultNotification>} */
68
+ const { subscriber, publisher } = makeVaultHolderPublishKit();
48
69
 
49
- return { holderId, vault };
50
- };
70
+ const ephemera = provideEphemera(subscriber);
71
+ ephemera.storedSubscriber = makeStoredSubscriber(
72
+ subscriber,
73
+ storageNode,
74
+ marshaller,
75
+ );
51
76
 
52
- const helper = {
53
- /**
54
- * @throws if this holder no longer owns the vault
55
- */
56
- owned() {
57
- const { vault } = this.state;
58
- if (!vault) {
59
- throw Fail`Using vault holder after transfer`;
60
- }
61
- return vault;
62
- },
63
- getUpdater() {
64
- return provideEphemera(this.state.holderId).publisher;
65
- },
66
- };
67
-
68
- const holder = {
69
- getSubscriber() {
70
- return provideEphemera(this.state.holderId).subscriber;
71
- },
72
- makeAdjustBalancesInvitation() {
73
- return this.facets.helper.owned().makeAdjustBalancesInvitation();
74
- },
75
- makeCloseInvitation() {
76
- return this.facets.helper.owned().makeCloseInvitation();
77
- },
78
- /**
79
- * Starting a transfer revokes the vault holder. The associated updater will
80
- * get a special notification that the vault is being transferred.
81
- */
82
- makeTransferInvitation() {
83
- const vault = this.facets.helper.owned();
84
- this.state.vault = null;
85
- return vault.makeTransferInvitation();
86
- },
87
- // for status/debugging
88
- getCollateralAmount() {
89
- return this.facets.helper.owned().getCollateralAmount();
90
- },
91
- getCurrentDebt() {
92
- return this.facets.helper.owned().getCurrentDebt();
93
- },
94
- getNormalizedDebt() {
95
- return this.facets.helper.owned().getNormalizedDebt();
96
- },
77
+ return { subscriber, publisher, vault };
78
+ },
79
+ {
80
+ helper: {
81
+ /**
82
+ * @throws if this holder no longer owns the vault
83
+ */
84
+ owned() {
85
+ const { vault } = this.state;
86
+ if (!vault) {
87
+ throw Fail`Using vault holder after transfer`;
88
+ }
89
+ return vault;
90
+ },
91
+ getUpdater() {
92
+ return this.state.publisher;
93
+ },
94
+ },
95
+ holder: {
96
+ /** @returns {StoredSubscriber<VaultNotification>} */
97
+ getSubscriber() {
98
+ const ephemera = provideEphemera(this.state.subscriber);
99
+ return ephemera.storedSubscriber;
100
+ },
101
+ makeAdjustBalancesInvitation() {
102
+ return this.facets.helper.owned().makeAdjustBalancesInvitation();
103
+ },
104
+ makeCloseInvitation() {
105
+ return this.facets.helper.owned().makeCloseInvitation();
106
+ },
107
+ /**
108
+ * Starting a transfer revokes the vault holder. The associated updater will
109
+ * get a special notification that the vault is being transferred.
110
+ */
111
+ makeTransferInvitation() {
112
+ const vault = this.facets.helper.owned();
113
+ this.state.vault = null;
114
+ return vault.makeTransferInvitation();
115
+ },
116
+ // for status/debugging
117
+ getCollateralAmount() {
118
+ return this.facets.helper.owned().getCollateralAmount();
119
+ },
120
+ getCurrentDebt() {
121
+ return this.facets.helper.owned().getCurrentDebt();
122
+ },
123
+ getNormalizedDebt() {
124
+ return this.facets.helper.owned().getNormalizedDebt();
125
+ },
126
+ },
127
+ },
128
+ );
129
+ return makeVaultHolderKit;
97
130
  };
98
-
99
- export const makeVaultHolder = defineDurableFarClassKit(
100
- makeKindHandle('VaultHolder'),
101
- {
102
- helper: M.interface(
103
- 'helper',
104
- // helper not exposed so guard not necessary
105
- {},
106
- { sloppy: true },
107
- ),
108
- holder: M.interface('holder', {
109
- getCollateralAmount: M.call().returns(AmountShape),
110
- getCurrentDebt: M.call().returns(AmountShape),
111
- getNormalizedDebt: M.call().returns(AmountShape),
112
- getSubscriber: M.call().returns(SubscriberShape),
113
- makeAdjustBalancesInvitation: M.call().returns(M.promise()),
114
- makeCloseInvitation: M.call().returns(M.promise()),
115
- makeTransferInvitation: M.call().returns(M.promise()),
116
- }),
117
- },
118
- initState,
119
- { helper, holder },
120
- );
@@ -1,37 +1,36 @@
1
1
  import '@agoric/zoe/exported.js';
2
2
  import { Far } from '@endo/marshal';
3
- import { makeVaultHolder } from './vaultHolder.js';
3
+ import { vivifyVaultHolder } from './vaultHolder.js';
4
4
 
5
- /**
6
- * Create a kit of utilities for use of the vault.
7
- *
8
- * @param {Vault} vault
9
- * @param {ERef<StorageNode>} storageNode
10
- * @param {ERef<Marshaller>} marshaller
11
- * @param {Subscriber<import('./vaultManager').AssetState>} assetSubscriber
12
- */
13
- export const makeVaultKit = (
14
- vault,
15
- storageNode,
16
- marshaller,
17
- assetSubscriber,
18
- ) => {
19
- const { holder, helper } = makeVaultHolder(vault, storageNode, marshaller);
20
- const vaultKit = harden({
21
- publicSubscribers: {
22
- // XXX should come from manager directly https://github.com/Agoric/agoric-sdk/issues/5814
23
- asset: assetSubscriber,
24
- vault: holder.getSubscriber(),
25
- },
26
- invitationMakers: Far('invitation makers', {
27
- AdjustBalances: holder.makeAdjustBalancesInvitation,
28
- CloseVault: holder.makeCloseInvitation,
29
- TransferVault: holder.makeTransferInvitation,
30
- }),
31
- vault: holder,
32
- vaultUpdater: helper.getUpdater(),
33
- });
34
- return vaultKit;
5
+ export const vivifyVaultKit = baggage => {
6
+ const makeVaultHolder = vivifyVaultHolder(baggage);
7
+ /**
8
+ * Create a kit of utilities for use of the vault.
9
+ *
10
+ * @param {Vault} vault
11
+ * @param {ERef<StorageNode>} storageNode
12
+ * @param {ERef<Marshaller>} marshaller
13
+ * @param {Subscriber<import('./vaultManager').AssetState>} assetSubscriber
14
+ */
15
+ const makeVaultKit = (vault, storageNode, marshaller, assetSubscriber) => {
16
+ const { holder, helper } = makeVaultHolder(vault, storageNode, marshaller);
17
+ const vaultKit = harden({
18
+ publicSubscribers: {
19
+ // XXX should come from manager directly https://github.com/Agoric/agoric-sdk/issues/5814
20
+ asset: assetSubscriber,
21
+ vault: holder.getSubscriber(),
22
+ },
23
+ invitationMakers: Far('invitation makers', {
24
+ AdjustBalances: holder.makeAdjustBalancesInvitation,
25
+ CloseVault: holder.makeCloseInvitation,
26
+ TransferVault: holder.makeTransferInvitation,
27
+ }),
28
+ vault: holder,
29
+ vaultUpdater: helper.getUpdater(),
30
+ });
31
+ return vaultKit;
32
+ };
33
+ return makeVaultKit;
35
34
  };
36
35
 
37
- /** @typedef {(ReturnType<typeof makeVaultKit>)} VaultKit */
36
+ /** @typedef {(ReturnType<ReturnType<typeof vivifyVaultKit>>)} VaultKit */