Skip to content

Commit

Permalink
Merge pull request #7946 from Agoric/6678-upgradeZoeZcf
Browse files Browse the repository at this point in the history
6678 upgrade zoe & zcf
  • Loading branch information
Chris-Hibbert authored Jul 27, 2023
2 parents cc54325 + 3b65d03 commit e6e23eb
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 22 deletions.
10 changes: 8 additions & 2 deletions packages/vats/src/vat-zoe.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ const BUILD_PARAMS_KEY = 'buildZoeParams';
export function buildRootObject(vatPowers, _vatParams, zoeBaggage) {
const shutdownZoeVat = vatPowers.exitVatWithFailure;

let zoeConfigFacet;

if (zoeBaggage.has(BUILD_PARAMS_KEY)) {
const { feeIssuerConfig, zcfSpec } = zoeBaggage.get(BUILD_PARAMS_KEY);
makeDurableZoeKit({
// The return value is `{ zoeService, zoeConfigFacet, feeMintAccess }`. This
// call only needs zoeConfigFacet because the others have been returned.
// zoeConfigFacet was added after the first release of Zoe on-chain.
({ zoeConfigFacet } = makeDurableZoeKit({
// For now Zoe will rewire vatAdminSvc on its own
shutdownZoeVat,
feeIssuerConfig,
zcfSpec,
zoeBaggage,
});
}));
}

return Far('root', {
Expand Down Expand Up @@ -44,5 +49,6 @@ export function buildRootObject(vatPowers, _vatParams, zoeBaggage) {
feeMintAccess,
});
},
getZoeConfigFacet: () => zoeConfigFacet,
});
}
32 changes: 15 additions & 17 deletions packages/zoe/src/zoeService/startInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ export const makeStartInstance = (
seatHandleToZoeSeatAdmin,
);

const getFreshZcfBundleCap = async () => {
const settledBundleCap = await getZcfBundleCapP();
settledBundleCap !== undefined || Fail`the ZCF bundle cap was broken`;
return settledBundleCap;
};

const InstanceAdminStateShape = harden({
instanceStorage: M.remotable('ZoeInstanceStorageManager'),
instanceAdmin: M.remotable('InstanceAdmin'),
Expand Down Expand Up @@ -178,12 +184,10 @@ export const makeStartInstance = (
/**
*
* @param {import('@agoric/swingset-vat').VatAdminFacet} adminNode
* @param {*} zcfBundleCap
* @param {*} contractBundleCap
*/
(adminNode, zcfBundleCap, contractBundleCap) => ({
(adminNode, contractBundleCap) => ({
adminNode,
zcfBundleCap,
contractBundleCap,
}),
{
Expand All @@ -200,22 +204,23 @@ export const makeStartInstance = (
privateArgs: newPrivateArgs,
};

return E(state.adminNode).upgrade(state.zcfBundleCap, {
vatParameters,
});
return E.when(getFreshZcfBundleCap(), bCap =>
E(state.adminNode).upgrade(bCap, { vatParameters }),
);
},
async upgradeContract(contractBundleId, newPrivateArgs = undefined) {
const { state } = this;

const newContractBundleCap = await getBundleCapByIdNow(
contractBundleId,
);
const vatParameters = {
contractBundleCap: newContractBundleCap,
privateArgs: newPrivateArgs,
};
return E(state.adminNode).upgrade(state.zcfBundleCap, {
vatParameters,
});
return E.when(getFreshZcfBundleCap(), bCap =>
E(state.adminNode).upgrade(bCap, { vatParameters }),
);
},
},
);
Expand Down Expand Up @@ -306,9 +311,6 @@ export const makeStartInstance = (

instanceAdmin.initDelayedState(handleOfferObj, publicFacet);

const settledBundleCap = await getZcfBundleCapP();
settledBundleCap !== undefined || Fail`the bundle cap was broken`;

// creatorInvitation can be undefined, but if it is defined,
// let's make sure it is an invitation.
return E.when(
Expand All @@ -324,11 +326,7 @@ export const makeStartInstance = (
isLiveResult ||
Fail`The contract did not correctly return a creatorInvitation`;

const adminFacet = makeAdminFacet(
adminNode,
harden(settledBundleCap),
contractBundleCap,
);
const adminFacet = makeAdminFacet(adminNode, contractBundleCap);

// Actually returned to the user.
return harden({
Expand Down
24 changes: 23 additions & 1 deletion packages/zoe/src/zoeService/zoe.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import '../internal-types.js';
import { E } from '@endo/eventual-send';
import { Far } from '@endo/marshal';
import { makeScalarBigMapStore, prepareExo } from '@agoric/vat-data';
import { M } from '@agoric/store';

import { makeZoeStorageManager } from './zoeStorageManager.js';
import { makeStartInstance } from './startInstance.js';
Expand All @@ -32,7 +33,7 @@ import { ZoeServiceI } from '../typeGuards.js';
const { Fail } = assert;

/**
* Create an durable instance of Zoe.
* Create a durable instance of Zoe.
*
* @param {object} options
* @param {Baggage} options.zoeBaggage - the baggage for Zoe durability. Must be provided by caller
Expand All @@ -52,6 +53,7 @@ const makeDurableZoeKit = ({
feeIssuerConfig = defaultFeeIssuerConfig,
zcfSpec = { name: 'zcf' },
}) => {
/** @type {BundleCap} */
let zcfBundleCap;

const saveBundleCap = () => {
Expand Down Expand Up @@ -168,6 +170,25 @@ const makeDurableZoeKit = ({
});
};

const ZoeConfigI = M.interface('ZoeConfigFacet', {
updateZcfBundleId: M.call(M.string()).returns(),
});

const zoeConfigFacet = prepareExo(zoeBaggage, 'ZoeConfigFacet', ZoeConfigI, {
updateZcfBundleId(bundleId) {
E.when(
getZcfBundleCap({ id: bundleId }, vatAdminSvc),
bundleCap => {
zcfBundleCap = bundleCap;
},
e => {
console.error(`'🚨 unable to update ZCF Bundle: `, e);
throw e;
},
);
},
});

/** @type {ZoeService} */
const zoeService = prepareExo(zoeBaggage, 'ZoeService', ZoeServiceI, {
install(bundleId, bundleLabel) {
Expand Down Expand Up @@ -223,6 +244,7 @@ const makeDurableZoeKit = ({

return harden({
zoeService,
zoeConfigFacet,
/** @type {FeeMintAccess} */
// @ts-expect-error cast
feeMintAccess: feeMintKit.feeMintAccess,
Expand Down
9 changes: 7 additions & 2 deletions packages/zoe/src/zoeService/zoeStorageManager.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { E } from '@endo/far';
import { AssetKind, makeDurableIssuerKit, AmountMath } from '@agoric/ertp';
import {
AssetKind,
makeDurableIssuerKit,
AmountMath,
prepareIssuerKit,
} from '@agoric/ertp';
import {
makeScalarBigMapStore,
provideDurableWeakMapStore,
Expand Down Expand Up @@ -117,7 +122,7 @@ export const makeZoeStorageManager = (
'zoeMintBaggageSet',
);
for (const issuerBaggage of zoeMintBaggageSet.values()) {
zoeMintBaggageSet(issuerBaggage);
prepareIssuerKit(issuerBaggage);
}

const makeZoeMint = prepareExoClass(
Expand Down

0 comments on commit e6e23eb

Please sign in to comment.