diff --git a/packages/ERTP/src/typeGuards.js b/packages/ERTP/src/typeGuards.js index 0511bdb3a42..78fd4e30475 100644 --- a/packages/ERTP/src/typeGuards.js +++ b/packages/ERTP/src/typeGuards.js @@ -234,14 +234,3 @@ export const makeBrandedAmountPattern = amount => { return { brand: amount.brand, value: M.nat() }; }; harden(makeBrandedAmountPattern); - -/** @param {Ratio} ratio */ -export const makeBrandedRatioPattern = ratio => { - const numeratorAmountShape = makeBrandedAmountPattern(ratio.numerator); - const denominatorAmountShape = makeBrandedAmountPattern(ratio.denominator); - return harden({ - numerator: numeratorAmountShape, - denominator: denominatorAmountShape, - }); -}; -harden(makeBrandedRatioPattern); diff --git a/packages/boot/test/bootstrapTests/test-vaults-upgrade.js b/packages/boot/test/bootstrapTests/test-vaults-upgrade.js index 30f6de222ed..1dbad275c1d 100644 --- a/packages/boot/test/bootstrapTests/test-vaults-upgrade.js +++ b/packages/boot/test/bootstrapTests/test-vaults-upgrade.js @@ -305,6 +305,8 @@ test.serial('restart vaultFactory', async t => { const { privateArgs } = vaultFactoryKit; console.log('reused privateArgs', privateArgs, vaultFactoryKit); + // XXX insufficient. The kernel doesn't like this storageNode. Have to make a realer one. + const storageRoot = makeMockChainStorageRoot(); const newStorageNode = await E(storageRoot).makeChildNode('governance'); diff --git a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/more_actions.sh b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/more_actions.sh new file mode 100644 index 00000000000..0ee90582d39 --- /dev/null +++ b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/more_actions.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +. ./upgrade-test-scripts/env_setup.sh + +# Enable debugging +set -x + +# CWD is agoric-sdk +upgrade11=./upgrade-test-scripts/agoric-upgrade-11 + +# hacky restore of pruned artifacts +killAgd +EXPORT_DIR=$(mktemp -t -d swing-store-export-upgrade-11-XXX) +WITHOUT_GENESIS_EXPORT=1 make_swing_store_snapshot $EXPORT_DIR --artifact-mode debug || fail "Couldn't make swing-store snapshot" +HISTORICAL_ARTIFACTS="$(cd $HOME/.agoric/data/agoric/swing-store-historical-artifacts/; for i in *; do echo -n "[\"$i\",\"$i\"],"; done)" +mv -n $HOME/.agoric/data/agoric/swing-store-historical-artifacts/* $EXPORT_DIR || fail "some historical artifacts not pruned" +mv $EXPORT_DIR/export-manifest.json $EXPORT_DIR/export-manifest-original.json +cat $EXPORT_DIR/export-manifest-original.json | jq -r ".artifacts = .artifacts + [${HISTORICAL_ARTIFACTS%%,}] | del(.artifactMode)" > $EXPORT_DIR/export-manifest.json +restore_swing_store_snapshot $EXPORT_DIR || fail "Couldn't restore swing-store snapshot" +rm -rf $EXPORT_DIR +startAgd + +###################################################################### +# FIXME: remove this line when these tests don't hardcode bundle hashes. +echo 1>&2 "FIXME: skipping zoe-full-upgrade tests"; return 0 + +# Pre-steps: +# * fill Wallets +# * build and install bundles +# * create instance of prober contract and run expecting no atomicRearrange +# +# Action: +# * upgrade Zoe and ZCF +# +# Finish +# * create instance of prober contract and run expecting to see atomicRearrange + +yarn --silent bundle-source --cache-json /tmp packages/zoe/src/contractFacet/vatRoot.js Zcf-upgrade +yarn --silent bundle-source --cache-json /tmp packages/vats/src/vat-zoe.js Zoe-upgrade +yarn --silent bundle-source --cache-json /tmp packages/boot/test/bootstrapTests/zcfProbe.js prober-contract + +echo +++ checking Zoe/Zcf hashes +++ +ZCF_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-Zcf-upgrade.json` +ZOE_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-Zoe-upgrade.json` +echo bundle-Zcf-upgrade.json $ZCF_HASH +grep $ZCF_HASH $upgrade11/zoe-full-upgrade/zcf-upgrade-script.js || exit 1 +echo bundle-Zoe-upgrade.json $ZOE_HASH +grep $ZOE_HASH $upgrade11/zoe-full-upgrade/zcf-upgrade-script.js || exit 1 + +echo +++ prober hash +++ +PROBER_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-prober-contract.json` +echo bundle-prober-contract.json $PROBER_HASH +grep $PROBER_HASH $upgrade11/zoe-full-upgrade/run-prober-script.js || exit 1 + +echo +++++ fill wallet +++++ +agd tx bank send validator $GOV1ADDR 12340000000${ATOM_DENOM} --from validator --chain-id agoriclocal --keyring-backend test --yes +agops vaults open --wantMinted 10000 --giveCollateral 2000 > wantIST +agops perf satisfaction --executeOffer wantIST --from gov1 --keyring-backend test + + +echo +++++ install bundles +++++ +for f in /tmp/bundle-{Z*-upgrade,prober-contract}.json; do + echo installing $f + agd tx swingset install-bundle "@$f" \ + --from gov1 --keyring-backend=test --gas=auto \ + --chain-id=agoriclocal -bblock --yes +done + + +echo +++++ Run prober first time +++++ +$upgrade11/zoe-full-upgrade/run-prober.sh +test_val "$(agd query vstorage data published.prober-asid9a -o jsonlines | jq -r '.value' | jq -r '.values[0]')" "false" "Prober calling zcf.atomicReallocate()" + + +# upgrade zoe to a version that can change which ZCF is installed; tell Zoe to +# use a new version of ZCF. THIS MATCHES THE UPGRADE OF THE LIVE CHAIN +echo +++++ upgrade Zoe and ZCF +++++ +$upgrade11/zoe-full-upgrade/zcf-upgrade-driver.sh + + +echo +++++ Run prober second time +++++ +# Re-run prober test and expect internal atomicRearrange. +$upgrade11/zoe-full-upgrade/run-prober.sh +test_val "$(agd query vstorage data published.prober-asid9a -o jsonlines | jq -r '.value' | jq -r '.values[0]')" "true" "Prober called zcf.atomicReallocate()" + +test_not_val "$(agops vaults list --from $GOV1ADDR)" "" "gov1 has no vaults" + +# open up a vault +OFFER=$(mktemp -t agops.XXX) +agops vaults open --wantMinted 7.00 --giveCollateral 11.0 >|"$OFFER" +agops perf satisfaction --from "$GOV1ADDR" --executeOffer "$OFFER" --keyring-backend=test + +# put some IST in +OFFER=$(mktemp -t agops.XXX) +agops vaults adjust --vaultId vault3 --giveMinted 1.5 --from $GOV1ADDR --keyring-backend=test >|"$OFFER" +agops perf satisfaction --from "$GOV1ADDR" --executeOffer "$OFFER" --keyring-backend=test + +# add some collateral +OFFER=$(mktemp -t agops.XXX) +agops vaults adjust --vaultId vault3 --giveCollateral 2.0 --from $GOV1ADDR --keyring-backend="test" >|"$OFFER" +agops perf satisfaction --from "$GOV1ADDR" --executeOffer "$OFFER" --keyring-backend=test + +# close out +OFFER=$(mktemp -t agops.XXX) +agops vaults close --vaultId vault3 --giveMinted 5.75 --from $GOV1ADDR --keyring-backend="test" >|"$OFFER" +agops perf satisfaction --from "$GOV1ADDR" --executeOffer "$OFFER" --keyring-backend=test + +test_val $(agoric follow -l -F :published.vaultFactory.managers.manager0.vaults.vault3 -o jsonlines | jq -r '.vaultState') "closed" "vault3 is closed" +test_val $(agoric follow -l -F :published.vaultFactory.managers.manager0.vaults.vault3 -o jsonlines | jq -r '.locked.value') "0" "vault3 contains no collateral" +test_val $(agoric follow -l -F :published.vaultFactory.managers.manager0.vaults.vault3 -o jsonlines | jq -r '.debtSnapshot.debt.value') "0" "vault3 has no debt" + +./more_actions.sh diff --git a/packages/governance/src/contractGovernance/paramManager.js b/packages/governance/src/contractGovernance/paramManager.js index 23bc725eb5e..73ec3842941 100644 --- a/packages/governance/src/contractGovernance/paramManager.js +++ b/packages/governance/src/contractGovernance/paramManager.js @@ -5,7 +5,6 @@ import { InstanceHandleShape, KeywordShape, } from '@agoric/zoe/src/typeGuards.js'; -import { makeBrandedRatioPattern } from '@agoric/ertp/src/typeGuards.js'; import { assertKeywordName } from '@agoric/zoe/src/cleanProposal.js'; import { keyEQ, M, mustMatch } from '@agoric/store'; import { E } from '@endo/eventual-send'; @@ -14,6 +13,7 @@ import { prepareExoClass, makeScalarBigMapStore } from '@agoric/vat-data'; import { RelativeTimeShape, TimestampShape } from '@agoric/time'; import { ToFarFunction } from '@endo/captp'; import { PublicTopicShape } from '@agoric/zoe/src/contractSupport/index.js'; +import { makeBrandedRatioPattern } from '@agoric/zoe/src/contractSupport/ratio.js'; import { ParamTypes } from '../constants.js'; import { CONTRACT_ELECTORATE } from './governParam.js'; diff --git a/packages/inter-protocol/src/vaultFactory/params.js b/packages/inter-protocol/src/vaultFactory/params.js index c4badff91e5..00556baa6a4 100644 --- a/packages/inter-protocol/src/vaultFactory/params.js +++ b/packages/inter-protocol/src/vaultFactory/params.js @@ -15,6 +15,8 @@ import { import { M, makeScalarMapStore } from '@agoric/store'; import { TimeMath } from '@agoric/time'; import { prepareExo, provideDurableMapStore } from '@agoric/vat-data'; +import { makeTracer } from '@agoric/internal/src'; + import { amountPattern, ratioPattern } from '../contractSupport.js'; export const CHARGING_PERIOD_KEY = 'ChargingPeriod'; @@ -38,6 +40,8 @@ export const vaultDirectorParamTypes = { }; harden(vaultDirectorParamTypes); +const trace = makeTracer('VaultFactory Params'); + /** * @param {Amount<'set'>} electorateInvitationAmount * @param {Amount<'nat'>} minInitialDebt @@ -258,6 +262,7 @@ export const provideVaultParamManagers = (baggage, makeRecorderKit) => { // try to do it again. This will NOT restore the most recent values; The EC // will have to restore the values they want before enabling trading. // [...managerArgs.entries()].map(([brand, args]) => makeManager(brand, args)); + trace('extracting paramManagers from baggage', managerArgs.keys()); for (const [brand, args] of managerArgs.entries()) { makeManager(brand, args); managerArgs.delete(brand); diff --git a/packages/zoe/src/contractSupport/ratio.js b/packages/zoe/src/contractSupport/ratio.js index 74fb7e97f88..cfdcc66a409 100644 --- a/packages/zoe/src/contractSupport/ratio.js +++ b/packages/zoe/src/contractSupport/ratio.js @@ -1,6 +1,6 @@ import './types.js'; -import { q, Fail } from '@agoric/assert'; -import { AmountMath } from '@agoric/ertp'; +import { Fail, q } from '@agoric/assert'; +import { AmountMath, makeBrandedAmountPattern } from '@agoric/ertp'; import { assertRecord } from '@endo/marshal'; import { isNat } from '@endo/nat'; @@ -399,3 +399,14 @@ export const ratioToNumber = ratio => { const d = Number(ratio.denominator.value); return n / d; }; + +/** @param {Ratio} ratio */ +export const makeBrandedRatioPattern = ratio => { + const numeratorAmountShape = makeBrandedAmountPattern(ratio.numerator); + const denominatorAmountShape = makeBrandedAmountPattern(ratio.denominator); + return harden({ + numerator: numeratorAmountShape, + denominator: denominatorAmountShape, + }); +}; +harden(makeBrandedRatioPattern);