@parity/product-deploy 0.11.0-rc.2 → 0.11.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/assets/environments.json +2 -0
  2. package/dist/auth-config.js +4 -4
  3. package/dist/bug-report.d.ts +10 -1
  4. package/dist/bug-report.js +6 -4
  5. package/dist/{chunk-422RAWSV.js → chunk-23AKFLS3.js} +3 -3
  6. package/dist/{chunk-HXN2HJMZ.js → chunk-4CQ75L4W.js} +1 -1
  7. package/dist/{chunk-6YUT276Z.js → chunk-CYKONVA7.js} +1 -1
  8. package/dist/{chunk-AR5IUHCM.js → chunk-GQNCLVZM.js} +1 -1
  9. package/dist/{chunk-QRKI6MMK.js → chunk-JSYQ3JQS.js} +4 -1
  10. package/dist/{chunk-4IUTMHVB.js → chunk-MRQPJLPS.js} +24 -3
  11. package/dist/{chunk-MU75RB7Z.js → chunk-ORJM2DGE.js} +2 -2
  12. package/dist/{chunk-YVLDMADS.js → chunk-ORS77MUP.js} +41 -20
  13. package/dist/{chunk-2MRHO7I5.js → chunk-OVF6SN7P.js} +1 -1
  14. package/dist/{chunk-6ZF7V4PG.js → chunk-PRBEYWUY.js} +2 -2
  15. package/dist/{chunk-WCEPEDZA.js → chunk-Q6UOOXXS.js} +9 -3
  16. package/dist/{chunk-OXENTCOF.js → chunk-RC3CVUOG.js} +46 -12
  17. package/dist/{chunk-33T5FHX2.js → chunk-ZDJW2Q4R.js} +1 -1
  18. package/dist/chunk-probe.js +3 -3
  19. package/dist/commands/login.js +12 -12
  20. package/dist/commands/logout.js +5 -5
  21. package/dist/commands/transfer.js +5 -5
  22. package/dist/commands/whoami.js +4 -4
  23. package/dist/deploy-actors.js +7 -7
  24. package/dist/deploy.d.ts +10 -1
  25. package/dist/deploy.js +14 -12
  26. package/dist/dotns.d.ts +33 -2
  27. package/dist/dotns.js +9 -5
  28. package/dist/environments.d.ts +2 -0
  29. package/dist/environments.js +1 -1
  30. package/dist/index.js +13 -13
  31. package/dist/manifest/publish.js +13 -13
  32. package/dist/memory-report.js +2 -2
  33. package/dist/merkle.js +12 -12
  34. package/dist/personhood/bootstrap.js +5 -5
  35. package/dist/personhood/people-client.js +5 -5
  36. package/dist/pool.d.ts +3 -1
  37. package/dist/pool.js +1 -1
  38. package/dist/run-state.js +1 -1
  39. package/dist/sss-allowance-cache.js +5 -5
  40. package/dist/storage-signer.js +12 -12
  41. package/dist/telemetry.js +2 -2
  42. package/dist/version-check.js +3 -3
  43. package/package.json +1 -1
@@ -5,6 +5,7 @@
5
5
  "name": "Preview",
6
6
  "network": "testnet",
7
7
  "description": "Product Preview net, used by Product Teams",
8
+ "bulletinAutoAuthorize": true,
8
9
  "e2eEligible": true,
9
10
  "backend": "https://polkadot-app-stg.parity.io/",
10
11
  "ipfs": "https://previewnet.substrate.dev",
@@ -96,6 +97,7 @@
96
97
  "name": "Paseo Next v2",
97
98
  "network": "testnet",
98
99
  "description": "Next iteration of the Paseo Next testnet",
100
+ "bulletinAutoAuthorize": true,
99
101
  "e2eEligible": true,
100
102
  "backend": "https://identity-backend-next.parity-testnet.parity.io",
