bulletin-deploy 0.13.0 → 0.13.1-rc.2

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 (37) hide show
  1. package/bin/bulletin-deploy +17 -0
  2. package/dist/auth-config.js +3 -3
  3. package/dist/bug-report.js +4 -4
  4. package/dist/{chunk-SJITQINC.js → chunk-BFWPRX5O.js} +1 -1
  5. package/dist/{chunk-UFY3RBUV.js → chunk-CILFB52S.js} +2 -2
  6. package/dist/{chunk-NXO6VBEM.js → chunk-F6MIQLOO.js} +1 -1
  7. package/dist/{chunk-I64OSTIG.js → chunk-H42S7VX2.js} +7 -7
  8. package/dist/{chunk-3R7RU6WB.js → chunk-HPEXY3JF.js} +3 -3
  9. package/dist/{chunk-EGG7SJTB.js → chunk-INPIXAV5.js} +2 -2
  10. package/dist/{chunk-P7HCUQCI.js → chunk-JSEVC62P.js} +92 -16
  11. package/dist/{chunk-AKHN5OWJ.js → chunk-LAKHIIHO.js} +1 -1
  12. package/dist/{chunk-HGXLCD5H.js → chunk-LZ5YS3EA.js} +1 -1
  13. package/dist/{chunk-72NGQCI5.js → chunk-MKRT2DH6.js} +1 -1
  14. package/dist/{chunk-MRAHKUK7.js → chunk-PFOPWGMV.js} +1 -1
  15. package/dist/chunk-probe.js +3 -3
  16. package/dist/commands/login.js +10 -10
  17. package/dist/commands/logout.js +4 -4
  18. package/dist/commands/transfer.js +3 -3
  19. package/dist/commands/whoami.js +3 -3
  20. package/dist/deploy-actors.js +5 -5
  21. package/dist/deploy.js +10 -10
  22. package/dist/dotns.d.ts +28 -2
  23. package/dist/dotns.js +13 -5
  24. package/dist/index.d.ts +40 -2
  25. package/dist/index.js +57 -12
  26. package/dist/manifest/publish.js +11 -11
  27. package/dist/memory-report.js +2 -2
  28. package/dist/merkle.js +10 -10
  29. package/dist/personhood/bootstrap.js +3 -3
  30. package/dist/personhood/people-client.js +3 -3
  31. package/dist/run-state.js +1 -1
  32. package/dist/sss-allowance-cache.js +4 -4
  33. package/dist/storage-signer.js +10 -10
  34. package/dist/telemetry.js +2 -2
  35. package/dist/version-check.js +3 -3
  36. package/package.json +1 -1
  37. package/tools/release-retry-wrapper.mjs +5 -0
@@ -455,6 +455,23 @@ try {
455
455
  const _versionInfo = await _versionCheckPromise;
456
456
  if (handlePreflightVersionCheck(_versionInfo) === "abort") process.exit(1);
457
457
 
458
+ // Frontloaded manifest preflight (paritytech/polkadot-app-deploy#125): when a
459
+ // product config applies (--config or discoverable via walk-up), validate it
460
+ // + its referenced icon/executable files BEFORE any storage or chain work, so
461
+ // config errors fail fast up front instead of after merkleize + upload. No-op
462
+ // (returns null) for contenthash-only deploys with no config.
463
+ try {
464
+ const { preflightProductConfig } = await import("../dist/index.js");
465
+ // config-load resolves a relative cwd internally, so no node:path here
466
+ // (it's only dynamically imported later, in the publish block).
467
+ await preflightProductConfig(
468
+ flags.config ? { path: flags.config } : { cwd: buildDir, walkUp: true },
469
+ );
470
+ } catch (err) {
471
+ console.error(`Error: ${err?.message ?? err}`);
472
+ process.exit(err instanceof NonRetryableError ? EXIT_CODE_NO_RETRY : 1);
473
+ }
474
+
458
475
  const result = await deploy(buildDir, domain, {
459
476
  mnemonic: flags.mnemonic,
460
477
  derivationPath: flags.derivationPath,
@@ -9,10 +9,10 @@ import {
9
9
  getPeopleChainEndpoints,
10
10
  hasPersistedSession,
11
11
  resolveBulletinEndpoints
12
- } from "./chunk-AKHN5OWJ.js";
12
+ } from "./chunk-LAKHIIHO.js";
13
13
  import "./chunk-TSPERKUS.js";
14
- import "./chunk-SJITQINC.js";
15
- import "./chunk-HGXLCD5H.js";
14
+ import "./chunk-BFWPRX5O.js";
15
+ import "./chunk-LZ5YS3EA.js";
16
16
  import "./chunk-NTXIXOCN.js";
17
17
  import "./chunk-ZOC4GITL.js";
18
18
  export {
@@ -10,10 +10,10 @@ import {
10
10
  offerBugReport,
11
11
  scrubSecrets,
12
12
  setDeployContext
13
- } from "./chunk-3R7RU6WB.js";
14
- import "./chunk-MRAHKUK7.js";
15
- import "./chunk-SJITQINC.js";
16
- import "./chunk-HGXLCD5H.js";
13
+ } from "./chunk-HPEXY3JF.js";
14
+ import "./chunk-PFOPWGMV.js";
15
+ import "./chunk-BFWPRX5O.js";
16
+ import "./chunk-LZ5YS3EA.js";
17
17
  export {
18
18
  buildCliFlagsSummary,
19
19
  buildLabels,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-HGXLCD5H.js";
4
+ } from "./chunk-LZ5YS3EA.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-5FLTDWWP.js";
5
5
  import {
6
6
  DOT_PRODUCT_ID
7
- } from "./chunk-AKHN5OWJ.js";
7
+ } from "./chunk-LAKHIIHO.js";
8
8
  import {
9
9
  DEFAULT_MNEMONIC
10
- } from "./chunk-P7HCUQCI.js";
10
+ } from "./chunk-JSEVC62P.js";
11
11
 
12
12
  // src/deploy-actors.ts
13
13
  var DEFAULT_WORKER_SURI = DEFAULT_MNEMONIC;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  captureWarning
3
- } from "./chunk-SJITQINC.js";
3
+ } from "./chunk-BFWPRX5O.js";
4
4
 
5
5
  // src/chunk-probe.ts
6
6
  import { Twox128, Blake2128Concat, decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  preflightSssAllowance
3
- } from "./chunk-72NGQCI5.js";
3
+ } from "./chunk-MKRT2DH6.js";
4
4
  import {
5
5
  statementSigningAccount
6
6
  } from "./chunk-GRPLHUYC.js";
@@ -31,18 +31,18 @@ import {
31
31
  } from "./chunk-S7EM5VMW.js";
32
32
  import {
33
33
  setDeployContext
34
- } from "./chunk-3R7RU6WB.js";
34
+ } from "./chunk-HPEXY3JF.js";
35
35
  import {
36
36
  getBestBlockNumber,
37
37
  probeChunks,
38
38
  probeFinalityGap
39
- } from "./chunk-NXO6VBEM.js";
39
+ } from "./chunk-F6MIQLOO.js";
40
40
  import {
41
41
  packSection
42
42
  } from "./chunk-C2TS5MER.js";
43
43
  import {
44
44
  resolveStorageSigner
45
- } from "./chunk-UFY3RBUV.js";
45
+ } from "./chunk-CILFB52S.js";
46
46
  import {
47
47
  createSlotAccountSigner,
48
48
  requestResourceAllocation
@@ -51,7 +51,7 @@ import {
51
51
  STALE_SESSION_MESSAGE,
52
52
  getPeopleChainEndpoints,
53
53
  hasPersistedSession
54
- } from "./chunk-AKHN5OWJ.js";
54
+ } from "./chunk-LAKHIIHO.js";
55
55
  import {
56
56
  CLI_NAME
57
57
  } from "./chunk-TSPERKUS.js";
