bulletin-deploy 0.18.0 → 0.18.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 (38) hide show
  1. package/bin/bulletin-deploy +4 -1
  2. package/dist/auth-config.js +3 -3
  3. package/dist/bug-report.js +4 -4
  4. package/dist/chain-health.js +3 -3
  5. package/dist/{chunk-A7GZZQ3Q.js → chunk-2WGCBESY.js} +2 -2
  6. package/dist/{chunk-UY2DR5V4.js → chunk-3BDYD4BG.js} +3 -3
  7. package/dist/{chunk-TIQ3TCK4.js → chunk-5JVTBR5H.js} +3 -3
  8. package/dist/{chunk-WYJX7OFF.js → chunk-64UKPUK4.js} +1 -1
  9. package/dist/{chunk-LZ7HCV4C.js → chunk-6HPDXI7E.js} +1 -1
  10. package/dist/{chunk-RSAEMNX4.js → chunk-FJTZNSNU.js} +128 -9
  11. package/dist/{chunk-3CES4RZG.js → chunk-HIODF4QF.js} +1 -1
  12. package/dist/{chunk-6LR7OM7F.js → chunk-Q6NVSUCX.js} +8 -8
  13. package/dist/{chunk-6WLVGBLQ.js → chunk-Q7CHACT6.js} +1 -1
  14. package/dist/{chunk-6BIAW73W.js → chunk-RULOELNF.js} +1 -1
  15. package/dist/{chunk-3TDAKT7Y.js → chunk-SSV2KD3B.js} +2 -2
  16. package/dist/{chunk-F4OW5UVA.js → chunk-UPQ2JGIO.js} +1 -1
  17. package/dist/chunk-probe.js +3 -3
  18. package/dist/commands/login.js +11 -11
  19. package/dist/commands/logout.js +4 -4
  20. package/dist/commands/transfer.js +4 -4
  21. package/dist/commands/whoami.js +3 -3
  22. package/dist/deploy-actors.js +6 -6
  23. package/dist/deploy.js +11 -11
  24. package/dist/dotns.d.ts +56 -2
  25. package/dist/dotns.js +4 -4
  26. package/dist/index.js +12 -12
  27. package/dist/manifest/publish.js +12 -12
  28. package/dist/memory-report.js +2 -2
  29. package/dist/merkle.js +11 -11
  30. package/dist/personhood/bootstrap.js +4 -4
  31. package/dist/personhood/people-client.js +4 -4
  32. package/dist/run-state.js +1 -1
  33. package/dist/sss-allowance-cache.js +4 -4
  34. package/dist/storage-signer.js +11 -11
  35. package/dist/telemetry.js +2 -2
  36. package/dist/version-check.js +3 -3
  37. package/package.json +2 -2
  38. package/tools/release-retry-wrapper.mjs +11 -0
@@ -585,8 +585,11 @@ try {
585
585
  console.error(`Manifest publish failed: ${err?.message ?? err}`);
586
586
  process.exit(err instanceof NonRetryableError ? EXIT_CODE_NO_RETRY : 1);
587
587
  }
588
+ } else if (!loaded && !flags.noManifest) {
589
+ // Only the walk-up can come back empty: an explicit --config that is
590
+ // missing throws out of tryLoadProductConfig rather than returning null.
591
+ console.log(`No product config found from ${buildDirAbs} upward; content deployed, no manifest published.`);
588
592
  }
589
- // No config (or --no-manifest) → the contenthash-only deploy above is the whole job; nothing else to do.
590
593
  }
591
594
 
592
595
  if (!flags.help && !flags.version) {
@@ -9,12 +9,12 @@ import {
9
9
  getPeopleChainEndpoints,
10
10
  hasPersistedSession,
11
11
  resolveBulletinEndpoints
12
- } from "./chunk-6WLVGBLQ.js";
12
+ } from "./chunk-Q7CHACT6.js";
13
13
  import "./chunk-TSPERKUS.js";
14
14
  import "./chunk-HDGD5FYX.js";
15
15
  import "./chunk-ZOC4GITL.js";
16
- import "./chunk-3CES4RZG.js";
17
- import "./chunk-3TDAKT7Y.js";
16
+ import "./chunk-HIODF4QF.js";
17
+ import "./chunk-SSV2KD3B.js";
18
18
  export {
19
19
  DOT_DAPP_ID,
20
20
  DOT_DERIVATION_INDEX,
@@ -10,10 +10,10 @@ import {
10
10
  offerBugReport,
11
11
  scrubSecrets,
12
12
  setDeployContext
13
- } from "./chunk-UY2DR5V4.js";
14
- import "./chunk-F4OW5UVA.js";
15
- import "./chunk-3CES4RZG.js";
16
- import "./chunk-3TDAKT7Y.js";
13
+ } from "./chunk-3BDYD4BG.js";
14
+ import "./chunk-UPQ2JGIO.js";
15
+ import "./chunk-HIODF4QF.js";
16
+ import "./chunk-SSV2KD3B.js";
17
17
  export {
18
18
  buildCliFlagsSummary,
19
19
  buildLabels,
@@ -3,9 +3,9 @@ import {
3
3
  DEFAULT_WINDOW_BLOCKS,
4
4
  MAX_SPANS_PER_SAMPLER,
5
5
  endpointHost
6
- } from "./chunk-LZ7HCV4C.js";
7
- import "./chunk-3CES4RZG.js";
8
- import "./chunk-3TDAKT7Y.js";
6
+ } from "./chunk-6HPDXI7E.js";
7
+ import "./chunk-HIODF4QF.js";
8
+ import "./chunk-SSV2KD3B.js";
9
9
  export {
10
10
  ChainHealthSampler,
11
11
  DEFAULT_WINDOW_BLOCKS,
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-5FLTDWWP.js";
5
5
  import {
6
6
  DEFAULT_MNEMONIC
7
- } from "./chunk-RSAEMNX4.js";
7
+ } from "./chunk-FJTZNSNU.js";
8
8
  import {
9
9
  DOT_PRODUCT_ID
10
- } from "./chunk-6WLVGBLQ.js";
10
+ } from "./chunk-Q7CHACT6.js";
11
11
 
12
12
  // src/deploy-actors.ts
13
13
  var DEFAULT_WORKER_SURI = DEFAULT_MNEMONIC;
@@ -2,15 +2,15 @@ import {
2
2
  classifyErrorArea,
3
3
  isInteractive,
4
4
  promptYesNo
5
- } from "./chunk-F4OW5UVA.js";
5
+ } from "./chunk-UPQ2JGIO.js";
6
6
  import {
7
7
  VERSION,
8
8
  getCurrentSentryTraceId,
9
9
  resolveIssueRepoSlug
10
- } from "./chunk-3CES4RZG.js";
10
+ } from "./chunk-HIODF4QF.js";
11
11
  import {
12
12
  package_default
13
- } from "./chunk-3TDAKT7Y.js";
13
+ } from "./chunk-SSV2KD3B.js";
14
14
 
15
15
  // src/bug-report.ts
16
16
  import { execSync, execFileSync } from "child_process";
@@ -13,13 +13,13 @@ import {
13
13
  setBulletinEndpoints,
14
14
  storeDirectory,
15
15
  storeFile
16
- } from "./chunk-6LR7OM7F.js";
16
+ } from "./chunk-Q6NVSUCX.js";
17
17
  import {
18
18
  DEFAULT_TLD,
19
19
  DotNS,
20
20
  TX_KIND_SKIPPED,
21
21
  stripTldSuffix
22
- } from "./chunk-RSAEMNX4.js";
22
+ } from "./chunk-FJTZNSNU.js";
23
23
  import {
24
24
  DEFAULT_ENV_ID,
25
25
  getPopSelfServeConfig,
@@ -33,7 +33,7 @@ import {
33
33
  setDeployAttribute,
34
34
  withManifestSpan,
35
35
  withSpan
36
- } from "./chunk-3CES4RZG.js";
36
+ } from "./chunk-HIODF4QF.js";
37
37
 
38
38
  // src/manifest/publish.ts
39
39
  import * as fs2 from "fs/promises";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  captureWarning
3
- } from "./chunk-3CES4RZG.js";
3
+ } from "./chunk-HIODF4QF.js";
4
4
 
5
5
  // src/chunk-probe.ts
6
6
  import { Twox128, Blake2128Concat, decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  emitIntervalSpan,
3
3
  setDeployAttribute
4
- } from "./chunk-3CES4RZG.js";
4
+ } from "./chunk-HIODF4QF.js";
5
5
 
6
6
  // src/chain-health.ts
