Bump to bulletin-deploy@0.15.0; per-env DotNS TLD (.paseo on paseo-next-v2) - #498
Conversation
… TLD per-env - @parity/polkadot-app-deploy@0.13.1 -> bulletin-deploy@0.15.0-rc.2 (npm package rename at 0.14; carries the post-wipe paseo-next-v2 DotNS addresses and the per-network TLD catalog) - Add ChainConfig.tld + getEnvTld(); paseo-next-v2 names now end in .paseo - normalizeDomain is TLD-aware and rejects wrong-TLD input with the same actionable message as upstream parseDomainName - Sweep deploy/decentralize/mod copy, prompts, and tests off hardcoded .dot; PLAYGROUND_PRODUCT_ID stays playground.dot (TLD-independent by convention)
|
Dev build ready — try this branch: |
E2E Test Pass · ❌ FAILTag:
❌ Failed tests (1)
Sentry traces: view spans for this run |
Upstream cut 0.15.0 today; verified code-identical to the validated rc.2 (tag diff is the version bump plus an unshipped e2e script fix; published dist matches after normalizing chunk hashes and the baked version string). Updates the pin, lockfile, min-age exclude, changeset, and CLAUDE.md note.
UtkarshBhardwaj007
left a comment
There was a problem hiding this comment.
Thanks for the PR. It is missing the sweep in a bunch of places - see comments. I am approving for you to address the comments and then be unblocked in merging.
Also all e2e tests are failing. I had a quick look - seems like we need a new funder account. Should be simple to fix. please make sure the e2e tests are all green before merging.
| * Fixed `.dot` domain names for deploy tests. SIGNER owns all of these after | ||
| * DotNS TLD of the env the E2E run targets (per-env since the paseo-next-v2 | ||
| * DotNS redeploy — "paseo" there, "dot" on previewnet). Tests build | ||
| * `<label>.${E2E_TLD}` registry keys / banner expectations from this so they |
There was a problem hiding this comment.
The sweep missed the fixture bootstrap side. tools/register-e2e-fixtures.ts still calls normalizeDomain() with one arg in five places (69, 76, 78, 83, 166), which now crashes with a TypeError at startup. tsc doesn't catch it because tools/ isn't in the tsconfig include. Separately, TEST_TEMPLATE_DOMAIN is still dot-cli-mod-fixture.dot in e2e.yml (4 places), tools/e2e-local.sh, and docs/e2e-running-tests.md, plus DEFAULT_TEMPLATE_DOMAIN in the tool itself. On paseo that means ensureTemplateRegistered throws the wrong-TLD error during bootstrap and mod looks up dot-cli-mod-fixture.dot.paseo, so the mod cell stays red even after the funder is topped up. Re-registering fixtures with this exact tool is step one of the post-wipe recovery, so I think this belongs in this PR: bare label for DEFAULT_TEMPLATE_DOMAIN, thread getEnvTld() through the tool, and bump the workflow/docs values to .paseo.
| const view = buildSummaryView({ | ||
| mode: inputs.mode, | ||
| domain: inputs.domain.replace(/\.dot$/, "") + ".dot", | ||
| domain: normalizeDomain(inputs.domain, getEnvTld()).fullDomain, |
There was a problem hiding this comment.
This can throw now, and it runs during render. A --domain passed as a flag never goes through the validate-domain stage (pickNextStage only prompts when domain is null, and validate-domain is only reachable from the prompt's onSubmit), so playground deploy --domain my-app.dot in interactive mode gets all the way to the confirm screen and then dies with a React stack trace instead of the wrong-TLD message. The old replace-and-append version couldn't throw here. Easiest fix is probably normalizing flag-provided domains in deploy/index.ts before the screen mounts, same as runHeadless already does.
| writeDotJson(targetDir, meta.name ?? domain.replace(/\.dot$/, ""), meta, domain); | ||
| writeDotJson( | ||
| targetDir, | ||
| meta.name ?? domain.replace(new RegExp(`\\.${getEnvTld()}$`), ""), |
There was a problem hiding this comment.
Related spot the sweep missed: defaultRepoName in src/utils/git/repoName.ts:23 still strips only .dot, so modding cool-app.paseo creates cool-app-paseo- instead of cool-app-. repoName.test.ts is still all .dot cases too, which is why nothing failed.
| * actionable message bulletin-deploy's `parseDomainName` produces. Callers | ||
| * resolve `tld` once via `getEnvTld(env)`. | ||
| */ | ||
| export function normalizeDomain( |
There was a problem hiding this comment.
One more caller that didn't get the TLD treatment: the deploy-all duplicate guard in src/commands/deploy-all/manifest.ts:88 still strips only .dot, so "app" and "app.paseo" in one manifest now slip past the duplicate check and race on the same DotNS name, which is exactly what that check exists to prevent.
| // publish wrote — per-env since the DotNS TLD split (`.paseo` on | ||
| // paseo-next-v2). Accept a bare label or a fully-qualified name. | ||
| const tld = getEnvTld(); | ||
| domain = rawDomain.endsWith(`.${tld}`) ? rawDomain : `${rawDomain}.${tld}`; |
There was a problem hiding this comment.
mod foo.dot on paseo becomes a lookup for foo.dot.paseo and reports a plain "not found in registry". An old .dot name is the most likely wrong input after the switch, and deploy/decentralize both reject it with the "this environment uses .paseo names" message. Running the input through normalizeDomain here (and catching) would make mod match the rest.
| "playground-cli": minor | ||
| --- | ||
|
|
||
| Support per-network DotNS TLDs (`.paseo` on paseo-next-v2) and move the deploy library to `bulletin-deploy@0.15.0` (the renamed `@parity/polkadot-app-deploy`), which carries the post-wipe DotNS contract addresses. Deploys, decentralize, mod lookups, and all UI copy now use the environment's TLD; a name typed with the wrong TLD (e.g. `my-app.dot` on paseo-next-v2) is rejected with an actionable message. The `playground.dot` product id is unchanged by convention. |
There was a problem hiding this comment.
README still documents .dot names for deploy/decentralize/mod (lines 78, 83, 147, 155, 181) and refers to polkadot-app-deploy throughout, including the "currently pinned 0.8.3" line at 313, which was already stale but is now the wrong package name entirely. The CLI help says my-app.paseo now, so the README contradicts the binary it documents.
| "Choosing Yes lists your app in the public Polkadot Playground so others " + | ||
| "can find and open it. No still deploys it to your .dot address. It just " + | ||
| "won't be listed in the playground.", | ||
| `can find and open it. No still deploys it to your .${getEnvTld()} address. ` + |
There was a problem hiding this comment.
A few copy strings didn't make the sweep: the publish select hint in DeployScreen.tsx:471 ("deploy to my .dot address only"), the decentralize command and flag descriptions (index.ts:102 and 116), login/nextSteps.ts:31 and 39, and the deploy-all description (index.ts:78).
…dge paths - tools/register-e2e-fixtures.ts: thread the env TLD into normalizeDomain (was a startup TypeError); typecheck now covers this script (the rest of tools/ carries pre-existing type errors in standalone operator scripts, so only the e2e-wired file joins the tsc baseline) - TEST_TEMPLATE_DOMAIN -> dot-cli-mod-fixture.paseo in e2e.yml, e2e-local.sh, and both e2e docs - DeployScreen: validate a flag-passed --domain up front and fall back to the domain prompt with the inline error instead of throwing during render - defaultRepoName strips any known TLD; deploy-all duplicate guard normalizes with the env TLD; mod surfaces normalizeDomain's wrong-TLD message - Copy sweep: publish hint, decentralize/deploy-all descriptions, login next steps; README examples, bulletin-deploy rename, real pin version - Drop unused label destructure in publishToPlayground
|
Thanks for the thorough sweep review @UtkarshBhardwaj007. All comments addressed in 98d9577:
All four checks green (format:check, lint:license, typecheck, test: 1014 passed). On the e2e failures: confirmed, and it is exactly the funder. Every cell dies in globalSetup before any test runs: The paseo-next-v2 wipe zeroed the whole chain: the e2e deployer ( Remediation, in order:
I have deliberately not executed any chain writes or touched secrets; step 2 is ready to run as-is once the funder has balance. |
A network=pah drip lands on the public Paseo Asset Hub (para 1000), not Asset Hub Next v2 (para 1500) where playground lives; proven empirically when a drip via that link left the funder's next-v2 balance at 0. The parachain=1500 form matches bulletin-deploy's environments.json popSelfServe.faucetUrl, and the divergence guard now pins the two. faucetUrlFor is separator-aware, and the funder-balance-check issue template uses the corrected link.
5fd3c59 to
d4708eb
Compare
|
One more fix in d4708eb, and a correction to the remediation link in my previous comment: the faucet links this repo carried pointed at the WRONG chain. Changed:
So for the funder top-up in my earlier comment, please use: All four checks green (1016 tests). |
|
@UtkarshBhardwaj007 all review comments addressed. On e2e: the funder is at 0 post-wipe and the public faucet can't reach next v2 (drips land on para 1000). You mentioned a new funder account - rotate the secret to one you can fund, or transfer to the existing |
There is no urgency to merge this PR AFAIK. Let's fix this here then. If this is urgent - sure we can create a task for it but this has been red since quite a while - would be good to fix.
We cannot know if it is purely the funder as the test doesn't proceed ahead as soon as it fails to fund. |
The builder-identity gate runs first in deploy/decentralize/deploy-all and soft-exits 0 for a sessionless run, which swallowed getChainConfig's '--env <x> is not yet supported' error entirely: 'deploy --env mainnet' printed the sign-in notice and exited 0. Validate the resolved env before the gate in all three commands; the throw propagates through the normal error path with the canonical message and a non-zero exit.
|
Reran e2e after the funder top-up (thanks!). Results and classification:
So this branch's e2e now sits exactly at main's baseline plus one fix. Given the remaining red is structural on main, I'd merge and pursue #504/#505 separately - your call. |
What / why
The paseo-next-v2 testnet was wiped and DotNS was redeployed at new canonical addresses, with the TLD now per-network (
.paseoon paseo-next-v2, previewnet stays.dot). Our pinned deploy library carried the dead addresses and every domain-side code path hardcoded.dot.@parity/polkadot-app-deploy@0.13.1forbulletin-deploy@0.15.0(exact pin). The npm package was renamed at 0.14; 0.15 carries the post-wipe contract addresses and the per-envtldcatalog field (upstream #1240/#1244).ChainConfig.tld+getEnvTld()(src/config.ts) as the single TLD source; theconfig.test.tsdivergence guard pins it to upstream'senvironments.json(tld ?? "dot"fallback), same as the endpoint guards.normalizeDomain(domain, tld)accepts a bare label or the env TLD and rejects a wrong-TLD name with the same actionable message as upstreamparseDomainName; all callers (deploy, decentralize, availability, mod lookup, registry publish,moddedFromlineage) thread the env TLD. A.paseoname yields<label>.paseo.li.PLAYGROUND_PRODUCT_ID = "playground.dot"is unchanged and now commented as TLD-independent by convention (product ids stay<label>.doton every network)..dot.Bump audit: 0.13.1 -> bulletin-deploy@0.15.0
The bump was validated on
0.15.0-rc.2; the pin moved to0.15.0stable the day upstream cut it, verified code-identical to the validated rc (git tag diff: version bump + an unshipped e2e script fix only; published dist byte-identical after normalizing tsup chunk hashes and the baked version string).deploy()signature(content, domainName, options)DeployOptionswe pass (jsMerkle,signer,signerAddress,storageSigner,storageSignerAddress,mnemonic,rpc,attributes,env)transferTo,contracts,bulletinEndpoints/assetHubEndpoints,publish,dumpCar,onPhoneSignaturePlan,confirmPhoneReady, ...)progress.tsparserPreflight/Storage/DotNS/DEPLOYMENT COMPLETE!) and[N/M]chunk lines unchanged (verified against 0.15 source, clearing the 0.13.1 live-verify caveat). #1240 moved theDomain:echo to after the Preflight connect (TLD chain-resolved first) - prose the parser drops; a new parser test pins the ordering. No regex changes neededstorageSignerroutingstorageSigner > signer > mnemonic > pool(exportedresolveStorageRoute); storage never phone-signs@parity/product-sdk-terminal@^0.5.1(resolves 0.5.4) whose host-papp range dedupes onto our single@novasamatech/host-papp@0.8.11(>= 0.8.6 floor). Onlyproduct-sdk-terminalis split (0.5.4 lib / 0.7.1 root). Patchedstatement-store@0.8.11/sdk-statement@0.6.0pins resolve unchanged; install is cleantld: "paseo"field (guard extended to cover it); DotNS contract addresses changed (owned upstream, resolved by env id - out of guard scope by design).summitremains droppedloadEnvironments/resolveEndpoints(now carryingtld) still exported;parseDomainName(input, tld)exported;DEFAULT_TLD/KNOWN_TLDSare NOT exported from the package root, so the CLI keeps a guarded local copypatch-package || true(bundling the samesdk-statement@0.6.0patch we already carry); build-script denial renamed tobulletin-deploy: false@parity/dotns-clisubprocess path entirely; the old warning-suppression shim insrc/index.tsis now a dormant no-op (our ownplayground dotnspassthrough keeps the dep)Notes
minimumReleaseAgeExcludeat resolution time, but the lockfile-verification pass did not honor it for the prerelease entry (stable verifies fine). Remedy documented in CLAUDE.md: one-offpnpm install --config.minimumReleaseAge=0to rewrite the lockfile, then a plainpnpm installto confirm.Verified:
pnpm format:check,pnpm lint:license,pnpm typecheck,pnpm test(1012 passed) - re-run on the stable pin.