101
103
  "ipfs": "https://paseo-bulletin-next-ipfs.polkadot.io",
@@ -9,11 +9,11 @@ import {
9
9
  getPeopleChainEndpoints,
10
10
  hasPersistedSession,
11
11
  resolveBulletinEndpoints
12
- } from "./chunk-MU75RB7Z.js";
12
+ } from "./chunk-ORJM2DGE.js";
13
13
  import "./chunk-TSPERKUS.js";
14
- import "./chunk-HXN2HJMZ.js";
15
- import "./chunk-AR5IUHCM.js";
16
- import "./chunk-QRKI6MMK.js";
14
+ import "./chunk-4CQ75L4W.js";
15
+ import "./chunk-GQNCLVZM.js";
16
+ import "./chunk-JSYQ3JQS.js";
17
17
  import "./chunk-ZOC4GITL.js";
18
18
  export {
19
19
  DOT_DAPP_ID,
@@ -24,6 +24,15 @@ declare function buildReportBody(error: Error): string;
24
24
  declare function buildTitle(error: Error): string;
25
25
  declare function buildLabels(error: Error): string[];
26
26
  declare function createGhIssue(title: string, body: string, labels: string[]): string;
27
+ /**
28
+ * True for deploy failures caused by user input rather than a code defect, so
29
+ * the bug-report prompt is NOT offered for them (#869). Scoped to DotNS name
30
+ * validation: a malformed or reserved label ("Invalid domain label …",
31
+ * "… reserves base names of N chars …") is something the user fixes by choosing
32
+ * a different name — filing it as a bug just creates noise. The actionable error
33
+ * message has already been printed to the user. Exported for unit testing.
34
+ */
35
+ declare function isUserInputError(error: Error): boolean;
27
36
  declare function offerBugReport(error: Error): Promise<void>;
28
37
 
29
- export { buildCliFlagsSummary, buildLabels, buildReportBody, buildTitle, createGhIssue, getCapturedTail, installLogCapture, offerBugReport, scrubSecrets, setDeployContext };
38
+ export { buildCliFlagsSummary, buildLabels, buildReportBody, buildTitle, createGhIssue, getCapturedTail, installLogCapture, isUserInputError, offerBugReport, scrubSecrets, setDeployContext };
@@ -6,13 +6,14 @@ import {
6
6
  createGhIssue,
7
7
  getCapturedTail,
8
8
  installLogCapture,
9
+ isUserInputError,
9
10
  offerBugReport,
10
11
  scrubSecrets,
11
12
  setDeployContext
12
- } from "./chunk-WCEPEDZA.js";
13
- import "./chunk-2MRHO7I5.js";
14
- import "./chunk-HXN2HJMZ.js";
15
- import "./chunk-AR5IUHCM.js";
13
+ } from "./chunk-Q6UOOXXS.js";
14
+ import "./chunk-OVF6SN7P.js";
15
+ import "./chunk-4CQ75L4W.js";
16
+ import "./chunk-GQNCLVZM.js";
16
17
  export {
17
18
  buildCliFlagsSummary,
18
19
  buildLabels,
@@ -21,6 +22,7 @@ export {
21
22
  createGhIssue,
22
23
  getCapturedTail,
23
24
  installLogCapture,
25
+ isUserInputError,
24
26
  offerBugReport,
25
27
  scrubSecrets,
26
28
  setDeployContext
@@ -7,15 +7,15 @@ import {
7
7
  resolveDotnsConnectOptions,
8
8
  storeDirectory,
9
9
  storeFile
10
- } from "./chunk-YVLDMADS.js";
10
+ } from "./chunk-ORS77MUP.js";
11
11
  import {
12
12
  DotNS
13
- } from "./chunk-OXENTCOF.js";
13
+ } from "./chunk-RC3CVUOG.js";
14
14
  import {
15
15
  getPopSelfServeConfig,
16
16
  loadEnvironments,
17
17
  resolveEndpoints
18
- } from "./chunk-QRKI6MMK.js";
18
+ } from "./chunk-JSYQ3JQS.js";
19
19
  import {
20
20
  NonRetryableError
21
21
  } from "./chunk-ZOC4GITL.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-AR5IUHCM.js";
