@agoric/inter-protocol 0.17.0-u16.2 → 0.17.0-u17.1
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/package.json +26 -26
- package/src/auction/auctionBook.d.ts.map +1 -1
- package/src/auction/auctionBook.js +27 -46
- 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.map +1 -1
- package/src/auction/auctioneer.js +7 -10
- package/src/auction/offerBook.d.ts.map +1 -1
- package/src/auction/scheduleMath.d.ts.map +1 -1
- package/src/auction/scheduleMath.js +1 -1
- package/src/auction/scheduler.d.ts.map +1 -1
- package/src/auction/scheduler.js +3 -4
- package/src/auction/sortedOffers.d.ts.map +1 -1
- package/src/auction/sortedOffers.js +1 -2
- package/src/clientSupport.js +1 -1
- package/src/contractSupport.d.ts.map +1 -1
- package/src/contractSupport.js +6 -2
- package/src/interest.js +2 -2
- package/src/price/fluxAggregatorContract.d.ts.map +1 -1
- package/src/price/fluxAggregatorKit.d.ts.map +1 -1
- package/src/price/fluxAggregatorKit.js +6 -7
- package/src/price/priceOracleKit.d.ts.map +1 -1
- package/src/price/priceOracleKit.js +1 -1
- package/src/price/roundsManager.d.ts.map +1 -1
- package/src/price/roundsManager.js +1 -1
- package/src/proposals/add-auction.d.ts +40 -14
- package/src/proposals/add-auction.d.ts.map +1 -1
- package/src/proposals/add-auction.js +102 -49
- package/src/proposals/addAssetToVault.d.ts.map +1 -1
- package/src/proposals/addAssetToVault.js +1 -2
- package/src/proposals/econ-behaviors.d.ts +2 -0
- package/src/proposals/econ-behaviors.d.ts.map +1 -1
- package/src/proposals/econ-behaviors.js +0 -3
- package/src/proposals/startPSM.d.ts.map +1 -1
- package/src/proposals/startPSM.js +16 -12
- package/src/proposals/upgrade-vaults.d.ts +14 -10
- package/src/proposals/upgrade-vaults.d.ts.map +1 -1
- package/src/proposals/upgrade-vaults.js +99 -116
- package/src/proposals/utils.d.ts.map +1 -1
- package/src/proposals/utils.js +3 -4
- package/src/provisionPool.d.ts.map +1 -1
- package/src/provisionPoolKit.d.ts +6 -0
- package/src/provisionPoolKit.d.ts.map +1 -1
- package/src/provisionPoolKit.js +109 -50
- package/src/psm/psm.d.ts +4 -1
- package/src/psm/psm.d.ts.map +1 -1
- package/src/psm/psm.js +7 -7
- package/src/reserve/assetReserveKit.d.ts.map +1 -1
- package/src/reserve/assetReserveKit.js +6 -6
- package/src/vaultFactory/liquidation.d.ts.map +1 -1
- package/src/vaultFactory/liquidation.js +1 -2
- package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -1
- package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -1
- package/src/vaultFactory/storeUtils.d.ts +1 -1
- package/src/vaultFactory/storeUtils.d.ts.map +1 -1
- package/src/vaultFactory/vault.d.ts.map +1 -1
- package/src/vaultFactory/vault.js +1 -2
- package/src/vaultFactory/vaultDirector.d.ts +3 -2
- package/src/vaultFactory/vaultDirector.d.ts.map +1 -1
- package/src/vaultFactory/vaultDirector.js +25 -16
- package/src/vaultFactory/vaultFactory.d.ts +1 -0
- package/src/vaultFactory/vaultFactory.d.ts.map +1 -1
- package/src/vaultFactory/vaultFactory.js +3 -1
- package/src/vaultFactory/vaultHolder.d.ts.map +1 -1
- package/src/vaultFactory/vaultHolder.js +1 -2
- package/src/vaultFactory/vaultManager.d.ts.map +1 -1
- package/src/vaultFactory/vaultManager.js +8 -8
|
@@ -2,63 +2,47 @@ import { E } from '@endo/far';
|
|
|
2
2
|
import { makeNotifierFromAsyncIterable } from '@agoric/notifier';
|
|
3
3
|
import { AmountMath } from '@agoric/ertp/src/index.js';
|
|
4
4
|
import { makeTracer } from '@agoric/internal/src/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { Fail } from '@endo/errors';
|
|
6
|
+
import { TimeMath } from '@agoric/time';
|
|
6
7
|
|
|
7
8
|
const trace = makeTracer('upgrade Vaults proposal');
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
void promise.then(resolve, () => {});
|
|
15
|
-
}
|
|
16
|
-
void Promise.allSettled(promises).then(results => {
|
|
17
|
-
const rejects = /** @type {PromiseRejectedResult[]} */ (
|
|
18
|
-
results.filter(({ status }) => status === 'rejected')
|
|
19
|
-
);
|
|
20
|
-
if (rejects.length === results.length) {
|
|
21
|
-
const messages = rejects.map(
|
|
22
|
-
({ reason: { message } }) => message || 'no error message',
|
|
23
|
-
);
|
|
24
|
-
const aggregate = new Error(messages.join(';'));
|
|
25
|
-
/** @type {any} */ (aggregate).errors = rejects.map(
|
|
26
|
-
({ reason }) => reason,
|
|
27
|
-
);
|
|
28
|
-
reject(aggregate);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
});
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {PromiseSpaceOf<{
|
|
12
|
+
* auctionUpgradeNewInstance: Instance;
|
|
13
|
+
* }>} interlockPowers
|
|
14
|
+
*/
|
|
32
15
|
|
|
33
16
|
/**
|
|
34
|
-
* @param {import('../../src/proposals/econ-behaviors').EconomyBootstrapPowers
|
|
17
|
+
* @param {import('../../src/proposals/econ-behaviors').EconomyBootstrapPowers &
|
|
18
|
+
* interlockPowers} powers
|
|
35
19
|
* @param {{ options: { vaultsRef: { bundleID: string } } }} options
|
|
36
20
|
*/
|
|
37
|
-
export const upgradeVaults = async (
|
|
38
|
-
|
|
21
|
+
export const upgradeVaults = async (
|
|
22
|
+
{
|
|
39
23
|
consume: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
priceAuthority,
|
|
43
|
-
vaultFactoryKit,
|
|
44
|
-
zoe,
|
|
24
|
+
auctionUpgradeNewInstance,
|
|
25
|
+
chainTimerService,
|
|
45
26
|
economicCommitteeCreatorFacet: electorateCreatorFacet,
|
|
46
27
|
reserveKit,
|
|
28
|
+
vaultFactoryKit,
|
|
29
|
+
zoe,
|
|
47
30
|
},
|
|
48
|
-
produce: {
|
|
49
|
-
|
|
50
|
-
|
|
31
|
+
produce: { auctionUpgradeNewInstance: auctionUpgradeNewInstanceProducer },
|
|
32
|
+
installation: {
|
|
33
|
+
produce: { VaultFactory: produceVaultInstallation },
|
|
51
34
|
},
|
|
52
35
|
instance: {
|
|
53
|
-
|
|
36
|
+
consume: { auctioneer: auctioneerInstanceP },
|
|
54
37
|
},
|
|
55
|
-
}
|
|
38
|
+
},
|
|
39
|
+
{ options },
|
|
40
|
+
) => {
|
|
56
41
|
const { vaultsRef } = options;
|
|
57
42
|
const kit = await vaultFactoryKit;
|
|
58
|
-
const auctioneerKit = await auctioneerKitP;
|
|
59
43
|
const { instance: directorInstance } = kit;
|
|
60
44
|
const allBrands = await E(zoe).getBrands(directorInstance);
|
|
61
|
-
const { Minted:
|
|
45
|
+
const { Minted: _istBrand, ...vaultBrands } = allBrands;
|
|
62
46
|
|
|
63
47
|
const bundleID = vaultsRef.bundleID;
|
|
64
48
|
console.log(`upgradeVaults: bundleId`, bundleID);
|
|
@@ -67,23 +51,50 @@ export const upgradeVaults = async (powers, { options }) => {
|
|
|
67
51
|
* Installation<import('../../src/vaultFactory/vaultFactory.js')['start']>
|
|
68
52
|
* >}
|
|
69
53
|
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
54
|
+
const installationP = E(zoe).installBundleID(bundleID);
|
|
55
|
+
produceVaultInstallation.reset();
|
|
56
|
+
produceVaultInstallation.resolve(installationP);
|
|
57
|
+
|
|
58
|
+
const [auctionOldInstance, auctionNewInstance] = await Promise.all([
|
|
59
|
+
auctioneerInstanceP,
|
|
60
|
+
auctionUpgradeNewInstance,
|
|
61
|
+
]);
|
|
62
|
+
auctionOldInstance !== auctionNewInstance ||
|
|
63
|
+
Fail`Auction instance didn't change`;
|
|
64
|
+
auctionUpgradeNewInstanceProducer.reset();
|
|
65
|
+
const publicFacet = E(zoe).getPublicFacet(auctionNewInstance);
|
|
66
|
+
/** @type {import('@agoric/inter-protocol/src/auction/scheduler.js').FullSchedule} */
|
|
67
|
+
const schedules = await E(publicFacet).getSchedules();
|
|
68
|
+
const now = await E(chainTimerService).getCurrentTimestamp();
|
|
69
|
+
(schedules.nextAuctionSchedule &&
|
|
70
|
+
TimeMath.compareAbs(schedules.nextAuctionSchedule.startTime, now) > 0) ||
|
|
71
|
+
Fail`Expected next start time in the future ${schedules.nextAuctionSchedule?.startTime}`;
|
|
72
|
+
|
|
73
|
+
const readCurrentDirectorParams = async () => {
|
|
74
|
+
const { publicFacet: directorPF } = kit;
|
|
75
|
+
|
|
76
|
+
await null;
|
|
77
|
+
|
|
78
|
+
const subscription = E(directorPF).getElectorateSubscription();
|
|
79
|
+
const notifier = makeNotifierFromAsyncIterable(subscription);
|
|
80
|
+
let { value, updateCount } = await notifier.getUpdateSince(0n);
|
|
81
|
+
// @ts-expect-error It's an amount.
|
|
82
|
+
while (AmountMath.isEmpty(value.current.MinInitialDebt.value)) {
|
|
83
|
+
({ value, updateCount } = await notifier.getUpdateSince(updateCount));
|
|
84
|
+
trace(
|
|
85
|
+
`minInitialDebt was empty, retried`,
|
|
86
|
+
value.current.MinInitialDebt.value,
|
|
84
87
|
);
|
|
85
88
|
}
|
|
86
|
-
|
|
89
|
+
|
|
90
|
+
return harden({
|
|
91
|
+
MinInitialDebt: value.current.MinInitialDebt.value,
|
|
92
|
+
ReferencedUI: value.current.ReferencedUI.value,
|
|
93
|
+
RecordingPeriod: value.current.RecordingPeriod.value,
|
|
94
|
+
ChargingPeriod: value.current.ChargingPeriod.value,
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const directorParamOverrides = await readCurrentDirectorParams();
|
|
87
98
|
|
|
88
99
|
const readManagerParams = async () => {
|
|
89
100
|
const { publicFacet: directorPF } = kit;
|
|
@@ -99,9 +110,17 @@ export const upgradeVaults = async (powers, { options }) => {
|
|
|
99
110
|
const notifier = makeNotifierFromAsyncIterable(subscription);
|
|
100
111
|
let { value, updateCount } = await notifier.getUpdateSince(0n);
|
|
101
112
|
// @ts-expect-error It's an amount.
|
|
102
|
-
|
|
113
|
+
if (AmountMath.isEmpty(value.current.DebtLimit.value)) {
|
|
114
|
+
// The parameters might have been empty at start, and the notifier might
|
|
115
|
+
// give the first state before the current state.
|
|
116
|
+
trace(`debtLimit was empty, retrying`, value.current.DebtLimit.value);
|
|
103
117
|
({ value, updateCount } = await notifier.getUpdateSince(updateCount));
|
|
104
|
-
|
|
118
|
+
|
|
119
|
+
// @ts-expect-error It's an amount.
|
|
120
|
+
if (AmountMath.isEmpty(value.current.DebtLimit.value)) {
|
|
121
|
+
trace('debtLimit was empty after retrying');
|
|
122
|
+
throw Error('🚨Governed parameters empty after retry, Giving up');
|
|
123
|
+
}
|
|
105
124
|
}
|
|
106
125
|
trace(kwd, 'params at', updateCount, 'are', value.current);
|
|
107
126
|
params[kwd] = harden({
|
|
@@ -130,14 +149,15 @@ export const upgradeVaults = async (powers, { options }) => {
|
|
|
130
149
|
const poserInvitation = await E(
|
|
131
150
|
electorateCreatorFacet,
|
|
132
151
|
).getPoserInvitation();
|
|
152
|
+
|
|
133
153
|
/** @type {import('../../src/vaultFactory/vaultFactory').VaultFactoryContract['privateArgs']} */
|
|
134
154
|
const newPrivateArgs = harden({
|
|
135
155
|
...privateArgs,
|
|
136
|
-
|
|
137
|
-
auctioneerInstance: auctioneerKit.instance,
|
|
156
|
+
auctioneerInstance: auctionNewInstance,
|
|
138
157
|
initialPoserInvitation: poserInvitation,
|
|
139
158
|
initialShortfallInvitation: shortfallInvitation,
|
|
140
159
|
managerParams: managerParamValues,
|
|
160
|
+
directorParamOverrides,
|
|
141
161
|
});
|
|
142
162
|
|
|
143
163
|
const upgradeResult = await E(kit.adminFacet).upgradeContract(
|
|
@@ -148,60 +168,22 @@ export const upgradeVaults = async (powers, { options }) => {
|
|
|
148
168
|
trace('upgraded vaultFactory.', upgradeResult);
|
|
149
169
|
};
|
|
150
170
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
isUpgradeDisconnection(reason) &&
|
|
165
|
-
(!lastRejectionReason ||
|
|
166
|
-
reason.incarnationNumber >
|
|
167
|
-
lastRejectionReason.incarnationNumber)
|
|
168
|
-
) {
|
|
169
|
-
return getQuote(reason);
|
|
170
|
-
}
|
|
171
|
-
throw reason;
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
return getQuote(null);
|
|
175
|
-
}),
|
|
176
|
-
),
|
|
177
|
-
async price => {
|
|
178
|
-
trace(`upgrading after delay`, price);
|
|
179
|
-
await upgradeVaultFactory();
|
|
180
|
-
auctioneerKitProducer.reset();
|
|
181
|
-
// @ts-expect-error auctioneerKit is non-null except between auctioneerKitProducer.reset() and auctioneerKitProducer.resolve()
|
|
182
|
-
auctioneerKitProducer.resolve(auctioneerKit);
|
|
183
|
-
auctioneerProducer.reset();
|
|
184
|
-
// @ts-expect-error auctioneerKit is non-null except between auctioneerKitProducer.reset() and auctioneerKitProducer.resolve()
|
|
185
|
-
auctioneerProducer.resolve(auctioneerKit.instance);
|
|
186
|
-
// We wanted it to be valid for only a short while.
|
|
187
|
-
tempAuctioneerKit.reset();
|
|
188
|
-
await E(E(agoricNamesAdmin).lookupAdmin('instance')).update(
|
|
189
|
-
'auctioneer',
|
|
190
|
-
// @ts-expect-error auctioneerKit is non-null except between auctioneerKitProducer.reset() and auctioneerKitProducer.resolve()
|
|
191
|
-
auctioneerKit.instance,
|
|
192
|
-
);
|
|
193
|
-
trace(`upgrading complete`, price);
|
|
194
|
-
},
|
|
195
|
-
error => {
|
|
196
|
-
console.error(
|
|
197
|
-
'Failed to upgrade vaultFactory',
|
|
198
|
-
error.message,
|
|
199
|
-
...(error.errors || []),
|
|
200
|
-
);
|
|
201
|
-
},
|
|
171
|
+
await upgradeVaultFactory();
|
|
172
|
+
|
|
173
|
+
// @ts-expect-error It's saved in econ-behaviors.js:startVaultFactory()
|
|
174
|
+
const vaultFactoryPrivateArgs = kit.privateArgs;
|
|
175
|
+
console.log('UPGV upgraded vaults, restarting governor');
|
|
176
|
+
|
|
177
|
+
const ecf = await electorateCreatorFacet;
|
|
178
|
+
// restart vaultFactory governor
|
|
179
|
+
await E(kit.governorAdminFacet).restartContract(
|
|
180
|
+
harden({
|
|
181
|
+
electorateCreatorFacet: ecf,
|
|
182
|
+
governed: vaultFactoryPrivateArgs,
|
|
183
|
+
}),
|
|
202
184
|
);
|
|
203
185
|
|
|
204
|
-
console.log(
|
|
186
|
+
console.log('UPGV restarted governor');
|
|
205
187
|
};
|
|
206
188
|
|
|
207
189
|
const uV = 'upgradeVaults';
|
|
@@ -218,17 +200,18 @@ export const getManifestForUpgradeVaults = async (
|
|
|
218
200
|
manifest: {
|
|
219
201
|
[upgradeVaults.name]: {
|
|
220
202
|
consume: {
|
|
221
|
-
|
|
222
|
-
|
|
203
|
+
auctionUpgradeNewInstance: uV,
|
|
204
|
+
chainTimerService: uV,
|
|
223
205
|
economicCommitteeCreatorFacet: uV,
|
|
224
|
-
priceAuthority: uV,
|
|
225
206
|
reserveKit: uV,
|
|
226
207
|
vaultFactoryKit: uV,
|
|
227
|
-
board: uV,
|
|
228
208
|
zoe: uV,
|
|
229
209
|
},
|
|
230
|
-
produce: {
|
|
231
|
-
|
|
210
|
+
produce: { auctionUpgradeNewInstance: uV },
|
|
211
|
+
installation: {
|
|
212
|
+
produce: { VaultFactory: true },
|
|
213
|
+
},
|
|
214
|
+
instance: { consume: { auctioneer: true } },
|
|
232
215
|
},
|
|
233
216
|
},
|
|
234
217
|
options: { ...vaultUpgradeOptions },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.js"],"names":[],"mappings":"AAWO,mDAHI,IAAI,CAAC,OAAO,cAAc,EAAE,SAAS,CAAC,SACtC,MAAM,EAAE,EAAE,kBA+BpB;AAMM,+CAHI,IAAI,CAAC,OAAO,cAAc,EAAE,SAAS,CAAC,SACtC,MAAM,EAAE,kBAMhB;AAQI,8CALI,MAAM,uBACN,IAAI,CAAC,OAAO,cAAc,EAAE,SAAS,CAAC,QACtC,MAAM,YACN,IAAI,CAAC,OAAO,CAAC,EAAE,iBAuBzB;AA6BM,wCAPI;IACV,OAAW,EAAE,IAAI,CAAC,OAAO,iCAAiC,EAAE,UAAU,CAAC,CAAC;CACrE,mCAED;IAAkE,UAAU,EAApE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,eAAe;CAAC;;;GAoDxC;AAEM,iFACsC;AAEtC,6DAC+B"}
|
package/src/proposals/utils.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { Fail } from '@endo/errors';
|
|
2
|
+
import { E } from '@endo/far';
|
|
1
3
|
import { WalletName } from '@agoric/internal';
|
|
2
4
|
import { getCopyMapEntries, makeCopyMap } from '@agoric/store';
|
|
3
|
-
import { E } from '@endo/far';
|
|
4
|
-
|
|
5
|
-
/** @import {CopyMap} from '@endo/patterns') */
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
/** @import {CopyMap} from '@endo/patterns'; */
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* @param {ERef<import('@agoric/vats').NameAdmin>} nameAdmin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisionPool.d.ts","sourceRoot":"","sources":["provisionPool.js"],"names":[],"mappings":"AAgBA,8CAA8C;AAE9C,2BAA2B;AAC3B,mBADW,YAAY,CAerB;AAqBK,2BAZI,GAAG,CAAC,cAAc,CAAC,eACnB;IACV,QAAY,EAAE,OAAO,WAAW,EAAE,IAAI,CACtC,OAAa,8BAA8B,EAAE,IAAI,CAC5C,CAAC;IACN,sBAA0B,EAAE,UAAU,CAAC;IACvC,WAAe,EAAE,WAAW,CAAC;IAC7B,UAAc,EAAE,QAAQ,GAAG,CAAC,CAAC;IAC7B,eAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,mBAAmB,CAAC;CACvE,WACO,OAAO,kBAAkB,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"provisionPool.d.ts","sourceRoot":"","sources":["provisionPool.js"],"names":[],"mappings":"AAgBA,8CAA8C;AAE9C,2BAA2B;AAC3B,mBADW,YAAY,CAerB;AAqBK,2BAZI,GAAG,CAAC,cAAc,CAAC,eACnB;IACV,QAAY,EAAE,OAAO,WAAW,EAAE,IAAI,CACtC,OAAa,8BAA8B,EAAE,IAAI,CAC5C,CAAC;IACN,sBAA0B,EAAE,UAAU,CAAC;IACvC,WAAe,EAAE,WAAW,CAAC;IAC7B,UAAc,EAAE,QAAQ,GAAG,CAAC,CAAC;IAC7B,eAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,mBAAmB,CAAC;CACvE,WACO,OAAO,kBAAkB,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;6DAsE0tkC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAAvswB,cAAc;kDAAuE,cAAc;;;;;;;;;GAHjrU;;;;6BAlFY,aAAa,GACzB,eAAmB,CAAC;IACpB,uBAA6B,EAAE,QAAQ,CAAC;CACnC,CAAC;6BAxBoB,eAAe"}
|
|
@@ -245,6 +245,12 @@ export function prepareProvisionPoolKit(baggage: import("@agoric/vat-data").Bagg
|
|
|
245
245
|
onProvisioned(): void;
|
|
246
246
|
/** @param {ERef<Bank>} destBank */
|
|
247
247
|
sendInitialPayment(destBank: ERef<Bank>): Promise<void>;
|
|
248
|
+
/**
|
|
249
|
+
* @param {ERef<Purse>} exchangePurse
|
|
250
|
+
* @param {ERef<Brand>} brand
|
|
251
|
+
*/
|
|
252
|
+
watchCurrentAmount(exchangePurse: ERef<Purse>, brand: ERef<Brand>): void;
|
|
253
|
+
watchAssetSubscription(): Promise<undefined>;
|
|
248
254
|
/**
|
|
249
255
|
* @param {object} [options]
|
|
250
256
|
* @param {MetricsNotification} [options.metrics]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisionPoolKit.d.ts","sourceRoot":"","sources":["provisionPoolKit.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provisionPoolKit.d.ts","sourceRoot":"","sources":["provisionPoolKit.js"],"names":[],"mappings":"AAuEO,4DAHI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,iBAC1C,MAAM,IAAI,0DAGP,0BAA0B;;;;GA+BvC;AAWM,iDARI,OAAO,kBAAkB,EAAE,OAAO,8CAClC;IACV,eAAmB,EAAE,OAAO,6CAA6C,EAAE,eAAe,CAAC;IAC3F,MAAU,EAAE,GAAG,CAAC;IAChB,QAAY,EAAE,OAAO,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,GAAO,EAAE,GAAG,CAAC;CACV,gCA0YC;IAA2B,SAAS,EAA5B,KAAK,CAAC,KAAK,CAAC;IACY,WAAW,EAAnC,KAAK,WAAW,CAAC;CAC3B;;QA7TK,qCAAqC;4CAAzB,MAAM,EAAE;;YA+CpB,8BAA8B;kCAAlB,MAAM;yDA4R2kpB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAvQ5mpB;;;eAGG;+BAFQ,MAAM,GACJ,OAAO;;QA9DpB,gDAAgD;6BAApC,0BAA0B;;;;;;QA6BtC;;;WAGG;uBAFQ,KAAK,YACL,WAAW;;;QAQtB,8BAA8B;8BAAlB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqBlB;;;WAGG;2BAFQ,MAAM,GACJ,OAAO;;;;;;;QAgDpB,mCAAmC;qCAAvB,KAAK,IAAI,CAAC;QA0BtB;;;WAGG;0CAFQ,KAAK,KAAK,CAAC,SACX,KAAK,KAAK,CAAC;;QA2FtB;;;WAGG;;;;QAiCH;;;;WAIG;oBAHQ,KAAK,OAAO,CAAC,UACb,MAAM,YACN,WAAW;;;;;;;IAsD7B;0BAjeY,OAAO,qCAAqC,EAAE,QAAQ,CAClE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA6WsB,cAAc;kDAEnB,cAAF;;;;;;;;;;;;EA/W0C,CACtD;;iBAKU,KAAK,WAAW,CAAC;yBACjB,KAAK,OAAO,cAAc,EAAE,SAAS,CAAC;mBACtC,KACb,OAAW,6CAA6C,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAC/F;;;;;;;;;;wBAMU,MAAM;;;;;yBACN,OAAO,KAAK,CAAC;;;;;0BAEb,OAAO,KAAK,CAAC;;0BAxBS,8BAA8B;0BAF3C,WAAW;4BACT,2BAA2B;iCAChB,8BAA8B"}
|
package/src/provisionPoolKit.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import { X, q, Fail } from '@endo/errors';
|
|
3
|
+
import { E } from '@endo/far';
|
|
4
|
+
import { Far } from '@endo/marshal';
|
|
5
|
+
|
|
2
6
|
import { AmountMath, BrandShape } from '@agoric/ertp';
|
|
3
|
-
import { deeplyFulfilledObject } from '@agoric/internal';
|
|
7
|
+
import { deeplyFulfilledObject, makeTracer } from '@agoric/internal';
|
|
4
8
|
import { UnguardedHelperI } from '@agoric/internal/src/typeGuards.js';
|
|
5
9
|
import {
|
|
6
10
|
observeIteration,
|
|
@@ -19,10 +23,13 @@ import {
|
|
|
19
23
|
makeRecorderTopic,
|
|
20
24
|
} from '@agoric/zoe/src/contractSupport/topics.js';
|
|
21
25
|
import { InstanceHandleShape } from '@agoric/zoe/src/typeGuards.js';
|
|
22
|
-
import {
|
|
23
|
-
import { Far } from '@endo/marshal';
|
|
26
|
+
import { isUpgradeDisconnection } from '@agoric/internal/src/upgrade-api.js';
|
|
24
27
|
|
|
25
|
-
const
|
|
28
|
+
const trace = makeTracer('ProvPool');
|
|
29
|
+
|
|
30
|
+
const FIRST_UPPER_KEYWORD = /^[A-Z][a-zA-Z0-9_$]*$/;
|
|
31
|
+
// see https://github.com/Agoric/agoric-sdk/issues/8238
|
|
32
|
+
const FIRST_LOWER_NEAR_KEYWORD = /^[a-z][a-zA-Z0-9_$]*$/;
|
|
26
33
|
|
|
27
34
|
/**
|
|
28
35
|
* @import {ERef} from '@endo/far'
|
|
@@ -73,7 +80,7 @@ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => {
|
|
|
73
80
|
fromBridge: async obj => {
|
|
74
81
|
obj.type === 'PLEASE_PROVISION' ||
|
|
75
82
|
Fail`Unrecognized request ${obj.type}`;
|
|
76
|
-
|
|
83
|
+
trace('PLEASE_PROVISION', obj);
|
|
77
84
|
const { address, powerFlags } = obj;
|
|
78
85
|
powerFlags.includes(PowerFlags.SMART_WALLET) ||
|
|
79
86
|
Fail`missing SMART_WALLET in powerFlags`;
|
|
@@ -90,7 +97,7 @@ export const makeBridgeProvisionTool = (sendInitialPayment, onProvisioned) => {
|
|
|
90
97
|
if (created) {
|
|
91
98
|
onProvisioned();
|
|
92
99
|
}
|
|
93
|
-
|
|
100
|
+
trace(created ? 'provisioned' : 're-provisioned', address);
|
|
94
101
|
},
|
|
95
102
|
});
|
|
96
103
|
return makeBridgeHandler;
|
|
@@ -149,7 +156,7 @@ export const prepareProvisionPoolKit = (
|
|
|
149
156
|
/** @type {import('@agoric/zoe/src/contractSupport/recorder.js').RecorderKit<MetricsNotification>} */
|
|
150
157
|
const metricsRecorderKit = makeRecorderKit(metricsNode);
|
|
151
158
|
|
|
152
|
-
/** @type {MapStore<Brand
|
|
159
|
+
/** @type {MapStore<ERef<Brand>, PsmInstance>} */
|
|
153
160
|
const brandToPSM = makeScalarBigMapStore('brandToPSM', { durable: true });
|
|
154
161
|
const revivableAddresses = makeScalarBigSetStore('revivableAddresses', {
|
|
155
162
|
durable: true,
|
|
@@ -184,7 +191,7 @@ export const prepareProvisionPoolKit = (
|
|
|
184
191
|
machine: {
|
|
185
192
|
/** @param {string[]} oldAddresses */
|
|
186
193
|
addRevivableAddresses(oldAddresses) {
|
|
187
|
-
|
|
194
|
+
trace('revivableAddresses count', oldAddresses.length);
|
|
188
195
|
this.state.revivableAddresses.addAll(oldAddresses);
|
|
189
196
|
},
|
|
190
197
|
getWalletReviver() {
|
|
@@ -318,7 +325,7 @@ export const prepareProvisionPoolKit = (
|
|
|
318
325
|
.deposit(initialPmt)
|
|
319
326
|
.then(amt => {
|
|
320
327
|
helper.onSendFunds(perAccountInitialAmount);
|
|
321
|
-
|
|
328
|
+
trace('provisionPool sent', amt);
|
|
322
329
|
})
|
|
323
330
|
.catch(reason => {
|
|
324
331
|
console.error(X`initial deposit failed: ${q(reason)}`);
|
|
@@ -327,62 +334,114 @@ export const prepareProvisionPoolKit = (
|
|
|
327
334
|
});
|
|
328
335
|
},
|
|
329
336
|
/**
|
|
330
|
-
* @param {
|
|
331
|
-
* @param {
|
|
337
|
+
* @param {ERef<Purse>} exchangePurse
|
|
338
|
+
* @param {ERef<Brand>} brand
|
|
332
339
|
*/
|
|
333
|
-
|
|
340
|
+
watchCurrentAmount(exchangePurse, brand) {
|
|
334
341
|
const {
|
|
335
342
|
state: { brandToPSM, poolBrand },
|
|
336
343
|
facets: { helper },
|
|
337
344
|
} = this;
|
|
338
345
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
346
|
+
void observeNotifier(E(exchangePurse).getCurrentAmountNotifier(), {
|
|
347
|
+
updateState: async amount => {
|
|
348
|
+
trace('provisionPool balance update', amount);
|
|
349
|
+
if (AmountMath.isEmpty(amount) || amount.brand === poolBrand) {
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (!brandToPSM.has(brand)) {
|
|
353
|
+
console.error('funds arrived but no PSM instance', brand);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const instance = brandToPSM.get(brand);
|
|
357
|
+
const payment = E(exchangePurse).withdraw(amount);
|
|
358
|
+
await helper
|
|
359
|
+
.swap(payment, amount, instance)
|
|
360
|
+
.catch(async reason => {
|
|
361
|
+
console.error(X`swap failed: ${reason}`);
|
|
362
|
+
const resolvedPayment = await payment;
|
|
363
|
+
return E(exchangePurse).deposit(resolvedPayment);
|
|
364
|
+
});
|
|
365
|
+
},
|
|
366
|
+
fail: reason => {
|
|
367
|
+
if (isUpgradeDisconnection(reason)) {
|
|
368
|
+
void helper.watchCurrentAmount(exchangePurse, brand);
|
|
369
|
+
} else {
|
|
370
|
+
console.error(reason);
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
},
|
|
375
|
+
watchAssetSubscription() {
|
|
376
|
+
const { facets } = this;
|
|
377
|
+
const { helper } = facets;
|
|
343
378
|
|
|
344
|
-
|
|
379
|
+
/** @param {import('@agoric/vats/src/vat-bank.js').AssetDescriptor} desc */
|
|
380
|
+
const repairDesc = desc => {
|
|
381
|
+
if (desc.issuerName.match(FIRST_UPPER_KEYWORD)) {
|
|
382
|
+
trace(`Saving Issuer ${desc.issuerName}`);
|
|
383
|
+
return desc;
|
|
384
|
+
} else if (desc.issuerName.match(FIRST_LOWER_NEAR_KEYWORD)) {
|
|
385
|
+
const bad = desc.issuerName;
|
|
386
|
+
const goodName = bad.replace(bad[0], bad[0].toUpperCase());
|
|
387
|
+
|
|
388
|
+
trace(
|
|
389
|
+
`Saving Issuer ${desc.issuerName} with repaired keyword ${goodName}`,
|
|
390
|
+
);
|
|
391
|
+
return { ...desc, issuerName: goodName };
|
|
392
|
+
} else {
|
|
393
|
+
console.error(
|
|
394
|
+
`unable to save issuer with illegal keyword: ${desc.issuerName}`,
|
|
395
|
+
);
|
|
396
|
+
return undefined;
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
return observeIteration(
|
|
345
401
|
subscribeEach(E(poolBank).getAssetSubscription()),
|
|
346
402
|
{
|
|
347
403
|
updateState: async desc => {
|
|
348
|
-
|
|
349
|
-
|
|
404
|
+
await null;
|
|
405
|
+
const issuer = zcf.getTerms().issuers[desc.issuerName];
|
|
406
|
+
if (issuer === desc.issuer) {
|
|
407
|
+
trace('provisionPool re-notified of known asset', desc.brand);
|
|
408
|
+
} else {
|
|
409
|
+
const goodDesc = repairDesc(desc);
|
|
410
|
+
if (goodDesc) {
|
|
411
|
+
await zcf.saveIssuer(goodDesc.issuer, goodDesc.issuerName);
|
|
412
|
+
} else {
|
|
413
|
+
console.error(
|
|
414
|
+
`unable to save issuer with illegal keyword: ${desc.issuerName}`,
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
350
419
|
/** @type {ERef<Purse>} */
|
|
351
420
|
const exchangePurse = E(poolBank).getPurse(desc.brand);
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
);
|
|
421
|
+
helper.watchCurrentAmount(exchangePurse, desc.brand);
|
|
422
|
+
},
|
|
423
|
+
fail: _reason => {
|
|
424
|
+
void helper.watchAssetSubscription();
|
|
383
425
|
},
|
|
384
426
|
},
|
|
385
427
|
);
|
|
428
|
+
},
|
|
429
|
+
/**
|
|
430
|
+
* @param {object} [options]
|
|
431
|
+
* @param {MetricsNotification} [options.metrics]
|
|
432
|
+
*/
|
|
433
|
+
start({ metrics } = {}) {
|
|
434
|
+
const {
|
|
435
|
+
state: { poolBrand },
|
|
436
|
+
facets: { helper },
|
|
437
|
+
} = this;
|
|
438
|
+
|
|
439
|
+
// Must match. poolBrand is from durable state and the param is from
|
|
440
|
+
// the contract, so it technically can change between incarnations.
|
|
441
|
+
// That would be a severe bug.
|
|
442
|
+
AmountMath.coerce(poolBrand, params.getPerAccountInitialAmount());
|
|
443
|
+
|
|
444
|
+
void helper.watchAssetSubscription();
|
|
386
445
|
|
|
387
446
|
if (metrics) {
|
|
388
447
|
// Restore state.
|
package/src/psm/psm.d.ts
CHANGED
|
@@ -19,7 +19,10 @@
|
|
|
19
19
|
* @property {Amount<'nat'>} totalMintedProvided running sum of Minted ever
|
|
20
20
|
* given by this contract
|
|
21
21
|
*/
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* @import {TypedPattern} from '@agoric/internal';
|
|
24
|
+
* @import {Baggage} from '@agoric/vat-data'
|
|
25
|
+
*/
|
|
23
26
|
/** @type {ContractMeta} */
|
|
24
27
|
export const meta: ContractMeta;
|
|
25
28
|
export function start(zcf: ZCF<GovernanceTerms<{
|
package/src/psm/psm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"AAsCA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AAEH,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,WACO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAwUyD,cAAc;kDAAuE,cAAc;;;;;;;;;;;;GAJ7K;;;;;;;;;;uBA3Ya,MAAM,CAAC,KAAK,CAAC;;;;;uBAEb,MAAM,CAAC,KAAK,CAAC;;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;6BAsYb,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;6BAhYpC,kBAAkB"}
|
package/src/psm/psm.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
/// <reference types="@agoric/governance/exported" />
|
|
3
3
|
/// <reference types="@agoric/zoe/exported" />
|
|
4
4
|
|
|
5
|
+
import { Fail } from '@endo/errors';
|
|
6
|
+
import { E } from '@endo/eventual-send';
|
|
5
7
|
import { AmountMath, AmountShape, BrandShape, RatioShape } from '@agoric/ertp';
|
|
6
8
|
import {
|
|
7
9
|
CONTRACT_ELECTORATE,
|
|
@@ -29,14 +31,11 @@ import {
|
|
|
29
31
|
InstanceHandleShape,
|
|
30
32
|
InvitationShape,
|
|
31
33
|
} from '@agoric/zoe/src/typeGuards.js';
|
|
32
|
-
import { E } from '@endo/eventual-send';
|
|
33
34
|
|
|
34
35
|
import { mustMatch } from '@agoric/store';
|
|
35
36
|
import { makeCollectFeesInvitation } from '../collectFees.js';
|
|
36
37
|
import { makeNatAmountShape } from '../contractSupport.js';
|
|
37
38
|
|
|
38
|
-
const { Fail } = assert;
|
|
39
|
-
|
|
40
39
|
/**
|
|
41
40
|
* @file The Parity Stability Module supports efficiently minting/burning a
|
|
42
41
|
* stable token at a specified fixed ratio to a reference stable token, which
|
|
@@ -60,7 +59,10 @@ const { Fail } = assert;
|
|
|
60
59
|
* given by this contract
|
|
61
60
|
*/
|
|
62
61
|
|
|
63
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* @import {TypedPattern} from '@agoric/internal';
|
|
64
|
+
* @import {Baggage} from '@agoric/vat-data'
|
|
65
|
+
*/
|
|
64
66
|
|
|
65
67
|
/** @type {ContractMeta} */
|
|
66
68
|
export const meta = {
|
|
@@ -175,9 +177,7 @@ export const start = async (zcf, privateArgs, baggage) => {
|
|
|
175
177
|
E.when(E(privateArgs.storageNode).makeChildNode('metrics'), node =>
|
|
176
178
|
makeRecorderKit(
|
|
177
179
|
node,
|
|
178
|
-
/** @type {
|
|
179
|
-
M.any()
|
|
180
|
-
),
|
|
180
|
+
/** @type {TypedPattern<MetricsNotification>} */ (M.any()),
|
|
181
181
|
),
|
|
182
182
|
),
|
|
183
183
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assetReserveKit.d.ts","sourceRoot":"","sources":["assetReserveKit.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assetReserveKit.d.ts","sourceRoot":"","sources":["assetReserveKit.js"],"names":[],"mappings":"AAqCO,gDARI,OAAO,kBAAkB,EAAE,OAAO,kDAClC;IACV,OAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,eAAmB,EAAE,OAAO,6CAA6C,EAAE,eAAe,CAAC;IAC3F,WAAe,EAAE,WAAW,CAAC;IAC7B,GAAO,EAAE,GAAG,CAAC;CACV;;QAoEI,2BAA2B;kCAAf,KAAK;QAUjB;;;WAGG;gCAFQ,KAAK,WACL,OAAO;;;;QAqBlB;;;WAGG;6CAFQ,MAAM,CAAC,KAAK,CAAC,GACX,IAAI;;;QA6BjB;;;WAGG;0BAFQ,MAAM,WACN,MAAM;QAmBjB,8DAA8D;;;YA2D9D,uCAAuC;oDAA3B,MAAM,CAAC,KAAK,CAAC;YAWzB,uCAAuC;kDAA3B,MAAM,CAAC,KAAK,CAAC;;;IArD3B;;;OAGG;;QAED,mDAAmD;;;;;;;QAqCnD,uCAAuC;gDAA3B,MAAM,CAAC,KAAK,CAAC;QAWzB,uCAAuC;8CAA3B,MAAM,CAAC,KAAK,CAAC;;KA8BhC;;iBA3Qa,mBAAmB;;;;;sBACnB,MAAM,CAAC,KAAK,CAAC;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;oBACb,MAAM,CAAC,KAAK,CAAC;;8BAyQb,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC"}
|