Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(vats): facilitate launching additional PSMs #6142

Merged
merged 12 commits into from
Sep 8, 2022
Merged
5 changes: 4 additions & 1 deletion packages/inter-protocol/scripts/build-bundles.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ await extractProposalBundles(
);

await createBundles(
[['../src/psm/psm.js', '../bundles/bundle-psm.js']],
[
['../src/psm/psm.js', '../bundles/bundle-psm.js'],
['../src/psm/psmCharter.js', '../bundles/bundle-psmCharter.js'],
],
dirname,
);
19 changes: 2 additions & 17 deletions packages/inter-protocol/src/proposals/core-proposal.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
// @ts-check
import { Stable } from '@agoric/vats/src/tokens.js';
import * as econBehaviors from './econ-behaviors.js';
import { ECON_COMMITTEE_MANIFEST } from './startEconCommittee.js';
import * as simBehaviors from './sim-behaviors.js';

export * from './econ-behaviors.js';
export * from './sim-behaviors.js';
// @ts-expect-error Module './econ-behaviors.js' has already exported a member
// named 'EconomyBootstrapPowers'.
export * from './startPSM.js';

export const ECON_COMMITTEE_MANIFEST = harden({
[econBehaviors.startEconomicCommittee.name]: {
consume: {
board: true,
chainStorage: true,
zoe: true,
},
produce: { economicCommitteeCreatorFacet: 'economicCommittee' },
installation: {
consume: { committee: 'zoe' },
},
instance: {
produce: { economicCommittee: 'economicCommittee' },
},
},
});
export * from './startEconCommittee.js';