7
7
  var DEFAULT_WINDOW_BLOCKS = 10;
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-ZOC4GITL.js";
14
14
  import {
15
15
  ChainHealthSampler
16
- } from "./chunk-LZ7HCV4C.js";
16
+ } from "./chunk-6HPDXI7E.js";
17
17
  import {
18
18
  captureWarning,
19
19
  markCodePath,
@@ -21,7 +21,7 @@ import {
21
21
  setDeploySentryTag,
22
22
  truncateAddress,
23
23
  withSpan
24
- } from "./chunk-3CES4RZG.js";
24
+ } from "./chunk-HIODF4QF.js";
25
25
  import {
26
26
  POP_CONTROLLER_PROBE_ABI,
27
27
  PROTOCOL_PROBE_LABEL,
@@ -413,6 +413,9 @@ var DOTNS_REGISTRY_ABI = [
413
413
  { inputs: [{ name: "node", type: "bytes32" }], name: "owner", outputs: [{ name: "", type: "address" }], stateMutability: "view", type: "function" },
414
414
  { inputs: [{ name: "node", type: "bytes32" }], name: "resolver", outputs: [{ name: "", type: "address" }], stateMutability: "view", type: "function" }
415
415
  ];
416
+ var DOTNS_REGISTRY_SET_SUBNODE_OWNER_ABI_V07 = [
417
+ { inputs: [{ name: "record", type: "tuple", components: [{ name: "parentNode", type: "bytes32" }, { name: "subLabel", type: "string" }, { name: "parentLabel", type: "string" }, { name: "owner", type: "address" }, { name: "persist", type: "bool" }] }], name: "setSubnodeOwner", outputs: [{ name: "subnode", type: "bytes32" }], stateMutability: "nonpayable", type: "function" }
418
+ ];
416
419
  var DOTNS_CONTENT_RESOLVER_ABI = [
417
420
  { inputs: [{ name: "node", type: "bytes32" }, { name: "hash", type: "bytes" }], name: "setContenthash", outputs: [], stateMutability: "nonpayable", type: "function" },
418
421
  { inputs: [{ name: "node", type: "bytes32" }], name: "contenthash", outputs: [{ name: "", type: "bytes" }], stateMutability: "view", type: "function" }
@@ -482,6 +485,9 @@ function dotnsContractName(address, contracts = CONTRACTS) {
482
485
  function stringifyDebugValue(value) {
483
486
  return JSON.stringify(value, (_key, nested) => typeof nested === "bigint" ? nested.toString() : nested);
484
487
  }
488
+ function isBareRevertResult(revertData, revertFlags) {
489
+ return (revertData === void 0 || revertData.trim() === "0x") && revertFlags === 1n;
490
+ }
485
491
  function dotnsTxDebugEnabled() {
486
492
  return process.env.BULLETIN_DEPLOY_DOTNS_DEBUG === "1" || process.env.DOTNS_DEBUG === "1";
487
493
  }
@@ -510,8 +516,7 @@ function formatContractDryRunFailure(gasEstimate, context) {
510
516
  lines.push(` calldata: ${context.encodedData}`);
511
517
  if (context.args) lines.push(` args: ${stringifyDebugValue(context.args)}`);
512
518
  }
513
- const revertData = gasEstimate.revertData;
514
- const isBareRevert = (revertData === void 0 || revertData.trim() === "0x") && gasEstimate.revertFlags === 1n;
519
+ const isBareRevert = isBareRevertResult(gasEstimate.revertData, gasEstimate.revertFlags);
515
520
  if (isBareRevert && BARE_REVERT_DIAGNOSTIC_FUNCTIONS.has(functionName)) {
516
521
  if (functionName === "register") {
517
522
  lines.push(
@@ -1322,6 +1327,22 @@ var DotNS = class _DotNS {
1322
1327
  // this into a throw-if-unset without re-checking both of those.
1323
1328
  _protocolVersion = DEFAULT_DOTNS_PROFILE;
1324
1329
  _adapter = getAdapter(DEFAULT_DOTNS_PROFILE);
1330
+ // #1435: which setSubnodeOwner tuple shape this connection's chain accepts
1331
+ // — "legacy" (4-field, pre-v0.7) or "v07" (5-field + persist). `null` means
1332
+ // "not yet probed"; resolveSubnodeOwnerShape resolves it lazily on the
1333
+ // FIRST subname write per connection (register or transfer, whichever runs
1334
+ // first) and caches the verdict here for the rest of that connection's
1335
+ // life. Defaults to "legacy" (NOT null) for the exact same reason
1336
+ // _protocolVersion defaults to DEFAULT_DOTNS_PROFILE above: every existing
1337
+ // test/library caller that constructs a DotNS instance and stubs
1338
+ // contractTransaction/submitBatchedContractCalls directly WITHOUT ever
1339
+ // calling connect() must keep today's exact pre-#1435 4-field behaviour,
1340
+ // with no probe attempted at all (there is no clientWrapper to probe
1341
+ // against in that case). connect() resets this to null so a real
1342
+ // connection always re-probes on its first subname write rather than
1343
+ // trusting this default or a previous connection's stale verdict — see
1344
+ // the reset next to detectProtocolVersion() below.
1345
+ _subnodeOwnerShape = "legacy";
1325
1346
  _onPhoneSigningRequired = void 0;
1326
1347
  _confirmPhoneReady = void 0;
1327
1348
  /** Total phone-signature count for this DotNS session (drives the `total` field passed to confirmPhoneReady). */
@@ -1359,6 +1380,10 @@ var DotNS = class _DotNS {
1359
1380
  this._protocolVersion = profile;
1360
1381
  this._adapter = getAdapter(profile);
1361
1382
  }
1383
+ /** #1435 test-only: pin the setSubnodeOwner shape cache directly ("legacy", "v07", or null to force resolveSubnodeOwnerShape to re-probe), bypassing the live dry-run probe — for unit tests that stub the probe or exercise the fallback/caching logic itself. */
1384
+ __setSubnodeOwnerShapeForTest(shape) {
1385
+ this._subnodeOwnerShape = shape;
1386
+ }
1362
1387
  constructor() {
1363
1388
  this.client = null;
1364
1389
  this.clientWrapper = null;
@@ -1540,6 +1565,7 @@ var DotNS = class _DotNS {
1540
1565
  this.connected = true;
1541
1566
  await this.resolveAndVerifyTld(options.tld);
1542
1567
  await this.detectProtocolVersion();
1568
+ this._subnodeOwnerShape = null;
1543
1569
  if (options.dotnsProtocol && options.dotnsProtocol !== this._protocolVersion) {
1544
1570
  this.connected = false;
1545
1571
  throw new Error(
@@ -1932,8 +1958,13 @@ var DotNS = class _DotNS {
1932
1958
  * v0.5.8-rc1 (pricingVersion answers on both), and classifyProtocolVersion
1933
1959
  * already only consults it when pricingVersionOk is true, so gating it
1934
1960
  * behind that result resolving first would just add a serialized
1935
- * round-trip for no benefit — worse once v0.6.0 is live everywhere (#1410),
1936
- * since that "no benefit" case becomes the common one. Resolves to `null`
1961
+ * round-trip for no benefit — worse as v0.6.0 spreads (#1410), since that
1962
+ * "no benefit" case becomes the common one. The discarded-probe cost does
1963
+ * NOT self-liquidate the moment v0.6.0 ships: it persists on every
1964
+ * environment still running an older generation (dotns-protocol.ts's
1965
+ * profile comment owns per-generation status — this one does not restate
1966
+ * it). Parallel regardless: one discarded read beats a serialized
1967
+ * round-trip on every connect. Resolves to `null`
1937
1968
  * immediately (no RPC at all) when DOTNS_POP_CONTROLLER has no configured
1938
1969
  * address.
1939
1970
  */
@@ -2086,6 +2117,92 @@ var DotNS = class _DotNS {
2086
2117
  }
2087
2118
  throw new Error("contractTransaction: unreachable \u2014 phone-silence re-arm loop exited without resolving");
2088
2119
  }
2120
+ /**
2121
+ * #1435: resolve — once per connection — which `setSubnodeOwner` tuple
2122
+ * shape this chain's DOTNS_REGISTRY accepts, and cache the verdict on
2123
+ * `_subnodeOwnerShape` for the rest of this connection's life. Called by
2124
+ * buildSetSubnodeOwnerCall on the first subname write (register or
2125
+ * transfer, whichever runs first); every subsequent subname write in the
2126
+ * same connection reuses the cached shape with no further chain I/O.
2127
+ *
2128
+ * There is no read-only capability probe for this (see
2129
+ * DOTNS_REGISTRY_SET_SUBNODE_OWNER_ABI_V07's comment — v0.7 adds no new
2130
+ * function/contract to probe), so this probes the WRITE itself: dry-run
2131
+ * the v0.7 (5-field, `persist: false`) encoding against `sampleRecord`
2132
+ * first (a dry run commits no state, so this never spends a fee or
2133
+ * mutates the registry). Three outcomes:
2134
+ *
2135
+ * - The dry run succeeds → this chain is on v0.7+; cache "v07".
2136
+ * - The dry run bare-reverts (empty `0x` data, flags=1 — i.e. no
2137
+ * function matches this selector at all) → this chain predates v0.7;
2138
+ * cache "legacy" and fall back to the 4-field encoding.
2139
+ * - The dry run reverts WITH data → the 5-field function EXISTS and
2140
+ * rejected the call for a real reason (bad parent, not authorised,
2141
+ * etc.) — that is a genuine failure of the caller's actual write, not
2142
+ * a shape mismatch, so it propagates immediately rather than being
2143
+ * swallowed into a fallback attempt. Conflating the two here would
2144
+ * turn a real authorization failure into a confusing shape-probe
2145
+ * loop, retrying the legacy shape (which will ALSO fail, just with a
2146
+ * less informative bare-revert-style error) instead of surfacing the
2147
+ * real cause.
2148
+ *
2149
+ * `sampleRecord` is the actual record the caller is about to write (not a
2150
+ * throwaway probe payload) — probing with real args means a v0.7 chain
2151
+ * that genuinely rejects this specific write (e.g. the signer doesn't own
2152
+ * the parent) reports that real reason here, on the first (probe) dry
2153
+ * run, rather than surfacing a second time once the real submission's own
2154
+ * internal dry run repeats the same call.
2155
+ */
2156
+ async resolveSubnodeOwnerShape(sampleRecord) {
2157
+ if (this._subnodeOwnerShape !== null) return this._subnodeOwnerShape;
2158
+ this.ensureConnected();
2159
+ if (!this.clientWrapper) throw new Error("resolveSubnodeOwnerShape: polkadot-api client not available");
2160
+ const contractAddress = this._contracts.DOTNS_REGISTRY;
2161
+ const v07Abi = DOTNS_REGISTRY_SET_SUBNODE_OWNER_ABI_V07;
2162
+ const v07Args = [{ ...sampleRecord, persist: false }];
2163
+ const encodedCallData = encodeFunctionData({ abi: v07Abi, functionName: "setSubnodeOwner", args: v07Args });
2164
+ const callResult = await this.clientWrapper.performDryRunCall(this.substrateAddress, contractAddress, 0n, encodedCallData);
2165
+ if (callResult.result.isOk) {
2166
+ this._subnodeOwnerShape = "v07";
2167
+ return "v07";
2168
+ }
2169
+ const errorData = callResult.result.value;
2170
+ const revertData = errorData?.data;
2171
+ const revertFlags = errorData?.flags;
2172
+ if (!isBareRevertResult(revertData, revertFlags)) {
2173
+ throw new Error(formatContractDryRunFailure({
2174
+ revertData,
2175
+ revertFlags,
2176
+ gasConsumed: callResult.gasConsumed,
2177
+ gasRequired: callResult.gasRequired,
2178
+ storageDeposit: callResult.storageDeposit?.value
2179
+ }, {
2180
+ contractAddress,
2181
+ functionName: "setSubnodeOwner",
2182
+ signerSubstrateAddress: this.substrateAddress,
2183
+ signerEvmAddress: this.evmAddress ?? void 0,
2184
+ value: 0n,
2185
+ encodedData: encodedCallData,
2186
+ args: v07Args,
2187
+ contracts: this._contracts
2188
+ }));
2189
+ }
2190
+ this._subnodeOwnerShape = "legacy";
2191
+ return "legacy";
2192
+ }
2193
+ /**
2194
+ * Build the `{ abi, args }` pair a setSubnodeOwner call site should submit,
2195
+ * after resolving (and caching) this connection's accepted tuple shape —
2196
+ * see resolveSubnodeOwnerShape. `record` carries the 4 fields common to
2197
+ * both shapes; the v0.7 shape appends `persist: false` (per #1435, this
2198
+ * only gates the LabelStore write, which is restricted to protocol store
2199
+ * writers — the ownership/resolver record itself is written either way).
2200
+ */
2201
+ async buildSetSubnodeOwnerCall(record) {
2202
+ const shape = await this.resolveSubnodeOwnerShape(record);
2203
+ if (shape === "v07") return { abi: DOTNS_REGISTRY_SET_SUBNODE_OWNER_ABI_V07, args: [{ ...record, persist: false }] };
2204
+ return { abi: DOTNS_REGISTRY_ABI, args: [record] };
2205
+ }
2089
2206
  async checkOwnership(label, ownerAddress = null) {
2090
2207
  this.ensureConnected();
2091
2208
  const checkAddress = (ownerAddress || this.evmAddress).toLowerCase();
@@ -2190,12 +2307,13 @@ var DotNS = class _DotNS {
2190
2307
  return { status: "skipped-already-owned" };
2191
2308
  }
2192
2309
  const subnodeRecord = { parentNode, subLabel: sublabel, parentLabel, owner: toH160 };
2310
+ const { abi: setSubnodeOwnerAbi, args: setSubnodeOwnerArgs } = await this.buildSetSubnodeOwnerCall(subnodeRecord);
2193
2311
  const txRes = await this.contractTransaction(
2194
2312
  this._contracts.DOTNS_REGISTRY,
2195
2313
  0n,
2196
- DOTNS_REGISTRY_ABI,
2314
+ setSubnodeOwnerAbi,
2197
2315
  "setSubnodeOwner",
2198
- [subnodeRecord],
2316
+ setSubnodeOwnerArgs,
2199
2317
  statusCallback
2200
2318
  );
2201
2319
  const after = await withTimeout(
@@ -2274,9 +2392,10 @@ var DotNS = class _DotNS {
2274
2392
  await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
2275
2393
  }
2276
2394
  };
2395
+ const { abi: setSubnodeOwnerAbi, args: setSubnodeOwnerArgs } = await this.buildSetSubnodeOwnerCall(subnodeRecord);
2277
2396
  const txResolution = await this.submitBatchedContractCalls(
2278
2397
  [
2279
- { contractAddress: this._contracts.DOTNS_REGISTRY, abi: DOTNS_REGISTRY_ABI, functionName: "setSubnodeOwner", args: [subnodeRecord] },
2398
+ { contractAddress: this._contracts.DOTNS_REGISTRY, abi: setSubnodeOwnerAbi, functionName: "setSubnodeOwner", args: setSubnodeOwnerArgs },
2280
2399
  { contractAddress: this._contracts.DOTNS_REGISTRY, abi: DOTNS_REGISTRY_ABI, functionName: "setResolver", args: [subnodeNode, this._contracts.DOTNS_CONTENT_RESOLVER] }
2281
2400
  ],
2282
2401
  (s) => console.log(` ${s}`),
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-3TDAKT7Y.js";
4
+ } from "./chunk-SSV2KD3B.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-M5AKL3FL.js";
4
4
  import {
5
5
  preflightSssAllowance
6
- } from "./chunk-6BIAW73W.js";
6
+ } from "./chunk-RULOELNF.js";
7
7
  import {
8
8
  statementSigningAccount
9
9
  } from "./chunk-GRPLHUYC.js";
@@ -29,18 +29,18 @@ import {
29
29
  } from "./chunk-WPC2PUCV.js";
30
30
  import {
31
31
  setDeployContext
32
- } from "./chunk-UY2DR5V4.js";
32
+ } from "./chunk-3BDYD4BG.js";
33
33
  import {
34
34
  getBestBlockNumber,
35
35
  probeChunks,
36
36
  probeFinalityGap
37
- } from "./chunk-WYJX7OFF.js";
37
+ } from "./chunk-64UKPUK4.js";
38
38
  import {
39
39
  packSection
40
40
  } from "./chunk-C2TS5MER.js";
41
41
  import {
42
42
  resolveStorageSigner
43
- } from "./chunk-A7GZZQ3Q.js";
43
+ } from "./chunk-2WGCBESY.js";
44
44
  import {
45
45
  createSlotAccountSigner,
46
46
  requestResourceAllocation
@@ -55,7 +55,7 @@ import {
55
55
  parseDomainName,
56
56
  popStatusName,
57
57
  verifyNonceAdvanced
58
- } from "./chunk-RSAEMNX4.js";
58
+ } from "./chunk-FJTZNSNU.js";
59
59
  import {
60
60
  derivePoolAccounts,
61
61
  detectTestnet,
@@ -69,7 +69,7 @@ import {
69
69
  STALE_SESSION_MESSAGE,
70
70
  getPeopleChainEndpoints,
71
71
  hasPersistedSession
72
- } from "./chunk-6WLVGBLQ.js";
72
+ } from "./chunk-Q7CHACT6.js";
73
73
  import {
74
74
  CLI_NAME
75
75
  } from "./chunk-TSPERKUS.js";
@@ -84,7 +84,7 @@ import {
84
84
  } from "./chunk-ZOC4GITL.js";
85
85
  import {
86
86
  ChainHealthSampler
87
- } from "./chunk-LZ7HCV4C.js";
87
+ } from "./chunk-6HPDXI7E.js";
88
88
  import {
89
89
  VERSION,
90
90
  captureWarning,
@@ -98,7 +98,7 @@ import {
98
98
  truncateAddress,
99
99
  withDeploySpan,
100
100
  withSpan
101
- } from "./chunk-3CES4RZG.js";
101
+ } from "./chunk-HIODF4QF.js";
102
102
 
103
103
  // src/merkle.ts
104
104
  import * as fs2 from "fs";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-HDGD5FYX.js";
7
7
  import {
8
8
  VERSION
9
- } from "./chunk-3CES4RZG.js";
9
+ } from "./chunk-HIODF4QF.js";
10
10
 
11
11
  // src/auth-config.ts
12
12
  import { existsSync, readdirSync } from "fs";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-GRPLHUYC.js";
4
4
  import {
5
5
  DOT_DAPP_ID
6
- } from "./chunk-6WLVGBLQ.js";
6
+ } from "./chunk-Q7CHACT6.js";
7
7
 
8
8
  // src/sss-allowance-cache.ts
9
9
  import { mkdir, readFile, writeFile, unlink } from "fs/promises";
@@ -6,7 +6,7 @@ import * as path from "path";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "bulletin-deploy",
9
- version: "0.18.0",
9
+ version: "0.18.1-rc.1",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -56,7 +56,7 @@ var package_default = {
56
56
  "refresh-environments": "node scripts/refresh-environments.mjs",
57
57
  postinstall: "patch-package || true",
58
58
  prepare: "npm run build",
59
- test: "npm run build && node --test test/test.js test/cli-help.test.js test/helpers/e2e-helpers.test.js test/environments.test.js test/refresh-environments.test.js test/chunk-sharing-report.test.js test/dotns-deployments-parser.test.js test/dotns-token-id.test.js test/dotns-subnode-id.test.js test/dotns-protocol.test.js test/product-manifest.test.js test/cache-savings-totals.test.js test/error-pattern-signature.test.js test/exit-codes.test.js test/probe-env-health.test.js test/e2e-chain-calls.test.js test/auth-config.test.js test/whoami.test.js test/login.test.js test/logout.test.js test/auth-resolve.test.js test/storage-signer.test.js test/spinner.test.js test/sss-allowance.test.js test/sss-allowance-cache.test.js test/dotns-transfer.test.js test/deploy-actors.test.js test/transfer-command.test.js test/dotns-register-fee.test.js test/deploy-label-ordering.test.js test/benign-teardown.test.js test/verify-baked-dsn.test.js test/product-account.test.js test/post-release-monitor-skill.test.js test/test-release-retry-wrapper.js test/reprove-alias-tool.test.js test/bootstrap-env.test.js test/check-chain-identity.test.js && npm run test:vendor",
59
+ test: "npm run build && node --test test/test.js test/cli-help.test.js test/helpers/e2e-helpers.test.js test/helpers/e2e-exit-guard.test.js test/environments.test.js test/refresh-environments.test.js test/chunk-sharing-report.test.js test/dotns-deployments-parser.test.js test/dotns-token-id.test.js test/dotns-subnode-id.test.js test/dotns-protocol.test.js test/product-manifest.test.js test/cache-savings-totals.test.js test/error-pattern-signature.test.js test/exit-codes.test.js test/probe-env-health.test.js test/e2e-chain-calls.test.js test/auth-config.test.js test/whoami.test.js test/login.test.js test/logout.test.js test/auth-resolve.test.js test/storage-signer.test.js test/spinner.test.js test/sss-allowance.test.js test/sss-allowance-cache.test.js test/dotns-transfer.test.js test/deploy-actors.test.js test/transfer-command.test.js test/dotns-register-fee.test.js test/deploy-label-ordering.test.js test/benign-teardown.test.js test/verify-baked-dsn.test.js test/product-account.test.js test/post-release-monitor-skill.test.js test/test-release-retry-wrapper.js test/reprove-alias-tool.test.js test/bootstrap-env.test.js test/check-chain-identity.test.js && npm run test:vendor",
60
60
  "test:e2e": "npm run build && node --test test/e2e.test.js",
61
61
  "test:e2e:smoke": "bash scripts/e2e-pass.sh smoke",
62
62
  "test:e2e:pr": "bash scripts/e2e-pass.sh pr",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-3CES4RZG.js";
3
+ } from "./chunk-HIODF4QF.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-WYJX7OFF.js";
12
- import "./chunk-3CES4RZG.js";
13
- import "./chunk-3TDAKT7Y.js";
11
+ } from "./chunk-64UKPUK4.js";
12
+ import "./chunk-HIODF4QF.js";
13
+ import "./chunk-SSV2KD3B.js";
14
14
  export {
15
15
  ChainProbeCrossValidationError,
16
16
  ChainProbeMetadataError,
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  isBenignTeardownError,
6
6
  waitForBulletinAuthorization
7
- } from "../chunk-6LR7OM7F.js";
7
+ } from "../chunk-Q6NVSUCX.js";
8
8
  import "../chunk-M5AKL3FL.js";
9
9
  import {
10
10
  preflightSssAllowance
11
- } from "../chunk-6BIAW73W.js";
11
+ } from "../chunk-RULOELNF.js";
12
12
  import {
13
13
  statementSigningAccount
14
14
  } from "../chunk-GRPLHUYC.js";
@@ -16,11 +16,11 @@ import "../chunk-IW3X2MJF.js";
16
16
  import "../chunk-LPTKBQII.js";
17
17
  import "../chunk-3MAIF2SF.js";
18
18
  import "../chunk-WPC2PUCV.js";
19
- import "../chunk-UY2DR5V4.js";
20
- import "../chunk-F4OW5UVA.js";
21
- import "../chunk-WYJX7OFF.js";
19
+ import "../chunk-3BDYD4BG.js";
20
+ import "../chunk-UPQ2JGIO.js";
21
+ import "../chunk-64UKPUK4.js";
22
22
  import "../chunk-C2TS5MER.js";
23
- import "../chunk-A7GZZQ3Q.js";
23
+ import "../chunk-2WGCBESY.js";
24
24
  import "../chunk-JQKKMUCT.js";
25
25
  import {
26
26
  BULLETIN_RESOURCE,
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  renderLoginStatus
34
34
  } from "../chunk-RIRDBSBG.js";
35
- import "../chunk-RSAEMNX4.js";
35
+ import "../chunk-FJTZNSNU.js";
36
36
  import "../chunk-SI2ZUOYD.js";
37
37
  import "../chunk-AYAVRPAP.js";
38
38
  import {
@@ -40,7 +40,7 @@ import {
40
40
  getAuthClient,
41
41
  getPeopleChainEndpoints,
42
42
  resolveBulletinEndpoints
43
- } from "../chunk-6WLVGBLQ.js";
43
+ } from "../chunk-Q7CHACT6.js";
44
44
  import {
45
45
  CLI_NAME
46
46
  } from "../chunk-TSPERKUS.js";
@@ -48,9 +48,9 @@ import {
48
48
  loadEnvironments
49
49
  } from "../chunk-HDGD5FYX.js";
50
50
  import "../chunk-ZOC4GITL.js";
51
- import "../chunk-LZ7HCV4C.js";
52
- import "../chunk-3CES4RZG.js";
53
- import "../chunk-3TDAKT7Y.js";
51
+ import "../chunk-6HPDXI7E.js";
52
+ import "../chunk-HIODF4QF.js";
53
+ import "../chunk-SSV2KD3B.js";
54
54
  import "../chunk-7I3MTGOR.js";
55
55
 
56
56
  // src/commands/login.ts
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearSssAllowanceCache
3
- } from "../chunk-6BIAW73W.js";
3
+ } from "../chunk-RULOELNF.js";
4
4
  import "../chunk-GRPLHUYC.js";
5
5
  import "../chunk-JQKKMUCT.js";
6
6
  import "../chunk-5FLTDWWP.js";
@@ -9,12 +9,12 @@ import {
9
9
  } from "../chunk-RIRDBSBG.js";
10
10
  import {
11
11
  getAuthClient
12
- } from "../chunk-6WLVGBLQ.js";
12
+ } from "../chunk-Q7CHACT6.js";
13
13
  import "../chunk-TSPERKUS.js";
14
14
  import "../chunk-HDGD5FYX.js";
15
15
  import "../chunk-ZOC4GITL.js";
16
- import "../chunk-3CES4RZG.js";
17
- import "../chunk-3TDAKT7Y.js";
16
+ import "../chunk-HIODF4QF.js";
17
+ import "../chunk-SSV2KD3B.js";
18
18
 
19
19
  // src/commands/logout.ts
20
20
  function formatLogout(status) {
@@ -3,7 +3,7 @@ import {
3
3
  DEFAULT_TLD,
4
4
  DotNS,
5
5
  parseDomainName
6
- } from "../chunk-RSAEMNX4.js";
6
+ } from "../chunk-FJTZNSNU.js";
7
7
  import "../chunk-SI2ZUOYD.js";
8
8
  import "../chunk-AYAVRPAP.js";
9
9
  import {
@@ -15,9 +15,9 @@ import {
15
15
  resolveEndpoints
16
16
  } from "../chunk-HDGD5FYX.js";
17
17
  import "../chunk-ZOC4GITL.js";
18
- import "../chunk-LZ7HCV4C.js";
19
- import "../chunk-3CES4RZG.js";
20
- import "../chunk-3TDAKT7Y.js";
18
+ import "../chunk-6HPDXI7E.js";
19
+ import "../chunk-HIODF4QF.js";
20
+ import "../chunk-SSV2KD3B.js";
21
21
  import "../chunk-7I3MTGOR.js";
22
22
 
23
23
  // src/commands/transfer.ts
@@ -2,14 +2,14 @@ import {
2
2
  STALE_SESSION_MESSAGE,
3
3
  getAuthClient,
4
4
  hasPersistedSession
5
- } from "../chunk-6WLVGBLQ.js";
5
+ } from "../chunk-Q7CHACT6.js";
6
6
  import {
7
7
  CLI_NAME
8
8
  } from "../chunk-TSPERKUS.js";
9
9
  import "../chunk-HDGD5FYX.js";
10
10
  import "../chunk-ZOC4GITL.js";
11
- import "../chunk-3CES4RZG.js";
12
- import "../chunk-3TDAKT7Y.js";
11
+ import "../chunk-HIODF4QF.js";
12
+ import "../chunk-SSV2KD3B.js";
13
13
 
14
14
  // src/commands/whoami.ts
15
15
  function formatWhoami(addresses) {
@@ -2,20 +2,20 @@ import {
2
2
  MainnetDefaultWorkerError,
3
3
  resolveDeployActors,
4
4
  resolveStorageSigner
5
- } from "./chunk-A7GZZQ3Q.js";
5
+ } from "./chunk-2WGCBESY.js";
6
6
  import "./chunk-JQKKMUCT.js";
7
7
  import "./chunk-5FLTDWWP.js";
8
8
  import "./chunk-RIRDBSBG.js";
9
- import "./chunk-RSAEMNX4.js";
9
+ import "./chunk-FJTZNSNU.js";
10
10
  import "./chunk-SI2ZUOYD.js";
11
11
  import "./chunk-AYAVRPAP.js";
12
- import "./chunk-6WLVGBLQ.js";
12
+ import "./chunk-Q7CHACT6.js";
13
13
  import "./chunk-TSPERKUS.js";
14
14
  import "./chunk-HDGD5FYX.js";
15
15
  import "./chunk-ZOC4GITL.js";
16
- import "./chunk-LZ7HCV4C.js";
17
- import "./chunk-3CES4RZG.js";
18
- import "./chunk-3TDAKT7Y.js";
16
+ import "./chunk-6HPDXI7E.js";
17
+ import "./chunk-HIODF4QF.js";
18
+ import "./chunk-SSV2KD3B.js";
19
19
  import "./chunk-7I3MTGOR.js";
20
20
  export {
21
21
  MainnetDefaultWorkerError,
package/dist/deploy.js CHANGED
@@ -64,35 +64,35 @@ import {
64
64
  storeDirectory,
65
65
  storeDirectoryV2,
66
66
  storeFile
67
- } from "./chunk-6LR7OM7F.js";
67
+ } from "./chunk-Q6NVSUCX.js";
68
68
  import "./chunk-M5AKL3FL.js";
69
- import "./chunk-6BIAW73W.js";
69
+ import "./chunk-RULOELNF.js";
70
70
  import "./chunk-GRPLHUYC.js";
71
71
  import "./chunk-IW3X2MJF.js";
72
72
  import "./chunk-LPTKBQII.js";
73
73
  import "./chunk-3MAIF2SF.js";
74
74
  import "./chunk-WPC2PUCV.js";
75
- import "./chunk-UY2DR5V4.js";
76
- import "./chunk-F4OW5UVA.js";
77
- import "./chunk-WYJX7OFF.js";
75
+ import "./chunk-3BDYD4BG.js";
76
+ import "./chunk-UPQ2JGIO.js";
77
+ import "./chunk-64UKPUK4.js";
78
78
  import "./chunk-C2TS5MER.js";
79
- import "./chunk-A7GZZQ3Q.js";
79
+ import "./chunk-2WGCBESY.js";
80
80
  import "./chunk-JQKKMUCT.js";
81
81
  import "./chunk-5FLTDWWP.js";
82
82
  import "./chunk-RIRDBSBG.js";
83
- import "./chunk-RSAEMNX4.js";
83
+ import "./chunk-FJTZNSNU.js";
84
84
  import "./chunk-SI2ZUOYD.js";
85
85
  import "./chunk-AYAVRPAP.js";
86
- import "./chunk-6WLVGBLQ.js";
86
+ import "./chunk-Q7CHACT6.js";
87
87
  import "./chunk-TSPERKUS.js";
88
88
  import "./chunk-HDGD5FYX.js";
89
89
  import {
90
90
  EXIT_CODE_NO_RETRY,
91
91
  NonRetryableError
92
92
  } from "./chunk-ZOC4GITL.js";
93
- import "./chunk-LZ7HCV4C.js";
94
- import "./chunk-3CES4RZG.js";
95
- import "./chunk-3TDAKT7Y.js";
93
+ import "./chunk-6HPDXI7E.js";
94
+ import "./chunk-HIODF4QF.js";
95
+ import "./chunk-SSV2KD3B.js";
96
96
  import "./chunk-7I3MTGOR.js";
97
97
  export {
98
98
  BLAKE2B_256_MULTIHASH_CODE,
package/dist/dotns.d.ts CHANGED
@@ -639,6 +639,7 @@ declare class DotNS {
639
639
  private _tld;
640
640
  private _protocolVersion;
641
641
  private _adapter;
642
+ private _subnodeOwnerShape;
642
643
  private _onPhoneSigningRequired;
643
644
  private _confirmPhoneReady;
644
645
  /** Total phone-signature count for this DotNS session (drives the `total` field passed to confirmPhoneReady). */
@@ -664,6 +665,8 @@ declare class DotNS {
664
665
  get protocolVersion(): DotnsAbiProfile;
665
666
  /** Test-only: bypass connect()'s live probe and pin the adapter directly, for unit tests that stub chain calls without going through connect(). */
666
667
  __setProtocolVersionForTest(profile: DotnsAbiProfile): void;
668
+ /** #1435 test-only: pin the setSubnodeOwner shape cache directly ("legacy", "v07", or null to force resolveSubnodeOwnerShape to re-probe), bypassing the live dry-run probe — for unit tests that stub the probe or exercise the fallback/caching logic itself. */
669
+ __setSubnodeOwnerShapeForTest(shape: "legacy" | "v07" | null): void;
667
670
  constructor();
668
671
  /**
669
672
  * The authoritative, post-connect resolved TLD: `options.tld` when the env
@@ -816,8 +819,13 @@ declare class DotNS {
816
819
  * v0.5.8-rc1 (pricingVersion answers on both), and classifyProtocolVersion
817
820
  * already only consults it when pricingVersionOk is true, so gating it
818
821
  * behind that result resolving first would just add a serialized
819
- * round-trip for no benefit — worse once v0.6.0 is live everywhere (#1410),
820
- * since that "no benefit" case becomes the common one. Resolves to `null`
822
+ * round-trip for no benefit — worse as v0.6.0 spreads (#1410), since that
823
+ * "no benefit" case becomes the common one. The discarded-probe cost does
824
+ * NOT self-liquidate the moment v0.6.0 ships: it persists on every
825
+ * environment still running an older generation (dotns-protocol.ts's
826
+ * profile comment owns per-generation status — this one does not restate
827
+ * it). Parallel regardless: one discarded read beats a serialized
828
+ * round-trip on every connect. Resolves to `null`
821
829
  * immediately (no RPC at all) when DOTNS_POP_CONTROLLER has no configured
822
830
  * address.
823
831
  */
@@ -837,6 +845,52 @@ declare class DotNS {
837
845
  feeAsset?: "pgas";
838
846
  phoneLabel?: string;
839
847
  }): Promise<TxResolution>;
848
+ /**
849
+ * #1435: resolve — once per connection — which `setSubnodeOwner` tuple
850
+ * shape this chain's DOTNS_REGISTRY accepts, and cache the verdict on
851
+ * `_subnodeOwnerShape` for the rest of this connection's life. Called by
852
+ * buildSetSubnodeOwnerCall on the first subname write (register or
853
+ * transfer, whichever runs first); every subsequent subname write in the
854
+ * same connection reuses the cached shape with no further chain I/O.
855
+ *
856
+ * There is no read-only capability probe for this (see
857
+ * DOTNS_REGISTRY_SET_SUBNODE_OWNER_ABI_V07's comment — v0.7 adds no new
858
+ * function/contract to probe), so this probes the WRITE itself: dry-run
859
+ * the v0.7 (5-field, `persist: false`) encoding against `sampleRecord`
860
+ * first (a dry run commits no state, so this never spends a fee or
861
+ * mutates the registry). Three outcomes:
862
+ *
863
+ * - The dry run succeeds → this chain is on v0.7+; cache "v07".
864
+ * - The dry run bare-reverts (empty `0x` data, flags=1 — i.e. no
865
+ * function matches this selector at all) → this chain predates v0.7;
866
+ * cache "legacy" and fall back to the 4-field encoding.
867
+ * - The dry run reverts WITH data → the 5-field function EXISTS and
868
+ * rejected the call for a real reason (bad parent, not authorised,
869
+ * etc.) — that is a genuine failure of the caller's actual write, not
870
+ * a shape mismatch, so it propagates immediately rather than being
871
+ * swallowed into a fallback attempt. Conflating the two here would
872
+ * turn a real authorization failure into a confusing shape-probe
873
+ * loop, retrying the legacy shape (which will ALSO fail, just with a
874
+ * less informative bare-revert-style error) instead of surfacing the
875
+ * real cause.
876
+ *
877
+ * `sampleRecord` is the actual record the caller is about to write (not a
878
+ * throwaway probe payload) — probing with real args means a v0.7 chain
879
+ * that genuinely rejects this specific write (e.g. the signer doesn't own
880
+ * the parent) reports that real reason here, on the first (probe) dry
881
+ * run, rather than surfacing a second time once the real submission's own
882
+ * internal dry run repeats the same call.
883
+ */
884
+ private resolveSubnodeOwnerShape;
885
+ /**
886
+ * Build the `{ abi, args }` pair a setSubnodeOwner call site should submit,
887
+ * after resolving (and caching) this connection's accepted tuple shape —
888
+ * see resolveSubnodeOwnerShape. `record` carries the 4 fields common to
889
+ * both shapes; the v0.7 shape appends `persist: false` (per #1435, this
890
+ * only gates the LabelStore write, which is restricted to protocol store
891
+ * writers — the ownership/resolver record itself is written either way).
892
+ */
893
+ private buildSetSubnodeOwnerCall;
840
894
  checkOwnership(label: string, ownerAddress?: string | null): Promise<OwnershipResult>;
841
895
  /** Live transfer-fee quote. transferFloor is a pure PopRules view — it
842
896
  * classifies the label and reads both tiers, so it works BEFORE the name is
package/dist/dotns.js CHANGED
@@ -87,14 +87,14 @@ import {
87
87
  verifyNonceAdvanced,
88
88
  weiToNative,
89
89
  withRetry
90
- } from "./chunk-RSAEMNX4.js";
90
+ } from "./chunk-FJTZNSNU.js";
91
91
  import "./chunk-SI2ZUOYD.js";
92
92
  import "./chunk-AYAVRPAP.js";
93
93
  import "./chunk-HDGD5FYX.js";
94
94
  import "./chunk-ZOC4GITL.js";
95
- import "./chunk-LZ7HCV4C.js";
96
- import "./chunk-3CES4RZG.js";
97
- import "./chunk-3TDAKT7Y.js";
95
+ import "./chunk-6HPDXI7E.js";
96
+ import "./chunk-HIODF4QF.js";
97
+ import "./chunk-SSV2KD3B.js";
98
98
  import "./chunk-7I3MTGOR.js";
99
99
  export {
100
100
  ATTR_TX_RESOLUTION_KIND,
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  publishManifest,
5
5
  verifyEmbeddedAppManifests,
6
6
  writeEmbeddedAppManifests
7
- } from "./chunk-TIQ3TCK4.js";
7
+ } from "./chunk-5JVTBR5H.js";
8
8
  import {
9
9
  DEFAULT_TEXT_RECORD_BUDGET_BYTES,
10
10
  PLACEHOLDER_CID,
@@ -29,9 +29,9 @@ import {
29
29
  deploy,
30
30
  merkleizeJS,
31
31
  merkleizeWithStableOrder
32
- } from "./chunk-6LR7OM7F.js";
32
+ } from "./chunk-Q6NVSUCX.js";
33
33
  import "./chunk-M5AKL3FL.js";
34
- import "./chunk-6BIAW73W.js";
34
+ import "./chunk-RULOELNF.js";
35
35
  import "./chunk-GRPLHUYC.js";
36
36
  import {
37
37
  computeStats,
@@ -54,13 +54,13 @@ import {
54
54
  isVolatilePath,
55
55
  parseManifest
56
56
  } from "./chunk-WPC2PUCV.js";
57
- import "./chunk-UY2DR5V4.js";
58
- import "./chunk-F4OW5UVA.js";
57
+ import "./chunk-3BDYD4BG.js";
58
+ import "./chunk-UPQ2JGIO.js";
59
59
  import {
60
60
  probeChunks
61
- } from "./chunk-WYJX7OFF.js";
61
+ } from "./chunk-64UKPUK4.js";
62
62
  import "./chunk-C2TS5MER.js";
63
- import "./chunk-A7GZZQ3Q.js";
63
+ import "./chunk-2WGCBESY.js";
64
64
  import "./chunk-JQKKMUCT.js";
65
65
  import "./chunk-5FLTDWWP.js";
66
66
  import "./chunk-RIRDBSBG.js";
@@ -69,7 +69,7 @@ import {
69
69
  DotNS,
70
70
  parseDomainName,
71
71
  sanitizeDomainLabel
72
- } from "./chunk-RSAEMNX4.js";
72
+ } from "./chunk-FJTZNSNU.js";
73
73
  import "./chunk-SI2ZUOYD.js";
74
74
  import {
75
75
  BULLETIN_BLOCKS_PER_DAY,
@@ -85,7 +85,7 @@ import {
85
85
  poolAccountDerivationPath,
86
86
  selectAccount
87
87
  } from "./chunk-AYAVRPAP.js";
88
- import "./chunk-6WLVGBLQ.js";
88
+ import "./chunk-Q7CHACT6.js";
89
89
  import "./chunk-TSPERKUS.js";
90
90
  import {
91
91
  DEFAULT_ENV_ID,
@@ -99,8 +99,8 @@ import {
99
99
  validateContractAddresses
100
100
  } from "./chunk-HDGD5FYX.js";
101
101
  import "./chunk-ZOC4GITL.js";
102
- import "./chunk-LZ7HCV4C.js";
103
- import "./chunk-3CES4RZG.js";
102
+ import "./chunk-6HPDXI7E.js";
103
+ import "./chunk-HIODF4QF.js";
104
104
  import {
105
105
  VERSION,
106
106
  loadRunState,
@@ -110,7 +110,7 @@ import {
110
110
  shouldSkipStaleWarning,
111
111
  stateFilePath,
112
112
  writeRunState
113
- } from "./chunk-3TDAKT7Y.js";
113
+ } from "./chunk-SSV2KD3B.js";
114
114
  import "./chunk-7I3MTGOR.js";
115
115
  export {
116
116
  BULLETIN_BLOCKS_PER_DAY,
@@ -2,36 +2,36 @@ import {
2
2
  domainMatchesEnvTld,
3
3
  publishManifest,
4
4
  registerOrEnsureResolver
5
- } from "../chunk-TIQ3TCK4.js";
5
+ } from "../chunk-5JVTBR5H.js";
6
6
  import "../chunk-RXV677CJ.js";
7
7
  import "../chunk-WEVSXHII.js";
8
8
  import "../chunk-CVQ7DJHG.js";
9
- import "../chunk-6LR7OM7F.js";
9
+ import "../chunk-Q6NVSUCX.js";
10
10
  import "../chunk-M5AKL3FL.js";
11
- import "../chunk-6BIAW73W.js";
11
+ import "../chunk-RULOELNF.js";
12
12
  import "../chunk-GRPLHUYC.js";
13
13
  import "../chunk-IW3X2MJF.js";
14
14
  import "../chunk-LPTKBQII.js";
15
15
  import "../chunk-3MAIF2SF.js";
16
16
  import "../chunk-WPC2PUCV.js";
17
- import "../chunk-UY2DR5V4.js";
18
- import "../chunk-F4OW5UVA.js";
19
- import "../chunk-WYJX7OFF.js";
17
+ import "../chunk-3BDYD4BG.js";
18
+ import "../chunk-UPQ2JGIO.js";
19
+ import "../chunk-64UKPUK4.js";
20
20
  import "../chunk-C2TS5MER.js";
21
- import "../chunk-A7GZZQ3Q.js";
21
+ import "../chunk-2WGCBESY.js";
22
22
  import "../chunk-JQKKMUCT.js";
23
23
  import "../chunk-5FLTDWWP.js";
24
24
  import "../chunk-RIRDBSBG.js";
25
- import "../chunk-RSAEMNX4.js";
25
+ import "../chunk-FJTZNSNU.js";
26
26
  import "../chunk-SI2ZUOYD.js";
27
27
  import "../chunk-AYAVRPAP.js";
28
- import "../chunk-6WLVGBLQ.js";
28
+ import "../chunk-Q7CHACT6.js";
29
29
  import "../chunk-TSPERKUS.js";
30
30
  import "../chunk-HDGD5FYX.js";
31
31
  import "../chunk-ZOC4GITL.js";
32
- import "../chunk-LZ7HCV4C.js";
33
- import "../chunk-3CES4RZG.js";
34
- import "../chunk-3TDAKT7Y.js";
32
+ import "../chunk-6HPDXI7E.js";
33
+ import "../chunk-HIODF4QF.js";
34
+ import "../chunk-SSV2KD3B.js";
35
35
  import "../chunk-7I3MTGOR.js";
36
36
  export {
37
37
  domainMatchesEnvTld,
@@ -5,8 +5,8 @@ import {
5
5
  maybeWriteMemoryReport,
6
6
  safeHeap,
7
7
  sampleFromBytes
8
- } from "./chunk-3CES4RZG.js";
9
- import "./chunk-3TDAKT7Y.js";
8
+ } from "./chunk-HIODF4QF.js";
9
+ import "./chunk-SSV2KD3B.js";
10
10
  export {
11
11
  DEFAULT_THRESHOLD_MB,
12
12
  buildMemoryReport,
package/dist/merkle.js CHANGED
@@ -6,32 +6,32 @@ import {
6
6
  merkleizeKuboBackend,
7
7
  merkleizeWithStableOrder,
8
8
  rebuildOrderedCarFromBytes
9
- } from "./chunk-6LR7OM7F.js";
9
+ } from "./chunk-Q6NVSUCX.js";
10
10
  import "./chunk-M5AKL3FL.js";
11
- import "./chunk-6BIAW73W.js";
11
+ import "./chunk-RULOELNF.js";
12
12
  import "./chunk-GRPLHUYC.js";
13
13
  import "./chunk-IW3X2MJF.js";
14
14
  import "./chunk-LPTKBQII.js";
15
15
  import "./chunk-3MAIF2SF.js";
16
16
  import "./chunk-WPC2PUCV.js";
17
- import "./chunk-UY2DR5V4.js";
18
- import "./chunk-F4OW5UVA.js";
19
- import "./chunk-WYJX7OFF.js";
17
+ import "./chunk-3BDYD4BG.js";
18
+ import "./chunk-UPQ2JGIO.js";
19
+ import "./chunk-64UKPUK4.js";
20
20
  import "./chunk-C2TS5MER.js";
21
- import "./chunk-A7GZZQ3Q.js";
21
+ import "./chunk-2WGCBESY.js";
22
22
  import "./chunk-JQKKMUCT.js";
23
23
  import "./chunk-5FLTDWWP.js";
24
24
  import "./chunk-RIRDBSBG.js";
25
- import "./chunk-RSAEMNX4.js";
25
+ import "./chunk-FJTZNSNU.js";
26
26
  import "./chunk-SI2ZUOYD.js";
27
27
  import "./chunk-AYAVRPAP.js";
28
- import "./chunk-6WLVGBLQ.js";
28
+ import "./chunk-Q7CHACT6.js";
29
29
  import "./chunk-TSPERKUS.js";
30
30
  import "./chunk-HDGD5FYX.js";
31
31
  import "./chunk-ZOC4GITL.js";
32
- import "./chunk-LZ7HCV4C.js";
33
- import "./chunk-3CES4RZG.js";
34
- import "./chunk-3TDAKT7Y.js";
32
+ import "./chunk-6HPDXI7E.js";
33
+ import "./chunk-HIODF4QF.js";
34
+ import "./chunk-SSV2KD3B.js";
35
35
  import "./chunk-7I3MTGOR.js";
36
36
  export {
37
37
  buildOrderedCar,
@@ -24,7 +24,7 @@ import {
24
24
  } from "../chunk-ZYVGHDMU.js";
25
25
  import {
26
26
  WS_HEARTBEAT_TIMEOUT_MS
27
- } from "../chunk-RSAEMNX4.js";
27
+ } from "../chunk-FJTZNSNU.js";
28
28
  import {
29
29
  DOTNS_CONTEXT_BYTES,
30
30
  PEOPLE_MEMBER_IDENTIFIER_HEX,
@@ -35,9 +35,9 @@ import {
35
35
  loadEnvironments
36
36
  } from "../chunk-HDGD5FYX.js";
37
37
  import "../chunk-ZOC4GITL.js";
38
- import "../chunk-LZ7HCV4C.js";
39
- import "../chunk-3CES4RZG.js";
40
- import "../chunk-3TDAKT7Y.js";
38
+ import "../chunk-6HPDXI7E.js";
39
+ import "../chunk-HIODF4QF.js";
40
+ import "../chunk-SSV2KD3B.js";
41
41
  import "../chunk-7I3MTGOR.js";
42
42
 
43
43
  // src/personhood/bootstrap.ts
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  WS_HEARTBEAT_TIMEOUT_MS
3
- } from "../chunk-RSAEMNX4.js";
3
+ } from "../chunk-FJTZNSNU.js";
4
4
  import "../chunk-SI2ZUOYD.js";
5
5
  import "../chunk-AYAVRPAP.js";
6
6
  import {
7
7
  loadEnvironments
8
8
  } from "../chunk-HDGD5FYX.js";
9
9
  import "../chunk-ZOC4GITL.js";
10
- import "../chunk-LZ7HCV4C.js";
11
- import "../chunk-3CES4RZG.js";
12
- import "../chunk-3TDAKT7Y.js";
10
+ import "../chunk-6HPDXI7E.js";
11
+ import "../chunk-HIODF4QF.js";
12
+ import "../chunk-SSV2KD3B.js";
13
13
  import "../chunk-7I3MTGOR.js";
14
14
 
15
15
  // src/personhood/people-client.ts
package/dist/run-state.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  shouldSkipStaleWarning,
8
8
  stateFilePath,
9
9
  writeRunState
10
- } from "./chunk-3TDAKT7Y.js";
10
+ } from "./chunk-SSV2KD3B.js";
11
11
  export {
12
12
  VERSION,
13
13
  loadRunState,
@@ -4,14 +4,14 @@ import {
4
4
  preflightSssAllowance,
5
5
  sssPeriodEndSec,
6
6
  writeSssAllowanceCache
7
- } from "./chunk-6BIAW73W.js";
7
+ } from "./chunk-RULOELNF.js";
8
8
  import "./chunk-GRPLHUYC.js";
9
- import "./chunk-6WLVGBLQ.js";
9
+ import "./chunk-Q7CHACT6.js";
10
10
  import "./chunk-TSPERKUS.js";
11
11
  import "./chunk-HDGD5FYX.js";
12
12
  import "./chunk-ZOC4GITL.js";
13
- import "./chunk-3CES4RZG.js";
14
- import "./chunk-3TDAKT7Y.js";
13
+ import "./chunk-HIODF4QF.js";
14
+ import "./chunk-SSV2KD3B.js";
15
15
  export {
16
16
  clearSssAllowanceCache,
17
17
  isSssAllowanceCacheValid,
@@ -8,32 +8,32 @@ import {
8
8
  waitForBulletinAuthorization,
9
9
  withTransientRetry,
10
10
  writeBulletinSlotKey
11
- } from "./chunk-6LR7OM7F.js";
11
+ } from "./chunk-Q6NVSUCX.js";
12
12
  import "./chunk-M5AKL3FL.js";
13
- import "./chunk-6BIAW73W.js";
13
+ import "./chunk-RULOELNF.js";
14
14
  import "./chunk-GRPLHUYC.js";
15
15
  import "./chunk-IW3X2MJF.js";
16
16
  import "./chunk-LPTKBQII.js";
17
17
  import "./chunk-3MAIF2SF.js";
18
18
  import "./chunk-WPC2PUCV.js";
19
- import "./chunk-UY2DR5V4.js";
20
- import "./chunk-F4OW5UVA.js";
21
- import "./chunk-WYJX7OFF.js";
19
+ import "./chunk-3BDYD4BG.js";
20
+ import "./chunk-UPQ2JGIO.js";
21
+ import "./chunk-64UKPUK4.js";
22
22
  import "./chunk-C2TS5MER.js";
23
- import "./chunk-A7GZZQ3Q.js";
23
+ import "./chunk-2WGCBESY.js";
24
24
  import "./chunk-JQKKMUCT.js";
25
25
  import "./chunk-5FLTDWWP.js";
26
26
  import "./chunk-RIRDBSBG.js";
27
- import "./chunk-RSAEMNX4.js";
27
+ import "./chunk-FJTZNSNU.js";
28
28
  import "./chunk-SI2ZUOYD.js";
29
29
  import "./chunk-AYAVRPAP.js";
30
- import "./chunk-6WLVGBLQ.js";
30
+ import "./chunk-Q7CHACT6.js";
31
31
  import "./chunk-TSPERKUS.js";
32
32
  import "./chunk-HDGD5FYX.js";
33
33
  import "./chunk-ZOC4GITL.js";
34
- import "./chunk-LZ7HCV4C.js";
35
- import "./chunk-3CES4RZG.js";
36
- import "./chunk-3TDAKT7Y.js";
34
+ import "./chunk-6HPDXI7E.js";
35
+ import "./chunk-HIODF4QF.js";
36
+ import "./chunk-SSV2KD3B.js";
37
37
  import "./chunk-7I3MTGOR.js";
38
38
  export {
39
39
  BulletinSlotAuthError,
package/dist/telemetry.js CHANGED
@@ -41,8 +41,8 @@ import {
41
41
  withDeploySpan,
42
42
  withManifestSpan,
43
43
  withSpan
44
- } from "./chunk-3CES4RZG.js";
45
- import "./chunk-3TDAKT7Y.js";
44
+ } from "./chunk-HIODF4QF.js";
45
+ import "./chunk-SSV2KD3B.js";
46
46
  export {
47
47
  VERSION,
48
48
  __setDeployRootSpanForTest,
@@ -12,9 +12,9 @@ import {
12
12
  isPreReleaseVersion,
13
13
  preReleaseWarning,
14
14
  promptYesNo
15
- } from "./chunk-F4OW5UVA.js";
16
- import "./chunk-3CES4RZG.js";
17
- import "./chunk-3TDAKT7Y.js";
15
+ } from "./chunk-UPQ2JGIO.js";
16
+ import "./chunk-HIODF4QF.js";
17
+ import "./chunk-SSV2KD3B.js";
18
18
  export {
19
19
  assessVersion,
20
20
  checkNodeVersion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bulletin-deploy",
3
- "version": "0.18.0",
3
+ "version": "0.18.1-rc.1",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -50,7 +50,7 @@
50
50
  "refresh-environments": "node scripts/refresh-environments.mjs",
51
51
  "postinstall": "patch-package || true",
52
52
  "prepare": "npm run build",
53
- "test": "npm run build && node --test test/test.js test/cli-help.test.js test/helpers/e2e-helpers.test.js test/environments.test.js test/refresh-environments.test.js test/chunk-sharing-report.test.js test/dotns-deployments-parser.test.js test/dotns-token-id.test.js test/dotns-subnode-id.test.js test/dotns-protocol.test.js test/product-manifest.test.js test/cache-savings-totals.test.js test/error-pattern-signature.test.js test/exit-codes.test.js test/probe-env-health.test.js test/e2e-chain-calls.test.js test/auth-config.test.js test/whoami.test.js test/login.test.js test/logout.test.js test/auth-resolve.test.js test/storage-signer.test.js test/spinner.test.js test/sss-allowance.test.js test/sss-allowance-cache.test.js test/dotns-transfer.test.js test/deploy-actors.test.js test/transfer-command.test.js test/dotns-register-fee.test.js test/deploy-label-ordering.test.js test/benign-teardown.test.js test/verify-baked-dsn.test.js test/product-account.test.js test/post-release-monitor-skill.test.js test/test-release-retry-wrapper.js test/reprove-alias-tool.test.js test/bootstrap-env.test.js test/check-chain-identity.test.js && npm run test:vendor",
53
+ "test": "npm run build && node --test test/test.js test/cli-help.test.js test/helpers/e2e-helpers.test.js test/helpers/e2e-exit-guard.test.js test/environments.test.js test/refresh-environments.test.js test/chunk-sharing-report.test.js test/dotns-deployments-parser.test.js test/dotns-token-id.test.js test/dotns-subnode-id.test.js test/dotns-protocol.test.js test/product-manifest.test.js test/cache-savings-totals.test.js test/error-pattern-signature.test.js test/exit-codes.test.js test/probe-env-health.test.js test/e2e-chain-calls.test.js test/auth-config.test.js test/whoami.test.js test/login.test.js test/logout.test.js test/auth-resolve.test.js test/storage-signer.test.js test/spinner.test.js test/sss-allowance.test.js test/sss-allowance-cache.test.js test/dotns-transfer.test.js test/deploy-actors.test.js test/transfer-command.test.js test/dotns-register-fee.test.js test/deploy-label-ordering.test.js test/benign-teardown.test.js test/verify-baked-dsn.test.js test/product-account.test.js test/post-release-monitor-skill.test.js test/test-release-retry-wrapper.js test/reprove-alias-tool.test.js test/bootstrap-env.test.js test/check-chain-identity.test.js && npm run test:vendor",
54
54
  "test:e2e": "npm run build && node --test test/e2e.test.js",
55
55
  "test:e2e:smoke": "bash scripts/e2e-pass.sh smoke",
56
56
  "test:e2e:pr": "bash scripts/e2e-pass.sh pr",
@@ -52,8 +52,19 @@ const FLAKE_PATTERNS = [
52
52
 
53
53
  // output: combined stdout+stderr text from the child. Any flake pattern
54
54
  // appearing anywhere in the child's output makes the run retry-eligible.
55
+ // Printed by the E2E harness when it outlives its suite. A leak is deterministic,
56
+ // and the WS-fault scenarios log flake wording while passing, so it must not retry.
57
+ export const HARNESS_GUARD_MARKER = ">> FAIL: e2e harness:";
58
+
59
+ // EXIT_CODE_NO_RETRY from src/errors.ts, reachable only when the wrapper spawns
60
+ // the CLI directly: node --test normalises its child's code to 1, which is why
61
+ // the marker is checked too.
62
+ export const NO_RETRY_EXIT_CODE = 78;
63
+
55
64
  export function classifyForRetry(output, childExitCode = 1) {
56
65
  if (childExitCode === 0) return 0;
66
+ if (childExitCode === NO_RETRY_EXIT_CODE) return NO_RETRY_EXIT_CODE;
67
+ if (output.includes(HARNESS_GUARD_MARKER)) return childExitCode || 1;
57
68
  for (const pat of FLAKE_PATTERNS) {
58
69
  if (output.includes(pat)) return 75;
59
70
  }