@@ -64,7 +64,7 @@ import {
64
64
  parseDomainName,
65
65
  popStatusName,
66
66
  verifyNonceAdvanced
67
- } from "./chunk-P7HCUQCI.js";
67
+ } from "./chunk-JSEVC62P.js";
68
68
  import {
69
69
  derivePoolAccounts,
70
70
  detectTestnet,
@@ -86,7 +86,7 @@ import {
86
86
  truncateAddress,
87
87
  withDeploySpan,
88
88
  withSpan
89
- } from "./chunk-SJITQINC.js";
89
+ } from "./chunk-BFWPRX5O.js";
90
90
  import {
91
91
  DEFAULT_ENV_ID,
92
92
  getPopSelfServeConfig,
@@ -2,15 +2,15 @@ import {
2
2
  classifyErrorArea,
3
3
  isInteractive,
4
4
  promptYesNo
5
- } from "./chunk-MRAHKUK7.js";
5
+ } from "./chunk-PFOPWGMV.js";
6
6
  import {
7
7
  VERSION,
8
8
  getCurrentSentryTraceId,
9
9
  resolveIssueRepoSlug
10
- } from "./chunk-SJITQINC.js";
10
+ } from "./chunk-BFWPRX5O.js";
11
11
  import {
12
12
  package_default
13
- } from "./chunk-HGXLCD5H.js";
13
+ } from "./chunk-LZ5YS3EA.js";
14
14
 
15
15
  // src/bug-report.ts
16
16
  import { execSync, execFileSync } from "child_process";
@@ -7,10 +7,10 @@ import {
7
7
  resolveDotnsConnectOptions,
8
8
  storeDirectory,
9
9
  storeFile
10
- } from "./chunk-I64OSTIG.js";
10
+ } from "./chunk-H42S7VX2.js";
11
11
  import {
12
12
  DotNS
13
- } from "./chunk-P7HCUQCI.js";
13
+ } from "./chunk-JSEVC62P.js";
14
14
  import {
15
15
  getPopSelfServeConfig,
16
16
  loadEnvironments,
@@ -11,7 +11,7 @@ import {
11
11
  setDeploySentryTag,
12
12
  truncateAddress,
13
13
  withSpan
14
- } from "./chunk-SJITQINC.js";
14
+ } from "./chunk-BFWPRX5O.js";
15
15
  import {
16
16
  validateContractAddresses
17
17
  } from "./chunk-NTXIXOCN.js";
@@ -125,6 +125,13 @@ var PERSONHOOD_CONTEXT = "0x646f746e73000000000000000000000000000000000000000000
125
125
  var DECIMALS = 12n;
126
126
  var NATIVE_TO_ETH_RATIO = 1000000n;
127
127
  var CONNECTION_TIMEOUT_MS = 3e4;
128
+ var REVIVE_ADDRESS_ATTEMPTS = 3;
129
+ var CONTENTHASH_VERIFY_ATTEMPTS = 3;
130
+ function pickVerifyEndpoint(attempt, rpc, assetHubEndpoints) {
131
+ const endpoints = rpc ? [rpc, ...assetHubEndpoints.filter((ep) => ep !== rpc)] : assetHubEndpoints;
132
+ if (endpoints.length === 0) throw new Error("pickVerifyEndpoint: no asset hub endpoints available");
133
+ return endpoints[(attempt - 1) % endpoints.length];
134
+ }
128
135
  var OPERATION_TIMEOUT_MS = 3e5;
129
136
  var TX_TIMEOUT_MS = 9e4;
130
137
  var TX_CHAIN_TIME_BUDGET_MS = 18e4;
@@ -173,6 +180,24 @@ function dotnsRetryBackoffMs(attempt, rand = Math.random) {
173
180
  const ceil = Math.min(DOTNS_RETRY_BASE_MS * 2 ** (attempt - 1), DOTNS_RETRY_MAX_MS);
174
181
  return Math.round(ceil * (0.5 + rand() * 0.5));
175
182
  }
183
+ async function withRetry(fn, opts) {
184
+ const backoffMs = opts.backoffMs ?? dotnsRetryBackoffMs;
185
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
186
+ let lastErr;
187
+ for (let attempt = 1; attempt <= opts.attempts; attempt++) {
188
+ try {
189
+ return await fn(attempt);
190
+ } catch (e) {
191
+ lastErr = e;
192
+ if (attempt < opts.attempts) {
193
+ const b = backoffMs(attempt);
194
+ opts.onRetry?.(attempt, e, b);
195
+ await sleep(b);
196
+ }
197
+ }
198
+ }
199
+ throw lastErr;
200
+ }
176
201
  function shouldRetryTxAttempt(attempt, maxAttempts, decision) {
177
202
  return decision === "retry" && attempt < maxAttempts;
178
203
  }