const SHARED_MAIN_MANIFEST = harden({
[econBehaviors.setupAmm.name]: {
Expand Down
71 changes: 3 additions & 68 deletions packages/inter-protocol/src/proposals/econ-behaviors.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ import { AmountMath } from '@agoric/ertp';
import '@agoric/governance/exported.js';
import '@agoric/vats/exported.js';
import '@agoric/vats/src/core/types.js';
import {
assertPathSegment,
makeStorageNodeChild,
} from '@agoric/vats/src/lib-chainStorage.js';
import { makeStorageNodeChild } from '@agoric/vats/src/lib-chainStorage.js';
import { makeRatio } from '@agoric/zoe/src/contractSupport/index.js';
import { E, Far } from '@endo/far';
import { Stable, Stake } from '@agoric/vats/src/tokens.js';
Expand All @@ -33,13 +30,6 @@ const SECONDS_PER_DAY = 24n * SECONDS_PER_HOUR;
const BASIS_POINTS = 10_000n;
const MILLI = 1_000_000n;

/** @type {(name: string) => string} */
const sanitizePathSegment = name => {
const candidate = name.replace(/[ ,]/g, '_');
assertPathSegment(candidate);
return candidate;
};

/**
* @typedef {GovernedCreatorFacet<import('../stakeFactory/stakeFactory.js').StakeFactoryCreator>} StakeFactoryCreator
* @typedef {import('../stakeFactory/stakeFactory.js').StakeFactoryPublic} StakeFactoryPublic
Expand Down Expand Up @@ -68,6 +58,8 @@ const sanitizePathSegment = name => {
* periodicFeeCollectors: import('../feeDistributor.js').PeriodicFeeCollector[],
* bankMints: Mint[],
* psmFacets: MapStore<Brand, PSMFacets>,
* psmCharterCreatorFacet: Awaited<ReturnType<import('../psm/psmCharter.js').start>>['creatorFacet'],
* psmCharterAdminFacet: AdminFacet,
* reservePublicFacet: import('../reserve/assetReserve.js').AssetReservePublicFacet,
* reserveCreatorFacet: import('../reserve/assetReserve.js').AssetReserveLimitedCreatorFacet,
* reserveGovernorCreatorFacet: GovernedAssetReserveFacetAccess,
Expand All @@ -88,63 +80,6 @@ const sanitizePathSegment = name => {
* In production called by @agoric/vats to bootstrap.
*/

/**
* @typedef {object} EconCommitteeOptions
* @property {string} [committeeName]
* @property {number} [committeeSize]
*/

/**
* @param {EconomyBootstrapPowers} powers
* @param {object} [config]
* @param {object} [config.options]
* @param {EconCommitteeOptions} [config.options.econCommitteeOptions]
*/
export const startEconomicCommittee = async (
{
consume: { board, chainStorage, zoe },
produce: { economicCommitteeCreatorFacet },
installation: {
consume: { committee },
},
instance: {
produce: { economicCommittee },
},
},
{ options: { econCommitteeOptions = {} } = {} },
) => {
const COMMITTEES_ROOT = 'committees';
trace('startEconomicCommittee');
const {
committeeName = 'Initial Economic Committee',
committeeSize = 3,
...rest
} = econCommitteeOptions;

const committeesNode = await makeStorageNodeChild(
chainStorage,
COMMITTEES_ROOT,
);
const storageNode = await E(committeesNode).makeChildNode(
sanitizePathSegment(committeeName),
);
const marshaller = await E(board).getReadonlyMarshaller();

const { creatorFacet, instance } = await E(zoe).startInstance(
committee,
{},
{ committeeName, committeeSize, ...rest },
{
storageNode,
marshaller,
},
);

economicCommitteeCreatorFacet.resolve(creatorFacet);
economicCommittee.resolve(instance);
};
harden(startEconomicCommittee);

/**
* @param {EconomyBootstrapPowers} powers
* @param {{
Expand Down
90 changes: 90 additions & 0 deletions packages/inter-protocol/src/proposals/startEconCommittee.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// @ts-check
import {
assertPathSegment,
makeStorageNodeChild,
} from '@agoric/vats/src/lib-chainStorage.js';
import { E } from '@endo/far';
import { makeTracer } from '../makeTracer.js';

const trace = makeTracer('RunEconBehaviors', false);

/** @type {(name: string) => string} */
const sanitizePathSegment = name => {
const candidate = name.replace(/[ ,]/g, '_');
assertPathSegment(candidate);
return candidate;
};

/**
* @typedef {object} EconCommitteeOptions
* @property {string} [committeeName]
* @property {number} [committeeSize]
*/

/**
* @param {import('./econ-behaviors').EconomyBootstrapPowers} powers
* @param {object} [config]
* @param {object} [config.options]
* @param {EconCommitteeOptions} [config.options.econCommitteeOptions]
*/
export const startEconomicCommittee = async (
{
consume: { board, chainStorage, zoe },
produce: { economicCommitteeCreatorFacet },
installation: {
consume: { committee },
},
instance: {
produce: { economicCommittee },
},
},
{ options: { econCommitteeOptions = {} } = {} },
) => {
const COMMITTEES_ROOT = 'committees';
trace('startEconomicCommittee');
const {
committeeName = 'Initial Economic Committee',
committeeSize = 3,
...rest
} = econCommitteeOptions;

const committeesNode = await makeStorageNodeChild(
chainStorage,
COMMITTEES_ROOT,
);
const storageNode = await E(committeesNode).makeChildNode(
sanitizePathSegment(committeeName),
);
const marshaller = await E(board).getReadonlyMarshaller();

const { creatorFacet, instance } = await E(zoe).startInstance(
committee,
{},
{ committeeName, committeeSize, ...rest },
{
storageNode,
marshaller,
},
);

economicCommitteeCreatorFacet.resolve(creatorFacet);
economicCommittee.resolve(instance);
};
harden(startEconomicCommittee);

export const ECON_COMMITTEE_MANIFEST = harden({
[startEconomicCommittee.name]: {
consume: {
board: true,
chainStorage: true,
zoe: true,
},
produce: { economicCommitteeCreatorFacet: 'economicCommittee' },
installation: {
consume: { committee: 'zoe' },
},
instance: {
produce: { economicCommittee: 'economicCommittee' },
},
},
});
76 changes: 73 additions & 3 deletions packages/inter-protocol/src/proposals/startPSM.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export const startPSM = async (
zoe,
feeMintAccess: feeMintAccessP,
economicCommitteeCreatorFacet,
psmCharterCreatorFacet,
chainStorage,
chainTimerService,
psmFacets,
Expand Down Expand Up @@ -159,9 +160,15 @@ export const startPSM = async (
const psmFacetsMap = await psmFacets;

psmFacetsMap.init(anchorBrand, newPsmFacets);
const instanceKey = `psm.${Stable.symbol}.${keyword}`;
const instanceKey = `psm-${Stable.symbol}-${keyword}`;
const instanceAdmin = E(agoricNamesAdmin).lookupAdmin('instance');
await E(instanceAdmin).update(instanceKey, newPsmFacets.psm);
await E(psmCharterCreatorFacet).addInstance(
psm,
psmCreatorFacet,
anchorBrand,
stable,
);
};
harden(startPSM);

Expand Down Expand Up @@ -245,7 +252,13 @@ export const installGovAndPSMContracts = async ({
consume: { zoe },
produce: { psmFacets },
installation: {
produce: { contractGovernor, committee, binaryVoteCounter, psm },
produce: {
contractGovernor,
committee,
binaryVoteCounter,
psm,
psmCharter,
},
},
}) => {
// In order to support multiple instances of the PSM, we store all the facets
Expand All @@ -260,6 +273,7 @@ export const installGovAndPSMContracts = async ({
committee,
binaryVoteCounter,
psm,
psmCharter,
}).map(async ([name, producer]) => {
const bundleCap = D(vatAdmin).getNamedBundleCap(name);
const bundle = D(bundleCap).getBundle();
Expand All @@ -270,6 +284,61 @@ export const installGovAndPSMContracts = async ({
);
};

/** @param {EconomyBootstrapPowers} powers */
export const startPSMCharter = async ({
consume: { zoe },
produce: { psmCharterCreatorFacet, psmCharterAdminFacet },
installation: {
consume: { binaryVoteCounter, psmCharter: installP },
},
instance: {
produce: { psmCharter: instanceP },
},
}) => {
const [charterR, counterR] = await Promise.all([installP, binaryVoteCounter]);
const terms = { binaryVoteCounterInstallation: counterR };
const facets = await E.get(E(zoe).startInstance(charterR, {}, terms));
instanceP.resolve(facets.instance);
psmCharterCreatorFacet.resolve(facets.creatorFacet);
psmCharterAdminFacet.resolve(facets.adminFacet);
};

/**
* PSM and gov contracts are available as
* named swingset bundles only in
* decentral-psm-config.json
*/
export const PSM_GOV_MANIFEST = {
[installGovAndPSMContracts.name]: {
vatPowers: { D: true },
devices: { vatAdmin: true },
consume: { zoe: 'zoe' },
produce: { psmFacets: 'true' },
installation: {
produce: {
contractGovernor: 'zoe',
committee: 'zoe',
binaryVoteCounter: 'zoe',
psm: 'zoe',
psmCharter: 'zoe',
},
},
},
[startPSMCharter.name]: {
consume: { zoe: 'zoe' },
produce: {
psmCharterCreatorFacet: 'psmCharter',
psmCharterAdminFacet: 'psmCharter',
},
installation: {
consume: { binaryVoteCounter: 'zoe', psmCharter: 'zoe' },
},
instance: {
produce: { psmCharter: 'psmCharter' },
},
},
};

export const PSM_MANIFEST = harden({
[makeAnchorAsset.name]: {
consume: { agoricNamesAdmin: true, bankManager: 'bank', zoe: 'zoe' },
Expand All @@ -290,8 +359,9 @@ export const PSM_MANIFEST = harden({
zoe: 'zoe',
feeMintAccess: 'zoe',
economicCommitteeCreatorFacet: 'economicCommittee',
psmCharterCreatorFacet: 'psmCharter',
chainTimerService: 'timer',
psmFacets: 'psm',
psmFacets: true,
},
installation: {
consume: { contractGovernor: 'zoe', psm: 'zoe' },
Expand Down
Loading