bulletin-deploy 0.5.3 → 0.5.4

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.
package/README.md CHANGED
@@ -74,12 +74,33 @@ const result = await deploy("./dist", "my-app00.dot");
74
74
  console.log(result.cid, result.domainName);
75
75
  ```
76
76
 
77
+ ## Domain Names and Proof of Personhood
78
+
79
+ DotNS domain names are classified by the PopOracle contract on Asset Hub. The classification determines what level of **Proof of Personhood (PoP)** is required to register:
80
+
81
+ | Domain pattern | Example | Required PoP |
82
+ |---|---|---|
83
+ | Name with trailing digits | `my-app00.dot` | **None** — open to all |
84
+ | Base name (no trailing digits) | `my-app.dot` | **Full** — requires `ProofOfPersonhoodFull` |
85
+
86
+ On **testnets** (Paseo, Westend, local devnets), bulletin-deploy automatically self-grants `ProofOfPersonhoodFull` before registration — no configuration needed. Both base names and names with trailing digits just work:
87
+
88
+ ```bash
89
+ bulletin-deploy ./dist my-app.dot # base name — auto-grants Full PoP
90
+ bulletin-deploy ./dist my-app00.dot # trailing digits — no PoP needed
91
+ ```
92
+
93
+ On **mainnet** (Polkadot Hub, Kusama Hub), PoP cannot be self-granted. You must have a verified account. Set `DOTNS_STATUS=none` explicitly or leave it unset (mainnet defaults to `none`).
94
+
95
+ If you see **"Requires Full Personhood verification"**, the deploy will fail early with an actionable error message before any gas is spent on commitment transactions.
96
+
77
97
  ## Environment Variables
78
98
 
79
99
  | Variable | Default | Description |
80
100
  |---|---|---|
81
101
  | `BULLETIN_RPC` | `wss://paseo-bulletin-rpc.polkadot.io` | Bulletin chain WebSocket RPC |
82
102
  | `BULLETIN_DEPLOY_TELEMETRY` | `1` (enabled) | Set to `0` to disable Sentry telemetry |
103
+ | `DOTNS_STATUS` | `full` (testnet) / `none` (mainnet) | PoP level to self-grant before registration: `none`, `lite`, or `full` |
83
104
  | `IPFS_CID` | _(none)_ | Skip storage, use pre-existing CID |
84
105
 
85
106
  ## How It Works
@@ -128,6 +149,7 @@ Dashboard: https://polkadot-community-foundation.sentry.io/dashboards/92523/
128
149
 
129
150
  | Error | Solution |
130
151
  |---|---|
152
+ | `Requires Full Personhood verification` | Auto-handled on testnets (v0.5.4+). On mainnet, your account needs verified PoP status. |
131
153
  | `Payment` or authorization error | Pool account needs storage authorization — auto-authorization should handle this |
132
154
  | `Stale` or dropped from best chain | Bulletin chain reorg. Automatic retry handles this. |
133
155
  | `IPFS CLI not installed` | Install Kubo: `brew install ipfs && ipfs init` |
@@ -611,11 +611,22 @@ var DotNS = class {
611
611
  const reverse = options.reverse ?? (process.env.DOTNS_REVERSE ?? "false").toLowerCase() === "true";
612
612
  if (!this.connected) await this.connect(options);
613
613
  label = validateDomainLabel(label);
614
- await Promise.all([
614
+ const [classification] = await Promise.all([
615
615
  this.classifyName(label),
616
- this.ensureNotRegistered(label),
617
- this.setUserPopStatus(status)
616
+ this.ensureNotRegistered(label)
618
617
  ]);
618
+ await this.setUserPopStatus(status);
619
+ const userStatus = await this.getUserPopStatus();
620
+ const requiredStatus = classification.requiredStatus;
621
+ if (requiredStatus === ProofOfPersonhoodStatus.Reserved) {
622
+ throw new Error(classification.message);
623
+ }
624
+ if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodFull && userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodFull) {
625
+ throw new Error("Requires Full Personhood verification. Set DOTNS_STATUS=full or use a domain with trailing digits (e.g. my-app00.dot)");
626
+ }
627
+ if (requiredStatus === ProofOfPersonhoodStatus.ProofOfPersonhoodLite && userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodLite && userStatus !== ProofOfPersonhoodStatus.ProofOfPersonhoodFull) {
628
+ throw new Error("Requires Personhood Lite verification. Set DOTNS_STATUS=lite or DOTNS_STATUS=full");
629
+ }
619
630
  const { commitment, registration } = await this.generateCommitment(label, reverse);
620
631
  await withSpan("deploy.dotns.submit-commitment", "2a-i. submit-commitment", {}, () => this.submitCommitment(commitment));
621
632
  await withSpan("deploy.dotns.wait-commitment-age", "2a-ii. wait-commitment-age", {}, () => this.waitForCommitmentAge());
@@ -3,7 +3,7 @@ import {
3
3
  DotNS,
4
4
  TX_TIMEOUT_MS,
5
5
  fetchNonce
6
- } from "./chunk-W23LLCZF.js";
6
+ } from "./chunk-K2KKLHWN.js";
7
7
  import {
8
8
  derivePoolAccounts,
9
9
  ensureAuthorized,
package/dist/deploy.js CHANGED
@@ -8,8 +8,8 @@ import {
8
8
  storeChunkedContent,
9
9
  storeDirectory,
10
10
  storeFile
11
- } from "./chunk-JF2UR7FV.js";
12
- import "./chunk-W23LLCZF.js";
11
+ } from "./chunk-OMZHBMOF.js";
12
+ import "./chunk-K2KKLHWN.js";
13
13
  import "./chunk-RV7XBIIO.js";
14
14
  import "./chunk-2RURGSQW.js";
15
15
  import "./chunk-QGM4M3NI.js";
package/dist/dotns.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  sanitizeDomainLabel,
19
19
  stripTrailingDigits,
20
20
  validateDomainLabel
21
- } from "./chunk-W23LLCZF.js";
21
+ } from "./chunk-K2KKLHWN.js";
22
22
  import "./chunk-2RURGSQW.js";
23
23
  import "./chunk-QGM4M3NI.js";
24
24
  export {
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  deploy
3
- } from "./chunk-JF2UR7FV.js";
3
+ } from "./chunk-OMZHBMOF.js";
4
4
  import {
5
5
  DotNS
6
- } from "./chunk-W23LLCZF.js";
6
+ } from "./chunk-K2KKLHWN.js";
7
7
  import {
8
8
  bootstrapPool,
9
9
  derivePoolAccounts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bulletin-deploy",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",