4
+ } from "./chunk-GQNCLVZM.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-GRPLHUYC.js";
4
4
  import {
5
5
  DOT_DAPP_ID
6
- } from "./chunk-MU75RB7Z.js";
6
+ } from "./chunk-ORJM2DGE.js";
7
7
 
8
8
  // src/sss-allowance-cache.ts
9
9
  import { mkdir, readFile, writeFile, unlink } from "fs/promises";
@@ -6,7 +6,7 @@ import * as path from "path";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@parity/product-deploy",
9
- version: "0.11.0-rc.2",
9
+ version: "0.11.0-rc.4",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -14,6 +14,7 @@ var environments_default = {
14
14
  name: "Preview",
15
15
  network: "testnet",
16
16
  description: "Product Preview net, used by Product Teams",
17
+ bulletinAutoAuthorize: true,
17
18
  e2eEligible: true,
18
19
  backend: "https://polkadot-app-stg.parity.io/",
19
20
  ipfs: "https://previewnet.substrate.dev",
@@ -105,6 +106,7 @@ var environments_default = {
105
106
  name: "Paseo Next v2",
106
107
  network: "testnet",
107
108
  description: "Next iteration of the Paseo Next testnet",
109
+ bulletinAutoAuthorize: true,
108
110
  e2eEligible: true,
109
111
  backend: "https://identity-backend-next.parity-testnet.parity.io",
110
112
  ipfs: "https://paseo-bulletin-next-ipfs.polkadot.io",
@@ -652,7 +654,8 @@ function resolveEndpoints(doc, envId) {
652
654
  autoAccountMapping: env.autoAccountMapping ?? false,
653
655
  contracts: env.contracts ?? {},
654
656
  nativeToEthRatio: BigInt(env.nativeToEthRatio ?? 1e6),
655
- ...env.registerStorageDeposit !== void 0 ? { registerStorageDeposit: BigInt(env.registerStorageDeposit) } : {}
657
+ ...env.registerStorageDeposit !== void 0 ? { registerStorageDeposit: BigInt(env.registerStorageDeposit) } : {},
658
+ bulletinAutoAuthorize: env.bulletinAutoAuthorize ?? false
656
659
  };
657
660
  }
658
661
  function getPopSelfServeConfig(doc, envId) {
@@ -100,17 +100,38 @@ function clampU32(n, name) {
100
100
  if (n > U32_MAX) throw new Error(`${name} (${n}) exceeds u32 max \u2014 split the deploy into smaller batches`);
101
101
  return Number(n);
102
102
  }
103
- async function ensureAuthorized(api, address, label) {
103
+ async function ensureAuthorized(api, address, label, opts = {}) {
104
104
  const [auth, currentBlock] = await Promise.all([
105
105
  api.query.TransactionStorage.Authorizations.getValue(Enum("Account", address)),
106
106
  api.query.System.Number.getValue()
107
107
  ]);
108
108
  if (isAuthorizationSufficient(auth, currentBlock)) return;
109
- const isTestnet = await detectTestnet(api);
110
109
  const who = `${label ?? "account"} (${address.slice(0, 8)}...)`;
110
+ if (opts.autoAuthorize) {
111
+ await cryptoWaitReady();
112
+ const keyring = new Keyring({ type: "sr25519" });
113
+ const alice = keyring.addFromUri("//Alice");
114
+ const signer = getPolkadotSigner(alice.publicKey, "Sr25519", (data) => alice.sign(data));
115
+ const grant = `${TOPUP_TRANSACTIONS} txs / ${Number(TOPUP_BYTES) / 1e6}MB`;
116
+ console.log(` Auto-authorizing ${who} on Bulletin (${grant})...`);
117
+ const tx = api.tx.TransactionStorage.authorize_account({
118
+ who: address,
119
+ transactions: clampU32(BigInt(TOPUP_TRANSACTIONS), "transactions"),
120
+ bytes: TOPUP_BYTES
121
+ });
122
+ const result = await tx.signAndSubmit(signer);
123
+ if (!result?.ok) {
124
+ throw new Error(
125
+ `Auto-authorization of Bulletin storage account ${who} failed: authorize_account was rejected. This environment is flagged bulletinAutoAuthorize, but //Alice may not hold authorizer rights on this chain.`
126
+ );
127
+ }
128
+ console.log(` Authorized: ${grant}`);
129
+ return;
130
+ }
131
+ const isTestnet = await detectTestnet(api);
111
132
  if (isTestnet) {
112
133
  throw new Error(
113
- `Bulletin storage account ${who} is not authorized (or its authorization expired). bulletin-deploy no longer self-authorizes on the Bulletin chain \u2014 request authorization for this account from the chain's authorizer (testnet faucet / personhood / pool bootstrap), then retry.`
134
+ `Bulletin storage account ${who} is not authorized (or its authorization expired). bulletin-deploy self-authorizes only on allow-listed testnets (environments.json bulletinAutoAuthorize) \u2014 request authorization for this account from the chain's authorizer (testnet faucet / personhood / pool bootstrap), then retry.`
114
135
  );
115
136
  }
116
137
  throw new Error(
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-TSPERKUS.js";
4
4
  import {
5
5
  VERSION
6
- } from "./chunk-HXN2HJMZ.js";
6
+ } from "./chunk-4CQ75L4W.js";
7
7
  import {
8
8
  loadEnvironments
9
- } from "./chunk-QRKI6MMK.js";
9
+ } from "./chunk-JSYQ3JQS.js";
10
10
 
11
11
  // src/auth-config.ts
12
12
  import { existsSync, readdirSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  preflightSssAllowance
3
- } from "./chunk-6YUT276Z.js";
3
+ } from "./chunk-CYKONVA7.js";
4
4
  import {
5
5
  statementSigningAccount
6
6
  } from "./chunk-GRPLHUYC.js";
@@ -31,16 +31,16 @@ import {
31
31
  } from "./chunk-S7EM5VMW.js";
32
32
  import {
33
33
  setDeployContext
34
- } from "./chunk-WCEPEDZA.js";
34
+ } from "./chunk-Q6UOOXXS.js";
35
35
  import {
36
36
  probeChunks
37
- } from "./chunk-33T5FHX2.js";
37
+ } from "./chunk-ZDJW2Q4R.js";
38
38
  import {
39
39
  packSection
40
40
  } from "./chunk-C2TS5MER.js";
