diff --git a/a3p-integration/proposals/n:upgrade-next/.gitignore b/a3p-integration/proposals/n:upgrade-next/.gitignore index 9b9add0013a..957aaf13d03 100644 --- a/a3p-integration/proposals/n:upgrade-next/.gitignore +++ b/a3p-integration/proposals/n:upgrade-next/.gitignore @@ -1,9 +1 @@ -replaceFeeDistributor/ -addUsdLemons/ -addUsdOlives/ -upgradeProvisionPool/ -upgradeAgoricNames/ -publishTestInfo/ -upgrade-mintHolder/ -upgradeAssetReserve/ -upgradePSM/ +test/generated/ diff --git a/a3p-integration/proposals/n:upgrade-next/eval.sh b/a3p-integration/proposals/n:upgrade-next/eval.sh index d5a8d48bf87..cafe282a75e 100644 --- a/a3p-integration/proposals/n:upgrade-next/eval.sh +++ b/a3p-integration/proposals/n:upgrade-next/eval.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -euo pipefail + # evaluate the proposals in the /submission/ directory echo "UPGRADE-19 Running proposal declared in package.json" diff --git a/a3p-integration/proposals/n:upgrade-next/package.json b/a3p-integration/proposals/n:upgrade-next/package.json index 7972914efe5..fdb59a323b0 100644 --- a/a3p-integration/proposals/n:upgrade-next/package.json +++ b/a3p-integration/proposals/n:upgrade-next/package.json @@ -8,16 +8,9 @@ }, "type": "Software Upgrade Proposal", "sdk-generate": [ - "testing/replace-feeDistributor-short.js replaceFeeDistributor", - "testing/add-USD-LEMONS.js addUsdLemons", - "vats/upgrade-provisionPool.js upgradeProvisionPool", - "vats/upgrade-asset-reserve.js upgradeAssetReserve", - "vats/upgrade-psm.js upgradePSM", - "vats/upgrade-paRegistry.js", - "vats/upgrade-agoricNames.js agoricNamesCoreEvals/upgradeAgoricNames", - "testing/add-USD-OLIVES.js agoricNamesCoreEvals/addUsdOlives", - "testing/publish-test-info.js agoricNamesCoreEvals/publishTestInfo", - "vats/upgrade-mintHolder.js upgrade-mintHolder A3P_INTEGRATION" + "testing/add-USD-LEMONS.js test/generated/addUsdLemons", + "testing/add-USD-OLIVES.js test/generated/agoricNamesCoreEvals/addUsdOlives", + "testing/publish-test-info.js test/generated/agoricNamesCoreEvals/publishTestInfo" ] }, "type": "module", diff --git a/a3p-integration/proposals/n:upgrade-next/psm.test.js b/a3p-integration/proposals/n:upgrade-next/psm.test.js deleted file mode 100644 index 90ff2060d98..00000000000 --- a/a3p-integration/proposals/n:upgrade-next/psm.test.js +++ /dev/null @@ -1,81 +0,0 @@ -/* eslint-env node */ -/** - * @file The goal of this file is to make sure all the PSM contacts are upgrade. Each set of vats are different - * per chain, but for mainnet, we expect this to be: V37-V42, V73, V76 - * - * The test scenario is as follows; - * 1. Simulate trade of IST and USDC - * 2. Upgrade all PSMs - * 3. Verify metrics are the same after the upgrade - * 4. Verify trading is still possible after the upgrade - */ - -import '@endo/init'; -import test from 'ava'; -import { evalBundles } from '@agoric/synthetic-chain'; -import { makeVstorageKit } from '@agoric/client-utils'; - -const UPGRADE_PSM_DIR = 'upgradePSM'; -const SWAP_ANCHOR = 'swapAnchorForMintedSeat'; - -test.before(async t => { - const vstorageKit = await makeVstorageKit( - { fetch }, - { rpcAddrs: ['http://localhost:26657'], chainName: 'agoriclocal' }, - ); - - t.context = { - vstorageKit, - }; -}); - -test.serial('simulate trade of IST and USDC', async t => { - // @ts-expect-error casting - const { vstorageKit } = t.context; - - await evalBundles(SWAP_ANCHOR); - - const metrics = await vstorageKit.readLatestHead( - 'published.psm.IST.USDC.metrics', - ); - - t.is(metrics.anchorPoolBalance.value, 500000n); - t.is(metrics.feePoolBalance.value, 0n); - t.is(metrics.mintedPoolBalance.value, 500000n); - t.is(metrics.totalAnchorProvided.value, 0n); - t.is(metrics.totalMintedProvided.value, 500000n); -}); - -test.serial('upgrade PSMs', async t => { - // @ts-expect-error casting - const { vstorageKit } = t.context; - - await evalBundles(UPGRADE_PSM_DIR); - - const metrics = await vstorageKit.readLatestHead( - 'published.psm.IST.USDC.metrics', - ); - - t.is(metrics.anchorPoolBalance.value, 500000n); - t.is(metrics.feePoolBalance.value, 0n); - t.is(metrics.mintedPoolBalance.value, 500000n); - t.is(metrics.totalAnchorProvided.value, 0n); - t.is(metrics.totalMintedProvided.value, 500000n); -}); - -test.serial('verify trading after upgrade', async t => { - // @ts-expect-error casting - const { vstorageKit } = t.context; - - await evalBundles(SWAP_ANCHOR); - - const metrics = await vstorageKit.readLatestHead( - 'published.psm.IST.USDC.metrics', - ); - - t.is(metrics.anchorPoolBalance.value, 1000000n); - t.is(metrics.feePoolBalance.value, 0n); - t.is(metrics.mintedPoolBalance.value, 1000000n); - t.is(metrics.totalAnchorProvided.value, 0n); - t.is(metrics.totalMintedProvided.value, 1000000n); -}); diff --git a/a3p-integration/proposals/n:upgrade-next/test-lib/mintHolder-helpers.js b/a3p-integration/proposals/n:upgrade-next/test-lib/mintHolder-helpers.js index 0b4a5ef38ad..01ec03826db 100644 --- a/a3p-integration/proposals/n:upgrade-next/test-lib/mintHolder-helpers.js +++ b/a3p-integration/proposals/n:upgrade-next/test-lib/mintHolder-helpers.js @@ -1,12 +1,7 @@ /* eslint-env node */ -import { - agoric, - evalBundles, - getDetailsMatchingVats, - getISTBalance, -} from '@agoric/synthetic-chain'; -import { makeVstorageKit, retryUntilCondition } from '@agoric/client-utils'; +import { agoric, evalBundles, getISTBalance } from '@agoric/synthetic-chain'; +import { makeVstorageKit } from '@agoric/client-utils'; import { readFile, writeFile } from 'node:fs/promises'; import { psmSwap, snapshotAgoricNames, tryISTBalances } from './psm-lib.js'; @@ -41,7 +36,10 @@ export const getAssetList = async labelList => { // Determine the assets to consider based on labelList const assetsToConsider = - labelList || Object.values(vbankAssets).map(asset => asset.issuerName); + labelList || + Object.values(vbankAssets) + .map(asset => asset.issuerName) + .filter(Boolean); // testvbankAsset can be malformed. for (const label of assetsToConsider) { if (label === 'IST') { @@ -67,6 +65,7 @@ export const mintPayment = async (t, address, assetList, value) => { for (const asset of assetList) { const { label, denom } = asset; + const scaled = BigInt(parseInt(value, 10) * 1_000_000).toString(); await replaceTemplateValuesInFile(`${SUBMISSION_DIR}/send-script`, { @@ -137,40 +136,3 @@ export const swap = async (t, address, assetList, want) => { t.is(anchorBalanceAfter, anchorBalanceBefore - want); } }; - -const getIncarnationForAllVats = async assetList => { - const vatsIncarnation = {}; - - for (const asset of assetList) { - const { label, mintHolderVat } = asset; - const matchingVats = await getDetailsMatchingVats(label); - const expectedVat = matchingVats.find(vat => vat.vatName === mintHolderVat); - vatsIncarnation[label] = expectedVat.incarnation; - } - assert(Object.keys(vatsIncarnation).length === assetList.length); - - return vatsIncarnation; -}; - -const checkVatsUpgraded = (before, current) => { - for (const vatLabel in before) { - if (current[vatLabel] !== before[vatLabel] + 1) { - console.log(`${vatLabel} upgrade failed. `); - return false; - } - } - return true; -}; - -export const upgradeMintHolder = async (submissionPath, assetList) => { - const before = await getIncarnationForAllVats(assetList); - - await evalBundles(submissionPath); - - return retryUntilCondition( - async () => getIncarnationForAllVats(assetList), - current => checkVatsUpgraded(before, current), - `mintHolder upgrade not processed yet`, - { setTimeout, retryIntervalMs: 5000, maxRetries: 15 }, - ); -}; diff --git a/a3p-integration/proposals/n:upgrade-next/test-lib/psm-lib.js b/a3p-integration/proposals/n:upgrade-next/test-lib/psm-lib.js index f98f5f6508c..2a66a0eb0dc 100644 --- a/a3p-integration/proposals/n:upgrade-next/test-lib/psm-lib.js +++ b/a3p-integration/proposals/n:upgrade-next/test-lib/psm-lib.js @@ -1,5 +1,5 @@ /* eslint-env node */ -// from z:acceptance/test-lib/psm-lib.js +// from z:acceptance/lib/psm-lib.js import { execa } from 'execa'; import { getNetworkConfig } from 'agoric/src/helpers.js'; diff --git a/a3p-integration/proposals/n:upgrade-next/test.sh b/a3p-integration/proposals/n:upgrade-next/test.sh index 694dd5cb7f7..ae253a64eea 100644 --- a/a3p-integration/proposals/n:upgrade-next/test.sh +++ b/a3p-integration/proposals/n:upgrade-next/test.sh @@ -1,11 +1,12 @@ #!/bin/bash -yarn ava initial.test.js -yarn ava replaceFeeDistributor.test.js -yarn ava mintHolder.test.js -yarn ava provisionPool.test.js +set -euo pipefail + +# segregate so changing these does not invalidate the proposal image +# à la https://github.com/Agoric/agoric-3-proposals/pull/213 +cd test -yarn ava agoricNames.test.js +GLOBIGNORE=initial.test.js +yarn ava initial.test.js -yarn ava assetReserve.test.js -yarn ava psm.test.js +yarn ava *.test.js diff --git a/a3p-integration/proposals/n:upgrade-next/addCollateral/add-collateral-permit.json b/a3p-integration/proposals/n:upgrade-next/test/addCollateral/add-collateral-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/addCollateral/add-collateral-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/addCollateral/add-collateral-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/addCollateral/add-collateral.js b/a3p-integration/proposals/n:upgrade-next/test/addCollateral/add-collateral.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/addCollateral/add-collateral.js rename to a3p-integration/proposals/n:upgrade-next/test/addCollateral/add-collateral.js diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNames.test.js b/a3p-integration/proposals/n:upgrade-next/test/agoricNames.test.js similarity index 94% rename from a3p-integration/proposals/n:upgrade-next/agoricNames.test.js rename to a3p-integration/proposals/n:upgrade-next/test/agoricNames.test.js index 0d61c976b45..ee666a365ff 100644 --- a/a3p-integration/proposals/n:upgrade-next/agoricNames.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/agoricNames.test.js @@ -65,15 +65,14 @@ import { extractBalance, psmSwap, tryISTBalances, -} from './test-lib/psm-lib.js'; -import { getBalances, listVaults } from './test-lib/utils.js'; -import { walletUtils } from './test-lib/index.js'; +} from '../test-lib/psm-lib.js'; +import { getBalances, listVaults } from '../test-lib/utils.js'; +import { walletUtils } from '../test-lib/index.js'; -const AGORIC_NAMES_UPGRADE_DIR = 'agoricNamesCoreEvals/upgradeAgoricNames'; const WRITE_AGORIC_NAMES_DIR = 'agoricNamesCoreEvals/writeToAgoricNames'; -const ADD_USD_OLIVES_DIR = 'agoricNamesCoreEvals/addUsdOlives'; +const ADD_USD_OLIVES_DIR = 'generated/agoricNamesCoreEvals/addUsdOlives'; const DEPOSIT_USD_OLIVES_DIR = 'agoricNamesCoreEvals/depositUsdOlives'; -const PUBLISH_TEST_INFO_DIR = 'agoricNamesCoreEvals/publishTestInfo'; +const PUBLISH_TEST_INFO_DIR = 'generated/agoricNamesCoreEvals/publishTestInfo'; const WRITE_TEST_INFO_DIR = 'agoricNamesCoreEvals/writeToTestInfo'; const makeWaitUntilKeyFound = (keyFinder, vstorage) => (path, targetKey) => @@ -118,9 +117,7 @@ test.serial('publish test info', async t => { }); }); -test.serial('upgrade agoricNames', async t => { - await evalBundles(AGORIC_NAMES_UPGRADE_DIR); - +test.serial('verify incarnation', async t => { const incarnation = await getIncarnation('agoricNames'); t.is(incarnation, 1, 'incorrect incarnation'); }); diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/depositUsdOlives/deposit-usd-olives.js diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToAgoricNames/write-to-agoricNames.js diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js b/a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js rename to a3p-integration/proposals/n:upgrade-next/test/agoricNamesCoreEvals/writeToTestInfo/write-to-testInfo.js diff --git a/a3p-integration/proposals/n:upgrade-next/assetReserve.test.js b/a3p-integration/proposals/n:upgrade-next/test/assetReserve.test.js similarity index 91% rename from a3p-integration/proposals/n:upgrade-next/assetReserve.test.js rename to a3p-integration/proposals/n:upgrade-next/test/assetReserve.test.js index a3bda12bde3..ce09f34b946 100644 --- a/a3p-integration/proposals/n:upgrade-next/assetReserve.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/assetReserve.test.js @@ -22,8 +22,7 @@ import { waitUntilContractDeployed, } from '@agoric/client-utils'; -const ADD_PSM_DIR = 'addUsdLemons'; -const UPGRADE_AR_DIR = 'upgradeAssetReserve'; +const ADD_PSM_DIR = 'generated/addUsdLemons'; const ADD_COLLATERAL = 'addCollateral'; const ambientAuthority = { @@ -51,11 +50,10 @@ test.before(async t => { }; }); -test.serial('add collatoral to reserve', async t => { +test.serial('add Collateral to reserve', async t => { // @ts-expect-error casting const { vstorageKit } = t.context; - // Introduce USD_LEMONS await evalBundles(ADD_PSM_DIR); await waitUntilContractDeployed('psm-IST-USD_LEMONS', ambientAuthority, { errorMessage: 'psm-IST-USD_LEMONS instance not observed.', @@ -75,8 +73,6 @@ test.serial('upgrade', async t => { // @ts-expect-error casting const { vstorageKit } = t.context; - await evalBundles(UPGRADE_AR_DIR); - const vatDetailsAfter = await getDetailsMatchingVats('reserve'); const { incarnation } = vatDetailsAfter.find(vat => vat.vatID === 'v36'); // assetReserve is v36 diff --git a/a3p-integration/proposals/n:upgrade-next/depositUSD-LEMONS/deposit-usd-lemons-permit.json b/a3p-integration/proposals/n:upgrade-next/test/depositUSD-LEMONS/deposit-usd-lemons-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/depositUSD-LEMONS/deposit-usd-lemons-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/depositUSD-LEMONS/deposit-usd-lemons-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/depositUSD-LEMONS/deposit-usd-lemons.js b/a3p-integration/proposals/n:upgrade-next/test/depositUSD-LEMONS/deposit-usd-lemons.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/depositUSD-LEMONS/deposit-usd-lemons.js rename to a3p-integration/proposals/n:upgrade-next/test/depositUSD-LEMONS/deposit-usd-lemons.js diff --git a/a3p-integration/proposals/n:upgrade-next/initial.test.js b/a3p-integration/proposals/n:upgrade-next/test/initial.test.js similarity index 95% rename from a3p-integration/proposals/n:upgrade-next/initial.test.js rename to a3p-integration/proposals/n:upgrade-next/test/initial.test.js index 92fa2c6275a..74031f21282 100644 --- a/a3p-integration/proposals/n:upgrade-next/initial.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/initial.test.js @@ -10,7 +10,7 @@ const vats = { orchestration: { incarnation: 1 }, transfer: { incarnation: 2 }, walletFactory: { incarnation: 6 }, - zoe: { incarnation: 4 }, + zoe: { incarnation: 3 }, // Terminated in a future proposal. '-ATOM-USD_price_feed-governor': { incarnation: 0 }, }; diff --git a/a3p-integration/proposals/n:upgrade-next/mint-payment/send-script-permit.json b/a3p-integration/proposals/n:upgrade-next/test/mint-payment/send-script-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/mint-payment/send-script-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/mint-payment/send-script-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/mint-payment/send-script.tjs b/a3p-integration/proposals/n:upgrade-next/test/mint-payment/send-script.tjs similarity index 93% rename from a3p-integration/proposals/n:upgrade-next/mint-payment/send-script.tjs rename to a3p-integration/proposals/n:upgrade-next/test/mint-payment/send-script.tjs index eb1a4815470..89e801885f7 100644 --- a/a3p-integration/proposals/n:upgrade-next/mint-payment/send-script.tjs +++ b/a3p-integration/proposals/n:upgrade-next/test/mint-payment/send-script.tjs @@ -24,8 +24,6 @@ const sendBankAsset = async powers => { const valueStr = '{{VALUE}}'; const value = BigInt(valueStr) - console.log(`Start sendBankAsset for ${label}`); - const contractKits = await contractKitsP; const mintHolderKit = Array.from(contractKits.values()).filter( kit => kit.label && kit.label === label, @@ -49,8 +47,6 @@ const sendBankAsset = async powers => { ); await E(receiverDepositFacet).receive(payment); - - console.log(`Finished sendBankAsset for ${label}`); }; sendBankAsset; diff --git a/a3p-integration/proposals/n:upgrade-next/mintHolder.test.js b/a3p-integration/proposals/n:upgrade-next/test/mintHolder.test.js similarity index 63% rename from a3p-integration/proposals/n:upgrade-next/mintHolder.test.js rename to a3p-integration/proposals/n:upgrade-next/test/mintHolder.test.js index 32a187bcb25..0b5101a3c50 100644 --- a/a3p-integration/proposals/n:upgrade-next/mintHolder.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/mintHolder.test.js @@ -8,18 +8,18 @@ import { getAssetList, swap, getPSMChildren, - upgradeMintHolder, -} from './test-lib/mintHolder-helpers.js'; -import { networkConfig } from './test-lib/index.js'; +} from '../test-lib/mintHolder-helpers.js'; +import { networkConfig } from '../test-lib/index.js'; -test('mintHolder contract is upgraded', async t => { +test('verify mintHolder contract upgrade', async t => { const receiver = await addUser('receiver'); await provisionSmartWallet(receiver, `20000000ubld`); let assetList = await getAssetList(); t.log('List of mintHolder vats being upgraded: ', assetList); - await upgradeMintHolder(`upgrade-mintHolder`, assetList); - await mintPayment(t, receiver, assetList, 10); + // The FastLP mint is not in a mintHolder; it's a ZCFMint from the FastUSDC contract + const assetListNoFastUSDC = assetList.filter(x => x.label !== 'FastLP'); + await mintPayment(t, receiver, assetListNoFastUSDC, 10); const psmLabelList = await getPSMChildren(fetch, networkConfig); assetList = await getAssetList(psmLabelList); diff --git a/a3p-integration/proposals/n:upgrade-next/nullUpgradePP/null-upgrade-pp-permit.json b/a3p-integration/proposals/n:upgrade-next/test/nullUpgradePP/null-upgrade-pp-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/nullUpgradePP/null-upgrade-pp-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/nullUpgradePP/null-upgrade-pp-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/nullUpgradePP/null-upgrade-pp.js b/a3p-integration/proposals/n:upgrade-next/test/nullUpgradePP/null-upgrade-pp.js similarity index 82% rename from a3p-integration/proposals/n:upgrade-next/nullUpgradePP/null-upgrade-pp.js rename to a3p-integration/proposals/n:upgrade-next/test/nullUpgradePP/null-upgrade-pp.js index be3fdc96b3d..96812201dbd 100644 --- a/a3p-integration/proposals/n:upgrade-next/nullUpgradePP/null-upgrade-pp.js +++ b/a3p-integration/proposals/n:upgrade-next/test/nullUpgradePP/null-upgrade-pp.js @@ -9,24 +9,15 @@ const nullUpgradePP = async powers => { }, } = powers; - console.log('awaiting powers'); const { adminFacet, instance } = await provisionPoolStartResultP; const instancePrivateArgs = await instancePrivateArgsP; - console.log('get privateArgs'); const privateArgs = instancePrivateArgs.get(instance); const [poolBank, poserInvitation] = await Promise.all([ privateArgs.poolBank, E(economicCommitteeCreatorFacet).getPoserInvitation(), ]); - console.log('DEBUG', { - adminFacet, - instance, - privateArgs, - poserInvitation, - }); - await E(adminFacet).restartContract({ ...privateArgs, poolBank, diff --git a/a3p-integration/proposals/n:upgrade-next/provisionPool.test.js b/a3p-integration/proposals/n:upgrade-next/test/provisionPool.test.js similarity index 87% rename from a3p-integration/proposals/n:upgrade-next/provisionPool.test.js rename to a3p-integration/proposals/n:upgrade-next/test/provisionPool.test.js index f6bcbdefce7..561f3aed505 100644 --- a/a3p-integration/proposals/n:upgrade-next/provisionPool.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/provisionPool.test.js @@ -6,7 +6,8 @@ * - https://github.com/Agoric/agoric-sdk/issues/8724 * * The test scenario is as follows; - * 1. Upgrade provisionPool. This upgrade overrides provisionWalletBridgerManager with a durable one + * 1. Upgrade provisionPool in upgrade.go. This upgrade overrides + * provisionWalletBridgerManager with a durable one * 2. Add a new account and successfully provision it * - Observe new account's address under `published.wallet.${address}` * 3. Send some USDC_axl to provisionPoolAddress and observe its IST balances increases accordingly @@ -49,14 +50,12 @@ import { checkUserProvisioned, introduceAndProvision, provision, -} from './test-lib/provision-helpers.js'; -import { getIncarnationFromDetails } from './test-lib/utils.js'; +} from '../test-lib/provision-helpers.js'; +import { getIncarnationFromDetails } from '../test-lib/utils.js'; const PROVISIONING_POOL_ADDR = 'agoric1megzytg65cyrgzs6fvzxgrcqvwwl7ugpt62346'; -const ADD_PSM_DIR = 'addUsdLemons'; const DEPOSIT_USD_LEMONS_DIR = 'depositUSD-LEMONS'; -const UPGRADE_PP_DIR = 'upgradeProvisionPool'; const NULL_UPGRADE_PP_DIR = 'nullUpgradePP'; const USDC_DENOM = NonNullish(process.env.USDC_DENOM); @@ -87,24 +86,6 @@ test.before(async t => { }; }); -test.serial('upgrade provisionPool', async t => { - // @ts-expect-error casting - const { currentVatIncarnations } = t.context; - console.log(currentVatIncarnations); - await evalBundles(UPGRADE_PP_DIR); - - for await (const vatName of upgradedVats) { - const incarnationAfterUpgrade = await getIncarnationFromDetails(vatName); - const previousIncarnation = currentVatIncarnations[vatName]; - - t.is( - incarnationAfterUpgrade, - previousIncarnation + 1, - `${vatName} does not meet the expected incarnation number`, - ); - } -}); - test.serial( `check provisionPool can recover purse and asset subscribers after upgrade`, async t => { @@ -127,8 +108,8 @@ test.serial( { errorMessage: 'Provision pool not able to swap USDC_axl for IST.' }, ); - // Introduce USD_LEMONS - await evalBundles(ADD_PSM_DIR); + // agoricNames already added USD_LEMONS + // await evalBundles(ADD_PSM_DIR); await waitUntilContractDeployed('psm-IST-USD_LEMONS', ambientAuthority, { errorMessage: 'psm-IST-USD_LEMONS instance not observed.', }); diff --git a/a3p-integration/proposals/n:upgrade-next/test/psm.test.js b/a3p-integration/proposals/n:upgrade-next/test/psm.test.js new file mode 100644 index 00000000000..e8cd26bbbc4 --- /dev/null +++ b/a3p-integration/proposals/n:upgrade-next/test/psm.test.js @@ -0,0 +1,60 @@ +/* eslint-env node */ +/** + * @file The goal of this file is to make sure all the PSM contacts were + * upgraded. Each set of vats are different per chain, but for mainnet, we + * expect this to be: V37-V42, V73, V76 + * + * The test scenario is as follows; + * 1. Verify metrics before the upgrade + * 2. Verify trading is possible after the upgrade + */ + +import '@endo/init'; +import test from 'ava'; +import { evalBundles } from '@agoric/synthetic-chain'; +import { makeVstorageKit } from '@agoric/client-utils'; + +const SWAP_ANCHOR = 'swapAnchorForMintedSeat'; + +test.before(async t => { + const vstorageKit = await makeVstorageKit( + { fetch }, + { rpcAddrs: ['http://localhost:26657'], chainName: 'agoriclocal' }, + ); + + t.context = { + vstorageKit, + }; +}); + +test.serial('check stats pre-swap', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + const metrics = await vstorageKit.readLatestHead( + 'published.psm.IST.USDC.metrics', + ); + + t.is(metrics.anchorPoolBalance.value, 0n, 'anchorPool empty'); + t.is(metrics.feePoolBalance.value, 0n, 'feePool empty'); + t.is(metrics.mintedPoolBalance.value, 0n, 'mintedPool 500K'); + t.is(metrics.totalAnchorProvided.value, 0n, 'totalAnchor empty'); + t.is(metrics.totalMintedProvided.value, 0n, 'totalMinted 500K'); +}); + +test.serial('verify trading after upgrade', async t => { + // @ts-expect-error casting + const { vstorageKit } = t.context; + + await evalBundles(SWAP_ANCHOR); + + const metrics = await vstorageKit.readLatestHead( + 'published.psm.IST.USDC.metrics', + ); + + t.is(metrics.anchorPoolBalance.value, 500_000n, 'AnchorPool +500K'); + t.is(metrics.feePoolBalance.value, 0n, 'feePool empty'); + t.is(metrics.mintedPoolBalance.value, 500_000n, 'mintedPool +500K'); + t.is(metrics.totalAnchorProvided.value, 0n, 'totalAnchor empty'); + t.is(metrics.totalMintedProvided.value, 500_000n, 'totalMinted +500K'); +}); diff --git a/a3p-integration/proposals/n:upgrade-next/replaceFeeDistributor.test.js b/a3p-integration/proposals/n:upgrade-next/test/replaceFeeDistributor.test.js similarity index 91% rename from a3p-integration/proposals/n:upgrade-next/replaceFeeDistributor.test.js rename to a3p-integration/proposals/n:upgrade-next/test/replaceFeeDistributor.test.js index 68dc70ad6b4..ec4bd70389d 100644 --- a/a3p-integration/proposals/n:upgrade-next/replaceFeeDistributor.test.js +++ b/a3p-integration/proposals/n:upgrade-next/test/replaceFeeDistributor.test.js @@ -18,15 +18,10 @@ import '@endo/init/debug.js'; import test from 'ava'; -import { - retryUntilCondition, - makeVstorageKit, - sleep, -} from '@agoric/client-utils'; +import { retryUntilCondition, makeVstorageKit } from '@agoric/client-utils'; import { ATOM_DENOM, bankSend, - evalBundles, openVault, USER1ADDR, } from '@agoric/synthetic-chain'; @@ -50,7 +45,6 @@ import { floorMultiplyBy } from '@agoric/zoe/src/contractSupport/ratio.js'; */ const config = { - coreEvalDir: 'replaceFeeDistributor', mintValue: '100.0', collateralValue: '200.0', managerIndex: 0, @@ -85,6 +79,7 @@ const produceFeesAndWait = async (vstorage, feeAmount) => { const metricsBefore = /** @type {ReserveAllocations} */ ( await vstorage.readLatestHead('published.reserve.metrics') ); + // XXX Probably better to not rely on synthetic-chain for opening a vault as per https://github.com/Agoric/agoric-sdk/pull/10396. // But to make the switch also requires either copying z:acceptance/test-lib here (which is not wanted) or creating a root level // lib and link it here which requires an all around work across all proposals. Probably a better idea to do it as a separate work. @@ -96,6 +91,7 @@ const produceFeesAndWait = async (vstorage, feeAmount) => { () => vstorage.readLatestHead('published.reserve.metrics'), metrics => AmountMath.isEqual( + // @ts-expect-error metrics has these fields. metrics.allocations.Fee, AmountMath.add(metricsBefore.allocations.Fee, feeAmount), ), @@ -142,7 +138,6 @@ test.before(async t => { ); const vstorage = await makeVstorageKit({ fetch }, config.networkConfig); const toAmount = (value, brandKeyword) => - // @ts-expect-error casting AmountMath.make(vstorage.agoricNames.brand[brandKeyword], value); t.context = { @@ -151,14 +146,10 @@ test.before(async t => { }; }); -test('replace feeDistributor', async t => { +test('test feeDistributor', async t => { // @ts-expect-error type const { vstorage, toAmount } = t.context; - const { collectionInterval, vaultCount, coreEvalDir } = config; - - await evalBundles(coreEvalDir); - // Wait for a round to give the new feeDistributor time to clear out outstanding fees, if any. - await sleep(collectionInterval + 5000, { log: console.log, setTimeout }); + const { vaultCount } = config; const feeAmount = await calculateFee( config.managerIndex, diff --git a/a3p-integration/proposals/n:upgrade-next/swapAnchorForMintedSeat/swap-anchor-for-minted-seat-permit.json b/a3p-integration/proposals/n:upgrade-next/test/swapAnchorForMintedSeat/swap-anchor-for-minted-seat-permit.json similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/swapAnchorForMintedSeat/swap-anchor-for-minted-seat-permit.json rename to a3p-integration/proposals/n:upgrade-next/test/swapAnchorForMintedSeat/swap-anchor-for-minted-seat-permit.json diff --git a/a3p-integration/proposals/n:upgrade-next/swapAnchorForMintedSeat/swap-anchor-for-minted-seat.js b/a3p-integration/proposals/n:upgrade-next/test/swapAnchorForMintedSeat/swap-anchor-for-minted-seat.js similarity index 100% rename from a3p-integration/proposals/n:upgrade-next/swapAnchorForMintedSeat/swap-anchor-for-minted-seat.js rename to a3p-integration/proposals/n:upgrade-next/test/swapAnchorForMintedSeat/swap-anchor-for-minted-seat.js diff --git a/a3p-integration/proposals/n:upgrade-next/tsconfig.json b/a3p-integration/proposals/n:upgrade-next/tsconfig.json index 23a6b14091b..280efe1056f 100644 --- a/a3p-integration/proposals/n:upgrade-next/tsconfig.json +++ b/a3p-integration/proposals/n:upgrade-next/tsconfig.json @@ -13,8 +13,6 @@ "skipLibCheck": true }, "exclude": [ - "addUsdLemons/", - "replaceFeeDistributor/", - "upgradeProvisionPool/" + "generated/" ] } diff --git a/a3p-integration/proposals/n:upgrade-next/vatDetails.js b/a3p-integration/proposals/n:upgrade-next/vatDetails.js deleted file mode 100644 index 9eeafdf5949..00000000000 --- a/a3p-integration/proposals/n:upgrade-next/vatDetails.js +++ /dev/null @@ -1,129 +0,0 @@ -// Temporary fork of -// https://github.com/Agoric/agoric-3-proposals/blob/main/packages/synthetic-chain/src/lib/vat-status.js -// for deleted vat information. -// See https://github.com/Agoric/agoric-3-proposals/issues/208 -/* eslint-env node */ - -import dbOpenAmbient from 'better-sqlite3'; - -const HOME = process.env.HOME; - -/** @type {(val: T | undefined) => T} */ -export const NonNullish = val => { - if (!val) throw Error('required'); - return val; -}; - -/** - * @file look up vat incarnation from kernel DB - * @see {getIncarnation} - */ - -const swingstorePath = `${HOME}/.agoric/data/agoric/swingstore.sqlite`; - -/** - * SQL short-hand - * - * @param {import('better-sqlite3').Database} db - */ -export const dbTool = db => { - const prepare = (strings, ...params) => { - const dml = strings.join('?'); - return { stmt: db.prepare(dml), params }; - }; - const sql = (strings, ...args) => { - const { stmt, params } = prepare(strings, ...args); - return stmt.all(...params); - }; - sql.get = (strings, ...args) => { - const { stmt, params } = prepare(strings, ...args); - return stmt.get(...params); - }; - return sql; -}; - -/** - * @param {import('better-sqlite3').Database} db - */ -const makeSwingstore = db => { - const sql = dbTool(db); - - /** @param {string} key */ - // @ts-expect-error cast - const kvGet = key => sql.get`select * from kvStore where key = ${key}`.value; - /** @param {string} key */ - const kvGetJSON = key => JSON.parse(kvGet(key)); - - /** @param {string} vatID */ - const lookupVat = vatID => { - return Object.freeze({ - source: () => kvGetJSON(`${vatID}.source`), - options: () => kvGetJSON(`${vatID}.options`), - currentSpan: () => - sql.get`select * from transcriptSpans where isCurrent = 1 and vatID = ${vatID}`, - getTerminated: () => kvGetJSON('vats.terminated').includes(vatID), - }); - }; - - /** - * @param {string} vatName - * @param {boolean} [includeTerminated] - * @returns {string[]} - */ - const findDynamicVatIDs = (vatName, includeTerminated = false) => { - /** @type {string[]} */ - const terminatedVatIDs = kvGetJSON('vats.terminated'); - /** @type {string[]} */ - const allDynamicIDs = kvGetJSON('vat.dynamicIDs'); - const dynamicIDs = includeTerminated - ? allDynamicIDs - : allDynamicIDs.filter(vatID => !terminatedVatIDs.includes(vatID)); - const matchingIDs = dynamicIDs.filter(vatID => - lookupVat(vatID).options().name.includes(vatName), - ); - return matchingIDs; - }; - - return Object.freeze({ - /** - * @param {string} vatName - * @param {boolean} [includeTerminated] - * @returns {string} - */ - findVat: (vatName, includeTerminated = false) => { - /** @type {string[]} */ - const matchingIDs = findDynamicVatIDs(vatName, includeTerminated); - if (matchingIDs.length === 0) throw Error(`vat not found: ${vatName}`); - return matchingIDs[0]; - }, - findVats: findDynamicVatIDs, - lookupVat, - }); -}; - -/** - * @param {string} vatName - * @param {boolean} [includeTerminated] - */ -export const getDetailsMatchingVats = async ( - vatName, - includeTerminated = false, -) => { - const kStore = makeSwingstore( - dbOpenAmbient(swingstorePath, { readonly: true }), - ); - - const vatIDs = kStore.findVats(vatName, includeTerminated); - const infos = []; - for (const vatID of vatIDs) { - const vatInfo = kStore.lookupVat(vatID); - const name = vatInfo.options().name; - const source = vatInfo.source(); - const terminated = includeTerminated && vatInfo.getTerminated(); - // @ts-expect-error cast - const { incarnation } = vatInfo.currentSpan(); - infos.push({ vatName: name, vatID, incarnation, terminated, ...source }); - } - - return infos; -}; diff --git a/a3p-integration/proposals/n:upgrade-next/verifyPushedPrice.js b/a3p-integration/proposals/n:upgrade-next/verifyPushedPrice.js deleted file mode 100644 index ca4ceee38ff..00000000000 --- a/a3p-integration/proposals/n:upgrade-next/verifyPushedPrice.js +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env node - -import '@endo/init/debug.js'; -import { - registerOraclesForBrand, - generateOracleMap, -} from '@agoric/synthetic-chain'; -import { argv } from 'node:process'; -import { verifyPushedPrice } from './test-lib/price-feed.js'; - -const brand = argv[2]; -const price = Number(argv[3]); - -const BASE_ID = 'n-upgrade'; -const ROUND_ID = 1; - -const oraclesByBrand = generateOracleMap(BASE_ID, [brand]); -await registerOraclesForBrand(brand, oraclesByBrand); -console.log(`Registering Oracle for ${brand}`); - -await verifyPushedPrice(price, brand, oraclesByBrand, ROUND_ID); -console.log(`Price pushed for ${brand}`); diff --git a/golang/cosmos/app/upgrade.go b/golang/cosmos/app/upgrade.go index e0334aff991..5b68fcfac0e 100644 --- a/golang/cosmos/app/upgrade.go +++ b/golang/cosmos/app/upgrade.go @@ -131,29 +131,37 @@ func getVariantFromUpgradeName(upgradeName string) string { return "DEVNET" case "UNRELEASED_emerynet": return "EMERYNET" - // Noupgrade for this version. case "UNRELEASED_BASIC": + // Noupgrade for this version. return "" default: return "" } } -// func upgradeMintHolderCoreProposal(upgradeName string) (vm.CoreProposalStep, error) { -// variant := getVariantFromUpgradeName(upgradeName) +func upgradeMintHolderCoreProposal(targetUpgrade string) (vm.CoreProposalStep, error) { + return buildProposalStepFromScript(targetUpgrade, "@agoric/builders/scripts/vats/upgrade-mintHolder.js") +} -// if variant == "" { -// return nil, nil -// } +func restartFeeDistributorCoreProposal(targetUpgrade string) (vm.CoreProposalStep, error) { + return buildProposalStepFromScript(targetUpgrade, "@agoric/builders/scripts/inter-protocol/replace-feeDistributor-combo.js") +} -// return buildProposalStepWithArgs( -// "@agoric/builders/scripts/vats/upgrade-mintHolder.js", -// "defaultProposalBuilder", -// map[string]any{ -// "variant": variant, -// }, -// ) -// } +func buildProposalStepFromScript(targetUpgrade string, builderScript string) (vm.CoreProposalStep, error) { + variant := getVariantFromUpgradeName(targetUpgrade) + + if variant == "" { + return nil, nil + } + + return buildProposalStepWithArgs( + builderScript, + "defaultProposalBuilder", + map[string]any{ + "variant": variant, + }, + ) +} // unreleasedUpgradeHandler performs standard upgrade actions plus custom actions for the unreleased upgrade. func unreleasedUpgradeHandler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) { @@ -174,55 +182,47 @@ func unreleasedUpgradeHandler(app *GaiaApp, targetUpgrade string) func(sdk.Conte // Each CoreProposalStep runs sequentially, and can be constructed from // one or more modules executing in parallel within the step. + CoreProposalSteps = append(CoreProposalSteps, + // because of #10794, we need to do at least a null upgrade of + // the walletFactory on every software upgrade + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js", + ), + ) + + upgradeMintHolderStep, err := upgradeMintHolderCoreProposal(targetUpgrade) + if err != nil { + return nil, err + } else if upgradeMintHolderStep != nil { + CoreProposalSteps = append(CoreProposalSteps, upgradeMintHolderStep) + } + restartFeeDistributorStep, err := restartFeeDistributorCoreProposal(targetUpgrade) + if err != nil { + return nil, err + } else if restartFeeDistributorStep != nil { + CoreProposalSteps = append(CoreProposalSteps, restartFeeDistributorStep) + } + CoreProposalSteps = append(CoreProposalSteps, vm.CoreProposalStepForModules( - // Upgrade Zoe (no new ZCF needed). - "@agoric/builders/scripts/vats/upgrade-zoe.js", + "@agoric/builders/scripts/vats/upgrade-paRegistry.js", ), - // Revive KREAd characters vm.CoreProposalStepForModules( - "@agoric/builders/scripts/vats/revive-kread.js", + "@agoric/builders/scripts/vats/upgrade-provisionPool.js", ), vm.CoreProposalStepForModules( - // Upgrade to include a cleanup from https://github.com/Agoric/agoric-sdk/pull/10319 - "@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js", + "@agoric/builders/scripts/vats/upgrade-bank.js", + ), + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/vats/upgrade-agoricNames.js", + ), + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/vats/upgrade-asset-reserve.js", + ), + vm.CoreProposalStepForModules( + "@agoric/builders/scripts/vats/upgrade-psm.js", ), ) - - // CoreProposals for Upgrade 19. These should not be introduced - // before upgrade 18 is done because they would be run in n:upgrade-next - // - // upgradeMintHolderStep, err := upgradeMintHolderCoreProposal(targetUpgrade) - // if err != nil { - // return nil, err - // } else if upgradeMintHolderStep != nil { - // CoreProposalSteps = append(CoreProposalSteps, upgradeMintHolderStep) - // } - // - // CoreProposalSteps = append(CoreProposalSteps, - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/inter-protocol/replace-feeDistributor.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-paRegistry.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-provisionPool.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-bank.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-agoricNames.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-asset-reserve.js", - // ), - // vm.CoreProposalStepForModules( - // "@agoric/builders/scripts/vats/upgrade-psm.js", - // ), - // ) - } app.upgradeDetails = &upgradeDetails{ diff --git a/packages/builders/scripts/inter-protocol/replace-feeDistributor-combo.js b/packages/builders/scripts/inter-protocol/replace-feeDistributor-combo.js new file mode 100644 index 00000000000..a284539c14f --- /dev/null +++ b/packages/builders/scripts/inter-protocol/replace-feeDistributor-combo.js @@ -0,0 +1,74 @@ +import { parseScriptArgs, makeHelpers } from '@agoric/deploy-script-support'; +import { getManifestForReplaceFeeDistributor } from '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js'; +import { SECONDS_PER_HOUR } from '@agoric/inter-protocol/src/proposals/econ-behaviors.js'; + +const configurations = { + A3P_INTEGRATION: { + params: { + collectionInterval: 30n, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }, + }, + MAINNET: { + params: { + collectionInterval: 1n * SECONDS_PER_HOUR, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }, + }, + DEVNET: { + params: { + collectionInterval: 1n * SECONDS_PER_HOUR, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }, + }, + EMERYNET: { + params: { + collectionInterval: 1n * SECONDS_PER_HOUR, + keywordShares: { + RewardDistributor: 0n, + Reserve: 1n, + }, + }, + }, +}; + +const { keys } = Object; +const knownVariants = keys(configurations); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async (_, opts) => { + const config = opts.config || configurations[opts.variant]; + console.log('feeDist OPTS', opts, config); + if (!config) { + const error = `Unknown variant "${opts.variant}". Expected one of ${knownVariants.join(', ')}`; + console.error(error); + throw Error(error); + } + const { params } = config; + + return harden({ + sourceSpec: + '@agoric/inter-protocol/src/proposals/replace-fee-distributor.js', + getManifestCall: [getManifestForReplaceFeeDistributor.name, { ...params }], + }); +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const name = 'replace-feeDistributor-combo'; + const opts = parseScriptArgs(endowments, name, knownVariants); + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval('replace-feeDistributor', utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/packages/builders/scripts/vats/upgrade-bank.js b/packages/builders/scripts/vats/upgrade-bank.js index af6a8ea2522..dabd24d208c 100644 --- a/packages/builders/scripts/vats/upgrade-bank.js +++ b/packages/builders/scripts/vats/upgrade-bank.js @@ -14,6 +14,6 @@ export const defaultProposalBuilder = async ({ publishRef, install }) => /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ export default async (homeP, endowments) => { - const { writeCoreProposal } = await makeHelpers(homeP, endowments); - await writeCoreProposal('upgrade-bank', defaultProposalBuilder); + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('upgrade-bank', defaultProposalBuilder); }; diff --git a/packages/builders/scripts/vats/upgrade-mintHolder.js b/packages/builders/scripts/vats/upgrade-mintHolder.js index 18cb47854c2..6f8b8c72012 100644 --- a/packages/builders/scripts/vats/upgrade-mintHolder.js +++ b/packages/builders/scripts/vats/upgrade-mintHolder.js @@ -1,4 +1,4 @@ -import { makeHelpers } from '@agoric/deploy-script-support'; +import { makeHelpers, parseScriptArgs } from '@agoric/deploy-script-support'; import { getManifestForUpgradingMintHolder } from '@agoric/vats/src/proposals/upgrade-mintHolder-proposal.js'; const configurations = { @@ -94,30 +94,9 @@ export const defaultProposalBuilder = async ({ publishRef, install }, opts) => { }); }; -const Usage = `agoric run upgrade-mintHolder.js ${[...knownVariants, ''].join(' | ')}`; - /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ export default async (homeP, endowments) => { - const { scriptArgs } = endowments; - const variantOrConfig = scriptArgs?.[0]; - console.log('upgrade-mintHolder', variantOrConfig); - - const opts = {}; - - if (typeof variantOrConfig === 'string') { - if (variantOrConfig[0] === '{') { - try { - opts.config = JSON.parse(variantOrConfig); - } catch (err) { - throw Error(`Failed to parse config argument ${variantOrConfig}`); - } - } else { - opts.variant = variantOrConfig; - } - } else { - console.error(Usage); - throw Error(Usage); - } + const opts = parseScriptArgs(endowments, 'upgrade-mintHolder', knownVariants); const { writeCoreEval } = await makeHelpers(homeP, endowments); await writeCoreEval(`upgrade-mintHolder`, utils => diff --git a/packages/builders/scripts/vats/upgrade-psm.js b/packages/builders/scripts/vats/upgrade-psm.js index 678f4a5449b..25f5130d04b 100644 --- a/packages/builders/scripts/vats/upgrade-psm.js +++ b/packages/builders/scripts/vats/upgrade-psm.js @@ -14,6 +14,6 @@ export const defaultProposalBuilder = async ({ publishRef, install }) => /** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ export default async (homeP, endowments) => { - const { writeCoreProposal } = await makeHelpers(homeP, endowments); - await writeCoreProposal('upgrade-psm', defaultProposalBuilder); + const { writeCoreEval } = await makeHelpers(homeP, endowments); + await writeCoreEval('upgrade-psm', defaultProposalBuilder); }; diff --git a/packages/deploy-script-support/src/helpers.js b/packages/deploy-script-support/src/helpers.js index 67fbe6257ee..252d8cd371c 100644 --- a/packages/deploy-script-support/src/helpers.js +++ b/packages/deploy-script-support/src/helpers.js @@ -20,6 +20,7 @@ import { installInPieces } from './installInPieces.js'; import { makeWriteCoreEval } from './writeCoreEvalParts.js'; export * from '@agoric/internal/src/node/createBundles.js'; +export { parseScriptArgs } from './parseCoreEvalArgs.js'; // These are also hard-coded in lib-wallet.js. // TODO: Add methods to the wallet to access these without hard-coding diff --git a/packages/deploy-script-support/src/parseCoreEvalArgs.js b/packages/deploy-script-support/src/parseCoreEvalArgs.js new file mode 100644 index 00000000000..ed94b80eaa3 --- /dev/null +++ b/packages/deploy-script-support/src/parseCoreEvalArgs.js @@ -0,0 +1,36 @@ +/** + * To customize proposals for multiple environments, we pass the "variant" + * identifier in scriptArgs. The variant must match a knownVariant. + * + * @param {import('./externalTypes.js').DeployScriptEndownments} endowments + * @param {string} name a name to use in error messages or Usage suggestions. + * @param {string[]} knownVariants + */ +export const parseScriptArgs = async (endowments, name, knownVariants) => { + const { scriptArgs } = endowments; + // const variantOrConfig = scriptArgs?.[0]; + const variantOrConfig = + scriptArgs && scriptArgs.length > 0 ? scriptArgs : undefined; + + console.log(`${name}`, variantOrConfig); + + const Usage = `agoric run ${name}.js ${[...knownVariants, ''].join(' | ')}`; + const opts = {}; + + if (typeof variantOrConfig === 'string') { + if (variantOrConfig[0] === '{') { + try { + opts.config = JSON.parse(variantOrConfig); + } catch (err) { + throw Error(`Failed to parse config argument ${variantOrConfig}`); + } + } else { + opts.variant = variantOrConfig; + } + } else { + console.error(Usage); + throw Error(Usage); + } + + return opts; +}; diff --git a/packages/vats/src/proposals/upgrade-psm-proposal.js b/packages/vats/src/proposals/upgrade-psm-proposal.js index 1151077c61a..420223a7f3f 100644 --- a/packages/vats/src/proposals/upgrade-psm-proposal.js +++ b/packages/vats/src/proposals/upgrade-psm-proposal.js @@ -59,7 +59,7 @@ export const upgradePSMProposal = async ( trace('Done.'); }; -export const getManifestForUpgradingPSM = (_powers, { psmRef }) => ({ +export const getManifestForUpgradingPSM = ({ restoreRef }, { psmRef }) => ({ manifest: { [upgradePSMProposal.name]: { consume: { @@ -71,4 +71,5 @@ export const getManifestForUpgradingPSM = (_powers, { psmRef }) => ({ }, }, options: { psmRef }, + installations: { psm: restoreRef(psmRef) }, });