@parity/product-deploy 0.7.29 → 0.7.30-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 (53) hide show
  1. package/assets/environments.json +5 -2
  2. package/dist/bug-report.js +4 -4
  3. package/dist/{chunk-WGZUHHII.js → chunk-4ESXBZHT.js} +1 -1
  4. package/dist/{chunk-SBLSXJ2L.js → chunk-6577E4YF.js} +58 -7
  5. package/dist/{chunk-XR6ZWT4P.js → chunk-67XDFCSR.js} +1 -1
  6. package/dist/{chunk-G5VJOHZJ.js → chunk-6H7W2G2R.js} +3 -3
  7. package/dist/{chunk-2VAUMZB2.js → chunk-7Y7RDOGT.js} +39 -8
  8. package/dist/{chunk-BMAEWZYV.js → chunk-AFBOKCCQ.js} +3 -3
  9. package/dist/{chunk-JZFXFZ5L.js → chunk-GL2HHK4G.js} +5 -2
  10. package/dist/{chunk-7PYJMQQP.js → chunk-I2DTDCS5.js} +2 -2
  11. package/dist/{chunk-5VZQ2KSU.js → chunk-JCOZV25R.js} +18 -15
  12. package/dist/{chunk-IDYGYIMH.js → chunk-LHLCPDGL.js} +1 -1
  13. package/dist/{chunk-7UGOKEKF.js → chunk-LU4NHGRE.js} +3 -3
  14. package/dist/{chunk-2TAHVGIF.js → chunk-Q4RL4KJO.js} +43 -60
  15. package/dist/{chunk-T7EEVWNU.js → chunk-SI2ZUOYD.js} +5 -5
  16. package/dist/chunk-SLE4P6MO.js +39 -0
  17. package/dist/{chunk-QTAKQVPQ.js → chunk-TMKDWZPN.js} +5 -1
  18. package/dist/{chunk-QTQGD54B.js → chunk-VLZQFSZ4.js} +1 -1
  19. package/dist/chunk-XAB7WM3S.js +90 -0
  20. package/dist/chunk-probe.js +3 -3
  21. package/dist/deploy.d.ts +3 -1
  22. package/dist/deploy.js +11 -9
  23. package/dist/dotns.d.ts +19 -2
  24. package/dist/dotns.js +7 -5
  25. package/dist/environments.js +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +10 -10
  28. package/dist/manifest/publish.js +10 -10
  29. package/dist/memory-report.js +2 -2
  30. package/dist/merkle.js +9 -9
  31. package/dist/personhood/bind-paid-alias.d.ts +1 -1
  32. package/dist/personhood/bind-paid-alias.js +3 -2
  33. package/dist/personhood/bind-personal-id.js +2 -2
  34. package/dist/personhood/bootstrap.d.ts +7 -0
  35. package/dist/personhood/bootstrap.js +29 -17
  36. package/dist/personhood/chain-prereqs.d.ts +76 -0
  37. package/dist/personhood/chain-prereqs.js +17 -0
  38. package/dist/personhood/claim-pgas.d.ts +33 -2
  39. package/dist/personhood/claim-pgas.js +4 -2
  40. package/dist/personhood/constants.d.ts +5 -5
  41. package/dist/personhood/constants.js +3 -3
  42. package/dist/personhood/member-key.js +2 -2
  43. package/dist/personhood/people-client.js +5 -5
  44. package/dist/personhood/proof-validity.d.ts +41 -0
  45. package/dist/personhood/proof-validity.js +12 -0
  46. package/dist/personhood/reprove.d.ts +1 -1
  47. package/dist/personhood/reprove.js +10 -13
  48. package/dist/pool.js +3 -3
  49. package/dist/run-state.js +1 -1
  50. package/dist/telemetry.d.ts +43 -1
  51. package/dist/telemetry.js +4 -2
  52. package/dist/version-check.js +3 -3
  53. package/package.json +3 -3
@@ -1,16 +1,17 @@
1
1
  import {
2
2
  isTestnetSpecName
3
- } from "./chunk-XR6ZWT4P.js";
3
+ } from "./chunk-67XDFCSR.js";
4
4
  import {
5
5
  captureWarning,
6
+ markCodePath,
6
7
  setDeployAttribute,
7
8
  setDeploySentryTag,
8
9
  truncateAddress,
9
10
  withSpan
10
- } from "./chunk-QTAKQVPQ.js";
11
+ } from "./chunk-TMKDWZPN.js";
11
12
  import {
12
13
  validateContractAddresses
13
- } from "./chunk-JZFXFZ5L.js";
14
+ } from "./chunk-GL2HHK4G.js";
14
15
  import {
15
16
  NonRetryableError
16
17
  } from "./chunk-ZOC4GITL.js";
@@ -39,6 +40,17 @@ import {
39
40
  concatHex
40
41
  } from "viem";
41
42
  import { CID } from "multiformats/cid";
43
+
44
+ // src/code-paths.ts
45
+ var CODE_PATHS = {
46
+ // Auto-account-mapping branch (ensureMappedAccountReady, dotns.ts)
47
+ // true → automated mapping via EVM key derivation
48
+ // false → standard check (already-mapped or manually register)
49
+ DOTNS_AUTO_MAPPING: "dotns.auto-mapping",
50
+ DOTNS_MANUAL_MAPPING: "dotns.manual-mapping"
51
+ };
52
+
53
+ // src/dotns.ts
42
54
  var TX_KIND_HASH = "hash";
43
55
  var TX_KIND_NONCE_ADVANCED = "nonce-advanced";
44
56
  var ATTR_TX_RESOLUTION_KIND = "deploy.dotns.tx_resolution_kind";
