bulletin-deploy 0.13.0 → 0.13.1-rc.1

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-72NGQCI5.js → chunk-44N6QKX5.js} +1 -1
  5. package/dist/{chunk-I64OSTIG.js → chunk-5ZQ3OICG.js} +7 -7
  6. package/dist/{chunk-NXO6VBEM.js → chunk-6KV67PGI.js} +1 -1
  7. package/dist/{chunk-UFY3RBUV.js → chunk-AUDBF3PN.js} +2 -2
  8. package/dist/{chunk-SJITQINC.js → chunk-JZITVZ6Z.js} +1 -1
  9. package/dist/{chunk-EGG7SJTB.js → chunk-KPAQ7Z2B.js} +2 -2
  10. package/dist/{chunk-AKHN5OWJ.js → chunk-MEM542KO.js} +1 -1
  11. package/dist/{chunk-P7HCUQCI.js → chunk-QRKIOMUM.js} +65 -16
  12. package/dist/{chunk-MRAHKUK7.js → chunk-SADBALHP.js} +1 -1
  13. package/dist/{chunk-3R7RU6WB.js → chunk-UXHZ3MJ4.js} +3 -3
  14. package/dist/{chunk-HGXLCD5H.js → chunk-Z3UT6JQ5.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 +18 -2
  23. package/dist/dotns.js +11 -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-MEM542KO.js";
13
13
  import "./chunk-TSPERKUS.js";
14
- import "./chunk-SJITQINC.js";
15
- import "./chunk-HGXLCD5H.js";
14
+ import "./chunk-JZITVZ6Z.js";
15
+ import "./chunk-Z3UT6JQ5.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-UXHZ3MJ4.js";
14
+ import "./chunk-SADBALHP.js";
15
+ import "./chunk-JZITVZ6Z.js";
16
+ import "./chunk-Z3UT6JQ5.js";
17
17
  export {
18
18
  buildCliFlagsSummary,
19
19
  buildLabels,
@@ -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-MEM542KO.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
  preflightSssAllowance
3
- } from "./chunk-72NGQCI5.js";
3
+ } from "./chunk-44N6QKX5.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-UXHZ3MJ4.js";
35
35
  import {
36
36
  getBestBlockNumber,
37
37
  probeChunks,
38
38
  probeFinalityGap
39
- } from "./chunk-NXO6VBEM.js";
39
+ } from "./chunk-6KV67PGI.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-AUDBF3PN.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-MEM542KO.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-QRKIOMUM.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-JZITVZ6Z.js";
90
90
  import {
91
91
  DEFAULT_ENV_ID,
92
92
  getPopSelfServeConfig,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  captureWarning
3
- } from "./chunk-SJITQINC.js";
3
+ } from "./chunk-JZITVZ6Z.js";
4
4
 
5
5
  // src/chunk-probe.ts
6
6
  import { Twox128, Blake2128Concat, decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings";
@@ -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-MEM542KO.js";
8
8
  import {
9
9
  DEFAULT_MNEMONIC
10
- } from "./chunk-P7HCUQCI.js";
10
+ } from "./chunk-QRKIOMUM.js";
11
11
 
12
12
  // src/deploy-actors.ts
13
13
  var DEFAULT_WORKER_SURI = DEFAULT_MNEMONIC;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-HGXLCD5H.js";
4
+ } from "./chunk-Z3UT6JQ5.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -7,10 +7,10 @@ import {
7
7
  resolveDotnsConnectOptions,
8
8
  storeDirectory,
9
9
  storeFile
