@agoric/inter-protocol 0.16.2-other-dev-8f8782b.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.
- package/README.md +6 -6
- package/package.json +46 -39
- package/scripts/build-bundles.js +5 -21
- package/src/auction/auctionBook.d.ts +147 -0
- package/src/auction/auctionBook.d.ts.map +1 -0
- package/src/auction/auctionBook.js +182 -151
- package/src/auction/auctionMath.d.ts +17 -0
- package/src/auction/auctionMath.d.ts.map +1 -0
- package/src/auction/auctionMath.js +81 -0
- package/src/auction/auctioneer.d.ts +70 -0
- package/src/auction/auctioneer.d.ts.map +1 -0
- package/src/auction/auctioneer.js +72 -59
- package/src/auction/offerBook.d.ts +46 -0
- package/src/auction/offerBook.d.ts.map +1 -0
- package/src/auction/offerBook.js +17 -12
- package/src/auction/params.d.ts +145 -0
- package/src/auction/params.d.ts.map +1 -0
- package/src/auction/params.js +11 -9
- package/src/auction/scheduleMath.d.ts +5 -0
- package/src/auction/scheduleMath.d.ts.map +1 -0
- package/src/auction/scheduleMath.js +18 -16
- package/src/auction/scheduler.d.ts +50 -0
- package/src/auction/scheduler.d.ts.map +1 -0
- package/src/auction/scheduler.js +53 -47
- package/src/auction/sortedOffers.d.ts +8 -0
- package/src/auction/sortedOffers.d.ts.map +1 -0
- package/src/auction/sortedOffers.js +10 -9
- package/src/auction/util.d.ts +31 -0
- package/src/auction/util.d.ts.map +1 -0
- package/src/auction/util.js +12 -6
- package/src/clientSupport.d.ts +168 -0
- package/src/clientSupport.d.ts.map +1 -0
- package/src/clientSupport.js +161 -98
- package/src/collectFees.d.ts +2 -0
- package/src/collectFees.d.ts.map +1 -0
- package/src/contractSupport.d.ts +28 -0
- package/src/contractSupport.d.ts.map +1 -0
- package/src/contractSupport.js +19 -13
- package/src/econCommitteeCharter.d.ts +43 -0
- package/src/econCommitteeCharter.d.ts.map +1 -0
- package/src/econCommitteeCharter.js +25 -20
- package/src/feeDistributor.d.ts +224 -0
- package/src/feeDistributor.d.ts.map +1 -0
- package/src/feeDistributor.js +41 -33
- package/src/index.d.ts +2 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +1 -0
- package/src/interest-math.d.ts +4 -0
- package/src/interest-math.d.ts.map +1 -0
- package/src/interest-math.js +5 -1
- package/src/interest.d.ts +30 -0
- package/src/interest.d.ts.map +1 -0
- package/src/interest.js +25 -23
- package/src/price/README.md +14 -1
- package/src/price/fluxAggregatorContract.d.ts +71 -0
- package/src/price/fluxAggregatorContract.d.ts.map +1 -0
- package/src/price/fluxAggregatorContract.js +64 -55
- package/src/price/fluxAggregatorKit.d.ts +104 -0
- package/src/price/fluxAggregatorKit.d.ts.map +1 -0
- package/src/price/fluxAggregatorKit.js +55 -42
- package/src/price/priceOracleKit.d.ts +39 -0
- package/src/price/priceOracleKit.d.ts.map +1 -0
- package/src/price/priceOracleKit.js +17 -15
- package/src/price/roundsManager.d.ts +204 -0
- package/src/price/roundsManager.d.ts.map +1 -0
- package/src/price/roundsManager.js +132 -85
- package/src/proposals/README.md +2 -3
- package/src/proposals/add-auction.js +285 -0
- package/src/proposals/addAssetToVault.js +192 -40
- package/src/proposals/committee-proposal.js +25 -31
- package/src/proposals/core-proposal.js +9 -11
- package/src/proposals/deploy-price-feeds.js +341 -0
- package/src/proposals/econ-behaviors.js +84 -49
- package/src/proposals/price-feed-proposal.js +109 -51
- package/src/proposals/replace-fee-distributor.js +198 -0
- package/src/proposals/replace-scaledPriceAuthorities.js +124 -0
- package/src/proposals/replaceElectorate.js +610 -0
- package/src/proposals/startEconCommittee.js +2 -2
- package/src/proposals/startPSM.js +44 -29
- package/src/proposals/upgrade-scaledPriceAuthorities.js +78 -0
- package/src/proposals/upgrade-vaults.js +207 -0
- package/src/proposals/utils.d.ts +21 -0
- package/src/proposals/utils.d.ts.map +1 -0
- package/src/proposals/utils.js +66 -9
- package/src/proposals/withdraw-reserve-proposal.js +63 -0
- package/src/provisionPool.d.ts +69 -0
- package/src/provisionPool.d.ts.map +1 -0
- package/src/provisionPool.js +138 -0
- package/src/provisionPoolKit.d.ts +129 -0
- package/src/provisionPoolKit.d.ts.map +1 -0
- package/src/provisionPoolKit.js +608 -0
- package/src/psm/psm.d.ts +133 -0
- package/src/psm/psm.d.ts.map +1 -0
- package/src/psm/psm.js +85 -79
- package/src/psm/types-ambient.d.ts +2 -0
- package/src/psm/types-ambient.d.ts.map +1 -0
- package/src/psm/types-ambient.js +3 -0
- package/src/reserve/assetReserve.d.ts +58 -0
- package/src/reserve/assetReserve.d.ts.map +1 -0
- package/src/reserve/assetReserve.js +42 -34
- package/src/reserve/assetReserveKit.d.ts +103 -0
- package/src/reserve/assetReserveKit.d.ts.map +1 -0
- package/src/reserve/assetReserveKit.js +134 -32
- package/src/reserve/params.d.ts +16 -0
- package/src/reserve/params.d.ts.map +1 -0
- package/src/reserve/params.js +8 -2
- package/src/tokens.d.ts +3 -0
- package/src/tokens.d.ts.map +1 -0
- package/src/tokens.js +5 -0
- package/src/vaultFactory/burn.d.ts +2 -0
- package/src/vaultFactory/burn.d.ts.map +1 -0
- package/src/vaultFactory/burn.js +1 -1
- package/src/vaultFactory/liquidation.d.ts +25 -0
- package/src/vaultFactory/liquidation.d.ts.map +1 -0
- package/src/vaultFactory/liquidation.js +37 -24
- package/src/vaultFactory/math.d.ts +11 -0
- package/src/vaultFactory/math.d.ts.map +1 -0
- package/src/vaultFactory/math.js +11 -10
- package/src/vaultFactory/orderedVaultStore.d.ts +94 -0
- package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -0
- package/src/vaultFactory/orderedVaultStore.js +9 -10
- package/src/vaultFactory/params.d.ts +143 -0
- package/src/vaultFactory/params.d.ts.map +1 -0
- package/src/vaultFactory/params.js +56 -25
- package/src/vaultFactory/prioritizedVaults.d.ts +280 -0
- package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -0
- package/src/vaultFactory/prioritizedVaults.js +7 -4
- package/src/vaultFactory/proceeds.d.ts +35 -0
- package/src/vaultFactory/proceeds.d.ts.map +1 -0
- package/src/vaultFactory/proceeds.js +26 -18
- package/src/vaultFactory/storeUtils.d.ts +25 -0
- package/src/vaultFactory/storeUtils.d.ts.map +1 -0
- package/src/vaultFactory/storeUtils.js +10 -12
- package/src/vaultFactory/types-ambient.d.ts +137 -0
- package/src/vaultFactory/types-ambient.d.ts.map +1 -0
- package/src/vaultFactory/{types.js → types-ambient.js} +47 -44
- package/src/vaultFactory/vault.d.ts +344 -0
- package/src/vaultFactory/vault.d.ts.map +1 -0
- package/src/vaultFactory/vault.js +107 -100
- package/src/vaultFactory/vaultDirector.d.ts +347 -0
- package/src/vaultFactory/vaultDirector.d.ts.map +1 -0
- package/src/vaultFactory/vaultDirector.js +94 -64
- package/src/vaultFactory/vaultFactory.d.ts +250 -0
- package/src/vaultFactory/vaultFactory.d.ts.map +1 -0
- package/src/vaultFactory/vaultFactory.js +56 -33
- package/src/vaultFactory/vaultHolder.d.ts +170 -0
- package/src/vaultFactory/vaultHolder.d.ts.map +1 -0
- package/src/vaultFactory/vaultHolder.js +14 -15
- package/src/vaultFactory/vaultKit.d.ts +33 -0
- package/src/vaultFactory/vaultKit.d.ts.map +1 -0
- package/src/vaultFactory/vaultKit.js +9 -4
- package/src/vaultFactory/vaultManager.d.ts +676 -0
- package/src/vaultFactory/vaultManager.d.ts.map +1 -0
- package/src/vaultFactory/vaultManager.js +286 -167
- package/CHANGELOG.md +0 -1041
- package/exported.js +0 -2
- package/scripts/add-collateral-core.js +0 -112
- package/scripts/deploy-contracts.js +0 -100
- package/scripts/init-core.js +0 -198
- package/scripts/invite-committee-core.js +0 -42
- package/scripts/manual-price-feed.js +0 -117
- package/scripts/price-feed-core.js +0 -104
- package/scripts/start-local-chain.sh +0 -84
- package/src/psm/types.js +0 -3
- package/src/typeGuards.js +0 -13
- package/src/vaultFactory/type-imports.js +0 -4
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import '@agoric/governance/exported.js';
|
|
1
|
+
/// <reference types="@agoric/governance/exported" />
|
|
2
|
+
/// <reference types="@agoric/zoe/exported" />
|
|
5
3
|
|
|
4
|
+
import { Fail, q } from '@endo/errors';
|
|
5
|
+
import { E } from '@endo/eventual-send';
|
|
6
|
+
import { Far } from '@endo/marshal';
|
|
6
7
|
import { AmountMath, AmountShape, BrandShape, IssuerShape } from '@agoric/ertp';
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
GovernorFacetShape,
|
|
10
|
+
InvitationShape,
|
|
11
|
+
} from '@agoric/governance/src/typeGuards.js';
|
|
8
12
|
import { makeTracer } from '@agoric/internal';
|
|
9
13
|
import { M, mustMatch } from '@agoric/store';
|
|
10
14
|
import {
|
|
@@ -14,15 +18,12 @@ import {
|
|
|
14
18
|
} from '@agoric/vat-data';
|
|
15
19
|
import { assertKeywordName } from '@agoric/zoe/src/cleanProposal.js';
|
|
16
20
|
import {
|
|
17
|
-
atomicRearrange,
|
|
18
21
|
makeRecorderTopic,
|
|
19
22
|
provideEmptySeat,
|
|
20
23
|
SubscriberShape,
|
|
21
24
|
TopicsRecordShape,
|
|
22
25
|
unitAmount,
|
|
23
26
|
} from '@agoric/zoe/src/contractSupport/index.js';
|
|
24
|
-
import { E } from '@endo/eventual-send';
|
|
25
|
-
import { Far } from '@endo/marshal';
|
|
26
27
|
import { makeCollectFeesInvitation } from '../collectFees.js';
|
|
27
28
|
import {
|
|
28
29
|
setWakeupsForNextAuction,
|
|
@@ -38,51 +39,78 @@ import {
|
|
|
38
39
|
provideAndStartVaultManagerKits,
|
|
39
40
|
} from './vaultManager.js';
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
/**
|
|
43
|
+
* @import {MapStore} from '@agoric/store';
|
|
44
|
+
* @import {TransferPart, ZCF, ZCFMint, ZCFSeat} from '@agoric/zoe';
|
|
45
|
+
* @import {EReturn} from '@endo/far';
|
|
46
|
+
* @import {TypedPattern} from '@agoric/internal';
|
|
47
|
+
*/
|
|
42
48
|
|
|
43
49
|
const trace = makeTracer('VD', true);
|
|
44
50
|
|
|
45
51
|
/**
|
|
46
52
|
* @typedef {{
|
|
47
|
-
*
|
|
48
|
-
*
|
|
53
|
+
* collaterals: Brand[];
|
|
54
|
+
* rewardPoolAllocation: AmountKeywordRecord;
|
|
49
55
|
* }} MetricsNotification
|
|
50
56
|
*
|
|
51
|
-
* @typedef {Readonly<{
|
|
52
|
-
* }>} ImmutableState
|
|
53
57
|
*
|
|
54
|
-
* @typedef {{
|
|
55
|
-
*
|
|
58
|
+
* @typedef {Readonly<{}>} ImmutableState
|
|
59
|
+
*
|
|
60
|
+
* @typedef {{}} MutableState
|
|
56
61
|
*
|
|
57
62
|
* @typedef {ImmutableState & MutableState} State
|
|
58
63
|
*
|
|
59
64
|
* @typedef {{
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
65
|
+
* burnDebt: BurnDebt;
|
|
66
|
+
* getGovernedParams: (
|
|
67
|
+
* collateralBrand: Brand,
|
|
68
|
+
* ) => import('./vaultManager.js').GovernedParamGetters;
|
|
69
|
+
* mintAndTransfer: MintAndTransfer;
|
|
70
|
+
* getShortfallReporter: () => Promise<
|
|
71
|
+
* import('../reserve/assetReserve.js').ShortfallReporter
|
|
72
|
+
* >;
|
|
64
73
|
* }} FactoryPowersFacet
|
|
65
74
|
*
|
|
75
|
+
*
|
|
66
76
|
* @typedef {Readonly<{
|
|
67
77
|
* state: State;
|
|
68
78
|
* }>} MethodContext
|
|
69
79
|
*
|
|
70
|
-
* @typedef {import('@agoric/governance/src/contractGovernance/typedParamManager').TypedParamManager<
|
|
80
|
+
* @typedef {import('@agoric/governance/src/contractGovernance/typedParamManager.js').TypedParamManager<
|
|
81
|
+
* import('./params.js').VaultDirectorParams
|
|
82
|
+
* >} VaultDirectorParamManager
|
|
71
83
|
*/
|
|
72
84
|
|
|
73
85
|
const shortfallInvitationKey = 'shortfallInvitation';
|
|
74
86
|
|
|
87
|
+
// If one manager/token fails, we don't want that to block possible success for
|
|
88
|
+
// others, so we .catch() and log separately.
|
|
89
|
+
//
|
|
90
|
+
// exported for testing
|
|
91
|
+
export const makeAllManagersDo = (collateralManagers, vaultManagers) => {
|
|
92
|
+
/** @param {(vm: VaultManager) => void} fn */
|
|
93
|
+
return fn => {
|
|
94
|
+
for (const managerIndex of collateralManagers.values()) {
|
|
95
|
+
Promise.resolve(vaultManagers.get(managerIndex).self)
|
|
96
|
+
.then(vm => fn(vm))
|
|
97
|
+
.catch(e => trace('🚨ERROR: allManagersDo', e));
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
75
102
|
/**
|
|
76
|
-
* @param {import('@agoric/
|
|
103
|
+
* @param {import('@agoric/swingset-liveslots').Baggage} baggage
|
|
77
104
|
* @param {import('./vaultFactory.js').VaultFactoryZCF} zcf
|
|
78
105
|
* @param {VaultDirectorParamManager} directorParamManager
|
|
79
|
-
* @param {ZCFMint<
|
|
80
|
-
* @param {ERef<import('@agoric/time
|
|
106
|
+
* @param {ZCFMint<'nat'>} debtMint
|
|
107
|
+
* @param {ERef<import('@agoric/time').TimerService>} timer
|
|
81
108
|
* @param {ERef<import('../auction/auctioneer.js').AuctioneerPublicFacet>} auctioneer
|
|
82
109
|
* @param {ERef<StorageNode>} storageNode
|
|
83
110
|
* @param {ERef<Marshaller>} marshaller
|
|
84
111
|
* @param {import('@agoric/zoe/src/contractSupport/recorder.js').MakeRecorderKit} makeRecorderKit
|
|
85
112
|
* @param {import('@agoric/zoe/src/contractSupport/recorder.js').MakeERecorderKit} makeERecorderKit
|
|
113
|
+
* @param {Record<string, import('./params.js').VaultManagerParamOverrides>} managerParams
|
|
86
114
|
*/
|
|
87
115
|
const prepareVaultDirector = (
|
|
88
116
|
baggage,
|
|
@@ -95,6 +123,7 @@ const prepareVaultDirector = (
|
|
|
95
123
|
marshaller,
|
|
96
124
|
makeRecorderKit,
|
|
97
125
|
makeERecorderKit,
|
|
126
|
+
managerParams,
|
|
98
127
|
) => {
|
|
99
128
|
/** @type {import('../reserve/assetReserve.js').ShortfallReporter} */
|
|
100
129
|
let shortfallReporter;
|
|
@@ -113,22 +142,22 @@ const prepareVaultDirector = (
|
|
|
113
142
|
// Non-durable map because param managers aren't durable.
|
|
114
143
|
// In the event they're needed they can be reconstructed from contract terms and off-chain data.
|
|
115
144
|
/** a powerful object; can modify parameters */
|
|
116
|
-
const vaultParamManagers = provideVaultParamManagers(
|
|
145
|
+
const vaultParamManagers = provideVaultParamManagers(
|
|
146
|
+
baggage,
|
|
147
|
+
marshaller,
|
|
148
|
+
managerParams,
|
|
149
|
+
);
|
|
117
150
|
|
|
118
151
|
const metricsNode = E(storageNode).makeChildNode('metrics');
|
|
119
152
|
|
|
120
153
|
const metricsKit = makeERecorderKit(
|
|
121
154
|
metricsNode,
|
|
122
|
-
/** @type {
|
|
123
|
-
M.any()
|
|
124
|
-
),
|
|
155
|
+
/** @type {TypedPattern<MetricsNotification>} */ (M.any()),
|
|
125
156
|
);
|
|
126
157
|
|
|
127
158
|
const managersNode = E(storageNode).makeChildNode('managers');
|
|
128
159
|
|
|
129
|
-
/**
|
|
130
|
-
* @returns {MetricsNotification}
|
|
131
|
-
*/
|
|
160
|
+
/** @returns {MetricsNotification} */
|
|
132
161
|
const sampleMetrics = () => {
|
|
133
162
|
return harden({
|
|
134
163
|
collaterals: Array.from(collateralManagers.keys()),
|
|
@@ -141,6 +170,7 @@ const prepareVaultDirector = (
|
|
|
141
170
|
const oldInvitation = baggage.has(shortfallInvitationKey)
|
|
142
171
|
? baggage.get(shortfallInvitationKey)
|
|
143
172
|
: undefined;
|
|
173
|
+
|
|
144
174
|
const newInvitation = await directorParamManager.getInternalParamValue(
|
|
145
175
|
SHORTFALL_INVITATION_KEY,
|
|
146
176
|
);
|
|
@@ -188,22 +218,22 @@ const prepareVaultDirector = (
|
|
|
188
218
|
},
|
|
189
219
|
|
|
190
220
|
/**
|
|
191
|
-
* Let the manager add rewards to the rewardPoolSeat without
|
|
192
|
-
*
|
|
221
|
+
* Let the manager add rewards to the rewardPoolSeat without exposing the
|
|
222
|
+
* rewardPoolSeat to them.
|
|
193
223
|
*
|
|
194
224
|
* @type {MintAndTransfer}
|
|
195
225
|
*/
|
|
196
226
|
mintAndTransfer: (mintReceiver, toMint, fee, nonMintTransfers) => {
|
|
197
227
|
const kept = AmountMath.subtract(toMint, fee);
|
|
198
228
|
debtMint.mintGains(harden({ Minted: toMint }), mintSeat);
|
|
199
|
-
/** @type {
|
|
229
|
+
/** @type {TransferPart[]} */
|
|
200
230
|
const transfers = [
|
|
201
231
|
...nonMintTransfers,
|
|
202
232
|
[mintSeat, rewardPoolSeat, { Minted: fee }],
|
|
203
233
|
[mintSeat, mintReceiver, { Minted: kept }],
|
|
204
234
|
];
|
|
205
235
|
try {
|
|
206
|
-
atomicRearrange(
|
|
236
|
+
zcf.atomicRearrange(harden(transfers));
|
|
207
237
|
} catch (e) {
|
|
208
238
|
console.error('mintAndTransfer failed to rearrange', e);
|
|
209
239
|
// If the rearrange fails, burn the newly minted tokens.
|
|
@@ -250,12 +280,7 @@ const prepareVaultDirector = (
|
|
|
250
280
|
metrics: makeRecorderTopic('Vault Factory metrics', metricsKit),
|
|
251
281
|
});
|
|
252
282
|
|
|
253
|
-
const allManagersDo =
|
|
254
|
-
for (const managerIndex of collateralManagers.values()) {
|
|
255
|
-
const vm = vaultManagers.get(managerIndex).self;
|
|
256
|
-
fn(vm);
|
|
257
|
-
}
|
|
258
|
-
};
|
|
283
|
+
const allManagersDo = makeAllManagersDo(collateralManagers, vaultManagers);
|
|
259
284
|
|
|
260
285
|
const makeWaker = (name, func) => {
|
|
261
286
|
return Far(name, {
|
|
@@ -263,9 +288,7 @@ const prepareVaultDirector = (
|
|
|
263
288
|
});
|
|
264
289
|
};
|
|
265
290
|
|
|
266
|
-
/**
|
|
267
|
-
* @returns {State}
|
|
268
|
-
*/
|
|
291
|
+
/** @returns {State} */
|
|
269
292
|
const initState = () => {
|
|
270
293
|
return {};
|
|
271
294
|
};
|
|
@@ -275,7 +298,7 @@ const prepareVaultDirector = (
|
|
|
275
298
|
*
|
|
276
299
|
* @param {import('./vaultFactory.js').VaultFactoryZCF} zcf
|
|
277
300
|
* @param {VaultDirectorParamManager} directorParamManager
|
|
278
|
-
* @param {ZCFMint<
|
|
301
|
+
* @param {ZCFMint<'nat'>} debtMint
|
|
279
302
|
*/
|
|
280
303
|
const makeVaultDirector = prepareExoClassKit(
|
|
281
304
|
baggage,
|
|
@@ -293,6 +316,7 @@ const prepareVaultDirector = (
|
|
|
293
316
|
makePriceLockWaker: M.call().returns(M.remotable('TimerWaker')),
|
|
294
317
|
makeLiquidationWaker: M.call().returns(M.remotable('TimerWaker')),
|
|
295
318
|
makeReschedulerWaker: M.call().returns(M.remotable('TimerWaker')),
|
|
319
|
+
setShortfallReporter: M.call(InvitationShape).returns(M.promise()),
|
|
296
320
|
}),
|
|
297
321
|
public: M.interface('public', {
|
|
298
322
|
getCollateralManager: M.call(BrandShape).returns(M.remotable()),
|
|
@@ -301,9 +325,10 @@ const prepareVaultDirector = (
|
|
|
301
325
|
SubscriberShape,
|
|
302
326
|
),
|
|
303
327
|
getElectorateSubscription: M.call().returns(SubscriberShape),
|
|
304
|
-
getGovernedParams: M.
|
|
328
|
+
getGovernedParams: M.callWhen({ collateralBrand: BrandShape }).returns(
|
|
305
329
|
M.record(),
|
|
306
330
|
),
|
|
331
|
+
getDirectorGovernedParams: M.call().returns(M.promise()),
|
|
307
332
|
getInvitationAmount: M.call(M.string()).returns(AmountShape),
|
|
308
333
|
getPublicTopics: M.call().returns(TopicsRecordShape),
|
|
309
334
|
}),
|
|
@@ -330,9 +355,7 @@ const prepareVaultDirector = (
|
|
|
330
355
|
}
|
|
331
356
|
},
|
|
332
357
|
}),
|
|
333
|
-
/**
|
|
334
|
-
* @param {string} name
|
|
335
|
-
*/
|
|
358
|
+
/** @param {string} name */
|
|
336
359
|
getInvitation(name) {
|
|
337
360
|
return directorParamManager.getInternalParamValue(name);
|
|
338
361
|
},
|
|
@@ -378,9 +401,8 @@ const prepareVaultDirector = (
|
|
|
378
401
|
// zero-based index of the manager being made
|
|
379
402
|
const managerIndex = vaultManagers.length();
|
|
380
403
|
const managerId = `manager${managerIndex}`;
|
|
381
|
-
const managerStorageNode =
|
|
382
|
-
managerId
|
|
383
|
-
);
|
|
404
|
+
const managerStorageNode =
|
|
405
|
+
await E(managersNode).makeChildNode(managerId);
|
|
384
406
|
|
|
385
407
|
vaultParamManagers.addParamManager(
|
|
386
408
|
collateralBrand,
|
|
@@ -424,6 +446,7 @@ const prepareVaultDirector = (
|
|
|
424
446
|
|
|
425
447
|
makeLiquidationWaker() {
|
|
426
448
|
return makeWaker('liquidationWaker', _timestamp => {
|
|
449
|
+
// XXX floating promise
|
|
427
450
|
allManagersDo(vm => vm.liquidateVaults(auctioneer));
|
|
428
451
|
});
|
|
429
452
|
},
|
|
@@ -438,11 +461,15 @@ const prepareVaultDirector = (
|
|
|
438
461
|
allManagersDo(vm => vm.lockOraclePrices());
|
|
439
462
|
});
|
|
440
463
|
},
|
|
464
|
+
async setShortfallReporter(newInvitation) {
|
|
465
|
+
const zoe = zcf.getZoeService();
|
|
466
|
+
shortfallReporter = await E(
|
|
467
|
+
E(zoe).offer(newInvitation),
|
|
468
|
+
).getOfferResult();
|
|
469
|
+
},
|
|
441
470
|
},
|
|
442
471
|
public: {
|
|
443
|
-
/**
|
|
444
|
-
* @param {Brand} brandIn
|
|
445
|
-
*/
|
|
472
|
+
/** @param {Brand} brandIn */
|
|
446
473
|
getCollateralManager(brandIn) {
|
|
447
474
|
collateralManagers.has(brandIn) ||
|
|
448
475
|
Fail`Not a supported collateral type ${brandIn}`;
|
|
@@ -463,22 +490,24 @@ const prepareVaultDirector = (
|
|
|
463
490
|
getPublicTopics() {
|
|
464
491
|
return topics;
|
|
465
492
|
},
|
|
466
|
-
/**
|
|
467
|
-
* subscription for the paramManager for the vaultFactory's electorate
|
|
468
|
-
*/
|
|
493
|
+
/** subscription for the paramManager for the vaultFactory's electorate */
|
|
469
494
|
getElectorateSubscription() {
|
|
470
495
|
return directorParamManager.getSubscription();
|
|
471
496
|
},
|
|
472
497
|
/**
|
|
498
|
+
* Note this works only for a collateral manager. For the director use,
|
|
499
|
+
* `getDirectorGovernedParams`
|
|
500
|
+
*
|
|
473
501
|
* @param {{ collateralBrand: Brand }} selector
|
|
474
502
|
*/
|
|
475
503
|
getGovernedParams({ collateralBrand }) {
|
|
476
504
|
// TODO use named getters of TypedParamManager
|
|
477
505
|
return vaultParamManagers.get(collateralBrand).getParams();
|
|
478
506
|
},
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
507
|
+
getDirectorGovernedParams() {
|
|
508
|
+
return directorParamManager.getParams();
|
|
509
|
+
},
|
|
510
|
+
/** @param {string} name */
|
|
482
511
|
getInvitationAmount(name) {
|
|
483
512
|
return directorParamManager.getInvitationAmount(name);
|
|
484
513
|
},
|
|
@@ -498,9 +527,7 @@ const prepareVaultDirector = (
|
|
|
498
527
|
rescheduleWaker,
|
|
499
528
|
);
|
|
500
529
|
},
|
|
501
|
-
/**
|
|
502
|
-
* Start non-durable processes (or restart if needed after vat restart)
|
|
503
|
-
*/
|
|
530
|
+
/** Start non-durable processes (or restart if needed after vat restart) */
|
|
504
531
|
async start() {
|
|
505
532
|
const { helper, machine } = this.facets;
|
|
506
533
|
|
|
@@ -521,11 +548,14 @@ const prepareVaultDirector = (
|
|
|
521
548
|
return makeVaultDirector;
|
|
522
549
|
};
|
|
523
550
|
harden(prepareVaultDirector);
|
|
551
|
+
/** @typedef {EReturn<EReturn<typeof prepareVaultDirector>>} VaultDirector */
|
|
524
552
|
|
|
525
553
|
/**
|
|
526
554
|
* Prepare the VaultDirector kind, get or make the singleton
|
|
527
555
|
*
|
|
528
|
-
* @type {(
|
|
556
|
+
* @type {(
|
|
557
|
+
* ...pvdArgs: Parameters<typeof prepareVaultDirector>
|
|
558
|
+
* ) => VaultDirector}
|
|
529
559
|
*/
|
|
530
560
|
export const provideDirector = (...args) => {
|
|
531
561
|
const makeVaultDirector = prepareVaultDirector(...args);
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {ZCF<
|
|
3
|
+
* GovernanceTerms<import('./params').VaultDirectorParams> & {
|
|
4
|
+
* priceAuthority: ERef<PriceAuthority>;
|
|
5
|
+
* reservePublicFacet: AssetReservePublicFacet;
|
|
6
|
+
* timerService: import('@agoric/time').TimerService;
|
|
7
|
+
* }
|
|
8
|
+
* >} VaultFactoryZCF
|
|
9
|
+
*/
|
|
10
|
+
/** @type {ContractMeta} */
|
|
11
|
+
export const meta: ContractMeta;
|
|
12
|
+
export function start(zcf: VaultFactoryZCF, privateArgs: {
|
|
13
|
+
feeMintAccess: FeeMintAccess;
|
|
14
|
+
initialPoserInvitation: Invitation;
|
|
15
|
+
initialShortfallInvitation: Invitation;
|
|
16
|
+
storageNode: ERef<StorageNode>;
|
|
17
|
+
marshaller: ERef<Marshaller>;
|
|
18
|
+
auctioneerInstance: Instance<(zcf: ZCF<GovernanceTerms<typeof import("../auction/params.js").auctioneerParamTypes> & {
|
|
19
|
+
timerService: import("@agoric/time").TimerService;
|
|
20
|
+
reservePublicFacet: AssetReservePublicFacet;
|
|
21
|
+
priceAuthority: PriceAuthority;
|
|
22
|
+
}>, privateArgs: {
|
|
23
|
+
initialPoserInvitation: Invitation;
|
|
24
|
+
storageNode: StorageNode;
|
|
25
|
+
marshaller: Marshaller;
|
|
26
|
+
}, baggage: Baggage) => Promise<{
|
|
27
|
+
publicFacet: globalThis.GovernedPublicFacet<{
|
|
28
|
+
getElectorate: () => import("@agoric/ertp").SetAmount<import("@endo/patterns").Key>;
|
|
29
|
+
getStartFrequency: () => RelativeTime;
|
|
30
|
+
getClockStep: () => RelativeTime;
|
|
31
|
+
getStartingRate: () => bigint;
|
|
32
|
+
getLowestRate: () => bigint;
|
|
33
|
+
getDiscountStep: () => bigint;
|
|
34
|
+
getAuctionStartDelay: () => RelativeTime;
|
|
35
|
+
getPriceLockPeriod: () => RelativeTime;
|
|
36
|
+
makeBidInvitation(collateralBrand: Brand<"nat">): Promise<Invitation<string, import("../auction/auctionBook.js").OfferSpec>>;
|
|
37
|
+
getSchedules(): {
|
|
38
|
+
liveAuctionSchedule: import("../auction/scheduler.js").Schedule | null;
|
|
39
|
+
nextAuctionSchedule: import("../auction/scheduler.js").Schedule | null;
|
|
40
|
+
};
|
|
41
|
+
getScheduleUpdates(): globalThis.Subscriber<import("../auction/scheduler.js").ScheduleNotification>;
|
|
42
|
+
getBookDataUpdates(brand: any): globalThis.Subscriber<import("../auction/auctionBook.js").BookDataNotification>;
|
|
43
|
+
getPublicTopics(brand: any): {
|
|
44
|
+
bookData: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("../auction/auctionBook.js").BookDataNotification>;
|
|
45
|
+
} | {
|
|
46
|
+
schedule: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("../auction/scheduler.js").ScheduleNotification>;
|
|
47
|
+
};
|
|
48
|
+
makeDepositInvitation: () => Promise<Invitation<string, {
|
|
49
|
+
goal: Amount<"nat">;
|
|
50
|
+
}>>;
|
|
51
|
+
}>;
|
|
52
|
+
creatorFacet: globalThis.GovernedCreatorFacet<{
|
|
53
|
+
addBrand(issuer: Issuer<"nat">, kwd: Keyword): Promise<void>;
|
|
54
|
+
getSchedule(): Promise<import("../auction/scheduler.js").FullSchedule>;
|
|
55
|
+
} & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
|
|
56
|
+
addBrand(issuer: Issuer<"nat">, kwd: Keyword): Promise<void>;
|
|
57
|
+
getSchedule(): Promise<import("../auction/scheduler.js").FullSchedule>;
|
|
58
|
+
}>>;
|
|
59
|
+
}>>;
|
|
60
|
+
managerParams: Record<string, import("./params.js").VaultManagerParamOverrides>;
|
|
61
|
+
directorParamOverrides: [object];
|
|
62
|
+
}, baggage: import("@agoric/swingset-liveslots").Baggage): Promise<{
|
|
63
|
+
creatorFacet: import("@endo/exo").Guarded<{
|
|
64
|
+
getParamMgrRetriever: () => {
|
|
65
|
+
get: (paramPath?: VaultFactoryParamPath) => import("./vaultDirector.js").VaultDirectorParamManager | import("@agoric/governance/src/contractGovernance/typedParamManager.js").TypedParamManager<{
|
|
66
|
+
DebtLimit: "amount";
|
|
67
|
+
InterestRate: "ratio";
|
|
68
|
+
LiquidationPadding: "ratio";
|
|
69
|
+
LiquidationMargin: "ratio";
|
|
70
|
+
LiquidationPenalty: "ratio";
|
|
71
|
+
MintFee: "ratio";
|
|
72
|
+
}>;
|
|
73
|
+
} & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
|
|
74
|
+
get: (paramPath?: VaultFactoryParamPath) => import("./vaultDirector.js").VaultDirectorParamManager | import("@agoric/governance/src/contractGovernance/typedParamManager.js").TypedParamManager<{
|
|
75
|
+
DebtLimit: "amount";
|
|
76
|
+
InterestRate: "ratio";
|
|
77
|
+
LiquidationPadding: "ratio";
|
|
78
|
+
LiquidationMargin: "ratio";
|
|
79
|
+
LiquidationPenalty: "ratio";
|
|
80
|
+
MintFee: "ratio";
|
|
81
|
+
}>;
|
|
82
|
+
}>;
|
|
83
|
+
getInvitation(name: string): Promise<Invitation>;
|
|
84
|
+
getLimitedCreatorFacet(): import("@endo/exo").Guarded<{
|
|
85
|
+
addVaultType(collateralIssuer: Issuer<"nat">, collateralKeyword: Keyword, initialParamValues: VaultManagerParamValues): Promise<import("@endo/exo").Guarded<{
|
|
86
|
+
getGovernedParams(): import("./vaultManager.js").GovernedParamGetters;
|
|
87
|
+
makeVaultKit(seat: ZCFSeat): Promise<{
|
|
88
|
+
publicSubscribers: {
|
|
89
|
+
vault: {
|
|
90
|
+
description: string;
|
|
91
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
92
|
+
storagePath: Promise<string>;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
invitationMakers: import("@endo/exo").Guarded<{
|
|
96
|
+
AdjustBalances(): Promise<Invitation<string, undefined>>;
|
|
97
|
+
CloseVault(): Promise<Invitation<string, undefined>>;
|
|
98
|
+
TransferVault(): Promise<Invitation</*elided*/ any>>;
|
|
99
|
+
}>;
|
|
100
|
+
vault: import("@endo/exo").Guarded<{
|
|
101
|
+
getPublicTopics(): {
|
|
102
|
+
vault: {
|
|
103
|
+
description: string;
|
|
104
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
105
|
+
storagePath: Promise<string>;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
makeAdjustBalancesInvitation(): Promise<Invitation<string, undefined>>;
|
|
109
|
+
makeCloseInvitation(): Promise<Invitation<string, undefined>>;
|
|
110
|
+
makeTransferInvitation(): Promise<Invitation</*elided*/ any>>;
|
|
111
|
+
getCollateralAmount(): import("@agoric/ertp").NatAmount;
|
|
112
|
+
getCurrentDebt(): import("@agoric/ertp").NatAmount;
|
|
113
|
+
getNormalizedDebt(): import("./storeUtils.js").NormalizedDebt;
|
|
114
|
+
}>;
|
|
115
|
+
vaultUpdater: import("@agoric/zoe/src/contractSupport/recorder.js").Recorder<VaultNotification>;
|
|
116
|
+
}>;
|
|
117
|
+
getCollateralQuote(): PriceQuote;
|
|
118
|
+
getPublicFacet(): import("@endo/exo").Guarded<{
|
|
119
|
+
makeVaultInvitation(): Promise<Invitation<{
|
|
120
|
+
publicSubscribers: {
|
|
121
|
+
vault: {
|
|
122
|
+
description: string;
|
|
123
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
124
|
+
storagePath: Promise<string>;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
invitationMakers: import("@endo/exo").Guarded<{
|
|
128
|
+
AdjustBalances(): Promise<Invitation<string, undefined>>;
|
|
129
|
+
CloseVault(): Promise<Invitation<string, undefined>>;
|
|
130
|
+
TransferVault(): Promise<Invitation</*elided*/ any>>;
|
|
131
|
+
}>;
|
|
132
|
+
vault: import("@endo/exo").Guarded<{
|
|
133
|
+
getPublicTopics(): {
|
|
134
|
+
vault: {
|
|
135
|
+
description: string;
|
|
136
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
137
|
+
storagePath: Promise<string>;
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
makeAdjustBalancesInvitation(): Promise<Invitation<string, undefined>>;
|
|
141
|
+
makeCloseInvitation(): Promise<Invitation<string, undefined>>;
|
|
142
|
+
makeTransferInvitation(): Promise<Invitation</*elided*/ any>>;
|
|
143
|
+
getCollateralAmount(): import("@agoric/ertp").NatAmount;
|
|
144
|
+
getCurrentDebt(): import("@agoric/ertp").NatAmount;
|
|
145
|
+
getNormalizedDebt(): import("./storeUtils.js").NormalizedDebt;
|
|
146
|
+
}>;
|
|
147
|
+
vaultUpdater: import("@agoric/zoe/src/contractSupport/recorder.js").Recorder<VaultNotification>;
|
|
148
|
+
}, undefined>>;
|
|
149
|
+
getQuotes(): import("@agoric/notifier").StoredNotifier<PriceQuote>;
|
|
150
|
+
getCompoundedInterest(): Ratio;
|
|
151
|
+
getPublicTopics(): {
|
|
152
|
+
asset: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./vaultManager.js").AssetState>;
|
|
153
|
+
metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./vaultManager.js").MetricsNotification>;
|
|
154
|
+
};
|
|
155
|
+
}>;
|
|
156
|
+
lockOraclePrices(): PriceQuote;
|
|
157
|
+
liquidateVaults(auctionPF: ERef<AuctioneerPublicFacet>): Promise<void>;
|
|
158
|
+
}>>;
|
|
159
|
+
makeCollectFeesInvitation(): Promise<Invitation<string>>;
|
|
160
|
+
getRewardAllocation(): Allocation;
|
|
161
|
+
makeLiquidationWaker(): {
|
|
162
|
+
wake: (timestamp: any) => any;
|
|
163
|
+
} & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
|
|
164
|
+
wake: (timestamp: any) => any;
|
|
165
|
+
}>;
|
|
166
|
+
makeReschedulerWaker(): {
|
|
167
|
+
wake: (timestamp: any) => any;
|
|
168
|
+
} & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
|
|
169
|
+
wake: (timestamp: any) => any;
|
|
170
|
+
}>;
|
|
171
|
+
makePriceLockWaker(): {
|
|
172
|
+
wake: (timestamp: any) => any;
|
|
173
|
+
} & RemotableObject<`Alleged: ${string}`> & import("@endo/eventual-send").RemotableBrand<{}, {
|
|
174
|
+
wake: (timestamp: any) => any;
|
|
175
|
+
}>;
|
|
176
|
+
setShortfallReporter(newInvitation: any): Promise<void>;
|
|
177
|
+
}>;
|
|
178
|
+
getGovernedApis(): ERef<GovernedApis>;
|
|
179
|
+
getGovernedApiNames(): never[];
|
|
180
|
+
setOfferFilter: (strings: any) => Promise<void>;
|
|
181
|
+
}>;
|
|
182
|
+
publicFacet: import("@endo/exo").Guarded<{
|
|
183
|
+
getCollateralManager(brandIn: Brand): import("@endo/exo").Guarded<{
|
|
184
|
+
makeVaultInvitation(): Promise<Invitation<{
|
|
185
|
+
publicSubscribers: {
|
|
186
|
+
vault: {
|
|
187
|
+
description: string;
|
|
188
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
189
|
+
storagePath: Promise<string>;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
invitationMakers: import("@endo/exo").Guarded<{
|
|
193
|
+
AdjustBalances(): Promise<Invitation<string, undefined>>;
|
|
194
|
+
CloseVault(): Promise<Invitation<string, undefined>>;
|
|
195
|
+
TransferVault(): Promise<Invitation</*elided*/ any>>;
|
|
196
|
+
}>;
|
|
197
|
+
vault: import("@endo/exo").Guarded<{
|
|
198
|
+
getPublicTopics(): {
|
|
199
|
+
vault: {
|
|
200
|
+
description: string;
|
|
201
|
+
subscriber: globalThis.Subscriber<VaultNotification>;
|
|
202
|
+
storagePath: Promise<string>;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
makeAdjustBalancesInvitation(): Promise<Invitation<string, undefined>>;
|
|
206
|
+
makeCloseInvitation(): Promise<Invitation<string, undefined>>;
|
|
207
|
+
makeTransferInvitation(): Promise<Invitation</*elided*/ any>>;
|
|
208
|
+
getCollateralAmount(): import("@agoric/ertp").NatAmount;
|
|
209
|
+
getCurrentDebt(): import("@agoric/ertp").NatAmount;
|
|
210
|
+
getNormalizedDebt(): import("./storeUtils.js").NormalizedDebt;
|
|
211
|
+
}>;
|
|
212
|
+
vaultUpdater: import("@agoric/zoe/src/contractSupport/recorder.js").Recorder<VaultNotification>;
|
|
213
|
+
}, undefined>>;
|
|
214
|
+
getQuotes(): import("@agoric/notifier").StoredNotifier<PriceQuote>;
|
|
215
|
+
getCompoundedInterest(): Ratio;
|
|
216
|
+
getPublicTopics(): {
|
|
217
|
+
asset: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./vaultManager.js").AssetState>;
|
|
218
|
+
metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./vaultManager.js").MetricsNotification>;
|
|
219
|
+
};
|
|
220
|
+
}>;
|
|
221
|
+
getDebtIssuer(): globalThis.Issuer<"nat", import("@endo/patterns").Key>;
|
|
222
|
+
getSubscription({ collateralBrand }: {
|
|
223
|
+
collateralBrand: Brand;
|
|
224
|
+
}): globalThis.StoredSubscription<globalThis.GovernanceSubscriptionState>;
|
|
225
|
+
getPublicTopics(): {
|
|
226
|
+
metrics: import("@agoric/zoe/src/contractSupport/topics.js").PublicTopic<import("./vaultDirector.js").MetricsNotification>;
|
|
227
|
+
};
|
|
228
|
+
getElectorateSubscription(): globalThis.StoredSubscription<globalThis.GovernanceSubscriptionState>;
|
|
229
|
+
getGovernedParams({ collateralBrand }: {
|
|
230
|
+
collateralBrand: Brand;
|
|
231
|
+
}): globalThis.ERef<globalThis.ParamStateRecord>;
|
|
232
|
+
getDirectorGovernedParams(): globalThis.ERef<globalThis.ParamStateRecord>;
|
|
233
|
+
getInvitationAmount(name: string): import("@agoric/ertp").SetAmount<import("@agoric/zoe").InvitationDetails>;
|
|
234
|
+
}>;
|
|
235
|
+
}>;
|
|
236
|
+
export type VaultFactoryZCF = ZCF<GovernanceTerms<import("./params").VaultDirectorParams> & {
|
|
237
|
+
priceAuthority: ERef<PriceAuthority>;
|
|
238
|
+
reservePublicFacet: AssetReservePublicFacet;
|
|
239
|
+
timerService: import("@agoric/time").TimerService;
|
|
240
|
+
}>;
|
|
241
|
+
export type VaultFactoryContract = ContractOf<typeof start>;
|
|
242
|
+
import type { ContractMeta } from '@agoric/zoe';
|
|
243
|
+
import type { FeeMintAccess } from '@agoric/zoe';
|
|
244
|
+
import type { Invitation } from '@agoric/zoe';
|
|
245
|
+
import type { PriceAuthority } from '@agoric/zoe/tools/types.js';
|
|
246
|
+
import type { ZCF } from '@agoric/zoe';
|
|
247
|
+
import type { ZCFSeat } from '@agoric/zoe';
|
|
248
|
+
import type { PriceQuote } from '@agoric/zoe/tools/types.js';
|
|
249
|
+
import type { ContractOf } from '@agoric/zoe/src/zoeService/utils.js';
|
|
250
|
+
//# sourceMappingURL=vaultFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vaultFactory.d.ts","sourceRoot":"","sources":["vaultFactory.js"],"names":[],"mappings":"AAuCA;;;;;;;;GAQG;AAEH,2BAA2B;AAC3B,mBADW,YAAY,CAerB;AAoBK,2BAhBI,eAAe,eACf;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,sBAAsB,EAAE,UAAU,CAAC;IACnC,0BAA0B,EAAE,UAAU,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,kBAAkB,EAAE,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAwC,CAAC,CAAC;IACvE,aAAa,EAAE,MAAM,CACzB,MAAY,EACZ,OAAa,aAAa,EAAE,0BAA0B,CACjD,CAAC;IACF,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC;CAClC,WACO,OAAO,4BAA4B,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFtD;8BAhIY,IACR,eAAe,CAAC,OAAO,UAAU,EAAE,mBAAmB,CAAC,GAAG;IACxD,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,YAAY,EAAE,OAAO,cAAc,EAAE,YAAY,CAAC;CACnD,CACF;mCA6HU,WAAW,OAAO,KAAK,CAAC;kCA3IoF,aAAa;mCAAb,aAAa;gCAAb,aAAa;oCAE1C,4BAA4B;yBAFC,aAAa;6BAAb,aAAa;gCAE1C,4BAA4B;gCAD5F,qCAAqC"}
|