diff --git a/.gitignore b/.gitignore index fc0fb98d..d9948d85 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ **/dist/ **/.tsup/ test/html/* -*.sqlite **/*.log downloads/* *.wasm @@ -22,4 +21,6 @@ artifacts **/contracts/out/* -.idea \ No newline at end of file +.idea +db.sqlite* +polkadot* \ No newline at end of file diff --git a/.npmignore b/.npmignore index 82be25e9..8bc155dd 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,3 @@ moonbeam -polkadot *.wasm *.txt diff --git a/packages/cli/src/internal/localNode.ts b/packages/cli/src/internal/localNode.ts index c55704ab..b3e7c974 100644 --- a/packages/cli/src/internal/localNode.ts +++ b/packages/cli/src/internal/localNode.ts @@ -91,7 +91,6 @@ export async function launchNode(cmd: string, args: string[], name: string) { for (const port of ports) { try { await checkWebSocketJSONRPC(port); - // console.log(`Port ${port} supports WebSocket JSON RPC!`); break probe; } catch {} } diff --git a/packages/cli/src/internal/providerFactories.ts b/packages/cli/src/internal/providerFactories.ts index a3fd815e..a1a8de5c 100644 --- a/packages/cli/src/internal/providerFactories.ts +++ b/packages/cli/src/internal/providerFactories.ts @@ -42,6 +42,7 @@ export class ProviderFactory { name: this.providerConfig.name, type: this.providerConfig.type, connect: async () => { + process.env.DEFAULT_TIMEOUT_MS = "30000"; const options: ApiOptions = { provider: new WsProvider(this.url), initWasm: false, @@ -226,7 +227,10 @@ export class ProviderInterfaceFactory { } private async createPolkadotJs(): Promise<ProviderInterface> { + debug(`🔌 Connecting PolkadotJs provider: ${this.name}`); const api = (await this.connect()) as ApiPromise; + debug(`✅ PolkadotJs provider ${this.name} connected`); + 1; return { name: this.name, api, @@ -309,7 +313,15 @@ export class ProviderInterfaceFactory { type: ProviderType, connect: () => Promise<ApiPromise> | Wallet | Web3 | Promise<ViemClient> | null ): Promise<ProviderInterface> { - return await new ProviderInterfaceFactory(name, type, connect).create(); + debug(`🔄 Populating provider: ${name} of type: ${type}`); + try { + const providerInterface = await new ProviderInterfaceFactory(name, type, connect).create(); + debug(`✅ Successfully populated provider: ${name}`); + return providerInterface; + } catch (error: any) { + console.error(`❌ Failed to populate provider: ${name} - ${error.message}`); + throw error; + } } } diff --git a/packages/cli/src/lib/globalContext.ts b/packages/cli/src/lib/globalContext.ts index 5311b8cf..b538d7fc 100644 --- a/packages/cli/src/lib/globalContext.ts +++ b/packages/cli/src/lib/globalContext.ts @@ -6,6 +6,7 @@ import type { MoonwallConfig, MoonwallEnvironment, MoonwallProvider, + ProviderType, } from "@moonwall/types"; import type { ApiPromise } from "@polkadot/api"; import zombie, { type Network } from "@zombienet/orchestrator"; @@ -35,6 +36,7 @@ import { isOptionSet, } from "./configReader"; import { type ChildProcess, exec, execSync } from "node:child_process"; +import { promisify } from "node:util"; const debugSetup = Debug("global:context"); export class MoonwallContext { @@ -369,13 +371,32 @@ export class MoonwallContext { const promises = nodes.map(async ({ cmd, args, name, launch }) => { if (launch) { - const { runningNode } = await launchNode(cmd, args, name || "node"); - this.nodes.push(runningNode); + try { + const { runningNode } = await launchNode(cmd, args, name || "node"); + this.nodes.push(runningNode); + } catch (error: any) { + throw new Error(`Failed to start node '${name || "unnamed"}': ${error.message}`); + } } else { return Promise.resolve(); } }); - await Promise.allSettled(promises); + + try { + await Promise.race([ + Promise.allSettled(promises), + new Promise((_, reject) => + setTimeout(() => reject(new Error("Network startup timed out after 30 seconds")), 30000) + ), + ]); + } catch (error: any) { + console.error(`Error starting network: ${error.message}`); + console.error( + "Current nodes:", + this.nodes.map((n) => ({ pid: n.pid })) + ); + throw error; + } return ctx; } @@ -395,14 +416,62 @@ export class MoonwallContext { return MoonwallContext.getContext(); } - const promises = this.environment.providers.map( - async ({ name, type, connect }) => - new Promise(async (resolve) => { - this.providers.push(await ProviderInterfaceFactory.populate(name, type, connect as any)); - resolve(""); - }) - ); - await Promise.all(promises); + const connectWithRetry = async (provider: { + name: string; + type: ProviderType; + connect: any; + }) => { + const maxRetries = 15; + const retryDelay = 1000; + const connectTimeout = 10000; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + const connectedProvider = await Promise.race([ + ProviderInterfaceFactory.populate(provider.name, provider.type, provider.connect), + new Promise<never>((_, reject) => + setTimeout(() => reject(new Error("Connection attempt timed out")), connectTimeout) + ), + ]); + + this.providers.push(connectedProvider); + debugSetup(`✅ Provider ${provider.name} connected on attempt ${attempt}`); + return; + } catch (error: any) { + console.error( + `Error connecting provider ${provider.name} on attempt ${attempt}: ${error.message}` + ); + + if (attempt === maxRetries) { + throw new Error( + `Failed to connect provider '${provider.name}' after ${maxRetries} attempts: ${error.message}` + ); + } + + debugSetup( + `⚠️ Retrying provider ${provider.name} connection, attempt ${attempt + 1}/${maxRetries}` + ); + await new Promise((resolve) => setTimeout(resolve, retryDelay)); + } + } + }; + + try { + await Promise.race([ + Promise.all(this.environment.providers.map((provider) => connectWithRetry(provider))), + new Promise((_, reject) => + setTimeout( + () => reject(new Error("Provider connection timed out after 30 seconds")), + 30000 + ) + ), + ]); + } catch (error: any) { + console.error(`Error connecting to environment: ${error.message}`); + console.error("Current providers:", this.providers.map((p) => p.name).join(", ")); + console.error(`Total providers: ${this.environment.providers.map((p) => p.name).join(", ")}`); + throw error; + } if (this.foundation === "zombie") { let readStreams: any[] = []; @@ -477,13 +546,42 @@ export class MoonwallContext { throw new Error(`Provider ${providerName} not found`); } - prov.disconnect(); + try { + await prov.disconnect(); + debugSetup(`✅ Provider ${providerName} disconnected`); + } catch (error: any) { + console.error(`❌ Error disconnecting provider ${providerName}: ${error.message}`); + } } else { - await Promise.all(this.providers.map((prov) => prov.disconnect())); + await Promise.all( + this.providers.map(async (prov) => { + try { + await prov.disconnect(); + debugSetup(`✅ Provider ${prov.name} disconnected`); + } catch (error: any) { + console.error(`❌ Error disconnecting provider ${prov.name}: ${error.message}`); + } + }) + ); this.providers = []; } } + // public async disconnect(providerName?: string) { + // if (providerName) { + // const prov = this.providers.find(({ name }) => name === providerName); + + // if (!prov) { + // throw new Error(`Provider ${providerName} not found`); + // } + + // prov.disconnect(); + // } else { + // await Promise.all(this.providers.map((prov) => prov.disconnect())); + // this.providers = []; + // } + // } + public static async getContext(config?: MoonwallConfig, force = false): Promise<MoonwallContext> { if (!MoonwallContext.instance?.configured || force) { if (!config) { @@ -582,9 +680,15 @@ export interface IGlobalContextFoundation { foundationType: FoundationType; } +const execAsync = promisify(exec); + async function isPidRunning(pid: number): Promise<boolean> { - const output = exec(`ps -p ${pid} -o pid=`); - return output.exitCode === 0; + try { + const { stdout } = await execAsync(`ps -p ${pid} -o pid=`); + return stdout.trim() === pid.toString(); + } catch (error) { + return false; + } } async function waitForPidsToDie(pids: number[]): Promise<void> { diff --git a/packages/cli/src/lib/runnerContext.ts b/packages/cli/src/lib/runnerContext.ts index 3e5383ef..7defc203 100644 --- a/packages/cli/src/lib/runnerContext.ts +++ b/packages/cli/src/lib/runnerContext.ts @@ -83,7 +83,6 @@ export function describeSuite<T extends FoundationType>({ beforeAll(async () => { const env = getEnvironmentFromConfig(); ctx = await contextCreator(); - if (env.foundation.type === "read_only") { const settings = loadParams(env.foundation.launchSpec); limiter = new Bottleneck(settings); diff --git a/packages/types/src/config.ts b/packages/types/src/config.ts index 4821aa88..99edc3b9 100644 --- a/packages/types/src/config.ts +++ b/packages/types/src/config.ts @@ -529,7 +529,7 @@ export type RepoSpec = { * * @example * { - * "name": "hydradx" + * "name": "hydration" * } * * @example diff --git a/test/configs/assethub.yml b/test/configs/assethub.yml new file mode 100644 index 00000000..69f08060 --- /dev/null +++ b/test/configs/assethub.yml @@ -0,0 +1,20 @@ +endpoint: wss://polkadot-asset-hub-rpc.polkadot.io +mock-signature-host: true +block: ${env.POLKADOT_ASSET_HUB_BLOCK_NUMBER} +db: ./tmp/db.sqlite + +import-storage: + System: + Account: + - + - + - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY + - providers: 1 + data: + free: 1000000000000000 + Assets: + Account: + - [[1984, 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY], { balance: 1000000000 }] + - [[1337, 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY], { balance: 1000000000 }] + - [[21, 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY], { balance: 1000000000 }] + Asset: [[[21], { supply: 1000000000 }]] \ No newline at end of file diff --git a/test/configs/hydradx.yml b/test/configs/hydradx.yml deleted file mode 100644 index 5464bfcf..00000000 --- a/test/configs/hydradx.yml +++ /dev/null @@ -1,78 +0,0 @@ -endpoint: wss://hydradx-rpc.dwellir.com -mock-signature-host: true -block: 4171463 -port: 8000 -db: ./tmp/hydradx_db_mba.sqlite -# wasm-override: hydradx_runtime.compact.compressed.wasm - -import-storage: - System: - Account: - - - - "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" - - providers: 1 - consumers: 1 - sufficients: 1 - data: - free: "133700000000000000000000000000000000" - - - Tokens: - Accounts: - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 0 # HDX - - free: "10000000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 1 # Lerna - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 2 # DAI Stablecoin (via Wormhole) - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 3 # Wrapped Bitcoin (via Wormhole) - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 4 # Ethereum (via Wormhole) - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 5 # Polkadot - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 6 # ApeCoin (via Wormhole) - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 7 # USD Coin (via Wormhole) - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 8 # Phala - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 9 # Astar - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 10 # Statemint USDT - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 11 # interBTC - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 12 # Zeitgeist - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 13 # Centrifuge - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 14 # Bifrost Native Coin - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 15 # Bifrost Voucher DOT - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 16 # GLMR - - free: "100000000000000000000000" - - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - - 17 # Interlay - - free: "100000000000000000000000" - TechnicalCommittee: - Members: ["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"] - Council: - Members: ["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"] diff --git a/test/configs/hydration.yml b/test/configs/hydration.yml new file mode 100644 index 00000000..d352754a --- /dev/null +++ b/test/configs/hydration.yml @@ -0,0 +1,78 @@ +endpoint: wss://rpc.hydradx.cloud +mock-signature-host: true +block: 6383496 +port: 8000 +db: ./tmp/hydration.sqlite +# wasm-override: hydradx_runtime.compact.compressed.wasm + +# import-storage: +# System: +# Account: +# - - - "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" +# - providers: 1 +# consumers: 1 +# sufficients: 1 +# data: +# free: "133700000000000000000000000000000000" + + +# Tokens: +# Accounts: +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 0 # HDX +# - free: "10000000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 1 # Lerna +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 2 # DAI Stablecoin (via Wormhole) +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 3 # Wrapped Bitcoin (via Wormhole) +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 4 # Ethereum (via Wormhole) +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 5 # Polkadot +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 6 # ApeCoin (via Wormhole) +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 7 # USD Coin (via Wormhole) +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 8 # Phala +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 9 # Astar +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 10 # Statemint USDT +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 11 # interBTC +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 12 # Zeitgeist +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 13 # Centrifuge +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 14 # Bifrost Native Coin +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 15 # Bifrost Voucher DOT +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 16 # GLMR +# - free: "100000000000000000000000" +# - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY +# - 17 # Interlay +# - free: "100000000000000000000000" +# TechnicalCommittee: +# Members: ["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"] +# Council: +# Members: ["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"] diff --git a/test/configs/polkadot.yml b/test/configs/polkadot.yml index c73719f1..71064ca0 100644 --- a/test/configs/polkadot.yml +++ b/test/configs/polkadot.yml @@ -1,6 +1,4 @@ -endpoint: - - wss://rpc.polkadot.io - - wss://polkadot-rpc.dwellir.com +endpoint: wss://rpc-polkadot.luckyfriday.io mock-signature-host: true block: 18867218 port: 8002 diff --git a/test/configs/zeitgeist.yml b/test/configs/zeitgeist.yml index ad518e03..fced2772 100644 --- a/test/configs/zeitgeist.yml +++ b/test/configs/zeitgeist.yml @@ -1,7 +1,5 @@ endpoint: wss://main.rpc.zeitgeist.pm/ws -# endpoint: wss://zeitgeist-rpc.dwellir.com -# endpoint: wss://zeitgeist.api.onfinality.io/public-ws -block: 4601408 +block: 6802268 mock-signature-host: true db: ./tmp/ztg_db_mba.sqlite port: 8001 diff --git a/test/moonwall.config.json b/test/moonwall.config.json index 6942136f..7b8b48c2 100644 --- a/test/moonwall.config.json +++ b/test/moonwall.config.json @@ -1,7 +1,7 @@ { "$schema": "../packages/types/config_schema.json", "label": "Global Test Config 🐯", - "defaultTestTimeout": 60000, + "defaultTestTimeout": 120000, "scriptsDir": "scripts/", "additionalRepos": [ { @@ -24,10 +24,10 @@ { "name": "hydra", "ghAuthor": "galacticcouncil", - "ghRepo": "HydraDX-node", + "ghRepo": "hydration-node", "binaries": [ { - "name": "hydradx" + "name": "hydration" } ] }, @@ -833,7 +833,6 @@ "testFileDir": ["suites/multi_chopsticks"], "foundation": { "type": "chopsticks", - "rtUpgradePath": "./tmp/hydradx_RT_201.wasm", "launchSpec": [ { "name": "polkadot", @@ -842,16 +841,16 @@ "configPath": "./configs/polkadot.yml" }, { - "name": "hydra", + "name": "hydration", "type": "parachain", "allowUnresolvedImports": true, - "configPath": "./configs/hydradx.yml" + "configPath": "./configs/hydration.yml" }, { - "name": "zeitgeist", + "name": "assethub", "type": "parachain", "allowUnresolvedImports": true, - "configPath": "./configs/zeitgeist.yml" + "configPath": "./configs/assethub.yml" } ] }, @@ -863,14 +862,14 @@ "endpoints": ["ws://localhost:8002"] }, { - "name": "hydradx", + "name": "assethub", "type": "polkadotJs", - "endpoints": ["ws://localhost:8000"] + "endpoints": ["ws://localhost:8001"] }, { - "name": "zeitgeist", + "name": "hydration", "type": "polkadotJs", - "endpoints": ["ws://localhost:8001"] + "endpoints": ["ws://localhost:8000"] } ] } diff --git a/test/polkadot-execute-worker b/test/polkadot-execute-worker deleted file mode 100755 index 76b742c6..00000000 Binary files a/test/polkadot-execute-worker and /dev/null differ diff --git a/test/suites/multi_chopsticks/test_multi_chop.test.ts b/test/suites/multi_chopsticks/test_multi_chop.test.ts index 7444b4d5..c8129762 100644 --- a/test/suites/multi_chopsticks/test_multi_chop.test.ts +++ b/test/suites/multi_chopsticks/test_multi_chop.test.ts @@ -9,14 +9,14 @@ describeSuite({ id: "T01", title: "Verify multiple chains connected", test: async () => { - const chain1Name = context.polkadotJs("hydradx").consts.system.version.specName.toString(); + const chain1Name = context.polkadotJs("hydration").consts.system.version.specName.toString(); const chain2Name = context - .polkadotJs("zeitgeist") + .polkadotJs("assethub") .consts.system.version.specName.toString(); const chain3Name = context.polkadotJs("polkadot").consts.system.version.specName.toString(); expect(chain1Name).toBe("hydradx"); - expect(chain2Name).toBe("zeitgeist"); + expect(chain2Name).toBe("statemint"); expect(chain3Name).toBe("polkadot"); }, }); @@ -26,19 +26,19 @@ describeSuite({ title: "Verify multiple chains can increment block numbers", test: async () => { const chain1Height = ( - await context.polkadotJs("hydradx").rpc.chain.getHeader() + await context.polkadotJs("hydration").rpc.chain.getHeader() ).number.toNumber(); - await context.createBlock({ providerName: "hydradx" }); - expect((await context.polkadotJs("hydradx").rpc.chain.getHeader()).number.toNumber()).toBe( + await context.createBlock({ providerName: "hydration" }); + expect((await context.polkadotJs("hydration").rpc.chain.getHeader()).number.toNumber()).toBe( chain1Height + 1 ); const chain2Height = ( - await context.polkadotJs("zeitgeist").rpc.chain.getHeader() + await context.polkadotJs("assethub").rpc.chain.getHeader() ).number.toNumber(); - await context.createBlock({ providerName: "zeitgeist" }); + await context.createBlock({ providerName: "assethub" }); expect( - (await context.polkadotJs("zeitgeist").rpc.chain.getHeader()).number.toNumber() + (await context.polkadotJs("assethub").rpc.chain.getHeader()).number.toNumber() ).toBe(chain2Height + 1); const chain3Height = ( @@ -51,20 +51,5 @@ describeSuite({ }, }); - it({ - id: "T03", - title: "Verify it can upgrade in multichain setup", - modifier: "skip", - test: async () => { - const specVersion = context - .polkadotJs("hydradx") - .consts.system.version.specVersion.toNumber(); - await context.upgradeRuntime("hydradx"); - // log((await context.polkadotJs("hydradx").query.system.account(context.keyring.alice.address)).toHuman()); - expect( - context.polkadotJs("hydradx").consts.system.version.specVersion.toNumber() - ).toBeGreaterThan(specVersion); - }, - }); }, });