Skip to content

Commit

Permalink
fix: start on zonifying ertp
Browse files Browse the repository at this point in the history
  • Loading branch information
erights committed Mar 6, 2023
1 parent 685e64c commit 241ec12
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 36 deletions.
1 change: 1 addition & 0 deletions packages/ERTP/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"@agoric/store": "^0.8.3",
"@agoric/swingset-vat": "^0.30.2",
"@agoric/vat-data": "^0.4.3",
"@agoric/zone": "^0.1.0",
"@endo/eventual-send": "^0.16.8",
"@endo/far": "^0.2.14",
"@endo/marshal": "^0.8.1",
Expand Down
14 changes: 9 additions & 5 deletions packages/ERTP/src/issuerKit.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import { assert } from '@agoric/assert';
import { assertPattern } from '@agoric/store';
import { makeScalarBigMapStore } from '@agoric/vat-data';
import { makeDurableZone } from '@agoric/zone/durable.js';

import { AssetKind, assertAssetKind } from './amountMath.js';
import { coerceDisplayInfo } from './displayInfo.js';
import { preparePaymentLedger } from './paymentLedger.js';

import './types-ambient.js';

/** @typedef {import('@agoric/zone').Zone} Zone */
/** @typedef {import('@agoric/vat-data').Baggage} Baggage */