@@ -400,7 +412,7 @@ function sanitizeDomainLabel(label) {
400
412
  return label;
401
413
  }
402
414
  function validateDomainLabel(label, opts = {}) {
403
- if (!/^[a-z0-9-]{3,}$/.test(label)) throw new Error("Invalid domain label: must contain only lowercase letters, digits, and hyphens, min 3 chars");
415
+ if (!/^[a-z0-9-]{3,63}$/.test(label)) throw new Error("Invalid domain label: must be 3-63 chars and contain only lowercase letters, digits, and hyphens");
404
416
  if (label.startsWith("-") || label.endsWith("-")) throw new Error("Invalid domain label: cannot start or end with hyphen");
405
417
  const sanitized = opts.skipSanitize ? label : sanitizeDomainLabel(label);
406
418
  if (!opts.skipSanitize && /-\d+$/.test(sanitized)) {
@@ -431,10 +443,10 @@ function isCommitmentTimingBarerevert(msg) {
431
443
  function classifyDotnsLabel(label) {
432
444
  const totalLength = label.length;
433
445
  const trailingDigits = countTrailingDigits(label);
434
- if (trailingDigits > 2) {
446
+ if (trailingDigits === 1 || trailingDigits > 2) {
435
447
  return {
436
448
  status: ProofOfPersonhoodStatus.Reserved,
437
- message: `Name has ${trailingDigits} trailing digits; DotNS allows at most 2 trailing digits. Use a base name with 0-2 trailing digits.`
449
+ message: `Name has ${trailingDigits} trailing digit${trailingDigits === 1 ? "" : "s"}; DotNS allows exactly 0 or 2 trailing digits. Use a base name with no trailing digits or a 2-digit suffix.`
438
450
  };
439
451
  }
440
452
  const baselength = totalLength - trailingDigits;
@@ -448,10 +460,9 @@ function classifyDotnsLabel(label) {
448
460
  if (trailingDigits === 2) return { status: ProofOfPersonhoodStatus.ProofOfPersonhoodLite, message: "Requires Light personhood verification" };
449
461
  return { status: ProofOfPersonhoodStatus.ProofOfPersonhoodFull, message: "Requires Full personhood verification" };
450
462
  }
451
- if (trailingDigits === 2) return { status: ProofOfPersonhoodStatus.NoStatus, message: "Available to all" };
452
- return { status: ProofOfPersonhoodStatus.ProofOfPersonhoodFull, message: "Requires Full personhood verification" };
463
+ return { status: ProofOfPersonhoodStatus.NoStatus, message: "Available to all" };
453
464
  }
454
- function canRegister(requiredStatus, userStatus, trailingDigits) {
465
+ function canRegister(requiredStatus, userStatus) {
455
466
  if (requiredStatus === ProofOfPersonhoodStatus.Reserved) return false;
456
467
  if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull) {
457
468
  return userStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull;
@@ -459,7 +470,7 @@ function canRegister(requiredStatus, userStatus, trailingDigits) {
459
470
  if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite) {
460
471
  return userStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite || userStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull;
461
472
  }
462
- return trailingDigits !== 0 && userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodLite;
473
+ return true;
463
474
  }
464
475
  function exampleNoStatusLabel(label) {
465
476
  const base = stripTrailingDigits(validateDomainLabel(label, { checkReserved: false })).replace(/[^a-z0-9-]/g, "x");
@@ -810,6 +821,16 @@ function logTxResolution(res) {
810
821
  }
811
822
  }
812
823
  var DOTNS_CONTEXT_HEX_LOWER = "0x646f746e73000000000000000000000000000000000000000000000000000000";
824
+ function classifyAliasAccountRow(row) {
825
+ if (!row) return { state: "not-bound" };
826
+ const r = row;
827
+ const contextHex = typeof r.ca?.context === "string" ? r.ca.context.toLowerCase() : "";
828
+ const revision = Number(r.revision ?? 0);
829
+ if (contextHex === DOTNS_CONTEXT_HEX_LOWER) {
830
+ return { state: "bound-likely-stale", storedContextHex: contextHex, revision };
831
+ }
832
+ return { state: "wrong-context", storedContextHex: contextHex, revision };
833
+ }
813
834
  function formatPersonhoodRemediation(state, popSelfServe, environmentId) {
814
835
  if (!popSelfServe?.stateAwareGuidance) {
815
836
  return "Self-attestation is no longer available. Contact the DotNS team for whitelisting / Personhood status help.";
@@ -977,10 +998,12 @@ var DotNS = class {
977
998
  throw new Error("Account mapping unavailable before DotNS signer is initialized");
978
999
  }
979
1000
  if (autoAccountMapping) {
1001
+ markCodePath(CODE_PATHS.DOTNS_AUTO_MAPPING);
980
1002
  setDeployAttribute("deploy.dotns.mapping_source", "auto-account-mapping");
981
1003
  await this.ensureAutoMappedAccountReady();
982
1004
  return;
983
1005
  }
1006
+ markCodePath(CODE_PATHS.DOTNS_MANUAL_MAPPING);
984
1007
  if (await this.clientWrapper.checkIfAccountMapped(this.substrateAddress)) {
985
1008
  setDeployAttribute("deploy.dotns.mapping_source", "already-mapped");
986
1009
  console.log(` Account: mapped`);
@@ -1095,17 +1118,7 @@ var DotNS = class {
1095
1118
  try {
1096
1119
  const api = this.clientWrapper.client;
1097
1120
  const row = await api.query.AliasAccounts.AccountToAlias.getValue(ss58, { at: "best" });
1098
- if (!row) return { state: "not-bound" };
1099
- const contextHex = typeof row.ca?.context === "string" ? row.ca.context.toLowerCase() : "";
1100
- const paid = Boolean(row.paid);
1101
- const revision = Number(row.revision ?? 0);
1102
- if (paid && contextHex === DOTNS_CONTEXT_HEX_LOWER) {
1103
- return { state: "bound-likely-stale", storedContextHex: contextHex, paid, revision };
1104
- }
1105
- if (!paid || contextHex !== DOTNS_CONTEXT_HEX_LOWER) {
1106
- return { state: "wrong-context", storedContextHex: contextHex, paid, revision };
1107
- }
1108
- return { state: "bound-fresh", storedContextHex: contextHex, paid, revision };
1121
+ return classifyAliasAccountRow(row);
1109
1122
  } catch {
1110
1123
  return { state: "not-bound" };
1111
1124
  }
@@ -1961,15 +1974,10 @@ var DotNS = class {
1961
1974
  const message = classificationResult[1];
1962
1975
  const userStatus = await this.getUserPopStatus();
1963
1976
  if (requiredStatus === ProofOfPersonhoodStatus.Reserved) throw new Error(message);
1964
- if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull) {
1965
- if (userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodFull) throw new Error("Requires Full Personhood verification");
1966
- } else if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite) {
1967
- if (userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodLite && userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodFull) throw new Error("Requires Personhood Lite verification");
1968
- } else {
1969
- const trailingDigitCount = countTrailingDigits(label);
1970
- if (trailingDigitCount === 0 || userStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite) {
1971
- throw new Error("Personhood Lite cannot register base names \u2014 this name class requires a Full or NoStatus signer");
1972
- }
1977
+ if (!canRegister(requiredStatus, userStatus)) {
1978
+ throw new Error(
1979
+ requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull ? "Requires Full Personhood verification" : "Requires Personhood Lite verification"
1980
+ );
1973
1981
  }
1974
1982
  const priceMeta = await withTimeout(this.contractCall(this._contracts.POP_RULES, POP_RULES_ABI, "priceWithCheck", [label, this.evmAddress]), 3e4, "priceWithCheck");
1975
1983
  const priceRaw = priceMeta?.price;
@@ -2126,27 +2134,7 @@ var DotNS = class {
2126
2134
  };
2127
2135
  }
2128
2136
  const targetPopStatus = userStatus;
2129
- if (!canRegister(classification.status, userStatus, trailingDigits)) {
2130
- if (classification.status === ProofOfPersonhoodStatus.NoStatus && userStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite) {
2131
- return {
2132
- label: validated,
2133
- classification,
2134
- userStatus,
2135
- trailingDigits,
2136
- baselength,
2137
- isAvailable: true,
2138
- existingOwner: null,
2139
- isBaseNameReserved: isReserved,
2140
- reservationOwner,
2141
- isTestnet,
2142
- canProceed: false,
2143
- reason: `${validated}.dot: this name class is NoStatus-compatible, but Personhood Lite signers cannot register NoStatus-class labels. Self-attestation is no longer available. Use a NoStatus or Full signer, or contact the DotNS team for whitelisting / Personhood status help.`,
2144
- plannedAction: "abort",
2145
- needsPopUpgrade: false,
2146
- targetPopStatus,
2147
- signerFreeBalance
2148
- };
2149
- }
2137
+ if (!canRegister(classification.status, userStatus)) {
2150
2138
  if (userStatus === ProofOfPersonhoodStatus.NoStatus && isTestnet && this._popSelfServe?.stateAwareGuidance === true && this.substrateAddress) {
2151
2139
  const aliasState = await this.classifyAliasAccountState(this.substrateAddress);
2152
2140
  if (aliasState.state === "bound-likely-stale" && !this._usesExternalSigner && this._localMnemonic && !reproveAttempted) {
@@ -2316,7 +2304,6 @@ var DotNS = class {
2316
2304
  return withSpan("deploy.dotns.register", `2a. register ${label}.dot`, {}, async () => {
2317
2305
  if (!this.connected) await this.connect(options);
2318
2306
  label = validateDomainLabel(label);
2319
- const trailingDigitCount = countTrailingDigits(label);
2320
2307
  const preClassification = classifyDotnsLabel(label);
2321
2308
  const preRequiredStatus = preClassification.status;
2322
2309
  if (preRequiredStatus === ProofOfPersonhoodStatus.Reserved) {
@@ -2325,11 +2312,6 @@ var DotNS = class {
2325
2312
  const isTestnet = await this.isTestnet();
2326
2313
  const registerAliasState = isTestnet && this._popSelfServe?.stateAwareGuidance === true && this.substrateAddress ? await this.classifyAliasAccountState(this.substrateAddress) : null;
2327
2314
  const rejectIneligible = (statusRequired, userStatus2) => {
2328
- if (statusRequired === ProofOfPersonhoodStatus.NoStatus && userStatus2 === ProofOfPersonhoodStatus.ProofOfPersonhoodLite) {
2329
- throw new Error(
2330
- `${label}.dot: this name class is NoStatus-compatible, but Personhood Lite signers cannot register NoStatus-class labels. Self-attestation is no longer available. Use a NoStatus or Full signer, or contact the DotNS team for whitelisting / Personhood status help.`
2331
- );
2332
- }
2333
2315
  throw new Error(
2334
2316
  formatPopShortfallReason({
2335
2317
  label,
@@ -2353,7 +2335,7 @@ var DotNS = class {
2353
2335
  throw new Error(classification.message);
2354
2336
  }
2355
2337
  const userStatus = await this.getUserPopStatus();
2356
- if (!canRegister(requiredStatus, userStatus, trailingDigitCount)) {
2338
+ if (!canRegister(requiredStatus, userStatus)) {
2357
2339
  rejectIneligible(requiredStatus, userStatus);
2358
2340
  }
2359
2341
  const doCommitAndRegister = async () => {
@@ -2408,8 +2390,8 @@ var DotNS = class {
2408
2390
  account: this.substrateAddress,
2409
2391
  memberKey,
2410
2392
  signCall: this.signer,
2411
- buildRingProof: async ({ members, context, msg }) => {
2412
- const r = verifiable.one_shot(memberEntropy, members, context, msg);
2393
+ buildRingProof: async ({ ringExponent, members, context, msg }) => {
2394
+ const r = verifiable.one_shot(ringExponent, memberEntropy, members, context, msg);
2413
2395
  return { proof: r.proof, alias: r.alias };
2414
2396
  }
2415
2397
  });
@@ -2495,6 +2477,7 @@ export {
2495
2477
  parseProofOfPersonhoodStatus,
2496
2478
  popStatusName,
2497
2479
  formatDispatchError,
2480
+ classifyAliasAccountRow,
2498
2481
  formatPersonhoodRemediation,
2499
2482
  formatPopShortfallReason,
2500
2483
  DotNS,
@@ -13,11 +13,11 @@ var PGAS_ASSET_LOCATION = {
13
13
  ]
14
14
  }
15
15
  };
16
- var PROOF_BYTES = 788;
17
- var BANDERSNATCH_SIGNATURE_BYTES = 96;
18
- var PEOPLE_MEMBER_IDENTIFIER_HEX = "0x70656f706c652020202020202020202020202020202020202020202020202020";
16
+ var PROOF_BYTES = 785;
17
+ var BANDERSNATCH_SIGNATURE_BYTES = 64;
18
+ var PEOPLE_MEMBER_IDENTIFIER_HEX = "0x706f703a706f6c6b61646f742e6e6574776f726b2f70656f706c652020202020";
19
19
  var MEMBER_ENTROPY_KEY = new TextEncoder().encode("candidate");
20
- var PAID_PROOF_TAG = new TextEncoder().encode("alias-accounts:paid");
20
+ var ALIAS_PROOF_TAG = new TextEncoder().encode("alias-accounts");
21
21
 
22
22
  export {
23
23
  DOTNS_CONTEXT_HEX,
@@ -28,5 +28,5 @@ export {
28
28
  BANDERSNATCH_SIGNATURE_BYTES,
29
29
  PEOPLE_MEMBER_IDENTIFIER_HEX,
30
30
  MEMBER_ENTROPY_KEY,
31
- PAID_PROOF_TAG
31
+ ALIAS_PROOF_TAG
32
32
  };
@@ -0,0 +1,39 @@
1
+ import {
2
+ ALIAS_PROOF_TAG
3
+ } from "./chunk-SI2ZUOYD.js";
4
+ import {
5
+ blake2_256,
6
+ concatBytes
7
+ } from "./chunk-ZYVGHDMU.js";
8
+
9
+ // src/personhood/proof-validity.ts
10
+ var u64LeBytes = (v) => {
11
+ const buf = new Uint8Array(8);
12
+ new DataView(buf.buffer).setBigUint64(
13
+ 0,
14
+ v,
15
+ true
16
+ /* little-endian */
17
+ );
18
+ return buf;
19
+ };
20
+ var buildAliasProofMessage = (accountPub, proofValidAt) => {
21
+ if (accountPub.length !== 32) {
22
+ throw new Error(
23
+ `buildAliasProofMessage: accountPub must be 32 bytes, got ${accountPub.length}`
24
+ );
25
+ }
26
+ return blake2_256(
27
+ concatBytes(ALIAS_PROOF_TAG, accountPub, u64LeBytes(proofValidAt))
28
+ );
29
+ };
30
+ var getProofValidAtSec = async (ahApi) => {
31
+ const nowMs = await ahApi.query.Timestamp.Now.getValue({ at: "best" });
32
+ return nowMs / 1000n;
33
+ };
34
+
35
+ export {
36
+ u64LeBytes,
37
+ buildAliasProofMessage,
38
+ getProofValidAtSec
39
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  package_default,
3
3
  writeRunState
4
- } from "./chunk-G5VJOHZJ.js";
4
+ } from "./chunk-6H7W2G2R.js";
5
5
 
6
6
  // src/memory-report.ts
7
7
  import * as fs2 from "fs";
@@ -550,6 +550,9 @@ function setDeploySentryTag(key, value) {
550
550
  if (!Sentry) return;
551
551
  Sentry.setTag(key, value);
552
552
  }
553
+ function markCodePath(id) {
554
+ setDeployAttribute(`code.path.${id}`, "true");
555
+ }
553
556
  function captureWarning(message, context) {
554
557
  if (!Sentry) return;
555
558
  try {
@@ -726,6 +729,7 @@ export {
726
729
  __setSentryForTest,
727
730
  getCurrentSentryTraceId,
728
731
  setDeploySentryTag,
732
+ markCodePath,
729
733
  captureWarning,
730
734
  flush
731
735
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  captureWarning
3
- } from "./chunk-QTAKQVPQ.js";
3
+ } from "./chunk-TMKDWZPN.js";
4
4
 
5
5
  // src/chunk-probe.ts
6
6
  import { Twox128, Blake2128Concat, decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings";
@@ -0,0 +1,90 @@
1
+ import {
2
+ PGAS_ASSET_ID
3
+ } from "./chunk-SI2ZUOYD.js";
4
+
5
+ // src/personhood/chain-prereqs.ts
6
+ var NATIVE_LOC = {
7
+ parents: 1,
8
+ interior: { type: "Here", value: void 0 }
9
+ };
10
+ var PGAS_LOC = {
11
+ parents: 0,
12
+ interior: {
13
+ type: "X2",
14
+ value: [
15
+ { type: "PalletInstance", value: 50 },
16
+ { type: "GeneralIndex", value: BigInt(PGAS_ASSET_ID) }
17
+ ]
18
+ }
19
+ };
20
+ async function probeRingCollectionExponents(ahUnsafeApi, peopleIdent) {
21
+ const ah = ahUnsafeApi;
22
+ let exp;
23
+ try {
24
+ exp = await ah.query.MembersSubscriber.RingCollectionExponents.getValue(
25
+ peopleIdent,
26
+ { at: "best" }
27
+ );
28
+ } catch (err) {
29
+ throw new Error(
30
+ `chain prerequisite check failed: MembersSubscriber.RingCollectionExponents.getValue threw \u2014 RPC error or storage not available. Cause: ${err instanceof Error ? err.message : String(err)}`,
31
+ { cause: err }
32
+ );
33
+ }
34
+ if (exp === void 0 || exp === null) {
35
+ throw new Error(
36
+ `chain prerequisite missing: MembersSubscriber.RingCollectionExponents[${peopleIdent}] is not set. Every ring-VRF proof will be rejected with InvalidTransaction::BadProof (CollectionNotFound). Chain operator must populate this entry (run sudo-fix-preview-people-exponent.ts or equivalent). See docs-internal/dotns-bootstrap-handover.md \xA76.1.`
37
+ );
38
+ }
39
+ }
40
+ async function probePgasAsset(ahUnsafeApi) {
41
+ const ah = ahUnsafeApi;
42
+ let pgas;
43
+ try {
44
+ pgas = await ah.query.Assets.Asset.getValue(PGAS_ASSET_ID, { at: "best" });
45
+ } catch (err) {
46
+ throw new Error(
47
+ `chain prerequisite check failed: Assets.Asset.getValue(${PGAS_ASSET_ID}) threw \u2014 RPC error or storage not available. Cause: ${err instanceof Error ? err.message : String(err)}`,
48
+ { cause: err }
49
+ );
50
+ }
51
+ if (pgas === void 0 || pgas === null) {
52
+ throw new Error(
53
+ `chain prerequisite missing: Assets.Asset[${PGAS_ASSET_ID}] (PGAS) is not created on this chain. Pgas.claim_pgas will reject with InvalidTransaction::Custom(233) = PgasAssetNotCreated. Chain operator must create the PGAS asset via Pgas.create_pgas_asset (authorized origin). See docs-internal/dotns-bootstrap-handover.md \xA76.3.`
54
+ );
55
+ }
56
+ }
57
+ async function probePgasNativePool(ahUnsafeApi, nativeLoc = NATIVE_LOC, pgasLoc = PGAS_LOC) {
58
+ const ah = ahUnsafeApi;
59
+ let pool;
60
+ try {
61
+ pool = await ah.query.AssetConversion.Pools.getValue(
62
+ [nativeLoc, pgasLoc],
63
+ { at: "best" }
64
+ );
65
+ } catch (err) {
66
+ throw new Error(
67
+ `chain prerequisite check failed: AssetConversion.Pools.getValue threw \u2014 RPC error or storage not available. Cause: ${err instanceof Error ? err.message : String(err)}`,
68
+ { cause: err }
69
+ );
70
+ }
71
+ if (pool === void 0 || pool === null) {
72
+ throw new Error(
73
+ `chain prerequisite missing: AssetConversion.Pools[NATIVE\u2194PGAS] does not exist on this chain. PGAS-fee routing via ChargeAssetTxPayment will fail with InvalidTransaction::Payment. Chain operator must create the pool (sudo-create-pgas-pool.ts or equivalent). See docs-internal/dotns-bootstrap-handover.md \xA76.2.`
74
+ );
75
+ }
76
+ }
77
+ async function runChainPrereqProbes(ahUnsafeApi, peopleIdent) {
78
+ await probeRingCollectionExponents(ahUnsafeApi, peopleIdent);
79
+ await probePgasAsset(ahUnsafeApi);
80
+ await probePgasNativePool(ahUnsafeApi);
81
+ }
82
+
83
+ export {
84
+ NATIVE_LOC,
85
+ PGAS_LOC,
86
+ probeRingCollectionExponents,
87
+ probePgasAsset,
88
+ probePgasNativePool,
89
+ runChainPrereqProbes
90
+ };
@@ -5,9 +5,9 @@ import {
5
5
  _decodeStorageValue,
6
6
  _resetProbeSession,
7
7
  probeChunks
8
- } from "./chunk-QTQGD54B.js";
9
- import "./chunk-QTAKQVPQ.js";
10
- import "./chunk-G5VJOHZJ.js";
8
+ } from "./chunk-VLZQFSZ4.js";
9
+ import "./chunk-TMKDWZPN.js";
10
+ import "./chunk-6H7W2G2R.js";
11
11
  export {
12
12
  ChainProbeCrossValidationError,
13
13
  ChainProbeMetadataError,
package/dist/deploy.d.ts CHANGED
@@ -75,6 +75,8 @@ declare const ENCRYPT_TAG_LEN = 16;
75
75
  declare const ENCRYPT_KEY_LEN = 32;
76
76
  declare const ENCRYPT_PBKDF2_ITERATIONS = 100000;
77
77
  declare function encryptContent(data: Uint8Array, password: string): Promise<Uint8Array>;
78
+ /** Signer > mnemonic > pool precedence, mirroring resolveDotnsConnectOptions. Exported for unit testing. */
79
+ declare function __selectStorageProviderModeForTest(options: Pick<DeployOptions, "signer" | "signerAddress" | "mnemonic">): "signer" | "direct" | "pool";
78
80
  declare function storeFile(contentBytes: Uint8Array, { client: existingClient, unsafeApi: existingApi, signer: existingSigner }?: ExistingProvider): Promise<string>;
79
81
  /**
80
82
  * Pre-compute dense nonces for chunks that need submission.
@@ -295,4 +297,4 @@ declare function unpublish(domainName: string, options?: {
295
297
  }>;
296
298
  declare function deploy(content: DeployContent, domainName?: string | null, options?: DeployOptions): Promise<DeployResult>;
297
299
 
298
- export { CHUNK_MORTALITY_PERIOD, DEFAULT_BULLETIN_RPC, DEFAULT_POOL_SIZE, type DeployContent, type DeployOptions, type DeployResult, ENCRYPT_KEY_LEN, ENCRYPT_MAGIC, ENCRYPT_NONCE_LEN, ENCRYPT_PBKDF2_ITERATIONS, ENCRYPT_SALT_LEN, ENCRYPT_TAG_LEN, type SizeDecision, type StoreDirectoryOptions, __assignDenseNoncesForTest, applyManifestFetchAttributes, assertSubdomainOwnerMatchesSigner, buildFilesMap, checkDeploySize, chunk, computeStorageCid, createCID, deploy, deriveRootSigner, detectFramework, encodeContenthash, encryptContent, estimateUploadBytes, friendlyChainError, hasIPFS, isConnectionError, merkleize, resolveDotnsConnectOptions, resolveReproducibleTimestamp, retryBudgetExhausted, setWsHaltCallback, storeChunkedContent, storeDirectory, storeDirectoryV2, storeFile, unpublish };
300
+ export { CHUNK_MORTALITY_PERIOD, DEFAULT_BULLETIN_RPC, DEFAULT_POOL_SIZE, type DeployContent, type DeployOptions, type DeployResult, ENCRYPT_KEY_LEN, ENCRYPT_MAGIC, ENCRYPT_NONCE_LEN, ENCRYPT_PBKDF2_ITERATIONS, ENCRYPT_SALT_LEN, ENCRYPT_TAG_LEN, type SizeDecision, type StoreDirectoryOptions, __assignDenseNoncesForTest, __selectStorageProviderModeForTest, applyManifestFetchAttributes, assertSubdomainOwnerMatchesSigner, buildFilesMap, checkDeploySize, chunk, computeStorageCid, createCID, deploy, deriveRootSigner, detectFramework, encodeContenthash, encryptContent, estimateUploadBytes, friendlyChainError, hasIPFS, isConnectionError, merkleize, resolveDotnsConnectOptions, resolveReproducibleTimestamp, retryBudgetExhausted, setWsHaltCallback, storeChunkedContent, storeDirectory, storeDirectoryV2, storeFile, unpublish };
package/dist/deploy.js CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  ENCRYPT_SALT_LEN,
10
10
  ENCRYPT_TAG_LEN,
11
11
  __assignDenseNoncesForTest,
12
+ __selectStorageProviderModeForTest,
12
13
  applyManifestFetchAttributes,
13
14
  assertSubdomainOwnerMatchesSigner,
14
15
  buildFilesMap,
@@ -35,20 +36,20 @@ import {
35
36
  storeDirectoryV2,
36
37
  storeFile,
37
38
  unpublish
38
- } from "./chunk-SBLSXJ2L.js";
39
+ } from "./chunk-6577E4YF.js";
39
40
  import "./chunk-IW3X2MJF.js";
40
41
  import "./chunk-KOSF5FDO.js";
41
42
  import "./chunk-L2SKSKB6.js";
42
43
  import "./chunk-S7EM5VMW.js";
43
- import "./chunk-7PYJMQQP.js";
44
- import "./chunk-WGZUHHII.js";
45
- import "./chunk-QTQGD54B.js";
44
+ import "./chunk-I2DTDCS5.js";
45
+ import "./chunk-4ESXBZHT.js";
46
+ import "./chunk-VLZQFSZ4.js";
46
47
  import "./chunk-C2TS5MER.js";
47
- import "./chunk-2TAHVGIF.js";
48
- import "./chunk-XR6ZWT4P.js";
49
- import "./chunk-QTAKQVPQ.js";
50
- import "./chunk-G5VJOHZJ.js";
51
- import "./chunk-JZFXFZ5L.js";
48
+ import "./chunk-Q4RL4KJO.js";
49
+ import "./chunk-67XDFCSR.js";
50
+ import "./chunk-TMKDWZPN.js";
51
+ import "./chunk-6H7W2G2R.js";
52
+ import "./chunk-GL2HHK4G.js";
52
53
  import {
53
54
  EXIT_CODE_NO_RETRY,
54
55
  NonRetryableError
@@ -67,6 +68,7 @@ export {
67
68
  EXIT_CODE_NO_RETRY,
68
69
  NonRetryableError,
69
70
  __assignDenseNoncesForTest,
71
+ __selectStorageProviderModeForTest,
70
72
  applyManifestFetchAttributes,
71
73
  assertSubdomainOwnerMatchesSigner,
72
74
  buildFilesMap,
package/dist/dotns.d.ts CHANGED
@@ -4,6 +4,7 @@ import { PolkadotSigner } from 'polkadot-api';
4
4
  import './personhood/bind-personal-id.js';
5
5
  import './personhood/claim-pgas.js';
6
6
  import './personhood/bind-paid-alias.js';
7
+ import './personhood/chain-prereqs.js';
7
8
 
8
9
  interface DotNSConnectOptions {
9
10
  rpc?: string;
@@ -240,7 +241,7 @@ declare function classifyDotnsLabel(label: string): {
240
241
  status: number;
241
242
  message: string;
242
243
  };
243
- declare function canRegister(requiredStatus: number, userStatus: number, trailingDigits: number): boolean;
244
+ declare function canRegister(requiredStatus: number, userStatus: number): boolean;
244
245
  declare function parseDomainName(input: string): ParsedDomainName;
245
246
  declare function parseProofOfPersonhoodStatus(status: string): number;
246
247
  declare function popStatusName(status: number): string;
@@ -305,6 +306,22 @@ interface AliasAccountClassification {
305
306
  paid?: boolean;
306
307
  revision?: number;
307
308
  }
309
+ /**
310
+ * Pure classifier — interprets an `AliasAccounts.AccountToAlias` storage row
311
+ * (or `undefined` for "no row") and returns the alias-state classification.
312
+ *
313
+ * Split out from `classifyAliasAccountState` so the row → state mapping can
314
+ * be unit-tested without a chain connection.
315
+ *
316
+ * AliasAccounts pallet rewrite (paritytech/individuality#955, May 2026)
317
+ * collapsed the paid/free path split — every binding now pays `AliasFee`
318
+ * and the `paid` field no longer exists on the row. Classification keys
319
+ * on context alone: rows under the `dotns` context are heuristically
320
+ * flagged stale for reprove; rows under any other context are wrong-context;
321
+ * absent rows are not-bound. See docs-internal/dotns-bootstrap-handover.md
322
+ * §3 for the pallet contract.
323
+ */
324
+ declare function classifyAliasAccountRow(row: unknown): AliasAccountClassification;
308
325
  /**
309
326
  * Format a user-facing remediation message for the "no personhood" preflight failure.
310
327
  * Pure function — unit-testable without a chain connection.
@@ -512,4 +529,4 @@ declare class DotNS {
512
529
  }
513
530
  declare const dotns: DotNS;
514
531
 
515
- export { ATTR_TX_RESOLUTION_KIND, type AliasAccountClassification, type AliasAccountState, CONNECTION_TIMEOUT_MS, CONTRACTS, ContractDryRunRevertError, DECIMALS, DEFAULT_MNEMONIC, DOTNS_TX_MAX_ATTEMPTS, DOT_NODE, DotNS, type DotNSConnectOptions, type DotnsPreflightResult, type DotnsSuccessAction, MINIMUM_REGISTER_STORAGE_DEPOSIT, NATIVE_TO_ETH_RATIO, OPERATION_TIMEOUT_MS, type OwnershipResult, PUBLISHER_ABI, type ParsedDomainName, type PriceValidationResult, ProofOfPersonhoodStatus, PublisherNotSupportedError, RPC_ENDPOINTS, TX_CHAIN_TIME_BUDGET_MS, TX_KIND_HASH, TX_KIND_NONCE_ADVANCED, TX_NO_PROGRESS_MS, TX_TIMEOUT_MS, TX_WALL_CLOCK_CEILING_MS, type TxResolution, WS_HEARTBEAT_TIMEOUT_MS, __formatContractDryRunFailureForTest, canRegister, classifyDotnsLabel, classifyTxRetryDecision, computeDomainTokenId, convertToHexString, convertWeiToNative, countTrailingDigits, decodePublisherRevert, dotns, feeFloorFor, fetchNonce, fmtPas, formatDispatchError, formatPersonhoodRemediation, formatPopShortfallReason, isCommitmentMature, isCommitmentTimingBarerevert, parseDomainName, parseProofOfPersonhoodStatus, popStatusName, sanitizeDomainLabel, stripTrailingDigits, validateDomainLabel, verifyNonceAdvanced };
532
+ export { ATTR_TX_RESOLUTION_KIND, type AliasAccountClassification, type AliasAccountState, CONNECTION_TIMEOUT_MS, CONTRACTS, ContractDryRunRevertError, DECIMALS, DEFAULT_MNEMONIC, DOTNS_TX_MAX_ATTEMPTS, DOT_NODE, DotNS, type DotNSConnectOptions, type DotnsPreflightResult, type DotnsSuccessAction, MINIMUM_REGISTER_STORAGE_DEPOSIT, NATIVE_TO_ETH_RATIO, OPERATION_TIMEOUT_MS, type OwnershipResult, PUBLISHER_ABI, type ParsedDomainName, type PriceValidationResult, ProofOfPersonhoodStatus, PublisherNotSupportedError, RPC_ENDPOINTS, TX_CHAIN_TIME_BUDGET_MS, TX_KIND_HASH, TX_KIND_NONCE_ADVANCED, TX_NO_PROGRESS_MS, TX_TIMEOUT_MS, TX_WALL_CLOCK_CEILING_MS, type TxResolution, WS_HEARTBEAT_TIMEOUT_MS, __formatContractDryRunFailureForTest, canRegister, classifyAliasAccountRow, classifyDotnsLabel, classifyTxRetryDecision, computeDomainTokenId, convertToHexString, convertWeiToNative, countTrailingDigits, decodePublisherRevert, dotns, feeFloorFor, fetchNonce, fmtPas, formatDispatchError, formatPersonhoodRemediation, formatPopShortfallReason, isCommitmentMature, isCommitmentTimingBarerevert, parseDomainName, parseProofOfPersonhoodStatus, popStatusName, sanitizeDomainLabel, stripTrailingDigits, validateDomainLabel, verifyNonceAdvanced };
package/dist/dotns.js CHANGED
@@ -24,6 +24,7 @@ import {
24
24
  WS_HEARTBEAT_TIMEOUT_MS,
25
25
  __formatContractDryRunFailureForTest,
26
26
  canRegister,
27
+ classifyAliasAccountRow,
27
28
  classifyDotnsLabel,
28
29
  classifyTxRetryDecision,
29
30
  computeDomainTokenId,
@@ -47,11 +48,11 @@ import {
47
48
  stripTrailingDigits,
48
49
  validateDomainLabel,
49
50
  verifyNonceAdvanced
50
- } from "./chunk-2TAHVGIF.js";
51
- import "./chunk-XR6ZWT4P.js";
52
- import "./chunk-QTAKQVPQ.js";
53
- import "./chunk-G5VJOHZJ.js";
54
- import "./chunk-JZFXFZ5L.js";
51
+ } from "./chunk-Q4RL4KJO.js";
52
+ import "./chunk-67XDFCSR.js";
53
+ import "./chunk-TMKDWZPN.js";
54
+ import "./chunk-6H7W2G2R.js";
55
+ import "./chunk-GL2HHK4G.js";
55
56
  import "./chunk-ZOC4GITL.js";
56
57
  export {
57
58
  ATTR_TX_RESOLUTION_KIND,
@@ -79,6 +80,7 @@ export {
79
80
  WS_HEARTBEAT_TIMEOUT_MS,
80
81
  __formatContractDryRunFailureForTest,
81
82
  canRegister,
83
+ classifyAliasAccountRow,
82
84
  classifyDotnsLabel,
83
85
  classifyTxRetryDecision,
84
86
  computeDomainTokenId,
@@ -8,7 +8,7 @@ import {
8
8
  loadEnvironments,
9
9
  resolveEndpoints,
10
10
  validateContractAddresses
11
- } from "./chunk-JZFXFZ5L.js";
11
+ } from "./chunk-GL2HHK4G.js";
12
12
  import "./chunk-ZOC4GITL.js";
13
13
  export {
14
14
  DEFAULT_ENV_ID,
package/dist/index.d.ts CHANGED
@@ -21,3 +21,4 @@ import './personhood/bootstrap.js';
21
21
  import './personhood/bind-personal-id.js';
22
22
  import './personhood/claim-pgas.js';
23
23
  import './personhood/bind-paid-alias.js';
24
+ import './personhood/chain-prereqs.js';
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-MMAZFJDG.js";
8
8
  import {
9
9
  publishManifest
10
- } from "./chunk-7UGOKEKF.js";
10
+ } from "./chunk-LU4NHGRE.js";
11
11
  import {
12
12
  DEFAULT_TEXT_RECORD_BUDGET_BYTES,
13
13
  PLACEHOLDER_CID,
@@ -24,7 +24,7 @@ import {
24
24
  deploy,
25
25
  merkleizeJS,
26
26
  merkleizeWithStableOrder
27
- } from "./chunk-SBLSXJ2L.js";
27
+ } from "./chunk-6577E4YF.js";
28
28
  import {
29
29
  computeStats,
30
30
  renderSummary,
@@ -46,26 +46,26 @@ import {
46
46
  isVolatilePath,
47
47
  parseManifest
48
48
  } from "./chunk-S7EM5VMW.js";
49
- import "./chunk-7PYJMQQP.js";
50
- import "./chunk-WGZUHHII.js";
49
+ import "./chunk-I2DTDCS5.js";
50
+ import "./chunk-4ESXBZHT.js";
51
51
  import {
52
52
  probeChunks
53
- } from "./chunk-QTQGD54B.js";
53
+ } from "./chunk-VLZQFSZ4.js";
54
54
  import "./chunk-C2TS5MER.js";
55
55
  import {
56
56
  DEFAULT_MNEMONIC,
57
57
  DotNS,
58
58
  parseDomainName,
59
59
  sanitizeDomainLabel
60
- } from "./chunk-2TAHVGIF.js";
60
+ } from "./chunk-Q4RL4KJO.js";
61
61
  import {
62
62
  bootstrapPool,
63
63
  derivePoolAccounts,
64
64
  ensureAuthorized,
65
65
  fetchPoolAuthorizations,
66
66
  selectAccount
67
- } from "./chunk-XR6ZWT4P.js";
68
- import "./chunk-QTAKQVPQ.js";
67
+ } from "./chunk-67XDFCSR.js";
68
+ import "./chunk-TMKDWZPN.js";
69
69
  import {
70
70
  VERSION,
71
71
  loadRunState,
@@ -75,7 +75,7 @@ import {
75
75
  shouldSkipStaleWarning,
76
76
  stateFilePath,
77
77
  writeRunState
78
- } from "./chunk-G5VJOHZJ.js";
78
+ } from "./chunk-6H7W2G2R.js";
79
79
  import {
80
80
  DEFAULT_ENV_ID,
81
81
  defaultBundledPath,
@@ -85,7 +85,7 @@ import {
85
85
  loadEnvironments,
86
86
  resolveEndpoints,
87
87
  validateContractAddresses
88
- } from "./chunk-JZFXFZ5L.js";
88
+ } from "./chunk-GL2HHK4G.js";
89
89
  import "./chunk-ZOC4GITL.js";
90
90
  import "./chunk-HOTQDYHD.js";
91
91
  export {