diff --git a/multichain-testing/test/auto-stake-it.test.ts b/multichain-testing/test/auto-stake-it.test.ts index e9a82de97a2..69af5caf669 100644 --- a/multichain-testing/test/auto-stake-it.test.ts +++ b/multichain-testing/test/auto-stake-it.test.ts @@ -25,15 +25,8 @@ test.before(async t => { deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; - - t.log('bundle and install contract', contractName); - await t.context.deployBuilder(contractBuilder); - const { vstorageClient } = t.context; - await t.context.retryUntilCondition( - () => vstorageClient.queryData(`published.agoricNames.instance`), - res => contractName in Object.fromEntries(res), - `${contractName} instance is available`, - ); + const { startContract } = rest; + await startContract(contractName, contractBuilder); }); test.after(async t => { diff --git a/multichain-testing/test/basic-flows.test.ts b/multichain-testing/test/basic-flows.test.ts index f9e710c5be3..9d8d9f57e44 100644 --- a/multichain-testing/test/basic-flows.test.ts +++ b/multichain-testing/test/basic-flows.test.ts @@ -20,15 +20,8 @@ test.before(async t => { deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; - - t.log('bundle and install contract', contractName); - await t.context.deployBuilder(contractBuilder); - const { vstorageClient } = t.context; - await t.context.retryUntilCondition( - () => vstorageClient.queryData(`published.agoricNames.instance`), - res => contractName in Object.fromEntries(res), - `${contractName} instance is available`, - ); + const { startContract } = rest; + await startContract(contractName, contractBuilder); }); test.after(async t => { diff --git a/multichain-testing/test/send-anywhere.test.ts b/multichain-testing/test/send-anywhere.test.ts index d27639c8607..54a7f0fe3cb 100644 --- a/multichain-testing/test/send-anywhere.test.ts +++ b/multichain-testing/test/send-anywhere.test.ts @@ -24,15 +24,8 @@ test.before(async t => { deleteTestKeys(accounts).catch(); const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; - - t.log('bundle and install contract', contractName); - await t.context.deployBuilder(contractBuilder); - const { vstorageClient } = t.context; - await t.context.retryUntilCondition( - () => vstorageClient.queryData(`published.agoricNames.instance`), - res => contractName in Object.fromEntries(res), - `${contractName} instance is available`, - ); + const { startContract } = rest; + await startContract(contractName, contractBuilder); }); test.after(async t => { diff --git a/multichain-testing/test/support.ts b/multichain-testing/test/support.ts index a3172eaf9ff..065c656c995 100644 --- a/multichain-testing/test/support.ts +++ b/multichain-testing/test/support.ts @@ -62,6 +62,33 @@ export const commonSetup = async (t: ExecutionContext) => { }); const hermes = makeHermes(childProcess); + /** + * Starts a contract if instance not found. Takes care of installing + * bundles and voting on the CoreEval proposal. + * + * @param contractName name of the contract in agoricNames + * @param contractBuilder path to proposal builder + */ + const startContract = async ( + contractName: string, + contractBuilder: string, + ) => { + const { vstorageClient } = tools; + const instances = Object.fromEntries( + await vstorageClient.queryData(`published.agoricNames.instance`), + ); + if (contractName in instances) { + return t.log('Contract found. Skipping installation...'); + } + t.log('bundle and install contract', contractName); + await deployBuilder(contractBuilder); + await retryUntilCondition( + () => vstorageClient.queryData(`published.agoricNames.instance`), + res => contractName in Object.fromEntries(res), + `${contractName} instance is available`, + ); + }; + return { useChain, ...tools, @@ -69,6 +96,7 @@ export const commonSetup = async (t: ExecutionContext) => { retryUntilCondition, deployBuilder, hermes, + startContract, }; };