/**
Expand All @@ -24,7 +26,7 @@ import './types-ambient.js';
/**
* @template {AssetKind} K
* @param {IssuerRecord<K>} issuerRecord
* @param {Baggage} issuerBaggage
* @param {Zone} issuerZone
* @param {ShutdownWithFailure} [optShutdownWithFailure] If this issuer fails
* in the middle of an atomic action (which btw should never happen), it
* potentially leaves its ledger in a corrupted state. If this function was
Expand All @@ -36,7 +38,7 @@ import './types-ambient.js';
*/
const setupIssuerKit = (
{ name, assetKind, displayInfo, elementShape },
issuerBaggage,
issuerZone,
optShutdownWithFailure = undefined,
) => {
assert.typeof(name, 'string');
Expand All @@ -56,7 +58,7 @@ const setupIssuerKit = (
/** @type {PaymentLedger<K>} */
// @ts-expect-error could be instantiated with different subtype of AssetKind
const { issuer, mint, brand } = preparePaymentLedger(
issuerBaggage,
issuerZone,
name,
assetKind,
cleanDisplayInfo,
Expand Down Expand Up @@ -93,7 +95,8 @@ export const prepareIssuerKit = (
optShutdownWithFailure = undefined,
) => {
const issuerRecord = issuerBaggage.get(INSTANCE_KEY);
return setupIssuerKit(issuerRecord, issuerBaggage, optShutdownWithFailure);
const issuerZone = makeDurableZone(issuerBaggage);
return setupIssuerKit(issuerRecord, issuerZone, optShutdownWithFailure);
};
harden(prepareIssuerKit);

Expand Down Expand Up @@ -149,7 +152,8 @@ export const makeDurableIssuerKit = (
) => {
const issuerData = harden({ name, assetKind, displayInfo, elementShape });
issuerBaggage.init(INSTANCE_KEY, issuerData);
return setupIssuerKit(issuerData, issuerBaggage, optShutdownWithFailure);
const issuerZone = makeDurableZone(issuerBaggage);
return setupIssuerKit(issuerData, issuerZone, optShutdownWithFailure);
};
harden(makeDurableIssuerKit);

Expand Down
10 changes: 4 additions & 6 deletions packages/ERTP/src/payment.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import { initEmpty } from '@agoric/store';
import { prepareExoClass } from '@agoric/vat-data';

/** @typedef {import('@agoric/vat-data').Baggage} Baggage */
/** @typedef {import('@agoric/zone').Zone} Zone */

/**
* @template {AssetKind} K
* @param {Baggage} issuerBaggage
* @param {Zone} issuerZone
* @param {string} name
* @param {Brand<K>} brand
* @param {InterfaceGuard} PaymentI
* @returns {() => Payment<K>}
*/
export const preparePaymentKind = (issuerBaggage, name, brand, PaymentI) => {
const makePayment = prepareExoClass(
issuerBaggage,
export const preparePaymentKind = (issuerZone, name, brand, PaymentI) => {
const makePayment = issuerZone.exoClass(
`${name} payment`,
PaymentI,
initEmpty,
Expand Down
30 changes: 12 additions & 18 deletions packages/ERTP/src/paymentLedger.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@
import { isPromise } from '@endo/promise-kit';
import { assertCopyArray } from '@endo/marshal';
import { mustMatch, M } from '@agoric/store';
import { provideDurableWeakMapStore, prepareExo } from '@agoric/vat-data';
import { AmountMath } from './amountMath.js';
import { preparePaymentKind } from './payment.js';
import { preparePurseKind } from './purse.js';

import '@agoric/store/exported.js';
import { BrandI, makeIssuerInterfaces } from './typeGuards.js';

/** @typedef {import('@agoric/vat-data').Baggage} Baggage */
/** @typedef {import('@agoric/zone').Zone} Zone */

const { details: X, quote: q, Fail } = assert;

Expand Down Expand Up @@ -69,7 +68,7 @@ const amountShapeFromElementShape = (brand, assetKind, elementShape) => {
* payments. All minting and transfer authority originates here.
*
* @template {AssetKind} K
* @param {Baggage} issuerBaggage
* @param {Zone} issuerZone
* @param {string} name
* @param {K} assetKind
* @param {DisplayInfo<K>} displayInfo
Expand All @@ -78,7 +77,7 @@ const amountShapeFromElementShape = (brand, assetKind, elementShape) => {
* @returns {PaymentLedger<K>}
*/
export const preparePaymentLedger = (
issuerBaggage,
issuerZone,
name,
assetKind,
displayInfo,
Expand All @@ -87,7 +86,7 @@ export const preparePaymentLedger = (
) => {
/** @type {Brand<K>} */
// @ts-expect-error XXX callWhen
const brand = prepareExo(issuerBaggage, `${name} brand`, BrandI, {
const brand = issuerZone.exo(`${name} brand`, BrandI, {
isMyIssuer(allegedIssuer) {
// BrandI delays calling this method until `allegedIssuer` is a Remotable
return allegedIssuer === issuer;
Expand Down Expand Up @@ -117,7 +116,7 @@ export const preparePaymentLedger = (
amountShape,
);

const makePayment = preparePaymentKind(issuerBaggage, name, brand, PaymentI);
const makePayment = preparePaymentKind(issuerZone, name, brand, PaymentI);

/** @type {ShutdownWithFailure} */
const shutdownLedgerWithFailure = reason => {
Expand All @@ -135,11 +134,9 @@ export const preparePaymentLedger = (
};

/** @type {WeakMapStore<Payment, Amount>} */
const paymentLedger = provideDurableWeakMapStore(
issuerBaggage,
'paymentLedger',
{ valueShape: amountShape },
);
const paymentLedger = issuerZone.weakMapStore('paymentLedger', {
valueShape: amountShape,
});

/**
* A withdrawn live payment is associated with the recovery set of
Expand All @@ -161,10 +158,7 @@ export const preparePaymentLedger = (
*
* @type {WeakMapStore<Payment, SetStore<Payment>>}
*/
const paymentRecoverySets = provideDurableWeakMapStore(
issuerBaggage,
'paymentRecoverySets',
);
const paymentRecoverySets = issuerZone.weakMapStore('paymentRecoverySets');

/**
* To maintain the invariants listed in the `paymentRecoverySets` comment,
Expand Down Expand Up @@ -371,7 +365,7 @@ export const preparePaymentLedger = (
};

const makeEmptyPurse = preparePurseKind(
issuerBaggage,
issuerZone,
name,
assetKind,
brand,
Expand All @@ -384,7 +378,7 @@ export const preparePaymentLedger = (

/** @type {Issuer<K>} */
// @ts-expect-error cast due to callWhen discrepancy
const issuer = prepareExo(issuerBaggage, `${name} issuer`, IssuerI, {
const issuer = issuerZone.exo(`${name} issuer`, IssuerI, {
getBrand() {
return brand;
},
Expand Down Expand Up @@ -499,7 +493,7 @@ export const preparePaymentLedger = (
});

/** @type {Mint<K>} */
const mint = prepareExo(issuerBaggage, `${name} mint`, MintI, {
const mint = issuerZone.exo(`${name} mint`, MintI, {
getIssuer() {
return issuer;
},
Expand Down
22 changes: 15 additions & 7 deletions packages/ERTP/src/purse.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
import { M } from '@agoric/store';
import { prepareExoClassKit, makeScalarBigSetStore } from '@agoric/vat-data';
import { AmountMath } from './amountMath.js';
import { makeTransientNotifierKit } from './transientNotifier.js';

/** @typedef {import('@endo/eventual-send').Callable} Callable */
/** @typedef {import('@agoric/zone').Zone} Zone */

const { Fail } = assert;

/**
* @param {Zone} issuerZone
* @param {string} name
* @param {AssetKind} assetKind
* @param {Brand} brand
* @param {Record<string, InterfaceGuard>} PurseIKit
* @param {Record<string, Callable>} purseMethods
*/
export const preparePurseKind = (
issuerBaggage,
issuerZone,
name,
assetKind,
brand,
Expand All @@ -17,6 +27,7 @@ export const preparePurseKind = (

// Note: Virtual for high cardinality, but *not* durable, and so
// broken across an upgrade.
// TODO propagate zonifying to notifiers, maybe?
const { provideNotifier, update: updateBalance } = makeTransientNotifierKit();

const updatePurseBalance = (state, newPurseBalance, purse) => {
Expand All @@ -31,17 +42,14 @@ export const preparePurseKind = (
// that created depositFacet as needed. But this approach ensures a constant
// identity for the facet and exercises the multi-faceted object style.
const { depositInternal, withdrawInternal } = purseMethods;
const makePurseKit = prepareExoClassKit(
issuerBaggage,
const makePurseKit = issuerZone.exoClassKit(
`${name} Purse`,
PurseIKit,
() => {
const currentBalance = AmountMath.makeEmpty(brand, assetKind);

/** @type {SetStore<Payment>} */
const recoverySet = makeScalarBigSetStore('recovery set', {
durable: true,
});
const recoverySet = issuerZone.detached().setStore('recovery set');

return {
currentBalance,
Expand Down
2 changes: 2 additions & 0 deletions packages/ERTP/src/transientNotifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { makeScalarBigWeakMapStore } from '@agoric/vat-data';
import { provideLazy } from '@agoric/store';
import { makeNotifierKit } from '@agoric/notifier';

// TODO propagate zonifying to notifiers, maybe?

// Note: Virtual for high cardinality, but *not* durable, and so
// broken across an upgrade.
export const makeTransientNotifierKit = () => {
Expand Down

0 comments on commit 241ec12

Please sign in to comment.