bulletin-deploy 0.7.25 → 0.7.26-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,8 @@ for (let i = 0; i < args.length; i++) {
42
42
  else if (args[i] === "--allow-large-deploy") { flags.allowLargeDeploy = true; }
43
43
  else if (args[i] === "--reproducible") { flags.reproducibleSource = "commit"; }
44
44
  else if (args[i].startsWith("--reproducible=")) { flags.reproducibleSource = args[i].slice("--reproducible=".length); }
45
+ else if (args[i] === "--dump-car") { flags.dumpCar = true; }
46
+ else if (args[i].startsWith("--dump-car=")) { flags.dumpCar = args[i].slice("--dump-car=".length); }
45
47
  else if (args[i] === "--version" || args[i] === "-V") { flags.version = true; }
46
48
  else if (args[i] === "--help" || args[i] === "-h") { flags.help = true; }
47
49
  else { positional.push(args[i]); }
@@ -92,6 +94,8 @@ Options:
92
94
  --js-merkle Use pure-JS merkleization (no IPFS Kubo binary required)
93
95
  --input-car <path> Deploy a pre-built CAR file; skips directory scan and merkleization.
94
96
  Usage: bulletin-deploy --input-car <file.car> <domain.dot>
97
+ --dump-car[=<path>] Save the pre-upload CAR file to disk. Default path: <buildDir>.bulletin.car.
98
+ Override path with =<path>. Also settable via BULLETIN_DEPLOY_DUMP_CAR env var.
95
99
  --tag "..." Label deploy in telemetry (or set DEPLOY_TAG env var); see Telemetry in README
96
100
  --name "..." Optional. Sets the "name" text record on the domain.
97
101
  --description "..." Optional. Sets the "description" text record (≤100 chars recommended).
@@ -267,6 +271,7 @@ try {
267
271
  description: flags.description,
268
272
  allowLargeDeploy: flags.allowLargeDeploy,
269
273
  reproducibleSource: flags.reproducibleSource,
274
+ dumpCar: flags.dumpCar,
270
275
  });
271
276
 
272
277
  const output = process.env.GITHUB_OUTPUT;
@@ -9,10 +9,10 @@ import {
9
9
  offerBugReport,
10
10
  scrubSecrets,
11
11
  setDeployContext
12
- } from "./chunk-OCYMH4PS.js";
13
- import "./chunk-LB3HGDGW.js";
14
- import "./chunk-Q5NNM4C3.js";
15
- import "./chunk-CKCCNBYX.js";
12
+ } from "./chunk-7NRU7N5A.js";
13
+ import "./chunk-3Z6VK7XP.js";
14
+ import "./chunk-IJOPI6JC.js";
15
+ import "./chunk-77OAX2MH.js";
16
16
  export {
17
17
  buildCliFlagsSummary,
18
18
  buildLabels,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-Q5NNM4C3.js";
3
+ } from "./chunk-IJOPI6JC.js";
4
4
 
5
5
  // src/version-check.ts
6
6
  import { execSync, execFileSync } from "child_process";
@@ -7,7 +7,7 @@ import {
7
7
  setDeploySentryTag,
8
8
  truncateAddress,
9
9
  withSpan
10
- } from "./chunk-Q5NNM4C3.js";
10
+ } from "./chunk-IJOPI6JC.js";
11
11
  import {
12
12
  validateContractAddresses
13
13
  } from "./chunk-MGU5I7H5.js";
