@agoric/smart-wallet 0.5.4-dev-af57c38.0 → 0.5.4-dev-09e90ee.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/smart-wallet",
3
- "version": "0.5.4-dev-af57c38.0+af57c38",
3
+ "version": "0.5.4-dev-09e90ee.0+09e90ee",
4
4
  "description": "Wallet contract",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -16,8 +16,8 @@
16
16
  "lint:eslint": "eslint ."
17
17
  },
18
18
  "devDependencies": {
19
- "@agoric/cosmic-proto": "0.3.1-dev-af57c38.0+af57c38",
20
- "@agoric/swingset-vat": "0.32.3-dev-af57c38.0+af57c38",
19
+ "@agoric/cosmic-proto": "0.3.1-dev-09e90ee.0+09e90ee",
20
+ "@agoric/swingset-vat": "0.32.3-dev-09e90ee.0+09e90ee",
21
21
  "@endo/bundle-source": "^3.0.2",
22
22
  "@endo/captp": "^4.0.2",
23
23
  "@endo/init": "^1.0.2",
@@ -25,15 +25,15 @@
25
25
  "import-meta-resolve": "^2.2.1"
26
26
  },
27
27
  "dependencies": {
28
- "@agoric/assert": "0.6.1-dev-af57c38.0+af57c38",
29
- "@agoric/casting": "0.4.3-dev-af57c38.0+af57c38",
30
- "@agoric/ertp": "0.16.3-dev-af57c38.0+af57c38",
31
- "@agoric/internal": "0.3.3-dev-af57c38.0+af57c38",
32
- "@agoric/notifier": "0.6.3-dev-af57c38.0+af57c38",
33
- "@agoric/store": "0.9.3-dev-af57c38.0+af57c38",
34
- "@agoric/vat-data": "0.5.3-dev-af57c38.0+af57c38",
35
- "@agoric/vats": "0.15.2-dev-af57c38.0+af57c38",
36
- "@agoric/zoe": "0.26.3-dev-af57c38.0+af57c38",
28
+ "@agoric/assert": "0.6.1-dev-09e90ee.0+09e90ee",
29
+ "@agoric/casting": "0.4.3-dev-09e90ee.0+09e90ee",
30
+ "@agoric/ertp": "0.16.3-dev-09e90ee.0+09e90ee",
31
+ "@agoric/internal": "0.3.3-dev-09e90ee.0+09e90ee",
32
+ "@agoric/notifier": "0.6.3-dev-09e90ee.0+09e90ee",
33
+ "@agoric/store": "0.9.3-dev-09e90ee.0+09e90ee",
34
+ "@agoric/vat-data": "0.5.3-dev-09e90ee.0+09e90ee",
35
+ "@agoric/vats": "0.15.2-dev-09e90ee.0+09e90ee",
36
+ "@agoric/zoe": "0.26.3-dev-09e90ee.0+09e90ee",
37
37
  "@endo/eventual-send": "^1.1.0",
38
38
  "@endo/far": "^1.0.2",
39
39
  "@endo/marshal": "^1.1.0",
@@ -69,5 +69,5 @@
69
69
  "typeCoverage": {
70
70
  "atLeast": 94.07
71
71
  },
72
- "gitHead": "af57c38c8d25498d8fa0261349b2c7647422d914"
72
+ "gitHead": "09e90eeb90153b39018afe6309ebdcafa02b07b2"
73
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"offerWatcher.d.ts","sourceRoot":"","sources":["offerWatcher.js"],"names":[],"mappings":"AAsEO,6CAHI,eAAe,QACf,QAAQ,oDAQlB;AA8BM;;;;;;IAwED,gDAAgD;oBAArC,eAAe,CAAC,gBAAgB,CAAC;IAyB5C,+CAA+C;mBAApC,eAAe,CAAC,eAAe,CAAC;IAkB3C,iDAAiD;qBAAtC,eAAe,CAAC,iBAAiB,CAAC;GAkBlD;0BAhOY,OAAO,aAAa,EAAE,SAAS,GAAG;IAC9C,KAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,MAAU,CAAC,EAAE,OAAO,GAAG,cAAc,aAAa,EAAE,kBAAkB,CAAC;IACvE,OAAW,CAAC,EAAE,mBAAmB,CAAC;CAC/B;;;;qDAKS,OAAO,4BAA4B,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;8BAIlE;IACZ,aAAe,EAAE,oBAAoB,OAAO,CAAC,CAAC;IAC9C,eAAiB,EAAE,oBAAoB,MAAM,CAAC,CAAC;IAC/C,cAAgB,EAAE,oBAAoB,qBAAqB,CAAC,CAAC;CAC1D;+BAiNU,WAAW,0BAA0B,CAAC"}
1
+ {"version":3,"file":"offerWatcher.d.ts","sourceRoot":"","sources":["offerWatcher.js"],"names":[],"mappings":"AAsEO,6CAHI,eAAe,QACf,QAAQ,oDAQlB;AA8BM;;;;;;IAwED,gDAAgD;oBAArC,eAAe,CAAC,gBAAgB,CAAC;IAyB5C,+CAA+C;mBAApC,eAAe,CAAC,eAAe,CAAC;IAkB3C,iDAAiD;qBAAtC,eAAe,CAAC,iBAAiB,CAAC;GAoBlD;0BAlOY,OAAO,aAAa,EAAE,SAAS,GAAG;IAC9C,KAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,MAAU,CAAC,EAAE,OAAO,GAAG,cAAc,aAAa,EAAE,kBAAkB,CAAC;IACvE,OAAW,CAAC,EAAE,mBAAmB,CAAC;CAC/B;;;;qDAKS,OAAO,4BAA4B,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;8BAIlE;IACZ,aAAe,EAAE,oBAAoB,OAAO,CAAC,CAAC;IAC9C,eAAiB,EAAE,oBAAoB,MAAM,CAAC,CAAC;IAC/C,cAAgB,EAAE,oBAAoB,qBAAqB,CAAC,CAAC;CAC1D;+BAmNU,WAAW,0BAA0B,CAAC"}
@@ -232,7 +232,9 @@ export const prepareOfferWatcher = baggage => {
232
232
  */
233
233
  onRejected(err, seat) {
234
234
  const { facets } = this;
235
- void watchForNumWants(facets, seat);
235
+ if (isUpgradeDisconnection(err)) {
236
+ void watchForNumWants(facets, seat);
237
+ }
236
238
  },
237
239
  },
