From 5b80462b7c863663eb89301a7e749046e8981e7a Mon Sep 17 00:00:00 2001 From: Mathieu Hofman Date: Mon, 21 Mar 2022 02:02:56 +0000 Subject: [PATCH] feat(loadgen): Use fallback token if no vaultFactoryCreator --- loadgen/config.js | 4 +- loadgen/contract/agent-prepare-loadgen.js | 59 ++++++++++++++++++++--- loadgen/prepare-loadgen.js | 4 ++ loadgen/task-create-vault.js | 21 +++++--- loadgen/task-trade-amm.js | 21 +++++--- 5 files changed, 87 insertions(+), 22 deletions(-) diff --git a/loadgen/config.js b/loadgen/config.js index 2d1f554..26395c3 100644 --- a/loadgen/config.js +++ b/loadgen/config.js @@ -1,3 +1,3 @@ -export const collateralToken = 'USDC'; +export const fallbackCollateralToken = 'USDC'; -export const tradeToken = 'USDC'; +export const fallbackTradeToken = 'USDC'; diff --git a/loadgen/contract/agent-prepare-loadgen.js b/loadgen/contract/agent-prepare-loadgen.js index 370358b..8159aba 100644 --- a/loadgen/contract/agent-prepare-loadgen.js +++ b/loadgen/contract/agent-prepare-loadgen.js @@ -23,6 +23,8 @@ import { fallback } from './fallback.js'; * wallet: ERef, * zoe: ERef, * mintBundle: BundleSource, + * fallbackCollateralToken?: string | undefined, + * fallbackTradeToken?: string | undefined, * }} startParam */ @@ -126,6 +128,8 @@ export default async function startAgent({ zoe, wallet, mintBundle, + fallbackTradeToken, + fallbackCollateralToken, }) { const walletAdmin = E(wallet).getAdminFacet(); @@ -400,14 +404,53 @@ export default async function startAgent({ }, ); - return harden( - await allValues({ - tokenKit, - runKit, - amm, - vaultManager, - vaultFactory: vaultFactoryPublicFacet, - }), + return E.when(vaultManager, async (vaultManagerPresence) => { + const collateralTokenPetname = + fallbackCollateralToken || fallbackTradeToken; + + if (vaultManagerPresence) { + return { vaultTokenKit: tokenKit, ammTokenKit: tokenKit }; + } else if (collateralTokenPetname) { + // Make sure the finder knows about all purses by finding the + // LGT purse we created + await purseFinder.find({ brandPetname: tokenBrandPetname }); + + const { kit: vaultTokenKit } = E.get( + purseFinder.find({ + brandPetname: collateralTokenPetname, + existingOnly: true, + }), + ); + + let ammTokenKit = vaultTokenKit.then((value) => value || tokenKit); + if ( + (fallbackTradeToken && fallbackTradeToken !== collateralTokenPetname) || + !(await fundingResult) + ) { + ({ kit: ammTokenKit } = E.get( + purseFinder.find({ + brandPetname: fallbackTradeToken, + existingOnly: true, + }), + )); + } + + return { vaultTokenKit, ammTokenKit }; + } else { + return { vaultTokenKit: null, ammTokenKit: null }; + } + }).then(async ({ vaultTokenKit, ammTokenKit }) => + harden( + await allValues({ + tokenKit, + runKit, + amm, + ammTokenKit, + vaultManager, + vaultFactory: vaultFactoryPublicFacet, + vaultTokenKit, + }), + ), ); // TODO: exit here? diff --git a/loadgen/prepare-loadgen.js b/loadgen/prepare-loadgen.js index fe7a74a..de144cc 100644 --- a/loadgen/prepare-loadgen.js +++ b/loadgen/prepare-loadgen.js @@ -4,6 +4,8 @@ import path from 'path'; import { E } from '@agoric/eventual-send'; +import { fallbackCollateralToken, fallbackTradeToken } from './config.js'; + const key = 'loadgenKit'; /** @@ -64,6 +66,8 @@ export async function prepareLoadgen(home, deployPowers) { wallet, zoe, mintBundle, + fallbackCollateralToken, + fallbackTradeToken, }); loadgenKit = await E(installerP).spawn(agentParam); diff --git a/loadgen/task-create-vault.js b/loadgen/task-create-vault.js index a38cb62..43f11d2 100644 --- a/loadgen/task-create-vault.js +++ b/loadgen/task-create-vault.js @@ -33,15 +33,24 @@ export async function prepareVaultCycle(home, deployPowers) { // create the solo-side agent to drive each cycle, let it handle zoe const installerP = E(spawner).install(agentBundle); - const { runKit, tokenKit, vaultFactory } = await loadgenKit; - /** @type {import('./contract/agent-create-vault').startParam} */ - const startParam = { tokenKit, runKit, vaultFactory, zoe }; - agent = await E(installerP).spawn(startParam); - await E(scratch).set(key, agent); - console.log(`create-vault: prepare: agent installed`); + const { runKit, vaultTokenKit: tokenKit, vaultFactory } = await loadgenKit; + if (runKit && tokenKit && vaultFactory) { + /** @type {import('./contract/agent-create-vault').startParam} */ + const startParam = { tokenKit, runKit, vaultFactory, zoe }; + agent = await E(installerP).spawn(startParam); + await E(scratch).set(key, agent); + console.log(`create-vault: prepare: agent installed`); + } else { + console.error( + `create-vault: prepare: couldn't install agent, missing prerequisites`, + ); + } } async function vaultCycle() { + if (!agent) { + throw new Error('No agent available'); + } const { newRunBalanceDisplay, newCollateralBalanceDisplay, diff --git a/loadgen/task-trade-amm.js b/loadgen/task-trade-amm.js index 6e7ddf4..83dbdb5 100644 --- a/loadgen/task-trade-amm.js +++ b/loadgen/task-trade-amm.js @@ -26,15 +26,24 @@ export async function prepareAMMTrade(home, deployPowers) { // create the solo-side agent to drive each cycle, let it handle zoe const installerP = E(spawner).install(agentBundle); - const { runKit, tokenKit, amm } = await loadgenKit; - /** @type {import('./contract/agent-trade-amm').startParam} */ - const startParam = { tokenKit, runKit, amm, zoe }; - agent = await E(installerP).spawn(startParam); - await E(scratch).set(key, agent); - console.log(`trade-amm: prepare: agent installed`); + const { runKit, ammTokenKit: tokenKit, amm } = await loadgenKit; + if (runKit && tokenKit && amm) { + /** @type {import('./contract/agent-trade-amm').startParam} */ + const startParam = { tokenKit, runKit, amm, zoe }; + agent = await E(installerP).spawn(startParam); + await E(scratch).set(key, agent); + console.log(`trade-amm: prepare: agent installed`); + } else { + console.error( + `trade-amm: prepare: couldn't install agent, missing prerequisites`, + ); + } } async function tradeAMMCycle() { + if (!agent) { + throw new Error('No agent available'); + } const { newRunBalanceDisplay, newTargetBalanceDisplay, targetToken } = await E(agent).doAMMCycle(); console.log(