10
- } from "./chunk-I64OSTIG.js";
10
+ } from "./chunk-5ZQ3OICG.js";
11
11
  import {
12
12
  DotNS
13
- } from "./chunk-P7HCUQCI.js";
13
+ } from "./chunk-QRKIOMUM.js";
14
14
  import {
15
15
  getPopSelfServeConfig,
16
16
  loadEnvironments,
@@ -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-JZITVZ6Z.js";
7
7
  import {
8
8
  loadEnvironments
9
9
  } from "./chunk-NTXIXOCN.js";
@@ -11,7 +11,7 @@ import {
11
11
  setDeploySentryTag,
12
12
  truncateAddress,
13
13
  withSpan
14
- } from "./chunk-SJITQINC.js";
14
+ } from "./chunk-JZITVZ6Z.js";
15
15
  import {
16
16
  validateContractAddresses
17
17
  } from "./chunk-NTXIXOCN.js";
@@ -125,6 +125,8 @@ 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;
128
130
  var OPERATION_TIMEOUT_MS = 3e5;
129
131
  var TX_TIMEOUT_MS = 9e4;
130
132
  var TX_CHAIN_TIME_BUDGET_MS = 18e4;
@@ -173,6 +175,24 @@ function dotnsRetryBackoffMs(attempt, rand = Math.random) {
173
175
  const ceil = Math.min(DOTNS_RETRY_BASE_MS * 2 ** (attempt - 1), DOTNS_RETRY_MAX_MS);
174
176
  return Math.round(ceil * (0.5 + rand() * 0.5));
175
177
  }
178
+ async function withRetry(fn, opts) {
179
+ const backoffMs = opts.backoffMs ?? dotnsRetryBackoffMs;
180
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
181
+ let lastErr;
182
+ for (let attempt = 1; attempt <= opts.attempts; attempt++) {
183
+ try {
184
+ return await fn(attempt);
185
+ } catch (e) {
186
+ lastErr = e;
187
+ if (attempt < opts.attempts) {
188
+ const b = backoffMs(attempt);
189
+ opts.onRetry?.(attempt, e, b);
190
+ await sleep(b);
191
+ }
192
+ }
193
+ }
194
+ throw lastErr;
195
+ }
176
196
  function shouldRetryTxAttempt(attempt, maxAttempts, decision) {
177
197
  return decision === "retry" && attempt < maxAttempts;
178
198
  }