@@ -520,7 +520,7 @@ var ReviveClientWrapper = class _ReviveClientWrapper {
520
520
  const finish = (fn) => (...args) => {
521
521
  if (!settled) {
522
522
  settled = true;
523
- if (deadlinePoller) clearInterval(deadlinePoller);
523
+ if (deadlinePoller) clearTimeout(deadlinePoller);
524
524
  try {
525
525
  sub?.unsubscribe();
526
526
  } catch {
@@ -530,7 +530,7 @@ var ReviveClientWrapper = class _ReviveClientWrapper {
530
530
  };
531
531
  const startWallClockMs = Date.now();
532
532
  let startChainTimeMs = null;
533
- deadlinePoller = setInterval(async () => {
533
+ const poll = async () => {
534
534
  if (settled) return;
535
535
  try {
536
536
  if (opts.nonceFallback) {
@@ -561,10 +561,13 @@ var ReviveClientWrapper = class _ReviveClientWrapper {
561
561
  if (chainElapsedMs > TX_CHAIN_TIME_BUDGET_MS) {
562
562
  statusCallback("failed");
563
563
  finish(reject)(new Error(`Transaction not included after ${Math.floor(chainElapsedMs / 1e3)}s of chain progress (budget=${TX_CHAIN_TIME_BUDGET_MS / 1e3}s)`));
564
+ return;
564
565
  }
565
566
  } catch {
566
567
  }
567
- }, 6e3);
568
+ if (!settled) deadlinePoller = setTimeout(poll, 6e3);
569
+ };
570
+ deadlinePoller = setTimeout(poll, 6e3);
568
571
  try {
569
572
  sub = extrinsic.signSubmitAndWatch(signer, { mortality: { mortal: true, period: 256 } }).subscribe({
570
573
  next: (event) => {
@@ -1405,7 +1408,7 @@ var DotNS = class {
1405
1408
  console.log(` Minimum commitment age: ${minimumAgeSeconds}s, maximum: ${maximumAgeSeconds}s`);
1406
1409
  console.log(` Commitment valid window: ${commitTimestamp + minimumAgeSeconds} \u2013 ${commitTimestamp + maximumAgeSeconds}`);
1407
1410
  console.log(` Commitment stored on-chain (timestamp: ${commitTimestamp})`);
1408
- console.log(` Waiting for on-chain block.timestamp > ${commitTimestamp + minimumAgeSeconds}...`);
1411
+ console.log(` Waiting for on-chain block.timestamp > ${commitTimestamp + minimumAgeSeconds} (timeout ${POLL_TIMEOUT_MS / 1e3}s)`);
1409
1412
  const pollDeadline = Date.now() + POLL_TIMEOUT_MS;
1410
1413
  while (Date.now() < pollDeadline) {
1411
1414
  const nowMs = await this.clientWrapper.client.query.Timestamp.Now.getValue();
@@ -1425,8 +1428,8 @@ var DotNS = class {
1425
1428
  }
1426
1429
  return;
1427
1430
  }
1428
- const remaining = Math.ceil((pollDeadline - Date.now()) / 1e3);
1429
- console.log(` Chain time ${chainNowSeconds}, waiting for > ${commitTimestamp + minimumAgeSeconds} (${remaining}s left)...`);
1431
+ const chainSecondsToTarget = Math.max(0, commitTimestamp + minimumAgeSeconds - chainNowSeconds);
1432
+ console.log(` Chain time ${chainNowSeconds} \u2014 need +${chainSecondsToTarget}s more chain progress`);
1430
1433
  await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
1431
1434
  }
1432
1435
  throw new Error(`Commitment still too new after ${POLL_TIMEOUT_MS / 1e3}s of polling chain time. The chain may be stalled.`);
@@ -1658,24 +1661,21 @@ var DotNS = class {
1658
1661
  signerFreeBalance
1659
1662
  };
1660
1663
  }
1661
- console.log(`
1662
- [stage] Personhood preflight \u2014 auto-refresh`);
1663
- console.log(` Alias binding exists but ring revision is stale (stored=${aliasState.revision ?? "unknown"}).`);
1664
- console.log(` Refreshing automatically on testnet\u2026`);
1665
- console.log(` Estimated reprove fee: ${fmtPas(REPROVE_FEE_ESTIMATE)} ${symbol}. Signer balance: ${fmtPas(signerFreeBalance)} ${symbol} \u2014 proceeding.`);
1664
+ console.log(` Personhood: alias revision stale (stored=${aliasState.revision ?? "unknown"}) \u2014 refreshing on testnet`);
1665
+ console.log(` Estimated fee: ${fmtPas(REPROVE_FEE_ESTIMATE)} ${symbol} (signer balance: ${fmtPas(signerFreeBalance)} ${symbol})`);
1666
1666
  setDeployAttribute("deploy.dotns.reprove.auto", "true");
1667
1667
  let reproveSucceeded = false;
1668
1668
  try {
1669
- console.log(` Submitting reprove_alias_account\u2026`);
1669
+ console.log(` Submitting reprove_alias_account\u2026`);
1670
1670
  const reproveResult = await this.reprove(this._localMnemonic);
1671
- console.log(` Refresh complete (old_revision=${reproveResult.oldRevision}, new_revision=${reproveResult.newRevision}, block=${reproveResult.blockHash}).`);
1671
+ console.log(` Refresh complete (revision ${reproveResult.oldRevision} \u2192 ${reproveResult.newRevision}, block ${reproveResult.blockHash})`);
1672
1672
  setDeployAttribute("deploy.dotns.reprove.outcome", "success");
1673
1673
  setDeployAttribute("deploy.dotns.reprove.old_revision", String(reproveResult.oldRevision));
1674
1674
  setDeployAttribute("deploy.dotns.reprove.new_revision", String(reproveResult.newRevision));
1675
1675
  reproveSucceeded = true;
1676
1676
  } catch (e) {
1677
1677
  const msg = e?.message ?? String(e);
1678
- console.log(` Auto-reprove failed: ${msg}`);
1678
+ console.log(` Auto-reprove failed: ${msg}`);
1679
1679
  setDeployAttribute("deploy.dotns.reprove.outcome", "failed_submission");
1680
1680
  }
1681
1681
  if (reproveSucceeded) {
@@ -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.7.25",
9
+ version: "0.7.26-rc.2",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -2,11 +2,11 @@ import {
2
2
  classifyErrorArea,
3
3
  isInteractive,
4
4
  promptYesNo
5
- } from "./chunk-LB3HGDGW.js";
5
+ } from "./chunk-3Z6VK7XP.js";
6
6
  import {
7
7
  VERSION,
8
8
  getCurrentSentryTraceId
9
- } from "./chunk-Q5NNM4C3.js";
9
+ } from "./chunk-IJOPI6JC.js";
10
10
 
11
11
  // src/bug-report.ts
12
12
  import { execSync, execFileSync } from "child_process";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-CKCCNBYX.js";
4
+ } from "./chunk-77OAX2MH.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -20,10 +20,10 @@ import {
20
20
  } from "./chunk-S7EM5VMW.js";
21
21
  import {
22
22
  setDeployContext
23
- } from "./chunk-OCYMH4PS.js";
23
+ } from "./chunk-7NRU7N5A.js";
24
24
  import {
25
25
  probeChunks
26
- } from "./chunk-FX6T7A3F.js";
26
+ } from "./chunk-SEMZRS7Q.js";
27
27
  import {
28
28
  packSection
29
29
  } from "./chunk-C2TS5MER.js";
@@ -34,7 +34,7 @@ import {
34
34
  parseDomainName,
35
35
  popStatusName,
36
36
  verifyNonceAdvanced
37
- } from "./chunk-WY3MHJE2.js";
37
+ } from "./chunk-4LB5PXBL.js";
38
38
  import {
39
39
  derivePoolAccounts,
40
40
  detectTestnet,
@@ -56,7 +56,7 @@ import {
56
56
  truncateAddress,
57
57
  withDeploySpan,
58
58
  withSpan
59
- } from "./chunk-Q5NNM4C3.js";
59
+ } from "./chunk-IJOPI6JC.js";
60
60
  import {
61
61
  DEFAULT_ENV_ID,
62
62
  getPopSelfServeConfig,
@@ -141,7 +141,7 @@ var CHUNK_MORTALITY_PERIOD = 16;
141
141
  var RETRY_BASE_DELAY_MS = 2e3;
142
142
  var RETRY_MAX_DELAY_MS = 15e3;
143
143
  var WS_HEARTBEAT_TIMEOUT_MS = 3e5;
144
- var GRANDPA_NATURAL_WAIT_MS = 9e4;
144
+ var GRANDPA_NATURAL_WAIT_MS = parseInt(process.env.BULLETIN_GRANDPA_NATURAL_WAIT_MS ?? "90000", 10);
145
145
  var GRANDPA_REUPLOAD_POLL_MS = 5e3;
146
146
  var GRANDPA_REUPLOAD_TIMEOUT_MS = 6e4;
147
147
  var RETRY_BUDGET_MAX_EVENTS = parseInt(process.env.BULLETIN_RETRY_BUDGET_MAX ?? "5", 10);
@@ -925,9 +925,13 @@ async function storeDirectory(directoryPath, providerOrOptions = {}, password, j
925
925
  carContent = await encryptContent(carContent, password);
926
926
  console.log(` Encrypted: ${(carContent.length / 1024 / 1024).toFixed(2)} MB`);
927
927
  }
928
- const dumpPath = process.env.BULLETIN_DEPLOY_DUMP_CAR ?? path.join(path.dirname(directoryPath), `${path.basename(directoryPath)}.bulletin.car`);
929
- fs.writeFileSync(dumpPath, carContent);
930
- console.log(` Pre-upload CAR saved to ${dumpPath} (${(carContent.length / 1024 / 1024).toFixed(2)} MB)`);
928
+ const carDumpEnv = process.env.BULLETIN_DEPLOY_DUMP_CAR;
929
+ const carDumpOpt = opts.dumpCar;
930
+ if (carDumpEnv !== void 0 || carDumpOpt) {
931
+ const dumpPath = typeof carDumpEnv === "string" && carDumpEnv ? carDumpEnv : typeof carDumpOpt === "string" && carDumpOpt ? carDumpOpt : path.join(path.dirname(directoryPath), `${path.basename(directoryPath)}.bulletin.car`);
932
+ fs.writeFileSync(dumpPath, carContent);
933
+ console.log(` Pre-upload CAR saved to ${dumpPath} (${(carContent.length / 1024 / 1024).toFixed(2)} MB)`);
934
+ }
931
935
  const carChunks = chunk(carContent, CHUNK_SIZE);
932
936
  const predictedStorageCid = computeStorageCid(carChunks);
933
937
  if (opts.onCarReady) await opts.onCarReady(carContent, predictedStorageCid);
@@ -1200,30 +1204,16 @@ async function storeDirectoryV2(directoryPath, opts = {}) {
1200
1204
  sampleMemory("merkleize_finalise_end");
1201
1205
  return r;
1202
1206
  });
1203
- {
1204
- const phaseBS1 = phaseB.chunkCids.slice(
1205
- phaseB.sectionChunkCounts.section0,
1206
- phaseB.sectionChunkCounts.section0 + phaseB.sectionChunkCounts.section1
1207
- );
1208
- if (phaseBS1.length !== phaseA.section1ChunkCids.length) {
1209
- throw new Error(
1210
- `INVARIANT FAILED: section-1 drift between phases. Phase A section1ChunkCids.length=${phaseA.section1ChunkCids.length}, Phase B section-1 slice length=${phaseBS1.length}. Section 1 must be byte-identical between phases.`
1211
- );
1212
- }
1213
- for (let i = 0; i < phaseBS1.length; i++) {
1214
- if (phaseBS1[i] !== phaseA.section1ChunkCids[i]) {
1215
- throw new Error(
1216
- `INVARIANT FAILED: section-1 drift between phases at chunk index ${i}. Phase A=${phaseA.section1ChunkCids[i]}, Phase B=${phaseBS1[i]}. Section 1 must be byte-identical between phases.`
1217
- );
1218
- }
1219
- }
1220
- }
1221
1207
  const sizeDecision = checkDeploySize(phaseB.carBytes.length, { allowLargeDeploy: opts.allowLargeDeploy });
1222
1208
  if (sizeDecision.kind === "abort") throw new Error(sizeDecision.message);
1223
1209
  if (sizeDecision.kind === "warn") console.warn(` \u26A0 ${sizeDecision.message}`);
1224
- const dumpPath = process.env.BULLETIN_DEPLOY_DUMP_CAR ?? path.join(path.dirname(directoryPath), `${path.basename(directoryPath)}.bulletin.car`);
1225
- fs.writeFileSync(dumpPath, phaseB.carBytes);
1226
- console.log(` Pre-upload CAR saved to ${dumpPath} (${(phaseB.carBytes.length / 1024 / 1024).toFixed(2)} MB)`);
1210
+ const carDumpEnv = process.env.BULLETIN_DEPLOY_DUMP_CAR;
1211
+ const carDumpOpt = opts.dumpCar;
1212
+ if (carDumpEnv !== void 0 || carDumpOpt) {
1213
+ const dumpPath = typeof carDumpEnv === "string" && carDumpEnv ? carDumpEnv : typeof carDumpOpt === "string" && carDumpOpt ? carDumpOpt : path.join(path.dirname(directoryPath), `${path.basename(directoryPath)}.bulletin.car`);
1214
+ fs.writeFileSync(dumpPath, phaseB.carBytes);
1215
+ console.log(` Pre-upload CAR saved to ${dumpPath} (${(phaseB.carBytes.length / 1024 / 1024).toFixed(2)} MB)`);
1216
+ }
1227
1217
  const carChunksB = phaseB.chunks;
1228
1218
  const carChunkCidsB = phaseB.chunkCids;
1229
1219
  const trustedCidsB = new Set(phaseAKnownPresent);
@@ -1281,12 +1271,14 @@ async function storeDirectoryV2(directoryPath, opts = {}) {
1281
1271
  const elapsed = Math.round((Date.now() - waitStart) / 1e3);
1282
1272
  console.log(` \u2713 All ${grandpaCids.length} chunks finalised (waited ${elapsed}s)`);
1283
1273
  } else {
1284
- const rootMissing = missingCids.has(storageCid);
1285
- if (rootMissing) {
1286
- throw new Error(
1287
- `Deploy verification failed: DAG-PB root ${storageCid.slice(0, 20)}\u2026 not finalised after ${GRANDPA_NATURAL_WAIT_MS / 1e3}s wait. The chain may have dropped the root extrinsic. Re-run deploy.`
1288
- );
1289
- }
1274
+ const rootHashCode = 18;
1275
+ const rootChunkLinks = phaseB.chunks.map((c) => ({
1276
+ cid: createCID(c, CID_CONFIG.codec, rootHashCode),
1277
+ len: c.length
1278
+ }));
1279
+ const rootFileData = new UnixFS({ type: "file", blockSizes: rootChunkLinks.map((c) => BigInt(c.len)) });
1280
+ const rootDagNode = dagPB.prepare({ Data: rootFileData.marshal(), Links: rootChunkLinks.map((c) => ({ Name: "", Tsize: c.len, Hash: c.cid })) });
1281
+ const rootDagBytes = dagPB.encode(rootDagNode);
1290
1282
  console.log(` ${missingCids.size} chunks still missing after wait \u2014 re-uploading`);
1291
1283
  const phaseBChunkByCid = /* @__PURE__ */ new Map();
1292
1284
  for (let i = 0; i < phaseB.chunkCids.length; i++) {
@@ -1296,14 +1288,29 @@ async function storeDirectoryV2(directoryPath, opts = {}) {
1296
1288
  const reuploadList = [...missingCids];
1297
1289
  for (let i = 0; i < reuploadList.length; i++) {
1298
1290
  const cid = reuploadList[i];
1299
- const chunkBytes = phaseBChunkByCid.get(cid);
1300
- if (!chunkBytes) {
1301
- throw new Error(
1302
- `Deploy verification failed: chunk ${cid.slice(0, 20)}\u2026 missing at finalised head and its bytes are not in phaseB.chunks (cannot re-upload). This indicates an internal state issue.`
1303
- );
1304
- }
1305
1291
  const freshNonce = await fetchNonceFn(BULLETIN_ENDPOINTS, phaseALiveProvider.ss58);
1306
- await storeChunk(phaseALiveProvider.unsafeApi, phaseALiveProvider.signer, chunkBytes, freshNonce, phaseALiveProvider.ss58, { fetchNonce: phaseALiveProvider.fetchNonce });
1292
+ if (cid === storageCid) {
1293
+ const rootTx = phaseALiveProvider.unsafeApi.tx.TransactionStorage.store_with_cid_config({
1294
+ cid: { codec: BigInt(112), hashing: toHashingEnum(rootHashCode) },
1295
+ data: rootDagBytes
1296
+ });
1297
+ await watchTransaction(rootTx, phaseALiveProvider.signer, { mortality: { mortal: true, period: 256 }, nonce: freshNonce }, () => storageCid, {
1298
+ label: "root-reupload",
1299
+ rpc: BULLETIN_ENDPOINTS,
1300
+ senderSS58: phaseALiveProvider.ss58,
1301
+ expectedNonce: freshNonce,
1302
+ timeoutMs: CHUNK_TIMEOUT_MS,
1303
+ fetchNonce: phaseALiveProvider.fetchNonce
1304
+ });
1305
+ } else {
1306
+ const chunkBytes = phaseBChunkByCid.get(cid);
1307
+ if (!chunkBytes) {
1308
+ throw new Error(
1309
+ `Deploy verification failed: chunk ${cid.slice(0, 20)}\u2026 missing at finalised head and its bytes are not in phaseB.chunks (cannot re-upload). This indicates an internal state issue.`
1310
+ );
1311
+ }
1312
+ await storeChunk(phaseALiveProvider.unsafeApi, phaseALiveProvider.signer, chunkBytes, freshNonce, phaseALiveProvider.ss58, { fetchNonce: phaseALiveProvider.fetchNonce });
1313
+ }
1307
1314
  reuploadCount++;
1308
1315
  console.log(` [${i + 1}/${reuploadList.length}] re-uploaded ${cid.slice(0, 20)}\u2026 (nonce ${freshNonce})`);
1309
1316
  }
@@ -1701,6 +1708,7 @@ async function deploy(content, domainName = null, options = {}) {
1701
1708
  reproducibleSource: options.reproducibleSource,
1702
1709
  domain: name,
1703
1710
  gateway: envIpfs,
1711
+ dumpCar: options.dumpCar,
1704
1712
  onCarReady: (carBytes, predictedCid) => {
1705
1713
  if (options.ghPagesMirror) {
1706
1714
  mirrorPromise = mirrorToGitHubPages({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  captureWarning
3
- } from "./chunk-Q5NNM4C3.js";
3
+ } from "./chunk-IJOPI6JC.js";
4
4
 
5
5
  // src/chunk-probe.ts
6
6
  import { Twox128, Blake2128Concat, decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings";
@@ -5,9 +5,9 @@ import {
5
5
  _decodeStorageValue,
6
6
  _resetProbeSession,
7
7
  probeChunks
8
- } from "./chunk-FX6T7A3F.js";
9
- import "./chunk-Q5NNM4C3.js";
10
- import "./chunk-CKCCNBYX.js";
8
+ } from "./chunk-SEMZRS7Q.js";
9
+ import "./chunk-IJOPI6JC.js";
10
+ import "./chunk-77OAX2MH.js";
11
11
  export {
12
12
  ChainProbeCrossValidationError,
13
13
  ChainProbeMetadataError,
package/dist/deploy.d.ts CHANGED
@@ -141,6 +141,14 @@ interface StoreDirectoryOptions {
141
141
  * before falling through to the IPFS gateway.
142
142
  */
143
143
  domain?: string;
144
+ /**
145
+ * Opt-in: write the pre-upload CAR file to disk after merkleization.
146
+ * - `true` → write to `<buildDir>.bulletin.car` (default path).
147
+ * - `string` → write to that explicit path.
148
+ * - omitted / `false` → no file written (default).
149
+ * Also honoured when `BULLETIN_DEPLOY_DUMP_CAR` env var is set (back-compat).
150
+ */
151
+ dumpCar?: string | boolean;
144
152
  }
145
153
  declare function storeDirectory(directoryPath: string, providerOrOptions?: ExistingProvider | StoreDirectoryOptions, password?: string, jsMerkle?: boolean): Promise<{
146
154
  storageCid: string;
@@ -230,6 +238,15 @@ interface DeployOptions {
230
238
  bulletinEndpoints?: string[];
231
239
  /** Pre-resolved asset-hub endpoints. Same escape-hatch semantics. */
232
240
  assetHubEndpoints?: string[];
241
+ /**
242
+ * Opt-in: write the pre-upload CAR file to disk after merkleization.
243
+ * - `true` → write to `<buildDir>.bulletin.car` (default path).
244
+ * - `string` → write to that explicit path.
245
+ * - omitted / `false` → no file written (default).
246
+ * Also honoured when `BULLETIN_DEPLOY_DUMP_CAR` env var is set (back-compat).
247
+ * CLI: --dump-car[=<path>]
248
+ */
249
+ dumpCar?: string | boolean;
233
250
  }
234
251
  declare function resolveDotnsConnectOptions(options: Pick<DeployOptions, "mnemonic" | "derivationPath" | "signer" | "signerAddress">, assetHubEndpoints?: string[], autoAccountMapping?: boolean, contracts?: Record<string, string>, nativeToEthRatio?: bigint, environmentId?: string, popSelfServe?: PopSelfServeConfig | null, registerStorageDeposit?: bigint): {
235
252
  signer?: PolkadotSigner;
package/dist/deploy.js CHANGED
@@ -32,19 +32,19 @@ import {
32
32
  storeDirectory,
33
33
  storeDirectoryV2,
34
34
  storeFile
35
- } from "./chunk-J5JHYLEN.js";
35
+ } from "./chunk-OHAO2BPD.js";
36
36
  import "./chunk-KHVTYIIX.js";
37
37
  import "./chunk-KOSF5FDO.js";
38
38
  import "./chunk-FZWJV5AD.js";
39
39
  import "./chunk-S7EM5VMW.js";
40
- import "./chunk-OCYMH4PS.js";
41
- import "./chunk-LB3HGDGW.js";
42
- import "./chunk-FX6T7A3F.js";
40
+ import "./chunk-7NRU7N5A.js";
41
+ import "./chunk-3Z6VK7XP.js";
42
+ import "./chunk-SEMZRS7Q.js";
43
43
  import "./chunk-C2TS5MER.js";
44
- import "./chunk-WY3MHJE2.js";
44
+ import "./chunk-4LB5PXBL.js";
45
45
  import "./chunk-QMYW3D6E.js";
46
- import "./chunk-Q5NNM4C3.js";
47
- import "./chunk-CKCCNBYX.js";
46
+ import "./chunk-IJOPI6JC.js";
47
+ import "./chunk-77OAX2MH.js";
48
48
  import "./chunk-MGU5I7H5.js";
49
49
  import {
50
50
  EXIT_CODE_NO_RETRY,
package/dist/dotns.js CHANGED
@@ -41,10 +41,10 @@ import {
41
41
  stripTrailingDigits,
42
42
  validateDomainLabel,
43
43
  verifyNonceAdvanced
44
- } from "./chunk-WY3MHJE2.js";
44
+ } from "./chunk-4LB5PXBL.js";
45
45
  import "./chunk-QMYW3D6E.js";
46
- import "./chunk-Q5NNM4C3.js";
47
- import "./chunk-CKCCNBYX.js";
46
+ import "./chunk-IJOPI6JC.js";
47
+ import "./chunk-77OAX2MH.js";
48
48
  import "./chunk-MGU5I7H5.js";
49
49
  import "./chunk-ZOC4GITL.js";
50
50
  export {
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  deploy,
3
3
  merkleizeJS,
4
4
  merkleizeWithStableOrder
5
- } from "./chunk-J5JHYLEN.js";
5
+ } from "./chunk-OHAO2BPD.js";
6
6
  import {
7
7
  computeStats,
8
8
  renderSummary,
@@ -24,18 +24,18 @@ import {
24
24
  isVolatilePath,
25
25
  parseManifest
26
26
  } from "./chunk-S7EM5VMW.js";
27
- import "./chunk-OCYMH4PS.js";
28
- import "./chunk-LB3HGDGW.js";
27
+ import "./chunk-7NRU7N5A.js";
28
+ import "./chunk-3Z6VK7XP.js";
29
29
  import {
30
30
  probeChunks
31
- } from "./chunk-FX6T7A3F.js";
31
+ } from "./chunk-SEMZRS7Q.js";
32
32
  import "./chunk-C2TS5MER.js";
33
33
  import {
34
34
  DEFAULT_MNEMONIC,
35
35
  DotNS,
36
36
  parseDomainName,
37
37
  sanitizeDomainLabel
38
- } from "./chunk-WY3MHJE2.js";
38
+ } from "./chunk-4LB5PXBL.js";
39
39
  import {
40
40
  bootstrapPool,
41
41
  derivePoolAccounts,
@@ -43,7 +43,7 @@ import {
43
43
  fetchPoolAuthorizations,
44
44
  selectAccount
45
45
  } from "./chunk-QMYW3D6E.js";
46
- import "./chunk-Q5NNM4C3.js";
46
+ import "./chunk-IJOPI6JC.js";
47
47
  import {
48
48
  VERSION,
49
49
  loadRunState,
@@ -53,7 +53,7 @@ import {
53
53
  shouldSkipStaleWarning,
54
54
  stateFilePath,
55
55
  writeRunState
56
- } from "./chunk-CKCCNBYX.js";
56
+ } from "./chunk-77OAX2MH.js";
57
57
  import {
58
58
  DEFAULT_ENV_ID,
59
59
  defaultBundledPath,
@@ -5,8 +5,8 @@ import {
5
5
  maybeWriteMemoryReport,
6
6
  safeHeap,
7
7
  sampleFromBytes
8
- } from "./chunk-Q5NNM4C3.js";
9
- import "./chunk-CKCCNBYX.js";
8
+ } from "./chunk-IJOPI6JC.js";
9
+ import "./chunk-77OAX2MH.js";
10
10
  export {
11
11
  DEFAULT_THRESHOLD_MB,
12
12
  buildMemoryReport,
package/dist/merkle.js CHANGED
@@ -6,19 +6,19 @@ import {
6
6
  merkleizeKuboBackend,
7
7
  merkleizeWithStableOrder,
8
8
  rebuildOrderedCarFromBytes
9
- } from "./chunk-J5JHYLEN.js";
9
+ } from "./chunk-OHAO2BPD.js";
10
10
  import "./chunk-KHVTYIIX.js";
11
11
  import "./chunk-KOSF5FDO.js";
12
12
  import "./chunk-FZWJV5AD.js";
13
13
  import "./chunk-S7EM5VMW.js";
14
- import "./chunk-OCYMH4PS.js";
15
- import "./chunk-LB3HGDGW.js";
16
- import "./chunk-FX6T7A3F.js";
14
+ import "./chunk-7NRU7N5A.js";
15
+ import "./chunk-3Z6VK7XP.js";
16
+ import "./chunk-SEMZRS7Q.js";
17
17
  import "./chunk-C2TS5MER.js";
18
- import "./chunk-WY3MHJE2.js";
18
+ import "./chunk-4LB5PXBL.js";
19
19
  import "./chunk-QMYW3D6E.js";
20
- import "./chunk-Q5NNM4C3.js";
21
- import "./chunk-CKCCNBYX.js";
20
+ import "./chunk-IJOPI6JC.js";
21
+ import "./chunk-77OAX2MH.js";
22
22
  import "./chunk-MGU5I7H5.js";
23
23
  import "./chunk-ZOC4GITL.js";
24
24
  import "./chunk-HOTQDYHD.js";
@@ -21,10 +21,10 @@ import {
21
21
  } from "../chunk-T7EEVWNU.js";
22
22
  import {
23
23
  WS_HEARTBEAT_TIMEOUT_MS
24
- } from "../chunk-WY3MHJE2.js";
24
+ } from "../chunk-4LB5PXBL.js";
25
25
  import "../chunk-QMYW3D6E.js";
26
- import "../chunk-Q5NNM4C3.js";
27
- import "../chunk-CKCCNBYX.js";
26
+ import "../chunk-IJOPI6JC.js";
27
+ import "../chunk-77OAX2MH.js";
28
28
  import {
29
29
  loadEnvironments
30
30
  } from "../chunk-MGU5I7H5.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  WS_HEARTBEAT_TIMEOUT_MS
3
- } from "../chunk-WY3MHJE2.js";
3
+ } from "../chunk-4LB5PXBL.js";
4
4
  import "../chunk-QMYW3D6E.js";
5
- import "../chunk-Q5NNM4C3.js";
6
- import "../chunk-CKCCNBYX.js";
5
+ import "../chunk-IJOPI6JC.js";
6
+ import "../chunk-77OAX2MH.js";
7
7
  import {
8
8
  loadEnvironments
9
9
  } from "../chunk-MGU5I7H5.js";
package/dist/run-state.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  shouldSkipStaleWarning,
8
8
  stateFilePath,
9
9
  writeRunState
10
- } from "./chunk-CKCCNBYX.js";
10
+ } from "./chunk-77OAX2MH.js";
11
11
  export {
12
12
  VERSION,
13
13
  loadRunState,
package/dist/telemetry.js CHANGED
@@ -31,8 +31,8 @@ import {
31
31
  truncateAddress,
32
32
  withDeploySpan,
33
33
  withSpan
34
- } from "./chunk-Q5NNM4C3.js";
35
- import "./chunk-CKCCNBYX.js";
34
+ } from "./chunk-IJOPI6JC.js";
35
+ import "./chunk-77OAX2MH.js";
36
36
  export {
37
37
  VERSION,
38
38
  __setDeployRootSpanForTest,
@@ -11,9 +11,9 @@ import {
11
11
  isPreReleaseVersion,
12
12
  preReleaseWarning,
13
13
  promptYesNo
14
- } from "./chunk-LB3HGDGW.js";
15
- import "./chunk-Q5NNM4C3.js";
16
- import "./chunk-CKCCNBYX.js";
14
+ } from "./chunk-3Z6VK7XP.js";
15
+ import "./chunk-IJOPI6JC.js";
16
+ import "./chunk-77OAX2MH.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.7.25",
3
+ "version": "0.7.26-rc.2",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",