@@ -1082,7 +1107,7 @@ var DotNS = class {
1082
1107
  // Test-only seam: fallback result for reprove() when the real call throws "not strictly
1083
1108
  // greater than stored" (account already at latest revision). Any other error propagates.
1084
1109
  _reproveFallbackForTest = null;
1085
- /** Test-only: register a fallback reprove result used only if the real reprove() throws "not strictly greater than stored". Consumed once. */
1110
+ /** Test-only: register a fallback reprove result used if the real reprove() throws (e.g. "already at latest revision", or a transient chain error). Consumed once. */
1086
1111
  __setReproveFallbackForTest(result) {
1087
1112
  this._reproveFallbackForTest = result;
1088
1113
  }
@@ -1096,6 +1121,24 @@ var DotNS = class {
1096
1121
  this.connected = false;
1097
1122
  this.assetHubEndpoints = RPC_ENDPOINTS;
1098
1123
  }
1124
+ /**
1125
+ * Tear down the current papi client (if any) and stand up a fresh WS
1126
+ * connection + ReviveClientWrapper against `endpoint`. Escapes a
1127
+ * wedged/slow/stale connection — used by connect()'s ReviveApi.address
1128
+ * retry (#1131) and by setContenthash's post-deploy read-back retry
1129
+ * (#1131-follow-up), which is the single reason this is a shared helper
1130
+ * rather than two copies of the same three lines.
1131
+ */
1132
+ recreateReviveClient(endpoint) {
1133
+ if (this.client) {
1134
+ try {
1135
+ this.client.destroy();
1136
+ } catch {
1137
+ }
1138
+ }
1139
+ this.client = createClient(getWsProvider(endpoint, { heartbeatTimeout: WS_HEARTBEAT_TIMEOUT_MS }));
1140
+ this.clientWrapper = new ReviveClientWrapper(this.client.getUnsafeApi());
1141
+ }
1099
1142
  async connect(options = {}) {
1100
1143
  if (options.assetHubEndpoints && options.assetHubEndpoints.length > 0) {
1101
1144
  this.assetHubEndpoints = options.assetHubEndpoints;
@@ -1148,22 +1191,30 @@ var DotNS = class {
1148
1191
  setDeploySentryTag("deploy.dotns.signer", truncateAddress(this.substrateAddress));
1149
1192
  return withSpan("deploy.dotns.connect", "dotns connect", {}, async () => {
1150
1193
  try {
1151
- this.client = createClient(getWsProvider(rpc, { heartbeatTimeout: WS_HEARTBEAT_TIMEOUT_MS }));
1152
- const unsafeApi = this.client.getUnsafeApi();
1153
- this.clientWrapper = new ReviveClientWrapper(unsafeApi);
1154
- this.evmAddress = await withTimeout(
1155
- this.clientWrapper.getEvmAddress(this.substrateAddress),
1156
- CONNECTION_TIMEOUT_MS,
1157
- "ReviveApi.address"
1158
- );
1159
- console.log(` H160 Address: ${this.evmAddress}`);
1194
+ this.evmAddress = await withRetry(async (attempt) => {
1195
+ this.recreateReviveClient(rpc);
1196
+ const addr = await withTimeout(
1197
+ this.clientWrapper.getEvmAddress(this.substrateAddress),
1198
+ CONNECTION_TIMEOUT_MS,
1199
+ "ReviveApi.address"
1200
+ );
1201
+ if (attempt > 1) setDeployAttribute("deploy.dotns.revive_address_attempts", String(attempt));
1202
+ return addr;
1203
+ }, {
1204
+ attempts: REVIVE_ADDRESS_ATTEMPTS,
1205
+ onRetry: (attempt, e, backoff) => {
1206
+ const inner = e?.message?.slice(0, 160) ?? String(e).slice(0, 160);
1207
+ console.log(` ReviveApi.address attempt ${attempt}/${REVIVE_ADDRESS_ATTEMPTS} failed (${inner}) \u2014 retrying in ${Math.round(backoff / 1e3)}s\u2026`);
1208
+ }
1209
+ });
1160
1210
  } catch (e) {
1161
- const inner = e.message?.slice(0, 200) ?? String(e).slice(0, 200);
1211
+ const inner = e?.message?.slice(0, 200) ?? String(e).slice(0, 200);
1162
1212
  const rpcHint = inner.includes("timed out") ? `; RPC: ${rpc} \u2014 retry or set DOTNS_RPC to another endpoint` : "";
1163
1213
  throw new Error(
1164
- `DotNS connect: failed to resolve EVM address from ${this.substrateAddress} via ReviveApi.address (${inner})${rpcHint}`
1214
+ `DotNS connect: failed to resolve EVM address from ${this.substrateAddress} via ReviveApi.address after ${REVIVE_ADDRESS_ATTEMPTS} attempts (${inner})${rpcHint}`
1165
1215
  );
1166
1216
  }
1217
+ console.log(` H160 Address: ${this.evmAddress}`);
1167
1218
  setDeployAttribute("deploy.dotns.rpc_used", rpc);
1168
1219
  setDeployAttribute("deploy.dotns.evm_address", this.evmAddress);
1169
1220
  this.connected = true;
@@ -1837,10 +1888,28 @@ var DotNS = class {
1837
1888
  console.log(`
1838
1889
  Linking content...`);
1839
1890
  const txRes = await this.contractTransaction(this._contracts.DOTNS_CONTENT_RESOLVER, 0n, DOTNS_CONTENT_RESOLVER_ABI, "setContenthash", [node, contenthashHex], (s) => console.log(` ${s}`), { useNoncePolling: true, verifyEffect, feeAsset: opts.feeAsset, phoneLabel: "Link content" });
1840
- const finalOnChain = (await this.getContenthash(domainName) || "0x").toLowerCase();
1891
+ let finalOnChain = "0x";
1892
+ try {
1893
+ await withRetry(async (attempt) => {
1894
+ if (attempt > 1) {
1895
+ const endpoint = pickVerifyEndpoint(attempt, this.rpc, this.assetHubEndpoints);
1896
+ this.recreateReviveClient(endpoint);
1897
+ }
1898
+ finalOnChain = (await this.getContenthash(domainName) || "0x").toLowerCase();
1899
+ if (finalOnChain !== expected) throw new Error(`contenthash still ${finalOnChain}, awaiting ${expected}`);
1900
+ if (attempt > 1) setDeployAttribute("deploy.contenthash.verify_attempts", String(attempt));
1901
+ }, {
1902
+ attempts: CONTENTHASH_VERIFY_ATTEMPTS,
1903
+ onRetry: (attempt, e, backoff) => {
1904
+ const inner = e?.message?.slice(0, 160) ?? String(e).slice(0, 160);
1905
+ console.log(` Read-back attempt ${attempt}/${CONTENTHASH_VERIFY_ATTEMPTS} saw a mismatch (${inner}) \u2014 retrying against a fresh connection in ${Math.round(backoff / 1e3)}s\u2026`);
1906
+ }
1907
+ });
1908
+ } catch {
1909
+ }
1841
1910
  if (finalOnChain !== expected) {
1842
1911
  throw new Error(
1843
- `Post-deploy verification failed for ${domainName}.dot: on-chain contenthash is ${finalOnChain}, not the ${expected} we just wrote. The setContenthash tx may have silently failed, or another party overwrote the domain. Re-run the deploy to retry.`
1912
+ `Post-deploy verification failed for ${domainName}.dot: on-chain contenthash is ${finalOnChain}, not the ${expected} we just wrote (after ${CONTENTHASH_VERIFY_ATTEMPTS} read attempts). The setContenthash tx may have silently failed, or another party overwrote the domain. Re-run the deploy to retry.`
1844
1913
  );
1845
1914
  }
1846
1915
  setDeployAttribute("deploy.dotns.tx_resolution", txRes.kind);
@@ -2751,9 +2820,12 @@ var DotNS = class {
2751
2820
  });
2752
2821
  return result;
2753
2822
  } catch (e) {
2754
- if (this._reproveFallbackForTest && typeof e?.message === "string" && e.message.includes("not strictly greater than stored")) {
2823
+ if (this._reproveFallbackForTest) {
2755
2824
  const fb = this._reproveFallbackForTest;
2756
2825
  this._reproveFallbackForTest = null;
2826
+ if (typeof e?.message === "string" && !e.message.includes("not strictly greater than stored")) {
2827
+ console.log(` (test) real reprove() errored transiently \u2014 using synthetic fallback: ${(e.message ?? String(e)).slice(0, 120)}`);
2828
+ }
2757
2829
  return fb;
2758
2830
  }
2759
2831
  throw e;
@@ -2838,6 +2910,9 @@ export {
2838
2910
  DECIMALS,
2839
2911
  NATIVE_TO_ETH_RATIO,
2840
2912
  CONNECTION_TIMEOUT_MS,
2913
+ REVIVE_ADDRESS_ATTEMPTS,
2914
+ CONTENTHASH_VERIFY_ATTEMPTS,
2915
+ pickVerifyEndpoint,
2841
2916
  OPERATION_TIMEOUT_MS,
2842
2917
  TX_TIMEOUT_MS,
2843
2918
  TX_CHAIN_TIME_BUDGET_MS,
@@ -2854,6 +2929,7 @@ export {
2854
2929
  classifyTxRetryDecision,
2855
2930
  classifyWatcherSilentFastFail,
2856
2931
  dotnsRetryBackoffMs,
2932
+ withRetry,
2857
2933
  shouldRetryTxAttempt,
2858
2934
  shouldRegateBeforeResign,
2859
2935
  makeRetryStatusFilter,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TSPERKUS.js";
4
4
  import {
5
5
  VERSION
6
- } from "./chunk-SJITQINC.js";
6
+ } from "./chunk-BFWPRX5O.js";
7
7
  import {
8
8
  loadEnvironments
9
9
  } from "./chunk-NTXIXOCN.js";
@@ -6,7 +6,7 @@ import * as path from "path";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "bulletin-deploy",
9
- version: "0.13.0",
9
+ version: "0.13.1-rc.2",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-GRPLHUYC.js";
4
4
  import {
5
5
  DOT_DAPP_ID
6
- } from "./chunk-AKHN5OWJ.js";
6
+ } from "./chunk-LAKHIIHO.js";
7
7
 
8
8
  // src/sss-allowance-cache.ts
9
9
  import { mkdir, readFile, writeFile, unlink } from "fs/promises";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-SJITQINC.js";
3
+ } from "./chunk-BFWPRX5O.js";
4
4
 
5
5
  // src/version-check.ts
6
6
  import { execSync, execFileSync } from "child_process";
@@ -8,9 +8,9 @@ import {
8
8
  getBestBlockNumber,
9
9
  probeChunks,
10
10
  probeFinalityGap
11
- } from "./chunk-NXO6VBEM.js";
12
- import "./chunk-SJITQINC.js";
13
- import "./chunk-HGXLCD5H.js";
11
+ } from "./chunk-F6MIQLOO.js";
12
+ import "./chunk-BFWPRX5O.js";
13
+ import "./chunk-LZ5YS3EA.js";
14
14
  export {
15
15
  ChainProbeCrossValidationError,
16
16
  ChainProbeMetadataError,
@@ -3,10 +3,10 @@ import {
3
3
  } from "../chunk-J7CYVTAW.js";
4
4
  import {
5
5
  waitForBulletinAuthorization
6
- } from "../chunk-I64OSTIG.js";
6
+ } from "../chunk-H42S7VX2.js";
7
7
  import {
8
8
  preflightSssAllowance
9
- } from "../chunk-72NGQCI5.js";
9
+ } from "../chunk-MKRT2DH6.js";
10
10
  import {
11
11
  statementSigningAccount
12
12
  } from "../chunk-GRPLHUYC.js";
@@ -15,11 +15,11 @@ import "../chunk-IW3X2MJF.js";
15
15
  import "../chunk-KOSF5FDO.js";
16
16
  import "../chunk-J3NIXHZZ.js";
17
17
  import "../chunk-S7EM5VMW.js";
18
- import "../chunk-3R7RU6WB.js";
19
- import "../chunk-MRAHKUK7.js";
20
- import "../chunk-NXO6VBEM.js";
18
+ import "../chunk-HPEXY3JF.js";
19
+ import "../chunk-PFOPWGMV.js";
20
+ import "../chunk-F6MIQLOO.js";
21
21
  import "../chunk-C2TS5MER.js";
22
- import "../chunk-UFY3RBUV.js";
22
+ import "../chunk-CILFB52S.js";
23
23
  import "../chunk-JQKKMUCT.js";
24
24
  import {
25
25
  BULLETIN_RESOURCE,
@@ -36,15 +36,15 @@ import {
36
36
  getAuthClient,
37
37
  getPeopleChainEndpoints,
38
38
  resolveBulletinEndpoints
39
- } from "../chunk-AKHN5OWJ.js";
39
+ } from "../chunk-LAKHIIHO.js";
40
40
  import {
41
41
  CLI_NAME
42
42
  } from "../chunk-TSPERKUS.js";
43
- import "../chunk-P7HCUQCI.js";
43
+ import "../chunk-JSEVC62P.js";
44
44
  import "../chunk-SI2ZUOYD.js";
45
45
  import "../chunk-4AEFFDHP.js";
46
- import "../chunk-SJITQINC.js";
47
- import "../chunk-HGXLCD5H.js";
46
+ import "../chunk-BFWPRX5O.js";
47
+ import "../chunk-LZ5YS3EA.js";
48
48
  import {
49
49
  loadEnvironments
50
50
  } from "../chunk-NTXIXOCN.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearSssAllowanceCache
3
- } from "../chunk-72NGQCI5.js";
3
+ } from "../chunk-MKRT2DH6.js";
4
4
  import "../chunk-GRPLHUYC.js";
5
5
  import "../chunk-JQKKMUCT.js";
6
6
  import "../chunk-5FLTDWWP.js";
@@ -9,10 +9,10 @@ import {
9
9
  } from "../chunk-RIRDBSBG.js";
10
10
  import {
11
11
  getAuthClient
12
- } from "../chunk-AKHN5OWJ.js";
12
+ } from "../chunk-LAKHIIHO.js";
13
13
  import "../chunk-TSPERKUS.js";
14
- import "../chunk-SJITQINC.js";
15
- import "../chunk-HGXLCD5H.js";
14
+ import "../chunk-BFWPRX5O.js";
15
+ import "../chunk-LZ5YS3EA.js";
16
16
  import "../chunk-NTXIXOCN.js";
17
17
  import "../chunk-ZOC4GITL.js";
18
18
 
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  DEFAULT_MNEMONIC,
6
6
  DotNS
7
- } from "../chunk-P7HCUQCI.js";
7
+ } from "../chunk-JSEVC62P.js";
8
8
  import "../chunk-SI2ZUOYD.js";
