@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.
Files changed (68) hide show
  1. package/package.json +26 -26
  2. package/src/auction/auctionBook.d.ts.map +1 -1
  3. package/src/auction/auctionBook.js +27 -46
  4. package/src/auction/auctionMath.d.ts +17 -0
  5. package/src/auction/auctionMath.d.ts.map +1 -0
  6. package/src/auction/auctionMath.js +81 -0
  7. package/src/auction/auctioneer.d.ts.map +1 -1
  8. package/src/auction/auctioneer.js +7 -10
  9. package/src/auction/offerBook.d.ts.map +1 -1
  10. package/src/auction/scheduleMath.d.ts.map +1 -1
  11. package/src/auction/scheduleMath.js +1 -1
  12. package/src/auction/scheduler.d.ts.map +1 -1
  13. package/src/auction/scheduler.js +3 -4
  14. package/src/auction/sortedOffers.d.ts.map +1 -1
  15. package/src/auction/sortedOffers.js +1 -2
  16. package/src/clientSupport.js +1 -1
  17. package/src/contractSupport.d.ts.map +1 -1
  18. package/src/contractSupport.js +6 -2
  19. package/src/interest.js +2 -2
  20. package/src/price/fluxAggregatorContract.d.ts.map +1 -1
  21. package/src/price/fluxAggregatorKit.d.ts.map +1 -1
  22. package/src/price/fluxAggregatorKit.js +6 -7
  23. package/src/price/priceOracleKit.d.ts.map +1 -1
  24. package/src/price/priceOracleKit.js +1 -1
  25. package/src/price/roundsManager.d.ts.map +1 -1
  26. package/src/price/roundsManager.js +1 -1
  27. package/src/proposals/add-auction.d.ts +40 -14
  28. package/src/proposals/add-auction.d.ts.map +1 -1
  29. package/src/proposals/add-auction.js +102 -49
  30. package/src/proposals/addAssetToVault.d.ts.map +1 -1
  31. package/src/proposals/addAssetToVault.js +1 -2
  32. package/src/proposals/econ-behaviors.d.ts +2 -0
  33. package/src/proposals/econ-behaviors.d.ts.map +1 -1
  34. package/src/proposals/econ-behaviors.js +0 -3
  35. package/src/proposals/startPSM.d.ts.map +1 -1
  36. package/src/proposals/startPSM.js +16 -12
  37. package/src/proposals/upgrade-vaults.d.ts +14 -10
  38. package/src/proposals/upgrade-vaults.d.ts.map +1 -1
  39. package/src/proposals/upgrade-vaults.js +99 -116
  40. package/src/proposals/utils.d.ts.map +1 -1
  41. package/src/proposals/utils.js +3 -4
  42. package/src/provisionPool.d.ts.map +1 -1
  43. package/src/provisionPoolKit.d.ts +6 -0
  44. package/src/provisionPoolKit.d.ts.map +1 -1
  45. package/src/provisionPoolKit.js +109 -50
  46. package/src/psm/psm.d.ts +4 -1
  47. package/src/psm/psm.d.ts.map +1 -1
  48. package/src/psm/psm.js +7 -7
  49. package/src/reserve/assetReserveKit.d.ts.map +1 -1
  50. package/src/reserve/assetReserveKit.js +6 -6
  51. package/src/vaultFactory/liquidation.d.ts.map +1 -1
  52. package/src/vaultFactory/liquidation.js +1 -2
  53. package/src/vaultFactory/orderedVaultStore.d.ts.map +1 -1
  54. package/src/vaultFactory/prioritizedVaults.d.ts.map +1 -1
  55. package/src/vaultFactory/storeUtils.d.ts +1 -1
  56. package/src/vaultFactory/storeUtils.d.ts.map +1 -1
  57. package/src/vaultFactory/vault.d.ts.map +1 -1
  58. package/src/vaultFactory/vault.js +1 -2
  59. package/src/vaultFactory/vaultDirector.d.ts +3 -2
  60. package/src/vaultFactory/vaultDirector.d.ts.map +1 -1
  61. package/src/vaultFactory/vaultDirector.js +25 -16
  62. package/src/vaultFactory/vaultFactory.d.ts +1 -0
  63. package/src/vaultFactory/vaultFactory.d.ts.map +1 -1
  64. package/src/vaultFactory/vaultFactory.js +3 -1
  65. package/src/vaultFactory/vaultHolder.d.ts.map +1 -1
  66. package/src/vaultFactory/vaultHolder.js +1 -2
  67. package/src/vaultFactory/vaultManager.d.ts.map +1 -1
  68. 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 { isUpgradeDisconnection } from '@agoric/internal/src/upgrade-api.js';
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
- // stand-in for Promise.any() which isn't available at this point.
10
- /** @param {Promise<any>[]} promises */
11
- const any = promises =>
12
- new Promise((resolve, reject) => {
13
- for (const promise of promises) {
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} powers
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 (powers, { options }) => {
38
- const {
21
+ export const upgradeVaults = async (
22
+ {
39
23
  consume: {
40
- agoricNamesAdmin,
41
- newAuctioneerKit: auctioneerKitP,
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
- auctioneerKit: auctioneerKitProducer,
50
- newAuctioneerKit: tempAuctioneerKit,
31
+ produce: { auctionUpgradeNewInstance: auctionUpgradeNewInstanceProducer },
32
+ installation: {
33
+ produce: { VaultFactory: produceVaultInstallation },
51
34
  },
52
35
  instance: {
53
- produce: { auctioneer: auctioneerProducer },
36
+ consume: { auctioneer: auctioneerInstanceP },
54
37
  },
55
- } = powers;
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: istBrand, ...vaultBrands } = allBrands;
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
- let installationP;
71
- await null;
72
- if (vaultsRef) {
73
- if (bundleID) {
74
- installationP = E(zoe).installBundleID(bundleID);
75
- await E.when(
76
- installationP,
77
- installation =>
78
- E(E(agoricNamesAdmin).lookupAdmin('installation')).update(
79
- 'vaultFactory',
80
- installation,
81
- ),
82
- err =>
83
- console.error(`🚨 failed to update vaultFactory installation`, err),
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
- while (AmountMath.isEmpty(value.current.DebtLimit.value)) {
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
- trace(`debtLimit was empty, retried`, value.current.DebtLimit.value);
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
- // @ts-expect-error It has a value until reset after the upgrade
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
- // Wait for at least one new price feed to be ready before upgrading Vaults
152
- void E.when(
153
- any(
154
- Object.values(vaultBrands).map(async brand => {
155
- const getQuote = async lastRejectionReason => {
156
- await null;
157
- try {
158
- return await E(priceAuthority).quoteGiven(
159
- AmountMath.make(brand, 10n),
160
- istBrand,
161
- );
162
- } catch (reason) {
163
- if (
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(`upgradeVaults scheduled; waiting for priceFeeds`);
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
- agoricNamesAdmin: uV,
222
- newAuctioneerKit: uV,
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: { auctioneerKit: uV, newAuctioneerKit: uV },
231
- instance: { produce: { auctioneer: uV, newAuctioneerKit: uV } },
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":"AAYO,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"}
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"}
@@ -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
- const { Fail } = assert;
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;;;;;;;;;;;;;;;;;;;;6DAsE67jC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAA16vB,cAAc;kDAAuE,cAAc;;;;;;;;;GAHjrU;;;;6BAlFY,aAAa,GACzB,eAAmB,CAAC;IACpB,uBAA6B,EAAE,QAAQ,CAAC;CACnC,CAAC;6BAxBoB,eAAe"}
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":"AAgEO,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,gCAsVC;IAA2B,SAAS,EAA5B,KAAK,CAAC,KAAK,CAAC;IACY,WAAW,EAAnC,KAAK,WAAW,CAAC;CAC3B;;QAzQK,qCAAqC;4CAAzB,MAAM,EAAE;;YA+CpB,8BAA8B;kCAAlB,MAAM;yDAwOixsB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAnNlzsB;;;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;;;;QA0EH;;;;WAIG;oBAHQ,KAAK,OAAO,CAAC,UACb,MAAM,YACN,WAAW;;;;;;;IAsD7B;0BA7aY,OAAO,qCAAqC,EAAE,QAAQ,CAClE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAiXS,cACP;kDAGQ,cAAc;;;;;;;;;;;;EArXiC,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"}
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"}
@@ -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 { E } from '@endo/far';
23
- import { Far } from '@endo/marshal';
26
+ import { isUpgradeDisconnection } from '@agoric/internal/src/upgrade-api.js';
24
27
 
25
- const { details: X, quote: q, Fail } = assert;
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
- console.info('PLEASE_PROVISION', obj);
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
- console.info(created ? 'provisioned' : 're-provisioned', address);
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, PsmInstance>} */
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
- console.log('revivableAddresses count', oldAddresses.length);
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
- console.log('provisionPool sent', amt);
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 {object} [options]
331
- * @param {MetricsNotification} [options.metrics]
337
+ * @param {ERef<Purse>} exchangePurse
338
+ * @param {ERef<Brand>} brand
332
339
  */
333
- start({ metrics } = {}) {
340
+ watchCurrentAmount(exchangePurse, brand) {
334
341
  const {
335
342
  state: { brandToPSM, poolBrand },
336
343
  facets: { helper },
337
344
  } = this;
338
345
 
339
- // Must match. poolBrand is from durable state and the param is from
340
- // the contract, so it technically can change between incarnations.
341
- // That would be a severe bug.
342
- AmountMath.coerce(poolBrand, params.getPerAccountInitialAmount());
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
- void observeIteration(
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
- console.log('provisionPool notified of new asset', desc.brand);
349
- await zcf.saveIssuer(desc.issuer, desc.issuerName);
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
- void observeNotifier(
353
- E(exchangePurse).getCurrentAmountNotifier(),
354
- {
355
- updateState: async amount => {
356
- console.log('provisionPool balance update', amount);
357
- if (
358
- AmountMath.isEmpty(amount) ||
359
- amount.brand === poolBrand
360
- ) {
361
- return;
362
- }
363
- if (!brandToPSM.has(desc.brand)) {
364
- console.error(
365
- 'funds arrived but no PSM instance',
366
- desc.brand,
367
- );
368
- return;
369
- }
370
- const instance = brandToPSM.get(desc.brand);
371
- const payment = E(exchangePurse).withdraw(amount);
372
- await helper
373
- .swap(payment, amount, instance)
374
- .catch(async reason => {
375
- console.error(X`swap failed: ${reason}`);
376
- const resolvedPayment = await payment;
377
- return E(exchangePurse).deposit(resolvedPayment);
378
- });
379
- },
380
- fail: reason => console.error(reason),
381
- },
382
- );
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
- /** @import {Baggage} from '@agoric/vat-data' */
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<{
@@ -1 +1 @@
1
- {"version":3,"file":"psm.d.ts","sourceRoot":"","sources":["psm.js"],"names":[],"mappings":"AAuCA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AAEH,gDAAgD;AAEhD,2BAA2B;AAC3B,mBADW,YAAY,CAkCrB;AAsBK,2BAlBI,GAAG,CACb,eAAmB,CAAC;IACpB,aAAmB,EAAE,OAAO,CAAC;IAC7B,aAAmB,EAAE,OAAO,CAAC;IAC7B,SAAe,EAAE,QAAQ,CAAC;CACrB,CAAC,GAAG;IACT,WAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,eAAqB,EAAE,KAAK,CAAC;CACxB,CACF,eACO;IACV,aAAiB,EAAE,aAAa,CAAC;IACjC,sBAA0B,EAAE,UAAU,CAAC;IACvC,WAAe,EAAE,WAAW,CAAC;IAC7B,UAAc,EAAE,UAAU,CAAC;CACxB,WACO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA0U6C,cAAc;kDAAuE,cAAc;;;;;;;;;;;;GAJjK;;;;;;;;;;uBA1Ya,MAAM,CAAC,KAAK,CAAC;;;;;uBAEb,MAAM,CAAC,KAAK,CAAC;;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;;;;yBAEb,MAAM,CAAC,KAAK,CAAC;;6BAqYb,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;6BAjYnC,kBAAkB"}
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
- /** @import {Baggage} from '@agoric/vat-data' */
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 {import('@agoric/zoe/src/contractSupport/recorder.js').TypedMatcher<MetricsNotification>} */ (
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":"AAmCO,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;;QAsEI,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;;iBA7Qa,mBAAmB;;;;;sBACnB,MAAM,CAAC,KAAK,CAAC;;;;oBAEb,MAAM,CAAC,KAAK,CAAC;;;;oBACb,MAAM,CAAC,KAAK,CAAC;;8BA2Qb,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC"}
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"}