From 1e153cfe017bd7beee6ab941f42ce33f54ed36aa Mon Sep 17 00:00:00 2001 From: JorgeLopes-BytePitch Date: Mon, 26 Feb 2024 11:25:43 +0000 Subject: [PATCH] fix(liquidationVisibility): minor updates to contract and bootstrap tests --- .../src/vaultFactory/vaultManager.js | 2 - .../liquidation-test-utils.js | 1 - .../test-liquidation-compability.js | 2 + .../test-liquidation-visibility.js | 135 ++++++++++++++++++ 4 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-visibility.js diff --git a/packages/inter-protocol/src/vaultFactory/vaultManager.js b/packages/inter-protocol/src/vaultFactory/vaultManager.js index 6809c275cac..c2002abbf86 100644 --- a/packages/inter-protocol/src/vaultFactory/vaultManager.js +++ b/packages/inter-protocol/src/vaultFactory/vaultManager.js @@ -153,7 +153,6 @@ const trace = makeTracer('VM'); * totalShortfallReceived: Amount<'nat'>, * vaultCounter: number, * lockedQuote: PriceQuote | undefined, - * liquidationsStorageNode: StorageNode | undefined, * }} MutableState */ @@ -388,7 +387,6 @@ export const prepareVaultManagerKit = ( unsettledVaults, } = state; - facets.helper.provideLiquidationStorageNode(); const ephemera = collateralEphemera(collateralBrand); ephemera.prioritizedVaults = makePrioritizedVaults(unsettledVaults); // We have to store this in ephemera since we can't add new properties diff --git a/packages/vats/test/bootstrapTests/liquidationVisibility/liquidation-test-utils.js b/packages/vats/test/bootstrapTests/liquidationVisibility/liquidation-test-utils.js index 946e2de1f86..70642ba7095 100644 --- a/packages/vats/test/bootstrapTests/liquidationVisibility/liquidation-test-utils.js +++ b/packages/vats/test/bootstrapTests/liquidationVisibility/liquidation-test-utils.js @@ -17,7 +17,6 @@ import { import { scale6 } from '../liquidation.js'; import { makeAgoricNamesRemotesFromFakeStorage } from '../../../tools/board-utils.js'; import { makeSwingsetTestKit } from '../supports.js'; -import { scale6 } from '../liquidation.js'; import { makeGovernanceDriver, makePriceFeedDriver, diff --git a/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-compability.js b/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-compability.js index d2c06264da4..73c9ae0768f 100644 --- a/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-compability.js +++ b/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-compability.js @@ -6,6 +6,7 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; import { checkVMChildNodes, makeTestContext, + startAuction, } from './liquidation-test-utils.js'; /** @@ -106,3 +107,4 @@ test.serial('visibility-after-upgrade', async t => { t.log('Data', storage.data.keys()); t.pass(); }); + diff --git a/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-visibility.js b/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-visibility.js new file mode 100644 index 00000000000..389723b8e5b --- /dev/null +++ b/packages/vats/test/bootstrapTests/liquidationVisibility/test-liquidation-visibility.js @@ -0,0 +1,135 @@ +/* eslint-disable no-lone-blocks, no-await-in-loop */ +// @ts-check +/** + * @file Bootstrap test vaults liquidation visibility + */ +import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js'; +import { makeLiquidationTestContext, scale6 } from '../liquidation.js'; +import { checkVisibility, startAuction } from './liquidation-test-utils.js'; + +/** + * @type {import('ava').TestFn>>} + */ +const test = anyTest; + +test.before(async t => { + t.context = await makeLiquidationTestContext( + t, + '@agoric/vats/decentral-liq-visibility-vaults-config.json', + ); +}); + +test.after.always(t => { + return t.context.shutdown && t.context.shutdown(); +}); + +test.serial('visibility-before-upgrade', async t => { + await checkVisibility({ + t, + collateralBrandKey: 'ATOM', + managerIndex: 0, + }); +}); + +test.serial('restart-vault-factory', async t => { + const { + runUtils: { EV }, + readLatest, + } = t.context; + const vaultFactoryKit = await EV.vat('bootstrap').consumeItem( + 'vaultFactoryKit', + ); + + const { privateArgs } = vaultFactoryKit; + console.log('reused privateArgs', privateArgs, vaultFactoryKit); + + const vfAdminFacet = await EV( + vaultFactoryKit.governorCreatorFacet, + ).getAdminFacet(); + + t.log('awaiting VaultFactory restartContract'); + const upgradeResult = await EV(vfAdminFacet).restartContract(privateArgs); + t.deepEqual(upgradeResult, { incarnationNumber: 1 }); +}); + +test.serial('restart contractGovernor', async t => { + const { EV } = t.context.runUtils; + const vaultFactoryKit = await EV.vat('bootstrap').consumeItem( + 'vaultFactoryKit', + ); + + const { governorAdminFacet } = vaultFactoryKit; + // has no privateArgs of its own. the privateArgs.governed is only for the + // contract startInstance. any changes to those privateArgs have to happen + // through a restart or upgrade using the governed contract's adminFacet + const privateArgs = undefined; + + t.log('awaiting CG restartContract'); + const upgradeResult = await EV(governorAdminFacet).restartContract( + privateArgs, + ); + t.deepEqual(upgradeResult, { incarnationNumber: 1 }); +}); + +test.serial('no-unnecessary-storage-nodes', async t => { + const { + runUtils: { EV }, + readLatest, + } = t.context; + const auctioneerKit = await EV.vat('bootstrap').consumeItem('auctioneerKit'); + const { nextAuctionSchedule } = await EV( + auctioneerKit.publicFacet, + ).getSchedules(); + t.log('nextAuctionSchedule', nextAuctionSchedule); + await startAuction(t); + + const scheduleNotification = readLatest('published.auction.schedule'); + t.log('scheduleNotification', scheduleNotification); + + // Make sure the auction started properly + t.is( + nextAuctionSchedule.startTime.absValue, + scheduleNotification.activeStartTime.absValue, + ); + + t.throws( + () => + readLatest( + `published.vaultFactory.managers.manager0.liquidations.${scheduleNotification.activeStartTime.absValue.toString()}`, + ), + { + message: `no data for "published.vaultFactory.managers.manager0.liquidations.${scheduleNotification.activeStartTime.absValue.toString()}"`, + }, + ); +}); + +test.serial('visibility-after-upgrade', async t => { + await checkVisibility({ + t, + managerIndex: 0, + collateralBrandKey: 'ATOM', + base: 3, + }); + + t.pass(); +}); + +test.serial('snapshot-storage', async t => { + const { readLatest } = t.context; + + const buildSnapshotItem = (paths, managerIndex, auctionTime) => { + const basePath = `published.vaultFactory.managers.manager${managerIndex}.liquidations.${auctionTime}`; + const item = {}; + for (const path of paths) { + const exactPath = `${basePath}.${path}`; + item[exactPath] = readLatest(exactPath); + } + t.snapshot(Object.entries(item)); + }; + + buildSnapshotItem( + ['vaults.preAuction', 'vaults.postAuction', 'auctionResult'], + 0, + 3600n, + ); +});