9
9
  import "../chunk-4AEFFDHP.js";
10
- import "../chunk-SJITQINC.js";
11
- import "../chunk-HGXLCD5H.js";
10
+ import "../chunk-BFWPRX5O.js";
11
+ import "../chunk-LZ5YS3EA.js";
12
12
  import {
13
13
  getPopSelfServeConfig,
14
14
  loadEnvironments,
@@ -2,12 +2,12 @@ import {
2
2
  STALE_SESSION_MESSAGE,
3
3
  getAuthClient,
4
4
  hasPersistedSession
5
- } from "../chunk-AKHN5OWJ.js";
5
+ } from "../chunk-LAKHIIHO.js";
6
6
  import {
7
7
  CLI_NAME
8
8
  } from "../chunk-TSPERKUS.js";
9
- import "../chunk-SJITQINC.js";
10
- import "../chunk-HGXLCD5H.js";
9
+ import "../chunk-BFWPRX5O.js";
10
+ import "../chunk-LZ5YS3EA.js";
11
11
  import "../chunk-NTXIXOCN.js";
12
12
  import "../chunk-ZOC4GITL.js";
13
13
 
@@ -2,17 +2,17 @@ import {
2
2
  MainnetDefaultWorkerError,
3
3
  resolveDeployActors,
4
4
  resolveStorageSigner
5
- } from "./chunk-UFY3RBUV.js";
5
+ } from "./chunk-CILFB52S.js";
6
6
  import "./chunk-JQKKMUCT.js";
7
7
  import "./chunk-5FLTDWWP.js";
8
8
  import "./chunk-RIRDBSBG.js";
9
- import "./chunk-AKHN5OWJ.js";
9
+ import "./chunk-LAKHIIHO.js";
10
10
  import "./chunk-TSPERKUS.js";
11
- import "./chunk-P7HCUQCI.js";
11
+ import "./chunk-JSEVC62P.js";
12
12
  import "./chunk-SI2ZUOYD.js";
13
13
  import "./chunk-4AEFFDHP.js";
14
- import "./chunk-SJITQINC.js";
15
- import "./chunk-HGXLCD5H.js";
14
+ import "./chunk-BFWPRX5O.js";
15
+ import "./chunk-LZ5YS3EA.js";
16
16
  import "./chunk-NTXIXOCN.js";
17
17
  import "./chunk-ZOC4GITL.js";
18
18
  export {
package/dist/deploy.js CHANGED
@@ -55,29 +55,29 @@ import {
55
55
  storeDirectoryV2,
56
56
  storeFile,
57
57
  unpublish
58
- } from "./chunk-I64OSTIG.js";
59
- import "./chunk-72NGQCI5.js";
58
+ } from "./chunk-H42S7VX2.js";
59
+ import "./chunk-MKRT2DH6.js";
60
60
  import "./chunk-GRPLHUYC.js";
61
61
  import "./chunk-HOTQDYHD.js";
62
62
  import "./chunk-IW3X2MJF.js";
63
63
  import "./chunk-KOSF5FDO.js";
64
64
  import "./chunk-J3NIXHZZ.js";
65
65
  import "./chunk-S7EM5VMW.js";
66
- import "./chunk-3R7RU6WB.js";
67
- import "./chunk-MRAHKUK7.js";
68
- import "./chunk-NXO6VBEM.js";
66
+ import "./chunk-HPEXY3JF.js";
67
+ import "./chunk-PFOPWGMV.js";
68
+ import "./chunk-F6MIQLOO.js";
69
69
  import "./chunk-C2TS5MER.js";
70
- import "./chunk-UFY3RBUV.js";
70
+ import "./chunk-CILFB52S.js";
71
71
  import "./chunk-JQKKMUCT.js";
72
72
  import "./chunk-5FLTDWWP.js";
73
73
  import "./chunk-RIRDBSBG.js";
74
- import "./chunk-AKHN5OWJ.js";
74
+ import "./chunk-LAKHIIHO.js";
75
75
  import "./chunk-TSPERKUS.js";
76
- import "./chunk-P7HCUQCI.js";
76
+ import "./chunk-JSEVC62P.js";
77
77
  import "./chunk-SI2ZUOYD.js";
78
78
  import "./chunk-4AEFFDHP.js";
79
- import "./chunk-SJITQINC.js";
80
- import "./chunk-HGXLCD5H.js";
79
+ import "./chunk-BFWPRX5O.js";
80
+ import "./chunk-LZ5YS3EA.js";
81
81
  import "./chunk-NTXIXOCN.js";
