From 6d1b001863c2eee5e8f42c4bac10cd13a7d412a1 Mon Sep 17 00:00:00 2001 From: Ender Date: Mon, 18 May 2026 14:38:56 +0200 Subject: [PATCH 1/3] fix(e2e): rename E2E domains to NoStatus-compatible labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All 9 E2E_DOMAINS had 6-char bases, classifying as PopLite under classifyLabel(). On paseo-next-v2 setUserPopStatus is owner-gated, so a NoStatus deployer cannot self-attest — every deploy cell was failing at the DotNS registration phase. Rename all labels to use ≥9-char bases + exactly 2 trailing digits, which classifies as NoStatus (no PoP required) on any environment. Also update a stale comment in availability.ts that described PoP-gated names as "still registrable on testnet" — they are not on paseo-next-v2 when the signer is NoStatus. Fixes #169, #170. --- e2e/cli/fixtures/accounts.ts | 26 ++++++++++++++------------ src/utils/deploy/availability.ts | 9 ++++++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/e2e/cli/fixtures/accounts.ts b/e2e/cli/fixtures/accounts.ts index adf53b7..67bd419 100644 --- a/e2e/cli/fixtures/accounts.ts +++ b/e2e/cli/fixtures/accounts.ts @@ -89,9 +89,11 @@ export const BOB: TestAccount = devAccount("Bob"); * publish path (storage / re-deploy / cross-owner collision); reuse a single * domain for the preflight / validation tests. * - * DotNS classifies names with a 6-8 character base plus exactly two trailing - * digits as PopLite. Keep these labels in that shape so E2E tests do not - * accidentally require Full personhood on testnet. + * DotNS classifies names with a base of ≥ 9 chars plus exactly two trailing + * digits as NoStatus (no PoP required). Keep these labels in that shape so + * the E2E deployer (NoStatus signer) can register them on any environment, + * including paseo-next-v2 where setUserPopStatus is owner-gated and + * self-attestation is not available. * * NOTE: do not assert on the registry state of `preflight` — it's shared by * six tests in the same file and the metadata at any moment reflects whichever @@ -105,22 +107,22 @@ export const E2E_DOMAINS = { * tests do reach `registry.publish`. SIGNER ends up owning this domain * regardless; subsequent runs are same-owner re-publishes. */ - preflight: "e2epre00", + preflight: "e2eprefly00", /** Used by the storage-phase happy path. */ - storage: "e2estr00", + storage: "e2estorag00", /** Used by the same-owner re-deploy test. */ - redeploy: "e2ered00", + redeploy: "e2eredepl00", /** Used by the cross-owner collision test (BOB tries to take SIGNER's). */ - collision: "e2ecol00", + collision: "e2ecollis00", /** * Phase 3 cell domains — registered by `tools/register-e2e-fixtures.ts`. * Owned by SIGNER; subsequent runs are same-owner re-publishes. * Not yet wired to any test — see Phase 4 of docs-internal/2026-05-02-e2e-test-suite-design.md. */ - foundry: "e2efnd00", - cdm: "e2ecdm00", - hardhat: "e2ehat00", - multi: "e2emul00", + foundry: "e2efoundry00", + cdm: "e2ecdmapp00", + hardhat: "e2ehardhat00", + multi: "e2emultip00", /** * Used by the nightly-chaos-sigint cell only. The deploy is interrupted by * SIGINT before it completes, so this domain is never actually registered. @@ -128,5 +130,5 @@ export const E2E_DOMAINS = { * storage test in test-publish when both run in a nightly that triggers all * matrices. */ - chaos: "e2echs00", + chaos: "e2echaosp00", } as const; diff --git a/src/utils/deploy/availability.ts b/src/utils/deploy/availability.ts index 9f2e00e..80f2a19 100644 --- a/src/utils/deploy/availability.ts +++ b/src/utils/deploy/availability.ts @@ -297,9 +297,12 @@ export async function checkDomainAvailability( const plan: DeployPlan = { action: "register", needsPopUpgrade }; - // Names that require Proof-of-Personhood are still registrable on - // testnet — bulletin-deploy self-attests during `register()` via - // `setUserPopStatus`. Surface it as an advisory note, not a blocker. + // Names that require Proof-of-Personhood are registrable on testnet + // environments where self-attestation is allowed (bulletin-deploy calls + // `setUserPopStatus` during `register()`). On paseo-next-v2 that call + // is owner-gated, so a NoStatus signer cannot self-attest and the + // deploy will fail at the network phase. We surface this as an advisory + // note rather than a hard block because the rule varies per environment. if ( classification.status === POP_STATUS_LITE || classification.status === POP_STATUS_FULL From f12f49735edcb8bb6ab6b4ed97d7d524cdaf6e8e Mon Sep 17 00:00:00 2001 From: Ender Date: Mon, 18 May 2026 14:39:05 +0200 Subject: [PATCH 2/3] fix(e2e): update pr-mod test for signer-less dot mod Since b228817 (feat: migrate to paseo-next-v2), dot mod uses getReadOnlyRegistryContract and never calls resolveSigner. The --suri flag is a deprecated no-op. The test "exits non-zero with signer suggestion when no signer available" was asserting on "No signer available" output that no longer exists. Update the test to reflect the actual signer-less behavior: dot mod proceeds directly to the registry lookup, and an unknown domain produces "not found in registry" (not a signer error). --- e2e/cli/mod.test.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/e2e/cli/mod.test.ts b/e2e/cli/mod.test.ts index 1487ae1..8a2f590 100644 --- a/e2e/cli/mod.test.ts +++ b/e2e/cli/mod.test.ts @@ -127,20 +127,20 @@ describe("dot mod — clone", () => { }, ); - test("exits non-zero with signer suggestion when no signer available", async () => { - const tempHome = makeTempDir("dot-e2e-mod-home-"); - const cwd = makeTempDir("dot-e2e-mod-cwd-"); - const result = await dot(["mod", "some-app.dot"], { home: tempHome, cwd }); - expect(result.exitCode).not.toBe(0); - const output = result.stdout + result.stderr; - // Exact wording from src/utils/signer.ts SignerNotAvailableError: - // `No signer available. Run "dot init" to log in, or pass --suri //Alice for dev.` - // The previous regex /signer|init|log.?in/i matched any of those words - // anywhere — including help text — so it passed even on early crashes - // that never reached the signer-resolution path. - expect(output).toContain("No signer available"); - expect(output).toContain("dot init"); - }); + test( + "exits non-zero for unknown domain with no prior session (mod is signer-less)", + { timeout: 60_000 }, + async () => { + const tempHome = makeTempDir("dot-e2e-mod-home-"); + const cwd = makeTempDir("dot-e2e-mod-cwd-"); + const result = await dot(["mod", "some-app.dot"], { home: tempHome, cwd, timeout: 60_000 }); + expect(result.exitCode).not.toBe(0); + const output = result.stdout + result.stderr; + // dot mod is signer-less — it proceeds directly to the registry lookup. + // An unknown domain produces: App "some-app.dot" not found in registry + expect(output).toContain("not found in registry"); + }, + ); }); describe("dot mod — registry miss", () => { From 97a13a1a8c1f3125de887694d428ec072238712a Mon Sep 17 00:00:00 2001 From: Ender Date: Mon, 18 May 2026 15:19:37 +0200 Subject: [PATCH 3/3] fix(e2e): update stale --env testnet assertion in preflight test getChainConfig() error message says 'Use --env paseo-next-v2' not 'Use --env testnet'. The old assertion was written against an earlier wording and was masked by the DotNS PopLite failures in the same cell. --- e2e/cli/deploy.test.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/e2e/cli/deploy.test.ts b/e2e/cli/deploy.test.ts index 7ec2828..912114f 100644 --- a/e2e/cli/deploy.test.ts +++ b/e2e/cli/deploy.test.ts @@ -128,11 +128,10 @@ describe("dot deploy — preflight and validation", () => { result.exitCode, `expected non-zero exit for --env mainnet, got 0\n${output}`, ).not.toBe(0); - // Exact wording from src/commands/deploy/index.ts: "`--env mainnet` is - // not yet supported. Use `--env testnet` (default) while mainnet launch - // is pending." + // Exact wording from src/config.ts::getChainConfig(): + // "--env polkadot is not yet supported. Use --env paseo-next-v2 (default)." expect(output).toContain("not yet supported"); - expect(output).toContain("--env testnet"); + expect(output).toContain("--env paseo-next-v2"); }); test("detects foundry contracts type in project", async () => {