diff --git a/.changeset/olive-lions-enjoy.md b/.changeset/olive-lions-enjoy.md new file mode 100644 index 00000000..c4806eea --- /dev/null +++ b/.changeset/olive-lions-enjoy.md @@ -0,0 +1,9 @@ +--- +"@moonwall/cli": minor +"@moonwall/tests": minor +"@moonwall/types": minor +"@moonwall/util": minor +--- + +November Update +- [[#435](https://github.com/Moonsong-Labs/moonwall/issues/435)] Zombienets dont require parachains anymore \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9206edc7..fd259c29 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -219,7 +219,7 @@ jobs: strategy: fail-fast: false matrix: - suite: ["zombie_test", "zombie_multi_para"] + suite: ["zombie_test", "zombie_multi_para", "zombie_noPara"] steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 diff --git a/packages/cli/src/internal/foundations/zombieHelpers.ts b/packages/cli/src/internal/foundations/zombieHelpers.ts index 0013f450..7d646fd5 100644 --- a/packages/cli/src/internal/foundations/zombieHelpers.ts +++ b/packages/cli/src/internal/foundations/zombieHelpers.ts @@ -15,39 +15,41 @@ export async function checkZombieBins(config: LaunchConfig) { await checkExists(relayBinPath); checkAccess(relayBinPath); - const promises = config.parachains.map((para) => { - if (para.collator) { - if (!para.collator.command) { - throw new Error( - "No command found for collator, please check your zombienet config file for collator command" - ); - } - checkExists(para.collator.command); - checkAccess(para.collator.command); - } - - if (para.collators) { - for (const coll of para.collators) { - if (!coll.command) { + if (config.parachains) { + const promises = config.parachains.map((para) => { + if (para.collator) { + if (!para.collator.command) { throw new Error( - "No command found for collators, please check your zombienet config file for collators command" + "No command found for collator, please check your zombienet config file for collator command" ); } - checkExists(coll.command); - checkAccess(coll.command); + checkExists(para.collator.command); + checkAccess(para.collator.command); } - // para.collators.forEach((coll) => { - // if (!coll.command) { - // throw new Error( - // "No command found for collators, please check your zombienet config file for para collators command" - // ); - // } - // checkExists(coll.command); - // checkAccess(coll.command); - // }); - } - }); - await Promise.all(promises); + + if (para.collators) { + for (const coll of para.collators) { + if (!coll.command) { + throw new Error( + "No command found for collators, please check your zombienet config file for collators command" + ); + } + checkExists(coll.command); + checkAccess(coll.command); + } + // para.collators.forEach((coll) => { + // if (!coll.command) { + // throw new Error( + // "No command found for collators, please check your zombienet config file for para collators command" + // ); + // } + // checkExists(coll.command); + // checkAccess(coll.command); + // }); + } + }); + await Promise.all(promises); + } } export function getZombieConfig(path: string) { diff --git a/packages/cli/src/internal/providerFactories.ts b/packages/cli/src/internal/providerFactories.ts index a1a8de5c..3ff08755 100644 --- a/packages/cli/src/internal/providerFactories.ts +++ b/packages/cli/src/internal/providerFactories.ts @@ -149,7 +149,7 @@ export class ProviderFactory { public static prepareDefaultZombie(): MoonwallProvider[] { const MOON_PARA_WSS = process.env.MOON_PARA_WSS || "error"; const MOON_RELAY_WSS = process.env.MOON_RELAY_WSS || "error"; - return ProviderFactory.prepare([ + const providers = [ { name: "w3", type: "web3", @@ -165,34 +165,45 @@ export class ProviderFactory { type: "viem", endpoints: [MOON_PARA_WSS], }, - { - name: "parachain", - type: "polkadotJs", - endpoints: [MOON_PARA_WSS], - }, + { name: "relaychain", type: "polkadotJs", endpoints: [MOON_RELAY_WSS], }, - ]); + ] satisfies ProviderConfig[]; + + if (MOON_PARA_WSS !== "error") { + providers.push({ + name: "parachain", + type: "polkadotJs", + endpoints: [MOON_PARA_WSS], + }); + } + + return ProviderFactory.prepare(providers); } public static prepareNoEthDefaultZombie(): MoonwallProvider[] { const MOON_PARA_WSS = process.env.MOON_PARA_WSS || "error"; const MOON_RELAY_WSS = process.env.MOON_RELAY_WSS || "error"; - return ProviderFactory.prepare([ - { - name: "parachain", - type: "polkadotJs", - endpoints: [MOON_PARA_WSS], - }, + + const providers = [ { name: "relaychain", type: "polkadotJs", endpoints: [MOON_RELAY_WSS], }, - ]); + ] satisfies ProviderConfig[]; + + if (MOON_PARA_WSS !== "error") { + providers.push({ + name: "parachain", + type: "polkadotJs", + endpoints: [MOON_PARA_WSS], + }); + } + return ProviderFactory.prepare(providers); } } diff --git a/packages/cli/src/lib/globalContext.ts b/packages/cli/src/lib/globalContext.ts index 7fcf8b53..01018a20 100644 --- a/packages/cli/src/lib/globalContext.ts +++ b/packages/cli/src/lib/globalContext.ts @@ -208,7 +208,11 @@ export class MoonwallContext { }; process.env.MOON_RELAY_WSS = network.relay[0].wsUri; - process.env.MOON_PARA_WSS = Object.values(network.paras)[0].nodes[0].wsUri; + + if (Object.entries(network.paras).length > 0) { + console.dir(network.paras, { depth: null }); + process.env.MOON_PARA_WSS = Object.values(network.paras)[0].nodes[0].wsUri; + } const nodeNames = Object.keys(network.nodesByName); process.env.MOON_ZOMBIE_DIR = `${network.tmpDir}`; diff --git a/test/configs/zombieNoPara.json b/test/configs/zombieNoPara.json new file mode 100644 index 00000000..d5452122 --- /dev/null +++ b/test/configs/zombieNoPara.json @@ -0,0 +1,32 @@ +{ + "settings": { + "timeout": 1000, + "provider": "native" + }, + "relaychain": { + "chain": "rococo-local", + "default_command": "tmp/polkadot", + "default_args": [ + "--no-hardware-benchmarks", + "-lparachain=debug", + "--database=paritydb" + ], + "nodes": [ + { + "name": "alice", + "validator": true + }, + { + "name": "bob", + "validator": true + } + ] + }, + "types": { + "Header": { + "number": "u64", + "parent_hash": "Hash", + "post_state": "Hash" + } + } +} diff --git a/test/moonwall.config.json b/test/moonwall.config.json index 7b8b48c2..3508a6bb 100644 --- a/test/moonwall.config.json +++ b/test/moonwall.config.json @@ -168,6 +168,24 @@ } } }, + { + "name": "zombie_noPara", + "testFileDir": ["suites/zombieNoPara"], + "timeout": 300000, + "envVars": ["DEBUG_COLORS=1"], + "reporters": ["default"], + "foundation": { + "type": "zombie", + "zombieSpec": { + "name": "zombienet", + "disableDefaultEthProviders": true, + "additionalZombieConfig": { + "silent": true + }, + "configPath": "./configs/zombieNoPara.json" + } + } + }, { "name": "para_test", "testFileDir": ["suites/zombie"], diff --git a/test/suites/zombieNoPara/test_basic.ts b/test/suites/zombieNoPara/test_basic.ts new file mode 100644 index 00000000..eed20add --- /dev/null +++ b/test/suites/zombieNoPara/test_basic.ts @@ -0,0 +1,31 @@ +import "@moonbeam-network/api-augment"; +import { beforeAll, describeSuite, expect } from "@moonwall/cli"; +import type { ApiPromise } from "@polkadot/api"; + +describeSuite({ + id: "Z1", + title: "Zombie Test Suite", + foundationMethods: "zombie", + testCases: ({ it, context, log }) => { + let paraApi: ApiPromise; + let relayApi: ApiPromise; + + beforeAll(async () => { + relayApi = context.polkadotJs("relaychain"); + }, 10000); + + it({ + id: "T01", + title: "Check relaychain api correctly connected", + test: async () => { + const rt = relayApi.consts.system.version.specVersion.toNumber(); + expect(rt).to.be.greaterThan(0); + + const network = relayApi.consts.system.version.specName.toString(); + expect(network).to.contain("rococo"); + }, + }); + + + }, +});