82
82
  import {
83
83
  EXIT_CODE_NO_RETRY,
package/dist/dotns.d.ts CHANGED
@@ -145,6 +145,9 @@ declare const CONTRACTS: {
145
145
  declare const DECIMALS: bigint;
146
146
  declare const NATIVE_TO_ETH_RATIO: bigint;
147
147
  declare const CONNECTION_TIMEOUT_MS: number;
148
+ declare const REVIVE_ADDRESS_ATTEMPTS: number;
149
+ declare const CONTENTHASH_VERIFY_ATTEMPTS: number;
150
+ declare function pickVerifyEndpoint(attempt: number, rpc: string | null, assetHubEndpoints: string[]): string;
148
151
  declare const OPERATION_TIMEOUT_MS: number;
149
152
  declare const TX_TIMEOUT_MS: number;
150
153
  declare const TX_CHAIN_TIME_BUDGET_MS: number;
@@ -187,6 +190,20 @@ declare function classifyTxRetryDecision(err: unknown): "retry" | "abort";
187
190
  */
188
191
  declare function classifyWatcherSilentFastFail(err: unknown, isPhoneSigner: boolean | undefined): NonRetryableError | null;
189
192
  declare function dotnsRetryBackoffMs(attempt: number, rand?: () => number): number;
193
+ /**
194
+ * Run `fn` up to `attempts` times, backing off between failures. Returns the
195
+ * first success; rethrows the LAST error if every attempt fails. `sleep` and
196
+ * `backoffMs` are injectable so the retry policy is unit-testable without real
197
+ * timers. Used for the ReviveApi.address resolution in connect() (#1131) — a
198
+ * generic seam so the "retry N times with backoff" behaviour is tested once,
199
+ * independent of the live-chain call it wraps.
200
+ */
201
+ declare function withRetry<T>(fn: (attempt: number) => Promise<T>, opts: {
202
+ attempts: number;
203
+ onRetry?: (attempt: number, err: unknown, backoffMs: number) => void;
204
+ backoffMs?: (attempt: number) => number;
205
+ sleep?: (ms: number) => Promise<void>;
206
+ }): Promise<T>;
190
207
  /**
191
208
  * Whether a failed attempt should be retried: only when the error is
192
209
  * retry-eligible AND there's a later attempt left in the budget. Extracted so
@@ -508,13 +525,22 @@ declare class DotNS {
508
525
  /** Test-only: inject a fixed getUserPopStatus return value for the next call. Consumed once. */
509
526
  __setUserPopStatusForTest(status: number): void;
510
527
  private _reproveFallbackForTest;
511
- /** Test-only: register a fallback reprove result used only if the real reprove() throws "not strictly greater than stored". Consumed once. */
528
+ /** Test-only: register a fallback reprove result used if the real reprove() throws (e.g. "already at latest revision", or a transient chain error). Consumed once. */
512
529
  __setReproveFallbackForTest(result: {
513
530
  oldRevision: number;
514
531
  newRevision: number;
515
532
  blockHash: string;
516
533
  }): void;
517
534
  constructor();
535
+ /**
536
+ * Tear down the current papi client (if any) and stand up a fresh WS
537
+ * connection + ReviveClientWrapper against `endpoint`. Escapes a
538
+ * wedged/slow/stale connection — used by connect()'s ReviveApi.address
539
+ * retry (#1131) and by setContenthash's post-deploy read-back retry
540
+ * (#1131-follow-up), which is the single reason this is a shared helper
541
+ * rather than two copies of the same three lines.
542
+ */
543
+ private recreateReviveClient;
518
544
  connect(options?: DotNSConnectOptions): Promise<this>;
519
545
  ensureMappedAccountReady(autoAccountMapping?: boolean): Promise<void>;
520
546
  ensureAutoMappedAccountReady(): Promise<void>;
@@ -709,4 +735,4 @@ declare class DotNS {
709
735
  }
710
736
  declare const dotns: DotNS;
711
737
 
712
- export { ATTR_TX_RESOLUTION_KIND, type AliasAccountClassification, type AliasAccountState, CONNECTION_TIMEOUT_MS, CONTRACTS, ContractDryRunRevertError, DECIMALS, DEFAULT_MNEMONIC, DOTNS_BEST_BLOCK_GRACE_MS, DOTNS_TX_MAX_ATTEMPTS, DOT_NODE, DotNS, type DotNSConnectOptions, type DotnsPreflightResult, type DotnsSuccessAction, MINIMUM_REGISTER_STORAGE_DEPOSIT, NATIVE_TO_ETH_RATIO, NONCE_ADVANCE_VERIFY_RETRIES, NONCE_ADVANCE_VERIFY_RETRY_INTERVAL_MS, OPERATION_TIMEOUT_MS, type OwnershipResult, PUBLISHER_ABI, type ParsedDomainName, type PhoneSignatureStep, type PriceValidationResult, ProofOfPersonhoodStatus, PublisherNotSupportedError, RPC_ENDPOINTS, ReviveClientWrapper, TX_CHAIN_TIME_BUDGET_MS, TX_KIND_BEST_BLOCK, TX_KIND_HASH, TX_KIND_NONCE_ADVANCED, TX_NO_PROGRESS_MS, TX_TIMEOUT_MS, TX_WALL_CLOCK_CEILING_MS, type TxResolution, VERIFY_EFFECT_CHAIN_SECONDS, WS_HEARTBEAT_TIMEOUT_MS, WatcherSilentNoEventError, __formatContractDryRunFailureForTest, bufferedWeiToNative, canRegister, classifyAliasAccountRow, classifyDotnsLabel, classifyTxRetryDecision, classifyWatcherSilentFastFail, computeDomainTokenId, convertToHexString, convertWeiToNative, countTrailingDigits, decodePublisherRevert, dotns, dotnsRetryBackoffMs, feeFloorFor, fetchNonce, fmtPas, formatDispatchError, formatPersonhoodRemediation, formatPopShortfallReason, isCommitmentMature, isCommitmentTimingBarerevert, makeRetryStatusFilter, parseDomainName, parseProofOfPersonhoodStatus, popStatusName, registerDepositWei, sanitizeDomainLabel, shouldRegateBeforeResign, shouldRetryTxAttempt, stripTrailingDigits, validateDomainLabel, verifyEffectWithGrace, verifyNonceAdvanced, weiToNative };
738
+ export { ATTR_TX_RESOLUTION_KIND, type AliasAccountClassification, type AliasAccountState, CONNECTION_TIMEOUT_MS, CONTENTHASH_VERIFY_ATTEMPTS, CONTRACTS, ContractDryRunRevertError, DECIMALS, DEFAULT_MNEMONIC, DOTNS_BEST_BLOCK_GRACE_MS, DOTNS_TX_MAX_ATTEMPTS, DOT_NODE, DotNS, type DotNSConnectOptions, type DotnsPreflightResult, type DotnsSuccessAction, MINIMUM_REGISTER_STORAGE_DEPOSIT, NATIVE_TO_ETH_RATIO, NONCE_ADVANCE_VERIFY_RETRIES, NONCE_ADVANCE_VERIFY_RETRY_INTERVAL_MS, OPERATION_TIMEOUT_MS, type OwnershipResult, PUBLISHER_ABI, type ParsedDomainName, type PhoneSignatureStep, type PriceValidationResult, ProofOfPersonhoodStatus, PublisherNotSupportedError, REVIVE_ADDRESS_ATTEMPTS, RPC_ENDPOINTS, ReviveClientWrapper, TX_CHAIN_TIME_BUDGET_MS, TX_KIND_BEST_BLOCK, TX_KIND_HASH, TX_KIND_NONCE_ADVANCED, TX_NO_PROGRESS_MS, TX_TIMEOUT_MS, TX_WALL_CLOCK_CEILING_MS, type TxResolution, VERIFY_EFFECT_CHAIN_SECONDS, WS_HEARTBEAT_TIMEOUT_MS, WatcherSilentNoEventError, __formatContractDryRunFailureForTest, bufferedWeiToNative, canRegister, classifyAliasAccountRow, classifyDotnsLabel, classifyTxRetryDecision, classifyWatcherSilentFastFail, computeDomainTokenId, convertToHexString, convertWeiToNative, countTrailingDigits, decodePublisherRevert, dotns, dotnsRetryBackoffMs, feeFloorFor, fetchNonce, fmtPas, formatDispatchError, formatPersonhoodRemediation, formatPopShortfallReason, isCommitmentMature, isCommitmentTimingBarerevert, makeRetryStatusFilter, parseDomainName, parseProofOfPersonhoodStatus, pickVerifyEndpoint, popStatusName, registerDepositWei, sanitizeDomainLabel, shouldRegateBeforeResign, shouldRetryTxAttempt, stripTrailingDigits, validateDomainLabel, verifyEffectWithGrace, verifyNonceAdvanced, weiToNative, withRetry };
package/dist/dotns.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  ATTR_TX_RESOLUTION_KIND,
3
3
  CONNECTION_TIMEOUT_MS,
4
+ CONTENTHASH_VERIFY_ATTEMPTS,
4
5
  CONTRACTS,
5
6
  ContractDryRunRevertError,
6
7
  DECIMALS,
@@ -17,6 +18,7 @@ import {
17
18
  PUBLISHER_ABI,
18
19
  ProofOfPersonhoodStatus,
19
20
  PublisherNotSupportedError,
21
+ REVIVE_ADDRESS_ATTEMPTS,
20
22
  RPC_ENDPOINTS,
21
23
  ReviveClientWrapper,
22
24
  TX_CHAIN_TIME_BUDGET_MS,
@@ -54,6 +56,7 @@ import {
54
56
  makeRetryStatusFilter,
55
57
  parseDomainName,
56
58
  parseProofOfPersonhoodStatus,
59
+ pickVerifyEndpoint,
57
60
  popStatusName,
58
61
  registerDepositWei,
59
62
  sanitizeDomainLabel,
@@ -63,17 +66,19 @@ import {
63
66
  validateDomainLabel,
64
67
  verifyEffectWithGrace,
65
68
  verifyNonceAdvanced,
66
- weiToNative
67
- } from "./chunk-P7HCUQCI.js";
69
+ weiToNative,
70
+ withRetry
71
+ } from "./chunk-JSEVC62P.js";
68
72
  import "./chunk-SI2ZUOYD.js";
69
73
  import "./chunk-4AEFFDHP.js";
70
- import "./chunk-SJITQINC.js";
71
- import "./chunk-HGXLCD5H.js";
74
+ import "./chunk-BFWPRX5O.js";
75
+ import "./chunk-LZ5YS3EA.js";
72
76
  import "./chunk-NTXIXOCN.js";
73
77
  import "./chunk-ZOC4GITL.js";
74
78
  export {
75
79
  ATTR_TX_RESOLUTION_KIND,
76
80
  CONNECTION_TIMEOUT_MS,
81
+ CONTENTHASH_VERIFY_ATTEMPTS,
77
82
  CONTRACTS,
78
83
  ContractDryRunRevertError,
79
84
  DECIMALS,
@@ -90,6 +95,7 @@ export {
90
95
  PUBLISHER_ABI,
91
96
  ProofOfPersonhoodStatus,
92
97
  PublisherNotSupportedError,
98
+ REVIVE_ADDRESS_ATTEMPTS,
93
99
  RPC_ENDPOINTS,
94
100
  ReviveClientWrapper,
95
101
  TX_CHAIN_TIME_BUDGET_MS,
@@ -127,6 +133,7 @@ export {
127
133
  makeRetryStatusFilter,
128
134
  parseDomainName,
129
135
  parseProofOfPersonhoodStatus,
136
+ pickVerifyEndpoint,
130
137
  popStatusName,
131
138
  registerDepositWei,
132
139
  sanitizeDomainLabel,
@@ -136,5 +143,6 @@ export {
136
143
  validateDomainLabel,
137
144
  verifyEffectWithGrace,
138
145
  verifyNonceAdvanced,
139
- weiToNative
146
+ weiToNative,
147
+ withRetry
140
148
  };
package/dist/index.d.ts CHANGED
@@ -9,10 +9,12 @@ export { FetchOptions, FetchOutcome, fetchPreviousManifest } from './manifest-fe
9
9
  export { ComputeStatsInput, IncrementalStats, computeStats, renderSummary, telemetryAttributes } from './incremental-stats.js';
10
10
  export { Chain, ChainEndpoint, DEFAULT_ENV_ID, Environment, EnvironmentListing, EnvironmentsDoc, EnvironmentsSource, LoadOptions, LoadResult, ResolvedEndpoints, deepMergeEnvironments, defaultBundledPath, formatEnvironmentTable, isValidContractAddress, listEnvironments, loadEnvironments, resolveEndpoints, validateContractAddresses } from './environments.js';
11
11
  export { RunState, RunStatus, VERSION, loadRunState, probablyOomRssMb, resolveStateDir, shouldShowOomHint, shouldSkipStaleWarning, stateFilePath, writeRunState } from './run-state.js';
12
- export { AppExecutableConfig, AppManifest, AppVersion, ExecutableConfig, ExecutableKind, ExecutableManifest, Icon, IconConfig, IconFormat, ProductConfig, RootManifest, WidgetDimensions, WidgetExecutableConfig, WidgetManifest, WorkerExecutableConfig, WorkerIncludes, WorkerManifest, defineConfig } from './manifest/types.js';
12
+ import { ProductConfig } from './manifest/types.js';
13
+ export { AppExecutableConfig, AppManifest, AppVersion, ExecutableConfig, ExecutableKind, ExecutableManifest, Icon, IconConfig, IconFormat, RootManifest, WidgetDimensions, WidgetExecutableConfig, WidgetManifest, WorkerExecutableConfig, WorkerIncludes, WorkerManifest, defineConfig } from './manifest/types.js';
13
14
  export { ValidationErr, ValidationOk, ValidationResult, validateExecutableManifest, validateProductConfig, validateRootManifest } from './manifest/schema.js';
14
15
  export { BudgetCheck, DEFAULT_TEXT_RECORD_BUDGET_BYTES, PLACEHOLDER_CID, PessimisticSizeReport, assertWithinBudget, getTextRecordBudgetBytes, pessimisticSizePreflight } from './manifest/byte-budget.js';
15
- export { LoadProductConfigOptions, LoadedProductConfig, loadProductConfig, tryLoadProductConfig } from './manifest/config-load.js';
16
+ import { LoadProductConfigOptions, LoadedProductConfig } from './manifest/config-load.js';
17
+ export { loadProductConfig, tryLoadProductConfig } from './manifest/config-load.js';
16
18
  export { PublishManifestOptions, PublishManifestResult, publishManifest } from './manifest/publish.js';
17
19
  import 'polkadot-api/ws';
18
20
  import 'multiformats/cid';
@@ -23,3 +25,39 @@ import './personhood/bind-personal-id.js';
23
25
  import './personhood/claim-pgas.js';
24
26
  import './personhood/bind-paid-alias.js';
25
27
  import './personhood/chain-prereqs.js';
28
+
29
+ /**
30
+ * Frontloaded product-manifest preflight.
31
+ *
32
+ * The deploy CLI historically loaded + validated the product config only in
33
+ * the post-deploy manifest-publish step — so an invalid config (bad `domain`,
34
+ * oversized text record, missing icon/executable file) surfaced *after*
35
+ * preflight and a full merkleize/upload (see paritytech/polkadot-app-deploy#125).
36
+ *
37
+ * This runs all the pure/local manifest checks up front, before any storage or
38
+ * chain work, so config errors fail fast with one aggregated message:
39
+ * 1. discover + load the config (schema validation, incl. `domain` ending
40
+ * in `.dot`, via `loadProductConfig`),
41
+ * 2. byte-budget preflight for every text record (`pessimisticSizePreflight`),
42
+ * 3. the referenced icon file + every executable path exist on disk.
43
+ *
44
+ * Returns the loaded+validated config so the caller can reuse it (no double
45
+ * load), or `null` when no config is applicable (opt-in manifest mode).
46
+ */
47
+
48
+ /**
49
+ * Check that every file a product config references exists on disk, resolved
50
+ * relative to the config's own directory. Returns a list of human-readable
51
+ * error strings (empty when everything is present). The icon must be a regular
52
+ * file; an executable path may be a file or a directory (a build dir).
53
+ */
54
+ declare function checkProductConfigFilesExist(config: ProductConfig, configDir: string): Promise<string[]>;
55
+ /**
56
+ * Run the full local manifest preflight. Throws a single aggregated
57
+ * `NonRetryableError` on any schema / byte-budget / missing-file problem.
58
+ * Returns the loaded config (reusable by the publish step) or `null` when no
59
+ * product config is present.
60
+ */
61
+ declare function preflightProductConfig(options?: LoadProductConfigOptions): Promise<LoadedProductConfig | null>;
62
+
63
+ export { LoadProductConfigOptions, LoadedProductConfig, ProductConfig, checkProductConfigFilesExist, preflightProductConfig };
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-362JEZKM.js";
5
5
  import {
6
6
  publishManifest
7
- } from "./chunk-EGG7SJTB.js";
7
+ } from "./chunk-INPIXAV5.js";
8
8
  import {
9
9
  DEFAULT_TEXT_RECORD_BUDGET_BYTES,
10
10
  PLACEHOLDER_CID,
@@ -24,8 +24,8 @@ import {
24
24
  deploy,
25
25
  merkleizeJS,
26
26
  merkleizeWithStableOrder
27
- } from "./chunk-I64OSTIG.js";
28
- import "./chunk-72NGQCI5.js";
27
+ } from "./chunk-H42S7VX2.js";
28
+ import "./chunk-MKRT2DH6.js";
29
29
  import "./chunk-GRPLHUYC.js";
30
30
  import "./chunk-HOTQDYHD.js";
31
31
  import {
@@ -49,24 +49,24 @@ import {
49
49
  isVolatilePath,
50
50
  parseManifest
51
51
  } from "./chunk-S7EM5VMW.js";
52
- import "./chunk-3R7RU6WB.js";
53
- import "./chunk-MRAHKUK7.js";
52
+ import "./chunk-HPEXY3JF.js";
53
+ import "./chunk-PFOPWGMV.js";
54
54
  import {
55
55
  probeChunks
56
- } from "./chunk-NXO6VBEM.js";
56
+ } from "./chunk-F6MIQLOO.js";
57
57
  import "./chunk-C2TS5MER.js";
58
- import "./chunk-UFY3RBUV.js";
58
+ import "./chunk-CILFB52S.js";
59
59
  import "./chunk-JQKKMUCT.js";
60
60
  import "./chunk-5FLTDWWP.js";
61
61
  import "./chunk-RIRDBSBG.js";
62
- import "./chunk-AKHN5OWJ.js";
62
+ import "./chunk-LAKHIIHO.js";
63
63
  import "./chunk-TSPERKUS.js";
64
64
  import {
65
65
  DEFAULT_MNEMONIC,
66
66
  DotNS,
67
67
  parseDomainName,
68
68
  sanitizeDomainLabel
69
- } from "./chunk-P7HCUQCI.js";
69
+ } from "./chunk-JSEVC62P.js";
70
70
  import "./chunk-SI2ZUOYD.js";
71
71
  import {
72
72
  BULLETIN_BLOCKS_PER_DAY,
@@ -82,7 +82,7 @@ import {
82
82
  poolAccountDerivationPath,
83
83
  selectAccount
84
84
  } from "./chunk-4AEFFDHP.js";
85
- import "./chunk-SJITQINC.js";
85
+ import "./chunk-BFWPRX5O.js";
86
86
  import {
87
87
  VERSION,
88
88
  loadRunState,
@@ -92,7 +92,7 @@ import {
92
92
  shouldSkipStaleWarning,
93
93
  stateFilePath,
94
94
  writeRunState
95
- } from "./chunk-HGXLCD5H.js";
95
+ } from "./chunk-LZ5YS3EA.js";
96
96
  import {
97
97
  DEFAULT_ENV_ID,
98
98
  deepMergeEnvironments,
@@ -104,7 +104,50 @@ import {
104
104
  resolveEndpoints,
105
105
  validateContractAddresses
106
106
  } from "./chunk-NTXIXOCN.js";
107
- import "./chunk-ZOC4GITL.js";
107
+ import {
108
+ NonRetryableError
109
+ } from "./chunk-ZOC4GITL.js";
110
+
111
+ // src/manifest/product-preflight.ts
112
+ import * as fs from "fs/promises";
113
+ import * as path from "path";
114
+ async function checkProductConfigFilesExist(config, configDir) {
115
+ const errors = [];
116
+ const iconAbs = path.resolve(configDir, config.icon.path);
117
+ try {
118
+ const st = await fs.stat(iconAbs);
119
+ if (!st.isFile()) errors.push(`icon.path "${config.icon.path}" is not a file (${iconAbs})`);
120
+ } catch {
121
+ errors.push(`icon.path "${config.icon.path}" not found (${iconAbs})`);
122
+ }
123
+ for (const exec of config.executables) {
124
+ const execAbs = path.resolve(configDir, exec.path);
125
+ try {
126
+ await fs.stat(execAbs);
127
+ } catch {
128
+ errors.push(`executables[${exec.kind}].path "${exec.path}" not found (${execAbs})`);
129
+ }
130
+ }
131
+ return errors;
132
+ }
133
+ async function preflightProductConfig(options = {}) {
134
+ const loaded = await tryLoadProductConfig(options);
135
+ if (!loaded) return null;
136
+ const { config, sourcePath } = loaded;
137
+ const errors = [];
138
+ const report = pessimisticSizePreflight(config, getTextRecordBudgetBytes());
139
+ for (const c of report.checks) {
140
+ if (!c.ok) errors.push(`text record "${c.key}" is ${c.bytes} B, over the ${c.budget} B dotNS budget`);
141
+ }
142
+ errors.push(...await checkProductConfigFilesExist(config, path.dirname(sourcePath)));
143
+ if (errors.length > 0) {
144
+ throw new NonRetryableError(
145
+ `Product config preflight failed for ${sourcePath}:
146
+ - ${errors.join("\n - ")}`
147
+ );
148
+ }
149
+ return loaded;
150
+ }
108
151
  export {
109
152
  BULLETIN_BLOCKS_PER_DAY,
110
153
  DEFAULT_ENV_ID,
@@ -122,6 +165,7 @@ export {
122
165
  assertWithinBudget,
123
166
  assetHubTopUpAmount,
124
167
  bootstrapPool,
168
+ checkProductConfigFilesExist,
125
169
  classifyFile,
126
170
  computeStats,
127
171
  deepMergeEnvironments,
@@ -149,6 +193,7 @@ export {
149
193
  parseManifest,
150
194
  pessimisticSizePreflight,
151
195
  poolAccountDerivationPath,
196
+ preflightProductConfig,
152
197
  probablyOomRssMb,
153
198
  probeChunks,
154
199
  publishManifest,
@@ -1,30 +1,30 @@
1
1
  import {
2
2
  publishManifest
3
- } from "../chunk-EGG7SJTB.js";
3
+ } from "../chunk-INPIXAV5.js";
4
4
  import "../chunk-WIMRJK32.js";
5
- import "../chunk-I64OSTIG.js";
6
- import "../chunk-72NGQCI5.js";
5
+ import "../chunk-H42S7VX2.js";
6
+ import "../chunk-MKRT2DH6.js";
7
7
  import "../chunk-GRPLHUYC.js";
8
8
  import "../chunk-HOTQDYHD.js";
9
9
  import "../chunk-IW3X2MJF.js";
10
10
  import "../chunk-KOSF5FDO.js";
11
11
  import "../chunk-J3NIXHZZ.js";
12
12
  import "../chunk-S7EM5VMW.js";
13
- import "../chunk-3R7RU6WB.js";
14
- import "../chunk-MRAHKUK7.js";
15
- import "../chunk-NXO6VBEM.js";
13
+ import "../chunk-HPEXY3JF.js";
14
+ import "../chunk-PFOPWGMV.js";
15
+ import "../chunk-F6MIQLOO.js";
16
16
  import "../chunk-C2TS5MER.js";
17
- import "../chunk-UFY3RBUV.js";
17
+ import "../chunk-CILFB52S.js";
18
18
  import "../chunk-JQKKMUCT.js";
19
19
  import "../chunk-5FLTDWWP.js";
20
20
  import "../chunk-RIRDBSBG.js";
21
- import "../chunk-AKHN5OWJ.js";
21
+ import "../chunk-LAKHIIHO.js";
22
22
  import "../chunk-TSPERKUS.js";
23
- import "../chunk-P7HCUQCI.js";
23
+ import "../chunk-JSEVC62P.js";
24
24
  import "../chunk-SI2ZUOYD.js";
25
25
  import "../chunk-4AEFFDHP.js";
26
- import "../chunk-SJITQINC.js";
27
- import "../chunk-HGXLCD5H.js";
26
+ import "../chunk-BFWPRX5O.js";
27
+ import "../chunk-LZ5YS3EA.js";
28
28
  import "../chunk-NTXIXOCN.js";
29
29
  import "../chunk-ZOC4GITL.js";
30
30
  export {
@@ -5,8 +5,8 @@ import {
5
5
  maybeWriteMemoryReport,
6
6
  safeHeap,
7
7
  sampleFromBytes
8
- } from "./chunk-SJITQINC.js";
9
- import "./chunk-HGXLCD5H.js";
8
+ } from "./chunk-BFWPRX5O.js";
9
+ import "./chunk-LZ5YS3EA.js";
10
10
  export {
11
11
  DEFAULT_THRESHOLD_MB,
12
12
  buildMemoryReport,
package/dist/merkle.js CHANGED
@@ -6,29 +6,29 @@ import {
6
6
  merkleizeKuboBackend,
7
7
  merkleizeWithStableOrder,
8
8
  rebuildOrderedCarFromBytes
9
- } from "./chunk-I64OSTIG.js";
10
- import "./chunk-72NGQCI5.js";
9
+ } from "./chunk-H42S7VX2.js";
10
+ import "./chunk-MKRT2DH6.js";
11
11
  import "./chunk-GRPLHUYC.js";
12
12
  import "./chunk-HOTQDYHD.js";
13
13
  import "./chunk-IW3X2MJF.js";
14
14
  import "./chunk-KOSF5FDO.js";
15
15
  import "./chunk-J3NIXHZZ.js";
16
16
  import "./chunk-S7EM5VMW.js";
17
- import "./chunk-3R7RU6WB.js";
18
- import "./chunk-MRAHKUK7.js";
19
- import "./chunk-NXO6VBEM.js";
17
+ import "./chunk-HPEXY3JF.js";
18
+ import "./chunk-PFOPWGMV.js";
19
+ import "./chunk-F6MIQLOO.js";
20
20
  import "./chunk-C2TS5MER.js";
21
- import "./chunk-UFY3RBUV.js";
21
+ import "./chunk-CILFB52S.js";
22
22
  import "./chunk-JQKKMUCT.js";
23
23
  import "./chunk-5FLTDWWP.js";
24
24
  import "./chunk-RIRDBSBG.js";
25
- import "./chunk-AKHN5OWJ.js";
25
+ import "./chunk-LAKHIIHO.js";
26
26
  import "./chunk-TSPERKUS.js";
27
- import "./chunk-P7HCUQCI.js";
27
+ import "./chunk-JSEVC62P.js";
28
28
  import "./chunk-SI2ZUOYD.js";
29
29
  import "./chunk-4AEFFDHP.js";
30
- import "./chunk-SJITQINC.js";
31
- import "./chunk-HGXLCD5H.js";
30
+ import "./chunk-BFWPRX5O.js";
31
+ import "./chunk-LZ5YS3EA.js";
32
32
  import "./chunk-NTXIXOCN.js";
33
33
  import "./chunk-ZOC4GITL.js";
34
34
  export {
@@ -21,15 +21,15 @@ import {
21
21
  } from "../chunk-ZYVGHDMU.js";
22
22
  import {
23
23
  WS_HEARTBEAT_TIMEOUT_MS
24
- } from "../chunk-P7HCUQCI.js";
24
+ } from "../chunk-JSEVC62P.js";
25
25
  import {
26
26
  DOTNS_CONTEXT_BYTES,
27
27
  PEOPLE_MEMBER_IDENTIFIER_HEX,
28
28
  PGAS_ASSET_ID
29
29
  } from "../chunk-SI2ZUOYD.js";
30
30
  import "../chunk-4AEFFDHP.js";
31
- import "../chunk-SJITQINC.js";
32
- import "../chunk-HGXLCD5H.js";
31
+ import "../chunk-BFWPRX5O.js";
32
+ import "../chunk-LZ5YS3EA.js";
33
33
  import {
34
34
  loadEnvironments
35
35
  } from "../chunk-NTXIXOCN.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  WS_HEARTBEAT_TIMEOUT_MS
3
- } from "../chunk-P7HCUQCI.js";
3
+ } from "../chunk-JSEVC62P.js";
4
4
  import "../chunk-SI2ZUOYD.js";
5
5
  import "../chunk-4AEFFDHP.js";
6
- import "../chunk-SJITQINC.js";
7
- import "../chunk-HGXLCD5H.js";
6
+ import "../chunk-BFWPRX5O.js";
7
+ import "../chunk-LZ5YS3EA.js";
8
8
  import {
9
9
  loadEnvironments
10
10
  } from "../chunk-NTXIXOCN.js";
package/dist/run-state.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  shouldSkipStaleWarning,
8
8
  stateFilePath,
9
9
  writeRunState
10
- } from "./chunk-HGXLCD5H.js";
10
+ } from "./chunk-LZ5YS3EA.js";
11
11
  export {
12
12
  VERSION,
13
13
  loadRunState,
@@ -4,12 +4,12 @@ import {
4
4
  preflightSssAllowance,
5
5
  sssPeriodEndSec,
6
6
  writeSssAllowanceCache
7
- } from "./chunk-72NGQCI5.js";
7
+ } from "./chunk-MKRT2DH6.js";
8
8
  import "./chunk-GRPLHUYC.js";
9
- import "./chunk-AKHN5OWJ.js";
9
+ import "./chunk-LAKHIIHO.js";
10
10
  import "./chunk-TSPERKUS.js";
11
- import "./chunk-SJITQINC.js";
12
- import "./chunk-HGXLCD5H.js";
11
+ import "./chunk-BFWPRX5O.js";
12
+ import "./chunk-LZ5YS3EA.js";
13
13
  import "./chunk-NTXIXOCN.js";
14
14
  import "./chunk-ZOC4GITL.js";
15
15
  export {
@@ -8,29 +8,29 @@ import {
8
8
  waitForBulletinAuthorization,
9
9
  withTransientRetry,
10
10
  writeBulletinSlotKey
11
- } from "./chunk-I64OSTIG.js";
12
- import "./chunk-72NGQCI5.js";
11
+ } from "./chunk-H42S7VX2.js";
12
+ import "./chunk-MKRT2DH6.js";
13
13
  import "./chunk-GRPLHUYC.js";
14
14
  import "./chunk-HOTQDYHD.js";
15
15
  import "./chunk-IW3X2MJF.js";
16
16
  import "./chunk-KOSF5FDO.js";
17
17
  import "./chunk-J3NIXHZZ.js";
18
18
  import "./chunk-S7EM5VMW.js";
19
- import "./chunk-3R7RU6WB.js";
20
- import "./chunk-MRAHKUK7.js";
21
- import "./chunk-NXO6VBEM.js";
19
+ import "./chunk-HPEXY3JF.js";
20
+ import "./chunk-PFOPWGMV.js";
21
+ import "./chunk-F6MIQLOO.js";
22
22
  import "./chunk-C2TS5MER.js";
23
- import "./chunk-UFY3RBUV.js";
23
+ import "./chunk-CILFB52S.js";
24
24
  import "./chunk-JQKKMUCT.js";
25
25
  import "./chunk-5FLTDWWP.js";
26
26
  import "./chunk-RIRDBSBG.js";
27
- import "./chunk-AKHN5OWJ.js";
27
+ import "./chunk-LAKHIIHO.js";
28
28
  import "./chunk-TSPERKUS.js";
29
- import "./chunk-P7HCUQCI.js";
29
+ import "./chunk-JSEVC62P.js";
30
30
  import "./chunk-SI2ZUOYD.js";
31
31
  import "./chunk-4AEFFDHP.js";
32
- import "./chunk-SJITQINC.js";
33
- import "./chunk-HGXLCD5H.js";
32
+ import "./chunk-BFWPRX5O.js";
33
+ import "./chunk-LZ5YS3EA.js";
34
34
  import "./chunk-NTXIXOCN.js";
35
35
  import "./chunk-ZOC4GITL.js";
36
36
  export {
package/dist/telemetry.js CHANGED
@@ -36,8 +36,8 @@ import {
36
36
  truncateAddress,
37
37
  withDeploySpan,
38
38
  withSpan
39
- } from "./chunk-SJITQINC.js";
40
- import "./chunk-HGXLCD5H.js";
39
+ } from "./chunk-BFWPRX5O.js";
40
+ import "./chunk-LZ5YS3EA.js";
41
41
  export {
42
42
  VERSION,
43
43
  __setDeployRootSpanForTest,
@@ -11,9 +11,9 @@ import {
11
11
  isPreReleaseVersion,
12
12
  preReleaseWarning,
13
13
  promptYesNo
14
- } from "./chunk-MRAHKUK7.js";
15
- import "./chunk-SJITQINC.js";
16
- import "./chunk-HGXLCD5H.js";
14
+ } from "./chunk-PFOPWGMV.js";
15
+ import "./chunk-BFWPRX5O.js";
16
+ import "./chunk-LZ5YS3EA.js";
17
17
  export {
18
18
  assessVersion,
19
19
  checkNodeVersion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bulletin-deploy",
3
- "version": "0.13.0",
3
+ "version": "0.13.1-rc.2",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,6 +36,11 @@ const FLAKE_PATTERNS = [
36
36
  "transaction watcher silent for",
37
37
  "of chain progress (budget=",
38
38
  "did not settle within",
39
+ // Asset Hub runtime-call (EVM address resolution) timeout — the paseo-next-v2
40
+ // AH node degrades under concurrent E2E matrix load and times out ReviveApi.address
41
+ // (#1131). A fresh CI retry lands in a recovered window. Not retried before, so a
42
+ // single bad window failed the whole scenario (shifting failure sets across reruns).
43
+ "ReviveApi.address timed out",
39
44
  ];
40
45
 
41
46
  // output: combined stdout+stderr text from the child. Any flake pattern