41
41
  import {
42
42
  resolveStorageSigner
43
- } from "./chunk-6ZF7V4PG.js";
43
+ } from "./chunk-PRBEYWUY.js";
44
44
  import {
45
45
  createSlotAccountSigner,
46
46
  requestResourceAllocation
@@ -49,7 +49,7 @@ import {
49
49
  STALE_SESSION_MESSAGE,
50
50
  getPeopleChainEndpoints,
51
51
  hasPersistedSession
52
- } from "./chunk-MU75RB7Z.js";
52
+ } from "./chunk-ORJM2DGE.js";
53
53
  import {
54
54
  CLI_NAME
55
55
  } from "./chunk-TSPERKUS.js";
@@ -62,7 +62,7 @@ import {
62
62
  parseDomainName,
63
63
  popStatusName,
64
64
  verifyNonceAdvanced
65
- } from "./chunk-OXENTCOF.js";
65
+ } from "./chunk-RC3CVUOG.js";
66
66
  import {
67
67
  derivePoolAccounts,
68
68
  detectTestnet,
@@ -70,7 +70,7 @@ import {
70
70
  fetchPoolAuthorizations,
71
71
  isAuthorizationSufficient,
72
72
  selectAccount
73
- } from "./chunk-4IUTMHVB.js";
73
+ } from "./chunk-MRQPJLPS.js";
74
74
  import {
75
75
  VERSION,
76
76
  captureWarning,
@@ -84,13 +84,13 @@ import {
84
84
  truncateAddress,
85
85
  withDeploySpan,
86
86
  withSpan
87
- } from "./chunk-HXN2HJMZ.js";
87
+ } from "./chunk-4CQ75L4W.js";
88
88
  import {
89
89
  DEFAULT_ENV_ID,
90
90
  getPopSelfServeConfig,
91
91
  loadEnvironments,
92
92
  resolveEndpoints
93
- } from "./chunk-QRKI6MMK.js";
93
+ } from "./chunk-JSYQ3JQS.js";
94
94
  import {
95
95
  NonRetryableError
96
96
  } from "./chunk-ZOC4GITL.js";