238
240
  },
@@ -1 +1 @@
1
- {"version":3,"file":"smartWallet.d.ts","sourceRoot":"","sources":["smartWallet.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smartWallet.d.ts","sourceRoot":"","sources":["smartWallet.js"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ import {
13
13
  objectMap,
14
14
  StorageNodeShape,
15
15
  } from '@agoric/internal';
16
- import { observeNotifier } from '@agoric/notifier';
16
+ import { isUpgradeDisconnection } from '@agoric/internal/src/upgrade-api.js';
17
17
  import { M, mustMatch } from '@agoric/store';
18
18
  import {
19
19
  appendToStoredArray,
@@ -22,8 +22,10 @@ import {
22
22
  import {
23
23
  makeScalarBigMapStore,
24
24
  makeScalarBigWeakMapStore,
25
+ prepareExoClass,
25
26
  prepareExoClassKit,
26
27
  provide,
28
+ watchPromise,
27
29
  } from '@agoric/vat-data';
28
30
  import {
29
31
  prepareRecorderKit,
@@ -271,6 +273,59 @@ export const prepareSmartWallet = (baggage, shared) => {
271
273
 
272
274
  const makeOfferWatcher = prepareOfferWatcher(baggage);
273
275
 
276
+ const updateShape = {
277
+ value: AmountShape,
278
+ updateCount: M.bigint(),
279
+ };
280
+
281
+ const NotifierShape = M.remotable();
282
+ const amountWatcherGuard = M.interface('paymentWatcher', {
283
+ onFulfilled: M.call(updateShape, NotifierShape).returns(),
284
+ onRejected: M.call(M.any(), NotifierShape).returns(M.promise()),
285
+ });
286
+
287
+ const prepareAmountWatcher = () =>
288
+ prepareExoClass(
289
+ baggage,
290
+ 'AmountWatcher',
291
+ amountWatcherGuard,
292
+ /**
293
+ * @param {Purse} purse
294
+ * @param {ReturnType<makeWalletWithResolvedStorageNodes>['helper']} helper
295
+ */
296
+ (purse, helper) => ({ purse, helper }),
297
+ {
298
+ /**
299
+ * @param {{ value: Amount, updateCount: bigint | undefined }} updateRecord
300
+ * @param { Notifier<Amount> } notifier
301
+ * @returns {void}
302
+ */
303
+ onFulfilled(updateRecord, notifier) {
304
+ const { helper, purse } = this.state;
305
+ helper.updateBalance(purse, updateRecord.value);
306
+ helper.watchNextBalance(
307
+ this.self,
308
+ notifier,
309
+ updateRecord.updateCount,
310
+ );
311
+ },
312
+ /**
313
+ * @param {unknown} err
314
+ * @returns {Promise<void>}
315
+ */
316
+ onRejected(err) {
317
+ const { helper, purse } = this.state;
318
+ if (isUpgradeDisconnection(err)) {
319
+ return helper.watchPurse(purse); // retry
320
+ }
321
+ helper.logWalletError(`failed amount observer`, err);
322
+ throw err;
323
+ },
324
+ },
325
+ );
326
+
327
+ const makeAmountWatcher = prepareAmountWatcher();
328
+
274
329
  /**
275
330
  * @param {UniqueParams} unique
276
331
  * @returns {State}
@@ -356,7 +411,9 @@ export const prepareSmartWallet = (baggage, shared) => {
356
411
  .returns(M.promise()),
357
412
  publishCurrentState: M.call().returns(),
358
413
  watchPurse: M.call(M.eref(PurseShape)).returns(M.promise()),
359
- repairUnwatchedSeats: M.call().returns(),
414
+ watchNextBalance: M.call(M.any(), NotifierShape, M.bigint()).returns(),
415
+ repairUnwatchedSeats: M.call().returns(M.promise()),
416
+ repairUnwatchedPurses: M.call().returns(M.promise()),
360
417
  updateStatus: M.call(M.any()).returns(),
361
418
  addContinuingOffer: M.call(
362
419
  M.or(M.number(), M.string()),
@@ -478,32 +535,24 @@ export const prepareSmartWallet = (baggage, shared) => {
478
535
 
479
536
  /** @type {(purse: ERef<Purse>) => Promise<void>} */
480
537
  async watchPurse(purseRef) {
481
- const { facets } = this;
538
+ const { helper } = this.facets;
539
+
540
+ // This would seem to fit the observeNotifier() pattern,
541
+ // but purse notifiers are not necessarily durable.
542
+ // If there is an error due to upgrade, retry watchPurse().
482
543
 
483
544
  const purse = await purseRef; // promises don't fit in durable storage
545
+ const handler = makeAmountWatcher(purse, helper);
484
546
 
485
- const { helper } = this.facets;
486
547
  // publish purse's balance and changes
487
- void E.when(
488
- E(purse).getCurrentAmount(),
489
- balance => helper.updateBalance(purse, balance),
490
- err =>
491
- facets.helper.logWalletError(
492
- 'initial purse balance publish failed',
493
- err,
494
- ),
495
- );
496
- void observeNotifier(E(purse).getCurrentAmountNotifier(), {
497
- updateState(balance) {
498
- helper.updateBalance(purse, balance);
499
- },
500
- fail(reason) {
501
- facets.helper.logWalletError(
502
- '⚠️ failed updateState observer',
503
- reason,
504
- );
505
- },
506
- });
548
+ const notifier = await E(purse).getCurrentAmountNotifier();
549
+ const startP = E(notifier).getUpdateSince(undefined);
550
+ watchPromise(startP, handler, notifier);
551
+ },
552
+
553
+ watchNextBalance(handler, notifier, updateCount) {
554
+ const nextP = E(notifier).getUpdateSince(updateCount);
555
+ watchPromise(nextP, handler, notifier);
507
556
  },
508
557
 
509
558
  /**
@@ -580,8 +629,6 @@ export const prepareSmartWallet = (baggage, shared) => {
580
629
  const { zoe, agoricNames, invitationBrand, invitationIssuer } =
581
630
  shared;
582
631
 
583
- await null;
584
-
585
632
  const invitationFromSpec = makeInvitationsHelper(
586
633
  zoe,
587
634
  agoricNames,
@@ -590,26 +637,49 @@ export const prepareSmartWallet = (baggage, shared) => {
590
637
  state.offerToInvitationMakers.get,
591
638
  );
592
639
 
640
+ const watcherPromises = [];
593
641
  for (const seatId of liveOfferSeats.keys()) {
594
642
  facets.helper.logWalletInfo(`repairing ${seatId}`);
595
643
  const offerSpec = liveOffers.get(seatId);
596
644
  const seat = liveOfferSeats.get(seatId);
597
645
 
598
646
  const invitation = invitationFromSpec(offerSpec.invitationSpec);
599
- const invitationAmount =
600
- await E(invitationIssuer).getAmountOf(invitation);
601
- const watcher = makeOfferWatcher(
602
- facets.helper,
603
- facets.deposit,
604
- offerSpec,
605
- address,
606
- invitationAmount,
607
- seat,
647
+ watcherPromises.push(
648
+ E.when(
649
+ E(invitationIssuer).getAmountOf(invitation),
650
+ invitationAmount => {
651
+ const watcher = makeOfferWatcher(
652
+ facets.helper,
653
+ facets.deposit,
654
+ offerSpec,
655
+ address,
656
+ invitationAmount,
657
+ seat,
658
+ );
659
+ return watchOfferOutcomes(watcher, seat);
660
+ },
661
+ ),
608
662
  );
609
-
610
- void watchOfferOutcomes(watcher, seat);
611
663
  trace(`Repaired seat ${seatId} for wallet ${address}`);
612
664
  }
665
+
666
+ await Promise.all(watcherPromises);
667
+ },
668
+ async repairUnwatchedPurses() {
669
+ const { state, facets } = this;
670
+ const { helper, self } = facets;
671
+ const { invitationPurse, address } = state;
672
+
673
+ const brandToPurses = getBrandToPurses(walletPurses, self);
674
+ trace(`Found ${brandToPurses.values()} purse(s) for ${address}`);
675
+ for (const purses of brandToPurses.values()) {
676
+ for (const record of purses) {
677
+ void helper.watchPurse(record.purse);
678
+ trace(`Repaired purse ${record.petname} of ${address}`);
679
+ }
680
+ }
681
+
682
+ void helper.watchPurse(invitationPurse);
613
683
  },
614
684
 
615
685
  /** @param {import('./offers.js').OfferStatus} offerStatus */
@@ -898,8 +968,12 @@ export const prepareSmartWallet = (baggage, shared) => {
898
968
  await watchOfferOutcomes(watcher, seatRef);
899
969
  } catch (err) {
900
970
  facets.helper.logWalletError('OFFER ERROR:', err);
971
+
901
972
  // Notify the user
902
- if (watcher) {
973
+ if (err.upgradeMessage === 'vat upgraded') {
974
+ // The offer watchers will reconnect. Don't reclaim or exit
975
+ return;
976
+ } else if (watcher) {
903
977
  watcher.helper.updateStatus({ error: err.toString() });
904
978
  } else {
905
979
  facets.helper.updateStatus({
@@ -1035,13 +1109,15 @@ export const prepareSmartWallet = (baggage, shared) => {
1035
1109
  * @param {object} key
1036
1110
  */
1037
1111
  repairWalletForIncarnation2(key) {
1038
- const { facets } = this;
1112
+ const { state, facets } = this;
1039
1113
 
1040
1114
  if (key !== shared.secretWalletFactoryKey) {
1041
1115
  return;
1042
1116
  }
1043
1117
 
1044
1118
  void facets.helper.repairUnwatchedSeats();
1119
+ void facets.helper.repairUnwatchedPurses();
1120
+ trace(`repaired wallet ${state.address}`);
1045
1121
  },
1046
1122
  },
1047
1123
  },