@agoric/inter-protocol 0.13.2-dev-876c738.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.
- package/bundles/bundle-amm-meta.js +125 -125
- package/bundles/bundle-amm.js +1 -1
- package/bundles/bundle-econCommitteeCharter-meta.js +70 -70
- package/bundles/bundle-econCommitteeCharter.js +1 -1
- package/bundles/bundle-feeDistributor-meta.js +53 -53
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-interchainPool-meta.js +103 -103
- package/bundles/bundle-interchainPool.js +1 -1
- package/bundles/bundle-liquidateIncrementally-meta.js +68 -68
- package/bundles/bundle-liquidateIncrementally.js +1 -1
- package/bundles/bundle-liquidateMinimum-meta.js +68 -68
- package/bundles/bundle-liquidateMinimum.js +1 -1
- package/bundles/bundle-priceAggregatorChainlink-meta.js +72 -72
- package/bundles/bundle-priceAggregatorChainlink.js +1 -1
- package/bundles/bundle-psm-meta.js +106 -106
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-meta.js +180 -180
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-meta.js +68 -68
- package/bundles/bundle-scaledPriceAuthority.js +1 -1
- package/bundles/bundle-stakeFactory-meta.js +114 -114
- package/bundles/bundle-stakeFactory.js +1 -1
- package/bundles/bundle-vaultFactory-meta.js +123 -123
- package/bundles/bundle-vaultFactory.js +1 -1
- package/package.json +15 -15
- package/src/contractSupport.js +42 -1
- package/src/vaultFactory/vault.js +619 -605
- package/src/vaultFactory/vaultDirector.js +42 -15
- package/src/vaultFactory/vaultHolder.js +103 -93
- package/src/vaultFactory/vaultKit.js +31 -32
- 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 {
|
|
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
|
-
//
|
|
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 {
|
|
174
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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 {
|
|
6
|
-
|
|
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
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
*
|
|
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 {
|
|
33
|
-
* @param {ERef<StorageNode>} storageNode
|
|
34
|
-
* @param {ERef<Marshaller>} marshaller
|
|
35
|
-
* @returns {State}
|
|
44
|
+
* @param {import('@agoric/ertp').Baggage} baggage
|
|
36
45
|
*/
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
marshaller,
|
|
46
|
+
export const vivifyVaultHolder = baggage => {
|
|
47
|
+
const makeVaultHolderPublishKit = vivifyDurablePublishKit(
|
|
48
|
+
baggage,
|
|
49
|
+
'Vault Holder publish kit',
|
|
42
50
|
);
|
|
43
51
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
70
|
+
const ephemera = provideEphemera(subscriber);
|
|
71
|
+
ephemera.storedSubscriber = makeStoredSubscriber(
|
|
72
|
+
subscriber,
|
|
73
|
+
storageNode,
|
|
74
|
+
marshaller,
|
|
75
|
+
);
|
|
51
76
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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 {
|
|
3
|
+
import { vivifyVaultHolder } from './vaultHolder.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
storageNode,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|
36
|
+
/** @typedef {(ReturnType<ReturnType<typeof vivifyVaultKit>>)} VaultKit */
|