@@ -373,6 +373,7 @@ var DEFAULT_BULLETIN_RPC = "wss://paseo-bulletin-rpc.polkadot.io";
373
373
  var DEFAULT_POOL_SIZE = 10;
374
374
  var BULLETIN_ENDPOINTS = [DEFAULT_BULLETIN_RPC];
375
375
  var POOL_SIZE = DEFAULT_POOL_SIZE;
376
+ var bulletinAutoAuthorize = false;
376
377
  var _deployRpcFailedOver = false;
377
378
  var _onWsHalt = null;
378
379
  function setWsHaltCallback(cb) {
@@ -511,7 +512,7 @@ async function getProvider() {
511
512
  const selectionResult = selectAccount(authorizations, Math.random, pinnedPoolIndex);
512
513
  const selectedAccount = selectionResult.account;
513
514
  const eligibleCount = selectionResult.eligibleCount;
514
- await ensureAuthorized(unsafeApi, selectedAccount.address, `pool account ${selectedAccount.index}`);
515
+ await ensureAuthorized(unsafeApi, selectedAccount.address, `pool account ${selectedAccount.index}`, { autoAuthorize: bulletinAutoAuthorize });
515
516
  console.log(` Using pool account ${selectedAccount.index}: ${selectedAccount.address}`);
516
517
  setDeployAttribute("deploy.signer.mode", "pool");
517
518
  setDeployAttribute("deploy.pool.account", truncateAddress(selectedAccount.address));
@@ -540,7 +541,7 @@ async function getDirectProvider(mnemonic, derivationPath = "") {
540
541
  let now = currentBlock.number;
541
542
  if (!auth || Number(auth.expiration ?? 0) <= now) {
542
543
  try {
543
- await ensureAuthorized(unsafeApi, ss58, "direct signer");
544
+ await ensureAuthorized(unsafeApi, ss58, "direct signer", { autoAuthorize: bulletinAutoAuthorize });
544
545
  [auth, currentBlock] = await Promise.all([
545
546
  unsafeApi.query.TransactionStorage.Authorizations.getValue(Enum2("Account", ss58)),
546
547
  client.getFinalizedBlock()
@@ -572,7 +573,7 @@ async function getSignerProvider(signer, ss58) {
572
573
  let now = currentBlock.number;
573
574
  if (!auth || Number(auth.expiration ?? 0) <= now) {
574
575
  try {
575
- await ensureAuthorized(unsafeApi, ss58, "external signer");
576
+ await ensureAuthorized(unsafeApi, ss58, "external signer", { autoAuthorize: bulletinAutoAuthorize });
576
577
  [auth, currentBlock] = await Promise.all([
577
578
  unsafeApi.query.TransactionStorage.Authorizations.getValue(Enum2("Account", ss58)),
578
579
  client.getFinalizedBlock()
@@ -614,6 +615,9 @@ function formatStorageSignerLine(slotAddress, failReason, owned) {
614
615
  }
615
616
  return ` Storage signer: pool fallback (${failReason ?? "no session"})`;
616
617
  }
618
+ function formatTransferModeDotnsLine(alreadyOwned, dotName, recipient) {
619
+ return alreadyOwned ? ` DotNS: you already own ${dotName} \u2014 content update needs your phone signature (no transfer)` : ` DotNS: will register ${dotName} and transfer it to your account ${recipient}`;
620
+ }
617
621
  function selectStorageReconnect(options) {
618
622
  if (options.storageSigner && options.storageSignerAddress) {
619
623
  let useSlot = true;
@@ -958,13 +962,14 @@ async function storeChunkedContent(chunks, { client: existingClient, unsafeApi:
958
962
  return { changed, currentNonce };
959
963
  };
960
964
  const uploadTotal = stored.filter((s) => s === null).length;
965
+ const uploadEmittedIndices = /* @__PURE__ */ new Set();
961
966
  let uploadEmitted = 0;
962
967
  const nonceAdvanceIndices = /* @__PURE__ */ new Set();
963
968
  let b = 0;
964
969
  while (b < chunks.length) {
965
970
  if (wsHaltDetected && reconnect && reconnectionsUsed < MAX_RECONNECTIONS) {
966
971
  wsHaltDetected = false;
967
- await doReconnect();
972
+ await doReconnectAndRebase();
968
973
  }
969
974
  const batchSize = reconnectionsUsed > 0 ? BATCH_SIZE_RECOVERY : BATCH_SIZE_INITIAL;
970
975
  const batchIndices = [];
@@ -983,8 +988,12 @@ async function storeChunkedContent(chunks, { client: existingClient, unsafeApi:
983
988
  const batchPromises = batchChunks.map((chunkData, j) => {
984
989
  const i = batchIndices[j];
985
990
  const nonce = assignedNonces.get(i);
986
- uploadEmitted++;
987
- console.log(` [${uploadEmitted}/${uploadTotal}] chunk ${i} \u2014 ${(chunkData.length / 1024 / 1024).toFixed(2)} MB (nonce: ${nonce})`);
991
+ const isRetry = uploadEmittedIndices.has(i);
992
+ if (!isRetry) {
993
+ uploadEmittedIndices.add(i);
994
+ uploadEmitted++;
995
+ }
996
+ console.log(` [${uploadEmitted}/${uploadTotal}] chunk ${i} \u2014 ${(chunkData.length / 1024 / 1024).toFixed(2)} MB (nonce: ${nonce})${isRetry ? " (retry)" : ""}`);
988
997
  return storeChunk(unsafeApi, signer, chunkData, nonce, ss58, { fetchNonce: fetchNonceOverride });
989
998
  });
990
999
  const results = await Promise.allSettled(batchPromises);
@@ -1988,6 +1997,7 @@ async function deploy(content, domainName = null, options = {}) {
1988
1997
  let envNativeToEthRatio;
1989
1998
  let envRegisterStorageDeposit;
1990
1999
  let envPopSelfServe = null;
2000
+ bulletinAutoAuthorize = false;
1991
2001
  if (options.bulletinEndpoints && options.bulletinEndpoints.length > 0) {
1992
2002
  envBulletin = options.bulletinEndpoints;
1993
2003
  envAssetHub = options.assetHubEndpoints;
@@ -2006,6 +2016,7 @@ async function deploy(content, domainName = null, options = {}) {
2006
2016
  envNativeToEthRatio = resolved.nativeToEthRatio;
2007
2017
  envRegisterStorageDeposit = resolved.registerStorageDeposit;
2008
2018
  envPopSelfServe = getPopSelfServeConfig(doc, envId);
2019
+ bulletinAutoAuthorize = resolved.bulletinAutoAuthorize;
2009
2020
  } catch (e) {
2010
2021
  if (e instanceof NonRetryableError) throw e;
2011
2022
  if (options.env !== void 0) throw e;
@@ -2051,7 +2062,7 @@ async function deploy(content, domainName = null, options = {}) {
2051
2062
  sessionCleanup = actors.worker.destroy.bind(actors.worker);
2052
2063
  if (actors.worker.source === "session") resolvedUserSession = actors.worker;
2053
2064
  if (actors.recipientH160) {
2054
- console.log(` Worker: ${actors.worker.source} signer ${actors.worker.address} \u2192 will transfer ${domainName ?? "the name"} to ${actors.recipientH160}`);
2065
+ console.log(` Worker: ${actors.worker.source} signer ${actors.worker.address} (signs Bulletin storage)`);
2055
2066
  } else {
2056
2067
  console.log(` Using ${actors.worker.source} signer: ${actors.worker.address}`);
2057
2068
  }
@@ -2103,7 +2114,8 @@ async function deploy(content, domainName = null, options = {}) {
2103
2114
  options = { ...options, storageSigner: slotResult.signer, storageSignerAddress: slotResult.slotAddress };
2104
2115
  console.log(formatStorageSignerLine(slotResult.slotAddress, void 0, slotResult.owned));
2105
2116
  } else {
2106
- console.log(formatStorageSignerLine(null, resolvedUserSession ? "no allowance" : void 0));
2117
+ const storageFailReason = resolvedUserSession ? "no allowance" : options.transferTo ? "transfer mode \u2014 worker signs storage" : void 0;
2118
+ console.log(formatStorageSignerLine(null, storageFailReason));
2107
2119
  }
2108
2120
  }
2109
2121
  initTelemetry();
@@ -2208,6 +2220,9 @@ async function deploy(content, domainName = null, options = {}) {
2208
2220
  const fromName = popStatusName(dotnsPreflight.userStatus);
2209
2221
  console.log(` Your PoP: ${fromName}`);
2210
2222
  console.log(` Domain: ${alreadyOwned ? "owned by you" : "available"}`);
2223
+ if (options.transferTo) {
2224
+ console.log(formatTransferModeDotnsLine(alreadyOwned, `${name}.dot`, options.transferTo));
2225
+ }
2211
2226
  }
2212
2227
  if (!dotnsPreflight.canProceed) {
2213
2228
  throw new NonRetryableError(
@@ -2426,7 +2441,9 @@ async function deploy(content, domainName = null, options = {}) {
2426
2441
  };
2427
2442
  await ownerDotns.connect({
2428
2443
  ...resolveDotnsConnectOptions({ ...options, signer: owner.signer, signerAddress: owner.address }, envAssetHub, envAutoAccountMapping, envContracts, envNativeToEthRatio, envId, envPopSelfServe, envRegisterStorageDeposit),
2429
- confirmPhoneReady: options.confirmPhoneReady
2444
+ confirmPhoneReady: options.confirmPhoneReady,
2445
+ phoneSigner: true
2446
+ // owner path is always a real phone/session signer
2430
2447
  });
2431
2448
  const willPublish = !!(options.publish && parsed && preflightPublishNeeded !== false);
2432
2449
  ownerDotns.setPhoneSignatureTotal(willPublish ? 2 : 1);
@@ -2438,7 +2455,10 @@ async function deploy(content, domainName = null, options = {}) {
2438
2455
  const dotns = new DotNS();
2439
2456
  await dotns.connect({
2440
2457
  ...resolveDotnsConnectOptions(options, envAssetHub, envAutoAccountMapping, envContracts, envNativeToEthRatio, envId, envPopSelfServe, envRegisterStorageDeposit),
2441
- confirmPhoneReady: options.confirmPhoneReady
2458
+ confirmPhoneReady: options.confirmPhoneReady,
2459
+ // Transfer mode: phoneSigner=false (local worker signs in-process, no phone gate).
2460
+ // Genuine phone/session signer: phoneSigner=true (gate enabled). Fixes #980.
2461
+ phoneSigner: phoneSignerActive
2442
2462
  });
2443
2463
  if (phoneSignerActive) {
2444
2464
  dotns.setPhoneSignatureTotal(computePhoneSigningSteps(dotnsPreflight, preflightPublishNeeded).length);
@@ -2556,7 +2576,7 @@ async function deploy(content, domainName = null, options = {}) {
2556
2576
  console.log("=".repeat(60));
2557
2577
  console.log("\nCheck it out here:");
2558
2578
  console.log(` ${browserUrlFor(name, envId)}`);
2559
- console.log(` ${name}.dot (in a Polkadot-aware browser)`);
2579
+ console.log(` ${name}.dot (in a Polkadot app: mobile or desktop)`);
2560
2580
  console.log("\n" + "=".repeat(60) + "\n");
2561
2581
  return { domainName: name, fullDomain: `${name}.dot`, cid, ipfsCid };
2562
2582
  } finally {
@@ -3012,6 +3032,7 @@ export {
3012
3032
  isPhoneSignerActive,
3013
3033
  shouldHandoverName,
3014
3034
  formatStorageSignerLine,
3035
+ formatTransferModeDotnsLine,
3015
3036
  storeFile,
3016
3037
  __assignDenseNoncesForTest,
3017
3038
  storeChunkedContent,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-HXN2HJMZ.js";
3
+ } from "./chunk-4CQ75L4W.js";
4
4
 
5
5
  // src/version-check.ts
6
6
  import { execSync, execFileSync } from "child_process";
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-5FLTDWWP.js";
5
5
  import {
6
6
  DOT_PRODUCT_ID
7
- } from "./chunk-MU75RB7Z.js";
7
+ } from "./chunk-ORJM2DGE.js";
8
8
  import {
9
9
  DEFAULT_MNEMONIC
10
- } from "./chunk-OXENTCOF.js";
10
+ } from "./chunk-RC3CVUOG.js";
11
11
 
12
12
  // src/deploy-actors.ts
13
13
  var DEFAULT_WORKER_SURI = DEFAULT_MNEMONIC;
@@ -2,15 +2,15 @@ import {
2
2
  classifyErrorArea,
3
3
  isInteractive,
4
4
  promptYesNo
5
- } from "./chunk-2MRHO7I5.js";
5
+ } from "./chunk-OVF6SN7P.js";
6
6
  import {
7
7
  VERSION,
8
8
  getCurrentSentryTraceId,
9
9
  resolveIssueRepoSlug
10
- } from "./chunk-HXN2HJMZ.js";
10
+ } from "./chunk-4CQ75L4W.js";
11
11
  import {
12
12
  package_default
13
- } from "./chunk-AR5IUHCM.js";
13
+ } from "./chunk-GQNCLVZM.js";
14
14
 
15
15
  // src/bug-report.ts
16
16
  import { execSync, execFileSync } from "child_process";
@@ -175,8 +175,13 @@ function applyCoreLabels(issueUrl) {
175
175
  return false;
176
176
  }
177
177
  }
178
+ function isUserInputError(error) {
179
+ const msg = error?.message ?? "";
180
+ return /Invalid domain label|reserves base names of/i.test(msg);
181
+ }
178
182
  async function offerBugReport(error) {
179
183
  if (!isInteractive()) return;
184
+ if (isUserInputError(error)) return;
180
185
  const yes = await promptYesNo("\n This looks like a bug. Open an issue with debug info? [Y/n] ");
181
186
  if (!yes) return;
182
187
  const title = buildTitle(error);
@@ -226,5 +231,6 @@ export {
226
231
  buildTitle,
227
232
  buildLabels,
228
233
  createGhIssue,
234
+ isUserInputError,
229
235
  offerBugReport
230
236
  };