@@ -1082,7 +1102,7 @@ var DotNS = class {
1082
1102
  // Test-only seam: fallback result for reprove() when the real call throws "not strictly
1083
1103
  // greater than stored" (account already at latest revision). Any other error propagates.
1084
1104
  _reproveFallbackForTest = null;
1085
- /** Test-only: register a fallback reprove result used only if the real reprove() throws "not strictly greater than stored". Consumed once. */
1105
+ /** 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
1106
  __setReproveFallbackForTest(result) {
1087
1107
  this._reproveFallbackForTest = result;
1088
1108
  }
@@ -1148,22 +1168,38 @@ var DotNS = class {
1148
1168
  setDeploySentryTag("deploy.dotns.signer", truncateAddress(this.substrateAddress));
1149
1169
  return withSpan("deploy.dotns.connect", "dotns connect", {}, async () => {
1150
1170
  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}`);
1171
+ this.evmAddress = await withRetry(async (attempt) => {
1172
+ if (this.client) {
1173
+ try {
1174
+ this.client.destroy();
1175
+ } catch {
1176
+ }
1177
+ }
1178
+ this.client = createClient(getWsProvider(rpc, { heartbeatTimeout: WS_HEARTBEAT_TIMEOUT_MS }));
1179
+ const unsafeApi = this.client.getUnsafeApi();
1180
+ this.clientWrapper = new ReviveClientWrapper(unsafeApi);
1181
+ const addr = await withTimeout(
1182
+ this.clientWrapper.getEvmAddress(this.substrateAddress),
1183
+ CONNECTION_TIMEOUT_MS,
1184
+ "ReviveApi.address"
1185
+ );
1186
+ if (attempt > 1) setDeployAttribute("deploy.dotns.revive_address_attempts", String(attempt));
1187
+ return addr;
1188
+ }, {
1189
+ attempts: REVIVE_ADDRESS_ATTEMPTS,
1190
+ onRetry: (attempt, e, backoff) => {
1191
+ const inner = e?.message?.slice(0, 160) ?? String(e).slice(0, 160);
1192
+ console.log(` ReviveApi.address attempt ${attempt}/${REVIVE_ADDRESS_ATTEMPTS} failed (${inner}) \u2014 retrying in ${Math.round(backoff / 1e3)}s\u2026`);
1193
+ }
1194
+ });
1160
1195
  } catch (e) {
1161
- const inner = e.message?.slice(0, 200) ?? String(e).slice(0, 200);
1196
+ const inner = e?.message?.slice(0, 200) ?? String(e).slice(0, 200);
1162
1197
  const rpcHint = inner.includes("timed out") ? `; RPC: ${rpc} \u2014 retry or set DOTNS_RPC to another endpoint` : "";
1163
1198
  throw new Error(
1164
- `DotNS connect: failed to resolve EVM address from ${this.substrateAddress} via ReviveApi.address (${inner})${rpcHint}`
1199
+ `DotNS connect: failed to resolve EVM address from ${this.substrateAddress} via ReviveApi.address after ${REVIVE_ADDRESS_ATTEMPTS} attempts (${inner})${rpcHint}`
1165
1200
  );
1166
1201
  }
1202
+ console.log(` H160 Address: ${this.evmAddress}`);
1167
1203
  setDeployAttribute("deploy.dotns.rpc_used", rpc);
1168
1204
  setDeployAttribute("deploy.dotns.evm_address", this.evmAddress);
1169
1205
  this.connected = true;
@@ -1837,10 +1873,17 @@ var DotNS = class {
1837
1873
  console.log(`
1838
1874
  Linking content...`);
1839
1875
  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();
1876
+ let finalOnChain = "0x";
1877
+ try {
1878
+ await withRetry(async () => {
1879
+ finalOnChain = (await this.getContenthash(domainName) || "0x").toLowerCase();
1880
+ if (finalOnChain !== expected) throw new Error(`contenthash still ${finalOnChain}, awaiting ${expected}`);
1881
+ }, { attempts: CONTENTHASH_VERIFY_ATTEMPTS });
1882
+ } catch {
1883
+ }
1841
1884
  if (finalOnChain !== expected) {
1842
1885
  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.`
1886
+ `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
1887
  );
1845
1888
  }
1846
1889
  setDeployAttribute("deploy.dotns.tx_resolution", txRes.kind);
@@ -2751,9 +2794,12 @@ var DotNS = class {
2751
2794
  });
2752
2795
  return result;
2753
2796
  } catch (e) {
2754
- if (this._reproveFallbackForTest && typeof e?.message === "string" && e.message.includes("not strictly greater than stored")) {
2797
+ if (this._reproveFallbackForTest) {
2755
2798
  const fb = this._reproveFallbackForTest;
2756
2799
  this._reproveFallbackForTest = null;
2800
+ if (typeof e?.message === "string" && !e.message.includes("not strictly greater than stored")) {
2801
+ console.log(` (test) real reprove() errored transiently \u2014 using synthetic fallback: ${(e.message ?? String(e)).slice(0, 120)}`);
2802
+ }
2757
2803
  return fb;
2758
2804
  }
2759
2805
  throw e;
@@ -2838,6 +2884,8 @@ export {
2838
2884
  DECIMALS,
2839
2885
  NATIVE_TO_ETH_RATIO,
2840
2886
  CONNECTION_TIMEOUT_MS,
2887
+ REVIVE_ADDRESS_ATTEMPTS,
2888
+ CONTENTHASH_VERIFY_ATTEMPTS,
2841
2889
  OPERATION_TIMEOUT_MS,
2842
2890
  TX_TIMEOUT_MS,
2843
2891
  TX_CHAIN_TIME_BUDGET_MS,
@@ -2854,6 +2902,7 @@ export {
2854
2902
  classifyTxRetryDecision,
2855
2903
  classifyWatcherSilentFastFail,
2856
2904
  dotnsRetryBackoffMs,
2905
+ withRetry,
2857
2906
  shouldRetryTxAttempt,
2858
2907
  shouldRegateBeforeResign,
2859
2908
  makeRetryStatusFilter,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-SJITQINC.js";
3
+ } from "./chunk-JZITVZ6Z.js";
4
4
 
5
5
  // src/version-check.ts
6
6
  import { execSync, execFileSync } from "child_process";
@@ -2,15 +2,15 @@ import {
2
2
  classifyErrorArea,
3
3
  isInteractive,
4
4
  promptYesNo
5
- } from "./chunk-MRAHKUK7.js";
5
+ } from "./chunk-SADBALHP.js";
6
6
  import {
7
7
  VERSION,
8
8
  getCurrentSentryTraceId,
9
9
  resolveIssueRepoSlug
10
- } from "./chunk-SJITQINC.js";
10
+ } from "./chunk-JZITVZ6Z.js";
11
11
  import {
12
12
  package_default
13
- } from "./chunk-HGXLCD5H.js";
13
+ } from "./chunk-Z3UT6JQ5.js";
14
14
 
15
15
  // src/bug-report.ts
16
16
  import { execSync, execFileSync } from "child_process";
@@ -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.1",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -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-6KV67PGI.js";
12
+ import "./chunk-JZITVZ6Z.js";
13
+ import "./chunk-Z3UT6JQ5.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-5ZQ3OICG.js";
7
7
  import {
8
8
  preflightSssAllowance
9
- } from "../chunk-72NGQCI5.js";
9
+ } from "../chunk-44N6QKX5.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-UXHZ3MJ4.js";
19
+ import "../chunk-SADBALHP.js";
20
+ import "../chunk-6KV67PGI.js";
21
21
  import "../chunk-C2TS5MER.js";
22
- import "../chunk-UFY3RBUV.js";
22
+ import "../chunk-AUDBF3PN.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-MEM542KO.js";
40
40
  import {
41
41
  CLI_NAME
42
42
  } from "../chunk-TSPERKUS.js";
43
- import "../chunk-P7HCUQCI.js";
43
+ import "../chunk-QRKIOMUM.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-JZITVZ6Z.js";
47
+ import "../chunk-Z3UT6JQ5.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-44N6QKX5.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-MEM542KO.js";
13
13
  import "../chunk-TSPERKUS.js";
14
- import "../chunk-SJITQINC.js";
15
- import "../chunk-HGXLCD5H.js";
14
+ import "../chunk-JZITVZ6Z.js";
15
+ import "../chunk-Z3UT6JQ5.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-QRKIOMUM.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-JZITVZ6Z.js";
11
+ import "../chunk-Z3UT6JQ5.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-MEM542KO.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-JZITVZ6Z.js";
10
+ import "../chunk-Z3UT6JQ5.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-AUDBF3PN.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-MEM542KO.js";
10
10
  import "./chunk-TSPERKUS.js";
11
- import "./chunk-P7HCUQCI.js";
11
+ import "./chunk-QRKIOMUM.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-JZITVZ6Z.js";
15
+ import "./chunk-Z3UT6JQ5.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-5ZQ3OICG.js";
59
+ import "./chunk-44N6QKX5.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-UXHZ3MJ4.js";
67
+ import "./chunk-SADBALHP.js";
68
+ import "./chunk-6KV67PGI.js";
69
69
  import "./chunk-C2TS5MER.js";
70
- import "./chunk-UFY3RBUV.js";
70
+ import "./chunk-AUDBF3PN.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-MEM542KO.js";
75
75
  import "./chunk-TSPERKUS.js";
76
- import "./chunk-P7HCUQCI.js";
76
+ import "./chunk-QRKIOMUM.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-JZITVZ6Z.js";
80
+ import "./chunk-Z3UT6JQ5.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,8 @@ 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;
148
150
  declare const OPERATION_TIMEOUT_MS: number;
149
151
  declare const TX_TIMEOUT_MS: number;
150
152
  declare const TX_CHAIN_TIME_BUDGET_MS: number;
@@ -187,6 +189,20 @@ declare function classifyTxRetryDecision(err: unknown): "retry" | "abort";
187
189
  */
188
190
  declare function classifyWatcherSilentFastFail(err: unknown, isPhoneSigner: boolean | undefined): NonRetryableError | null;
189
191
  declare function dotnsRetryBackoffMs(attempt: number, rand?: () => number): number;
192
+ /**
193
+ * Run `fn` up to `attempts` times, backing off between failures. Returns the
194
+ * first success; rethrows the LAST error if every attempt fails. `sleep` and
195
+ * `backoffMs` are injectable so the retry policy is unit-testable without real
196
+ * timers. Used for the ReviveApi.address resolution in connect() (#1131) — a
197
+ * generic seam so the "retry N times with backoff" behaviour is tested once,
198
+ * independent of the live-chain call it wraps.
199
+ */
200
+ declare function withRetry<T>(fn: (attempt: number) => Promise<T>, opts: {
201
+ attempts: number;
202
+ onRetry?: (attempt: number, err: unknown, backoffMs: number) => void;
203
+ backoffMs?: (attempt: number) => number;
204
+ sleep?: (ms: number) => Promise<void>;
205
+ }): Promise<T>;
190
206
  /**
191
207
  * Whether a failed attempt should be retried: only when the error is
192
208
  * retry-eligible AND there's a later attempt left in the budget. Extracted so
@@ -508,7 +524,7 @@ declare class DotNS {
508
524
  /** Test-only: inject a fixed getUserPopStatus return value for the next call. Consumed once. */
509
525
  __setUserPopStatusForTest(status: number): void;
510
526
  private _reproveFallbackForTest;
511
- /** Test-only: register a fallback reprove result used only if the real reprove() throws "not strictly greater than stored". Consumed once. */
527
+ /** 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
528
  __setReproveFallbackForTest(result: {
513
529
  oldRevision: number;
514
530
  newRevision: number;
@@ -709,4 +725,4 @@ declare class DotNS {
709
725
  }
710
726
  declare const dotns: DotNS;
711
727
 
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 };
728
+ 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, 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,
@@ -63,17 +65,19 @@ import {
63
65
  validateDomainLabel,
64
66
  verifyEffectWithGrace,
65
67
  verifyNonceAdvanced,
66
- weiToNative
67
- } from "./chunk-P7HCUQCI.js";
68
+ weiToNative,
69
+ withRetry
70
+ } from "./chunk-QRKIOMUM.js";
68
71
  import "./chunk-SI2ZUOYD.js";
69
72
  import "./chunk-4AEFFDHP.js";
70
- import "./chunk-SJITQINC.js";
71
- import "./chunk-HGXLCD5H.js";
73
+ import "./chunk-JZITVZ6Z.js";
74
+ import "./chunk-Z3UT6JQ5.js";
72
75
  import "./chunk-NTXIXOCN.js";
73
76
  import "./chunk-ZOC4GITL.js";
74
77
  export {
75
78
  ATTR_TX_RESOLUTION_KIND,
76
79
  CONNECTION_TIMEOUT_MS,
80
+ CONTENTHASH_VERIFY_ATTEMPTS,
77
81
  CONTRACTS,
78
82
  ContractDryRunRevertError,
79
83
  DECIMALS,
@@ -90,6 +94,7 @@ export {
90
94
  PUBLISHER_ABI,
91
95
  ProofOfPersonhoodStatus,
92
96
  PublisherNotSupportedError,
97
+ REVIVE_ADDRESS_ATTEMPTS,
93
98
  RPC_ENDPOINTS,
94
99
  ReviveClientWrapper,
95
100
  TX_CHAIN_TIME_BUDGET_MS,
@@ -136,5 +141,6 @@ export {
136
141
  validateDomainLabel,
137
142
  verifyEffectWithGrace,
138
143
  verifyNonceAdvanced,
139
- weiToNative
144
+ weiToNative,
145
+ withRetry
140
146
  };
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-KPAQ7Z2B.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-5ZQ3OICG.js";
28
+ import "./chunk-44N6QKX5.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-UXHZ3MJ4.js";
53
+ import "./chunk-SADBALHP.js";
54
54
  import {
55
55
  probeChunks
56
- } from "./chunk-NXO6VBEM.js";
56
+ } from "./chunk-6KV67PGI.js";
57
57
  import "./chunk-C2TS5MER.js";
58
- import "./chunk-UFY3RBUV.js";
58
+ import "./chunk-AUDBF3PN.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-MEM542KO.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-QRKIOMUM.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-JZITVZ6Z.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-Z3UT6JQ5.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-KPAQ7Z2B.js";
4
4
  import "../chunk-WIMRJK32.js";
5
- import "../chunk-I64OSTIG.js";
6
- import "../chunk-72NGQCI5.js";
5
+ import "../chunk-5ZQ3OICG.js";
6
+ import "../chunk-44N6QKX5.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-UXHZ3MJ4.js";
14
+ import "../chunk-SADBALHP.js";
15
+ import "../chunk-6KV67PGI.js";
16
16
  import "../chunk-C2TS5MER.js";
17
- import "../chunk-UFY3RBUV.js";
17
+ import "../chunk-AUDBF3PN.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-MEM542KO.js";
22
22
  import "../chunk-TSPERKUS.js";
23
- import "../chunk-P7HCUQCI.js";
23
+ import "../chunk-QRKIOMUM.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-JZITVZ6Z.js";
27
+ import "../chunk-Z3UT6JQ5.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-JZITVZ6Z.js";
9
+ import "./chunk-Z3UT6JQ5.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-5ZQ3OICG.js";
10
+ import "./chunk-44N6QKX5.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-UXHZ3MJ4.js";
18
+ import "./chunk-SADBALHP.js";
19
+ import "./chunk-6KV67PGI.js";
20
20
  import "./chunk-C2TS5MER.js";
21
- import "./chunk-UFY3RBUV.js";
21
+ import "./chunk-AUDBF3PN.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-MEM542KO.js";
26
26
  import "./chunk-TSPERKUS.js";
27
- import "./chunk-P7HCUQCI.js";
27
+ import "./chunk-QRKIOMUM.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-JZITVZ6Z.js";
31
+ import "./chunk-Z3UT6JQ5.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-QRKIOMUM.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-JZITVZ6Z.js";
32
+ import "../chunk-Z3UT6JQ5.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-QRKIOMUM.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-JZITVZ6Z.js";
7
+ import "../chunk-Z3UT6JQ5.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-Z3UT6JQ5.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-44N6QKX5.js";
8
8
  import "./chunk-GRPLHUYC.js";
9
- import "./chunk-AKHN5OWJ.js";
9
+ import "./chunk-MEM542KO.js";
10
10
  import "./chunk-TSPERKUS.js";
11
- import "./chunk-SJITQINC.js";
12
- import "./chunk-HGXLCD5H.js";
11
+ import "./chunk-JZITVZ6Z.js";
12
+ import "./chunk-Z3UT6JQ5.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-5ZQ3OICG.js";
12
+ import "./chunk-44N6QKX5.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-UXHZ3MJ4.js";
20
+ import "./chunk-SADBALHP.js";
21
+ import "./chunk-6KV67PGI.js";
22
22
  import "./chunk-C2TS5MER.js";
23
- import "./chunk-UFY3RBUV.js";
23
+ import "./chunk-AUDBF3PN.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-MEM542KO.js";
28
28
  import "./chunk-TSPERKUS.js";
29
- import "./chunk-P7HCUQCI.js";
29
+ import "./chunk-QRKIOMUM.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-JZITVZ6Z.js";
33
+ import "./chunk-Z3UT6JQ5.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-JZITVZ6Z.js";
40
+ import "./chunk-Z3UT6JQ5.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-SADBALHP.js";
15
+ import "./chunk-JZITVZ6Z.js";
16
+ import "./chunk-Z3UT6JQ5.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.1",
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