Skip to content

Commit

Permalink
Merge pull request #6142 from Agoric/6021-more-psm-assets
Browse files Browse the repository at this point in the history
feat(vats): facilitate launching additional PSMs
  • Loading branch information
mergify[bot] authored Sep 8, 2022
2 parents 88b1067 + fc5213d commit bd7ae9c
Show file tree
Hide file tree
Showing 21 changed files with 347 additions and 142 deletions.
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

0 comments on commit bd7ae9c

Please sign in to comment.