@artblocks/abx-cli 0.1.0-alpha.9 → 0.2.0
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/CHANGELOG.md +429 -0
- package/assets/renderer-scaffold/README.md +44 -13
- package/assets/renderer-scaffold/foundry.toml +5 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +132 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +175 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +483 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/contract.d.ts +19 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +171 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/deploy.d.ts +296 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5756 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +154 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/maintenance.d.ts +4 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +114 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/project.d.ts +458 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1837 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +85 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +881 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +741 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +761 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +399 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +102 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +638 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +94 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +332 -12
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +400 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/creator-agent.d.ts +49 -0
- package/dist/creator-agent.d.ts.map +1 -0
- package/dist/creator-agent.js +363 -0
- package/dist/creator-agent.js.map +1 -0
- package/dist/creator-keyring.d.ts +26 -0
- package/dist/creator-keyring.d.ts.map +1 -0
- package/dist/creator-keyring.js +57 -0
- package/dist/creator-keyring.js.map +1 -0
- package/dist/creator-signer.d.ts +52 -0
- package/dist/creator-signer.d.ts.map +1 -0
- package/dist/creator-signer.js +267 -0
- package/dist/creator-signer.js.map +1 -0
- package/dist/deploy-plan.d.ts +218 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +20 -0
- package/dist/deploy-plan.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +188 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +53 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +151 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +79 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +859 -5374
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +184 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +774 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +463 -59
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2329 -366
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +116 -9
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +371 -14
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +101 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +343 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +20 -1
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +110 -18
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +60 -9
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +105 -18
- package/dist/update-check.js.map +1 -1
- package/package.json +17 -12
- package/skill/SKILL.md +213 -354
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +195 -0
- package/skill/reference/code.md +236 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +191 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +191 -102
- package/skill/reference/operate.md +237 -0
- package/skill/reference/services.md +173 -0
- package/skill/reference/setup.md +221 -42
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -118
- package/skill/reference/troubleshooting.md +0 -28
package/skill/SKILL.md
CHANGED
|
@@ -1,359 +1,218 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: abx
|
|
3
|
-
description:
|
|
4
|
-
|
|
2
|
+
name: abx
|
|
3
|
+
description: >-
|
|
4
|
+
Use the ABX CLI (`abx`) to plan, launch, host, inspect, and operate ABX NFT projects on supported
|
|
5
|
+
networks: static 1/1s, image series, editions, JavaScript/code drops, and Solidity-rendered projects.
|
|
6
|
+
Covers on-chain and off-chain content, managed or self-hosted resolvers, storage, minting and sales,
|
|
7
|
+
PostParams, hooks, custom minters, migrations, feedback, locks, and capability questions. Use for
|
|
8
|
+
requests to create, deploy, mint, host, serve, verify, repair, migrate, report ABX feedback, or
|
|
9
|
+
change an ABX collection, or to determine whether ABX supports a mechanic.
|
|
10
|
+
compatibility: Drives @artblocks/abx-cli on Node 22.13+. Co-versioned with the CLI; install or refresh with `abx skill install`.
|
|
5
11
|
metadata:
|
|
6
|
-
version: "0.
|
|
12
|
+
version: "0.2.0"
|
|
7
13
|
---
|
|
8
14
|
|
|
9
|
-
# ABX
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
1. **
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
**When the user names off-chain custody for tiny art ("deploy it as an IPFS NFT"), lead with the on-chain recommendation in your *first* reply** — don't bury it, and don't collect resolver-URL details for a path you're about to advise against. "For a 2.4 KB SVG I'd go fully on-chain — no server, renders forever, cheaper. Want that, or IPFS?" Then let them choose (you surface the better default; you don't override the request). Defaulting to "IPFS" for tiny art is what lands it at a broken localhost URI.
|
|
119
|
-
|
|
120
|
-
Tiny-art path:
|
|
121
|
-
1. **Confirm identity** (name, symbol, `--description`, royalty, owner) via the [readout](#confirm-before-sending).
|
|
122
|
-
2. **Deploy + mint in one go:**
|
|
123
|
-
```bash
|
|
124
|
-
abx deploy --image art.svg --name "…" --symbol … --description "…" --onchain-image --compress fastlz [--sign --for 0x…]
|
|
125
|
-
```
|
|
126
|
-
= staging tx(s) + one deploy-that-mints. **Mint at deploy — no `--no-mint`** (nothing to warm).
|
|
127
|
-
3. **Prove + finish:** `abx tokenuri <addr>` (reads metadata straight from chain) · `abx refresh <addr>` (nudge marketplaces) · lock later once it resolves: `abx lock-field <addr> --field image` then `abx lock-uri <addr>`.
|
|
128
|
-
|
|
129
|
-
For large/dynamic media, off-chain custody, or operating an existing project, use the framework + reference files below.
|
|
130
|
-
|
|
131
|
-
## Series (multi-token drops)
|
|
132
|
-
|
|
133
|
-
One contract, **N tokens**, static creator metadata — a folder of media → a collection. **Everything from the 1/1 applies per token** (custody, on-chain vs off-chain, signing lanes, identity, locking, warming); only the three points below are new. Reach for it when there's more than one piece; a single image is `abx deploy`.
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
abx deploy-series --dir <media-dir> --name "…" --symbol … [--onchain-uri --backend arweave|ipfs|cloud | --onchain-image --compress fastlz | --onchain-uri | --public-base-url https://…] [--mint-all | --mint-count N | --no-mint]
|
|
137
|
-
```
|
|
138
|
-
**Quick start — a folder of photos, permanent, no server:**
|
|
139
|
-
```bash
|
|
140
|
-
abx deploy-series --dir ./photos --name "My Series" --symbol MS --onchain-uri --backend arweave --mint-all --sign
|
|
141
|
-
```
|
|
142
|
-
Files natural-sort into **tokens `0…N-1`** (`--count N` uses the first N); a token's metadata is its token id. `--dry-run` and the [readout](#confirm-before-sending) work identically (token count + mint plan). **Content placement is per token — the same custody call as a 1/1 (see [Decisions](#decisions-real-launch)).** The one Series-specific win: a **same-extension folder** uploads as ONE directory/manifest → a single collection `url-template` (O(1) on-chain, any size); mixed extensions fall back to per-token `url` fields (still no server). `cloud` needs `--public-base`. **Per-token traits: `--attributes <file.json>`** — a JSON **array** indexed by token id, or an **object** keyed by filename / token id (each value an attributes array or a `{name:value}` map). **Lane-aware, exactly like the 1/1's traits**: off-chain operator metadata by default (resolver-served, editable later via `abx add <addr> --attributes`), inlined **on-chain** when the token resolves on-chain (`--onchain-uri`) or you pass `--traits-onchain` — small/medium collections; a huge series sets on-chain traits post-deploy via `set-field` under a gas budget. *(For **generative** traits computed from a seed, that's a code project — `abx.traits()` / `--attributes-renderer` — not a static Series.)*
|
|
143
|
-
|
|
144
|
-
## Code projects (generative / code-based drops)
|
|
145
|
-
|
|
146
|
-
A **program is the content** (`abx deploy-code` → a `SeriesCode`): output is a function of live on-chain state (`tokenData`: coordinates + `seed` + PostParams), injected at view time. Everything from a [Series](#series-multi-token-drops) applies (mint order, lanes, identity, supply cap, minter, pause). This section is the **decision tree**; the operating depth — what to keep running, the resume loop, verify steps, render ops, lane internals, the arweave delay, selling — lives in **[reference/code-projects.md](reference/code-projects.md)**.
|
|
147
|
-
|
|
148
|
-
**Infra fork FIRST (before any lane talk): a code project's thumbnail is *rendered* off-chain, so it ALWAYS needs a PUBLIC home you provide — there is NO zero-infrastructure code drop, and "fully on-chain" does NOT mean "nothing to run."** Settle the shape with the creator up front:
|
|
149
|
-
- **Off-chain resolver** (`--public-base-url` + rendering, ~a few $/mo self-hosted) — **the default for a drop you'll sell.** Auto-renders every mint + param change, serves traits with no Solidity, and stays **maneuverable** (metadata/serving evolve with no on-chain surgery) while marketplaces fetch a **small** `tokenURI`. A **managed provider whose descriptor says `render.attached`** covers both halves with one API key — no effects runner to stand up ([hosting.md → Managed providers](reference/hosting.md#managed-providers--a-resolver-someone-else-runs---remote-name)).
|
|
150
|
-
- **Fully on-chain** (`--onchain-uri --image-base <a bucket you own>`) — maximal durability, no always-on service. Trade-offs: the whole ~200KB+ doc rides each `tokenURI` (some marketplace/indexer reads choke), **manual** stills (`abx render`), on-chain traits need a deployed renderer, later changes are on-chain re-points. Choose it deliberately when permanence outweighs maneuverability. *(The one zero-infra-AND-on-chain exception: the in-chain **Solidity** lane below.)*
|
|
151
|
-
|
|
152
|
-
**Writing the program yourself (the creator brought an *idea*, not a file)? There's ONE runtime contract — get it right or the drop is silently broken** (seed never injects → every token identical; traits empty). The program reads state via **`abx.tokenData`** (a flat object: `.seed`, and each `--schema` key flat, e.g. `.palette`) and reports traits via **`abx.traits({…})`** — never an invented global (`window.tokenData`, `window.tokenTraits`) and never "defensively across variants." `abx.traits()` is the ONLY thing captured into `attributes`, on the resolver lane too. Verify with `abx inspect` (its **PostParams** + **Traits** lines reflect what the program actually reads/reports — if they're empty but you intended a param/traits, you read it the wrong way), THEN pick a lane. Full contract: [reference/code-projects.md → Authoring the program](reference/code-projects.md#authoring-the-program--the-abxjs-runtime-contract-get-this-right-first).
|
|
153
|
-
|
|
154
|
-
**Run `abx inspect <script>` before proposing any lane, then adopt the recommended lane it prints — don't hand-assemble a different flag set.** (Exception: the in-chain **Solidity-render** lane below has no JS script to inspect — go straight to it. `abx inspect` only analyzes a JS file.) A code project has surfaces that each must land *somewhere public* — the fatal mistake (seen in real sessions) is picking *“fully on-chain, no server!”* and only discovering, one at a time after deploy, that it carries no thumbnail, no traits, and dropped a PostParam. **These are all DEPLOY-TIME decisions — an on-chain field with no pointer CANNOT be backfilled** (least of all to localhost). `abx inspect` and `deploy-code --dry-run` print a **Surfaces block** grading each one; **every ⚠ there is a marketplace-facing hole you must close before deploy — trust it over your own read.** Resolve all of them into ONE coherent lane with the creator BEFORE you collect identity or show a config:
|
|
155
|
-
|
|
156
|
-
| Surface | On-chain | Off-chain |
|
|
15
|
+
# ABX
|
|
16
|
+
|
|
17
|
+
Use `abx` as the execution and truth surface. Help, capability output, dry runs, on-chain reads, and
|
|
18
|
+
typed errors outrank remembered prose.
|
|
19
|
+
|
|
20
|
+
## Non-negotiable rules
|
|
21
|
+
|
|
22
|
+
- Never read or print `.env`, private keys, RPC URLs, provider tokens, storage credentials, wallet
|
|
23
|
+
session URLs, or Arweave JWK contents. Use `abx doctor`, `abx remote`, and `abx storage show` to
|
|
24
|
+
inspect configuration safely.
|
|
25
|
+
- Use `pnpm abx …` inside the ABX source repository. Use `abx …` in a creator project or installed
|
|
26
|
+
environment. Run `abx version` if provenance is uncertain.
|
|
27
|
+
- Treat an available CLI update as an action item. Recommend upgrading before further planning or
|
|
28
|
+
preparing a write: current ABX releases retain support for canonical projects created by earlier
|
|
29
|
+
releases, and updating local tooling does not change deployed contracts. Never upgrade silently.
|
|
30
|
+
After an upgrade, run the scope-appropriate `abx skill install`, restart the agent, and rerun
|
|
31
|
+
`abx doctor` plus any help or dry run used for the plan. If the creator defers, state that the
|
|
32
|
+
installed version remains behind and use only that version's live help and capabilities.
|
|
33
|
+
- Read the full `chains` array from `abx capabilities --json` before choosing a network. Never
|
|
34
|
+
operate on a `disabled` chain. Call out `experimental` or `beta` status and its risks before a
|
|
35
|
+
transaction. Select with `ABX_CHAIN=<chain>`; there is deliberately no `--chain` flag.
|
|
36
|
+
- On a production `beta` network, say that real funds and irreversible state are at risk; ABX has
|
|
37
|
+
not had an independent third-party audit; bugs, misconfiguration, and
|
|
38
|
+
nondeterministic agent behavior may cause permanent loss. Link to https://github.com/ArtBlocks/abx,
|
|
39
|
+
prove the same flow on the paired testnet, and summarize the network, signer, transaction group,
|
|
40
|
+
value, and irreversible choices before asking to send. An environment key may still sign deliberate
|
|
41
|
+
automation; do not impose a browser-wallet requirement the creator did not choose.
|
|
42
|
+
- Run `abx help <command>` immediately before composing a non-trivial command. Do not recover flag
|
|
43
|
+
syntax from this skill.
|
|
44
|
+
- Never infer that a capability is absent because a flag is absent. Run `abx capabilities --json`,
|
|
45
|
+
identify a native lane or extension seam, and read [capabilities.md](reference/capabilities.md).
|
|
46
|
+
- Never hand-roll transactions, nonces, retry loops, resolver URLs, or contract-type detection when
|
|
47
|
+
the CLI exposes the operation. One EOA must have one serialized write sequence.
|
|
48
|
+
- Never send, mint, transfer, lower a cap, change authority, or apply a lock until the human confirms
|
|
49
|
+
the exact action. Locks, ownership transfers, and several deploy choices are irreversible.
|
|
50
|
+
- **Never lock a token or collection URI to a domain the creator does not own.** The base URI remains
|
|
51
|
+
updatable only until it is locked. Do not point at a managed remote and then lock that provider's
|
|
52
|
+
domain. If the provider supports custom domains, route a creator-controlled domain to it, verify
|
|
53
|
+
the production path, and lock only that domain. ABX Services does not currently support
|
|
54
|
+
custom-domain routing, so never lock an `abx.io` URI.
|
|
55
|
+
- Never submit feedback, project data, logs, or agent/session context to ABX or a remote provider
|
|
56
|
+
until the human reviews the preview and approves that specific report. Redact credentials and
|
|
57
|
+
unrelated personal or project information. `abx feedback` previews by default; `--yes` sends.
|
|
58
|
+
- Never fold `abx submit-app` into deployment. Listing is a separate, optional post-deploy action.
|
|
59
|
+
|
|
60
|
+
## Use the lifecycle
|
|
61
|
+
|
|
62
|
+
Follow this state machine instead of accumulating retries:
|
|
63
|
+
|
|
64
|
+
1. **Discover** — identify the working directory, CLI provenance/version, active chain, artifacts,
|
|
65
|
+
existing contract addresses, configured remote, and signer preference. Run `abx doctor` for a
|
|
66
|
+
deployment or unfamiliar environment. Surface and recommend any available CLI update before
|
|
67
|
+
planning a deployment or write; do not bury the notice in setup output. If the creator has not
|
|
68
|
+
chosen a signer, inspect the live remote and prefer `--sponsor` when the active chain and command
|
|
69
|
+
are advertised as eligible; otherwise choose the appropriate bring-your-own lane. Never silently
|
|
70
|
+
replace an explicit signer choice.
|
|
71
|
+
2. **Classify surfaces** — decide collection shape, runtime, required public surfaces, custody,
|
|
72
|
+
resolution, authority, mutability, and mint/sale timing. Use the model below.
|
|
73
|
+
3. **Inspect** — run `abx capabilities --json`; for code run `abx inspect` and `abx preview`. For an
|
|
74
|
+
existing collection run `abx state`, `abx tokens`, `abx tokenuri`, and `abx verify` as relevant.
|
|
75
|
+
4. **Plan** — use the selected deploy command with `--dry-run --json`. Read its normalized shape,
|
|
76
|
+
addresses, surface warnings, transaction count, storage activity, and irreversible choices back
|
|
77
|
+
to the creator. A dry run may perform read-only network probes; it must not send or store. Select
|
|
78
|
+
the signer before this dry run; changing lanes can change the owner, salt, and predicted address,
|
|
79
|
+
so rerun the preview after any signer change.
|
|
80
|
+
5. **Confirm** — confirm name, symbol, token standard, code-capable/static type, burnability,
|
|
81
|
+
ERC-721C/ERC-1155C enrollment, edition arithmetic, royalty ceiling, signer, costs, public URLs,
|
|
82
|
+
initial mint, and every requested lock.
|
|
83
|
+
6. **Execute** — let the CLI sign and serialize the operation. Do not start a second write process
|
|
84
|
+
with the same EOA. Honor structured lifecycle states and terminal errors.
|
|
85
|
+
7. **Verify** — verify the contract and each promised surface from its canonical path. Use on-chain
|
|
86
|
+
reads for self-resolving metadata and `abx verify`/remote status for hosted surfaces. Mint token 0
|
|
87
|
+
before expecting token-specific renders.
|
|
88
|
+
8. **Operate** — configure sales, publish renders, migrate, refresh marketplaces, transfer authority,
|
|
89
|
+
or lock only after verification. Record the contract address, chain, deploy block, custody,
|
|
90
|
+
resolution, owner powers, and remaining mutable surfaces.
|
|
91
|
+
|
|
92
|
+
When diagnosing, identify the current state and choose one next transition. Read
|
|
93
|
+
[diagnose.md](reference/diagnose.md); do not build a ladder of speculative retries.
|
|
94
|
+
|
|
95
|
+
## Model the project by independent dimensions
|
|
96
|
+
|
|
97
|
+
Keep these concepts separate. Most bad ABX plans collapse two of them into “hosting.”
|
|
98
|
+
|
|
99
|
+
| Dimension | Decide |
|
|
100
|
+
|---|---|
|
|
101
|
+
| **Collection shape** | one work; N unique works; one or N ids with limited/open copies |
|
|
102
|
+
| **Runtime** | static media; JavaScript program; build directory; Solidity field renderer |
|
|
103
|
+
| **Public surfaces** | metadata, image, animation, traits, attachments, PostParams |
|
|
104
|
+
| **Custody** | on-chain bytes, Arweave, IPFS, cloud, or local development storage |
|
|
105
|
+
| **Resolution** | on-chain renderer, hosted resolver, or on-chain JSON pointing at external media |
|
|
106
|
+
| **Rendering** | no derived render, one-shot stills, continuous effects, or Solidity-computed fields |
|
|
107
|
+
| **Authority** | owner, token holder, delegated address, minter, hook, transfer validator |
|
|
108
|
+
| **Mutability** | editable values/pointers, governed values, and the locks applied after verification |
|
|
109
|
+
|
|
110
|
+
Use precise language:
|
|
111
|
+
|
|
112
|
+
- **On-chain bytes** describes custody. **Self-resolving** describes resolution.
|
|
113
|
+
- **Chain-complete** means the requested document has no off-chain dependency. It does not promise
|
|
114
|
+
immutability or that every third-party RPC can execute a large read.
|
|
115
|
+
- **Locked** names a particular stored value or pointer. It does not prove that code behind a proxy
|
|
116
|
+
is immutable or that every output input is frozen.
|
|
117
|
+
- Marketplace refresh re-fetches a projection; it does not mutate canonical state.
|
|
118
|
+
|
|
119
|
+
## Choose the native deployment family
|
|
120
|
+
|
|
121
|
+
Run `abx capabilities --json` for the current matrix, then load [deploy.md](reference/deploy.md).
|
|
122
|
+
|
|
123
|
+
| Intent | Command | Default contract shape |
|
|
157
124
|
|---|---|---|
|
|
158
|
-
|
|
|
159
|
-
|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
**
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
Rules:
|
|
253
|
-
- **The readout is a contract: what's shown is *exactly* what deploys.** Every value = a flag you pass. Not going on-chain → the row says `none`, never an invented placeholder.
|
|
254
|
-
- **Every line must be *verified*, never aspirational — a value that depends on an external contract that must already exist** (`--attributes-renderer`, `--minter`, a `0x…` `--dep`, a gateway) **may appear as committed only once the dry-run confirms it resolves.** Never bake in a guessed/placeholder address; if it's unverified, show it `⚠ requires <X> — not yet deployed/verified` or leave the surface out. (The real-session trap: presenting "Traits computed on-chain via `--attributes-renderer 0x…`" off a *guessed* address — `deploy-code` now refuses an address with no code, so trust the dry-run over the assumption.)
|
|
255
|
-
- **Flag every inferred/defaulted value** with `⚠` + where it came from (name/symbol from filename, royalty default, owner = signing key).
|
|
256
|
-
- **The description is the one people forget** — never deploy an auto-written or empty description quietly. State what's written and whether it's on-chain (`--description-onchain`) or off. For a real piece, ask for the creator's words.
|
|
257
|
-
- **Traits are the creator's** (the OpenSea `attributes` array) — ask (`--traits "Background=Blue"` or `--attributes file.json`); never invent traits, never put protocol facts there. Off-chain by default; `--traits-onchain` to commit them.
|
|
258
|
-
- **Show real values** — the real name, description, address + pinned salt, chunk/tx count from the dry-run.
|
|
259
|
-
- Adapt rows to the config (off-chain shows storage backend + host URL instead of the renderer; `--no-mint` shows a deferred mint) — but always one row per written value, always the ⚠ flags, always an explicit confirm.
|
|
260
|
-
|
|
261
|
-
## Deploy strategy — when to mint
|
|
262
|
-
|
|
263
|
-
The deploy address is **deterministic** — a pure function of `(factory, salt)`, knowable before signing (`abx predict`). So you can warm the resolver at that exact address first → the moment a marketplace sees the mint it fetches live metadata, not a cached blank. Minting is optional at deploy (`--no-mint`); there's a one-shot `abx mint`.
|
|
264
|
-
|
|
265
|
-
| Path | When | Flow |
|
|
266
|
-
|---|---|---|
|
|
267
|
-
| **Express** *(default)* | demo, or pre-mint to your own wallet | `deploy` (mints #0) → `serve` → `refresh` |
|
|
268
|
-
| **Careful** *(real launch, off-chain resolver)* | metadata live the instant it's listable | `deploy --no-mint` → `serve` (warm) → verify → `mint` → `refresh` |
|
|
269
|
-
| **Primary sale** | token issued at point of sale | `deploy --no-mint` → settle off-chain → `mint --to <buyer>` → `refresh` |
|
|
270
|
-
|
|
271
|
-
- **Fully on-chain ⇒ mint at deploy; do NOT add `--no-mint`.** The careful path warms an *off-chain resolver*; a fully on-chain token has none (the renderer resolves the instant the contract exists). Deferring buys nothing and adds a tx. Defer an on-chain mint only for a genuine primary sale.
|
|
272
|
-
- **`abx predict [--salt 0x..] [--for 0x..]`** pre-computes the address. No `--salt` → reserves a fresh, front-run-proof salt to the deployer; pass `--salt` for a vanity/known address. The salt's leading 20 bytes are an access guard: zero ⇒ anyone may deploy; non-zero ⇒ only that signer.
|
|
273
|
-
- **The address depends on the salt — preview one, you MUST pin it.** Without `--salt`, every invocation (incl. `--dry-run`) reserves a *fresh* salt → a plain `deploy` lands at a different address than the dry-run showed. `--dry-run` prints the exact `--salt …` it used; pass that same salt to the real deploy. Never quote a previewed address without pinning its salt.
|
|
274
|
-
- **`abx refresh <addr>`** asks marketplaces to re-index. We emit **ERC-4906** on URI changes so 4906-aware marketplaces self-refresh; `refresh` is the fallback (+ genesis mint). With `OPENSEA_API_KEY` it calls OpenSea directly; else it prints the links to click.
|
|
275
|
-
- **There is no "add it to a marketplace" step — don't offer one.** Marketplaces discover the collection from chain (the mint + ERC-4906); `abx refresh` is the only nudge. Suggesting a manual listing implies work that doesn't exist.
|
|
276
|
-
- A `--no-mint` deploy reconstructs + serves normally (dashboard shows #0 "not yet minted"; metadata/image already resolve).
|
|
277
|
-
- **Etherscan source is already verified** — your deploys are EIP-1167 clones Etherscan auto-recognizes as proxies of the verified implementation.
|
|
278
|
-
|
|
279
|
-
## What a token carries — files beyond the image (the data plane)
|
|
280
|
-
|
|
281
|
-
A token is **not "just a picture."** It anchors **named, typed files** ("artifacts"), and the served metadata JSON carries an **`artifacts`** list — the *complete* set of the token's files, each `{key, mimeType, uri}`. The `image` / `animation_url` are just reserved members of that same set; alongside them a token can carry a hi-res master, a certificate, source files, a README — any number of named files. (Background: [data plane](https://abx.docs.artblocks.io/protocol/data-plane/).)
|
|
282
|
-
|
|
283
|
-
```json
|
|
284
|
-
"artifacts": [
|
|
285
|
-
{ "key": "image", "mimeType": "image/svg+xml", "uri": "…/image" },
|
|
286
|
-
{ "key": "print", "mimeType": "image/tiff", "uri": "ipfs://Qm…/master.tiff" },
|
|
287
|
-
{ "key": "readme", "mimeType": "text/markdown; charset=utf-8", "uri": "ar://…/README.md" }
|
|
288
|
-
]
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
- **Attach a file:** `abx attach <addr> <key> <ipfs://… | ar://… | https://…>` — `<key>` is any name you choose (`print`, `certificate`, `stems`, `readme`) and becomes the manifest entry's key. The representation is **auto-detected** from the URI scheme; the `mimeType` is declared from the file **extension** (`…/master.tiff` → `image/tiff`), so point the URI at the file itself. Tiny bytes with no external host can go **on-chain** with `--file <path>`. Token scope by default; `--collection` for a collection-wide file. Any signing lane; `--dry-run` previews. It's one file per call, run **after deploy**.
|
|
292
|
-
- **Don't have a URL yet? Upload first.** `attach` takes a locator you already host. `abx storage upload <path> --backend arweave|ipfs` uploads one file and prints a locator that **keeps the filename** (so the declared type survives) plus the ready-to-run `attach` line (Arweave = pay-once permanent; the same backends `deploy` uses; `--dry-run` to preview without uploading). Full flow: `abx storage upload master.tiff --backend arweave` → copy the printed locator → `abx attach <addr> print <that-locator>`.
|
|
293
|
-
- **`artifacts` is COMPUTED, never a field you set.** The resolver/renderer assembles the list from your fields — setting a field literally named `artifacts` is refused. You attach one file per key; the manifest builds itself.
|
|
294
|
-
- **The complete listing is a resolver surface.** A resolver serves the full `artifacts` list at `/t/<chainId>/<addr>/<id>`, and `/data/<key>` fetches each file. The bare on-chain `tokenURI` enumerates **reserved fields only** (there's no on-chain enumeration of arbitrary keys) — so a project that must surface extra files to consumers today runs a resolver (attached files are still stored on-chain + keccak-anchored regardless).
|
|
295
|
-
- **Effect outputs are artifacts too.** A code project's effect runner publishes `render/image`, `render/traits`, and any extra declared output (e.g. a hi-res `render/print`) into the same manifest automatically, at the current settled state — files appear as tokens are minted and params change (see [code-projects](reference/code-projects.md)).
|
|
296
|
-
- **Not the same as a Series.** `deploy-series` makes **N separate tokens, one file each**. The data plane is how **one** token holds several named files. Depth (representations, verify, reserved keys, on-chain-vs-resolver) → [operating.md](reference/operating.md#attaching-files--the-data-plane).
|
|
297
|
-
- **Set expectations honestly (say it up front).** No mainstream marketplace (OpenSea/Blur) shows a "files" tab **today** — they render `image`/`animation_url` only. Attached files are a durable, cryptographically-anchored part of the token *now*, read by **data-plane-aware tools and any resolver**; broad marketplace display is future adoption. So a creator verifies an attach by **curling their resolver's listing**, not by refreshing OpenSea (which won't show it).
|
|
298
|
-
|
|
299
|
-
## After launch — tell the creator (durability + owner care)
|
|
300
|
-
|
|
301
|
-
Once it's live, cover these in plain language; don't wait to be asked.
|
|
302
|
-
|
|
303
|
-
- **Durability depends on the backend.** Arweave = **pay once, kept for centuries** (a storage endowment funds ~200 years; resolves as long as the network + any gateway are up) — nothing to renew. IPFS/Pinata = **the creator must keep it pinned** — the image serves through their gateway, and if pinning lapses the bytes can disappear. `cloud`/`fs` = they maintain them. Say which one this drop uses and what it implies. For a real drop, lead toward Arweave (or start elsewhere and re-host later — bytes are keccak-anchored, so re-upload to the new backend + re-point with `set-field`, verified by `abx verify`).
|
|
304
|
-
- **Moving backend/gateway later is an owner-signed on-chain edit.** The on-chain keccak anchors the bytes so they're portable, but re-pointing (`set-field`/`migrate`) is a tx from the **owner** wallet — so that wallet must stay secure and reachable.
|
|
305
|
-
- **Owner-wallet hygiene (suggest as follow-ons).** The owner wallet controls mint, royalties, URIs, and ownership itself. Recommend: a hardware/dedicated wallet over a throwaway hot key; for anything valuable, hand ownership to a multisig (`abx set-admin <addr> --to <safe>`); and **back up `.abx-self-host/arweave-key.json`** — it holds any prepaid Turbo credits, lose it and they're stranded.
|
|
306
|
-
|
|
307
|
-
## Setup + environment
|
|
308
|
-
|
|
309
|
-
`abx` needs **Node ≥ 22.5** at runtime (the projection store uses built-in SQLite).
|
|
310
|
-
|
|
311
|
-
### Find `abx` before you install it — local first, then global
|
|
312
|
-
|
|
313
|
-
**Resolve in this order and use the first hit.** Don't jump to a global install; a project-local CLI is pinned in the creator's `package.json` (reproducible, and what `abx skill install` version-locks against), so it wins whenever it exists:
|
|
314
|
-
|
|
315
|
-
```bash
|
|
316
|
-
npx --no-install abx version # 1. project-local (./node_modules/.bin/abx) — PREFER this
|
|
317
|
-
abx version # 2. a global install already on PATH
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
- **`--no-install` is mandatory on that probe.** The bare `abx` name on npm is an **unrelated squatted package** — a plain `npx abx` with nothing local would *download that*, not this CLI. `--no-install` makes the probe fail cleanly instead.
|
|
321
|
-
- In the **abx source repo** (contributor), neither applies: use `pnpm abx <cmd>`, which runs the live `tsx` source.
|
|
322
|
-
|
|
323
|
-
**Nothing found → install.** The package is **`@artblocks/abx-cli`** (not `@artblocks/abx-sdk` — that's the library, and installing it gets you no `abx` binary; a real session lost a cycle to exactly that mistake):
|
|
324
|
-
|
|
325
|
-
| Situation | Install | Then invoke as |
|
|
326
|
-
|---|---|---|
|
|
327
|
-
| The creator has a project dir (a `package.json`) — **default** | `npm install --save-dev @artblocks/abx-cli` | `npx abx …` |
|
|
328
|
-
| No project, or they asked for a machine-wide tool | `npm install -g @artblocks/abx-cli` | `abx …` |
|
|
329
|
-
|
|
330
|
-
Ask before installing **globally** — it's a machine-wide change to their PATH, and the per-project install is the reversible one. A project install needs no permission beyond the usual.
|
|
331
|
-
|
|
332
|
-
Whichever you land on, **keep using that same invocation for every command in the session** (`npx abx …` vs `abx …`) — don't mix them, or you'll silently drive two different CLI versions. Then run `abx doctor` (preflight: signing key/wallet, RPC, canonical factory, storage).
|
|
333
|
-
|
|
334
|
-
`.env` (in the creator's project dir) = **secrets only**:
|
|
335
|
-
- **Signing:** a key (`SEPOLIA_FUNDED_PK` / `ABX_DEPLOYER_PK` / `SEPOLIA_WALLET_PK`) is needed ONLY for hot/unattended signing. If the creator owns a wallet, prefer **`--sign`** — no key in `.env`. `doctor`'s missing-key ✗ is **not fatal** on the `--sign` path.
|
|
336
|
-
- `ABX_RPC_URLS`, `ABX_PUBLIC_BASE_URL` (remote-resolver custody only), optional `OPENSEA_API_KEY`, plus any backend secret.
|
|
337
|
-
- **Two resolver credentials — don't mix them up.** `ABX_RESOLVER_ADMIN_TOKEN` = **a node you run** (`deploy-resolver` generates it; it's the operator secret, and bare `--remote` uses it). `ABX_REMOTE_<NAME>_TOKEN` (+ `_URL`) = **a managed provider's per-account API key** for `--remote <name>` (same name normalization as `ABX_RPC_URLS_<CHAIN>`). A named remote deliberately never falls back to the node-admin token, so putting a provider key in `ABX_RESOLVER_ADMIN_TOKEN` silently won't work. Only `_URL`/`_TOKEN` are read — `ABX_REMOTE_<NAME>_KEY` is ignored (the CLI now flags a near-miss name).
|
|
338
|
-
|
|
339
|
-
<sub>Working from the abx **source repo** (contributor)? `pnpm install`, then `pnpm abx <cmd>` or `pnpm sandbox`. Every command below is identical.</sub>
|
|
340
|
-
|
|
341
|
-
**Indexing reads the event log via `eth_getLogs` from the contract's deploy block** — the CLI records it at deploy and forwards it to a resolver on `add` (discovering it on-chain for a contract it didn't deploy here). So a normal deploy→index scans a small, recent window and is fast on **any** RPC, and re-index is incremental (resumes from the last block). It **auto-chunks**, so a range cap never yields *wrong* state — but don't wave a cap away: a **from-genesis** or long-span reconstruction, or a resolver serving many code projects under load, is slow and rate-limit-prone on a getLogs-**range-capped** endpoint. `abx doctor` rates each endpoint and flags a capped one — treat that as a real infra signal, and give a resolver you'll run under load a range-generous **archive** RPC. **If indexing is slow, or a hosted resolver won't serve, check the scan floor FIRST (is it scanning from block 0?), not the RPC tier** — that mis-diagnosis is a known trap. RPC deep-dive + troubleshooting → [reference/setup.md](reference/setup.md).
|
|
342
|
-
|
|
343
|
-
## Reference files
|
|
344
|
-
|
|
345
|
-
- **Public docs — the human-facing companion** at **https://abx.docs.artblocks.io** (quickstart, guides, the CLI/SDK reference, the protocol model). This skill is YOUR operating manual and stays authoritative for how to drive the CLI; the docs site is what you **link the creator to** for background/onboarding, and a place you can read if you want the protocol rationale behind a command. Don't send the creator commands to run (you run them) — send them the docs to *read*.
|
|
346
|
-
- **Code projects — operating depth** (what to keep running, the resume loop, verify-it-resolves, render ops, `--onchain-uri`/`--image-base`/traits internals, arweave delay, `deploy-code` flags, mint timing/pause/supply) → **[reference/code-projects.md](reference/code-projects.md)**
|
|
347
|
-
- **Operating an existing project** (owner ops, **artist credit + license fields**, **attaching files / the data plane**, selling via the shared minter, `abx mint-page`, moving hosting, resolver→resolver `migrate`) → **[reference/operating.md](reference/operating.md)**
|
|
348
|
-
- **Hosting infrastructure** (storage backends, Turbo lanes + failure playbook, **managed providers + named remotes + the service descriptor**, `deploy-resolver`, `deploy-effects`, local-vs-remote stores, token API routes, Docker) → **[reference/hosting.md](reference/hosting.md)**
|
|
349
|
-
- **Environment detail** (RPC selection + failover, multi-chain, troubleshooting) → **[reference/setup.md](reference/setup.md)**
|
|
350
|
-
- **Troubleshooting — "my NFT looks wrong"** (gray placeholder, stale-on-marketplace, tokenURI reverts, localhost baked, "not registered") — diagnose before acting → **[reference/troubleshooting.md](reference/troubleshooting.md)**
|
|
351
|
-
|
|
352
|
-
## Guarantees
|
|
353
|
-
|
|
354
|
-
- **Reconstruction from chain alone** — deterministic, idempotent; delete the projection, replay yields identical state.
|
|
355
|
-
- **Trust = the factory** — a clone is canonical only when the ownerless factory's `isAbxClone` confirms it (the `AbxDeployed` beacon is discovery, and spoofable).
|
|
356
|
-
- **Content is verifiable** — the on-chain keccak256 lets anyone re-hash the served bytes (the `verify` route), zero trust in the node.
|
|
357
|
-
- **Keys stay with their owner** — the wallet lane signs in the user's own wallet; the CLI never sees the key. Runtime data lives in `./.abx-self-host/` (gitignored).
|
|
358
|
-
|
|
359
|
-
Protocol model + full docs → **https://abx.docs.artblocks.io** ([protocol](https://abx.docs.artblocks.io/protocol/), [using ABX](https://abx.docs.artblocks.io/using-abx/), [CLI/SDK reference](https://abx.docs.artblocks.io/reference/)).
|
|
125
|
+
| One static work | `abx deploy` | ERC-721 1/1 |
|
|
126
|
+
| Folder of distinct static works | `abx deploy-series` | ERC-721 Series |
|
|
127
|
+
| Program or state-derived work | `abx deploy-code` | ERC-721 SeriesCode |
|
|
128
|
+
| One program, each token carries its own data | `deploy-code --script` + `<key>:Bytes:Creator` | SeriesCode + payload param |
|
|
129
|
+
| Copies of any family | add `--copies <n|open>` | corresponding ERC-1155 edition |
|
|
130
|
+
|
|
131
|
+
Important boundaries:
|
|
132
|
+
|
|
133
|
+
- `deploy-code --copies` supports `--script`, `--code-dir`, dependencies, Solidity image/attributes
|
|
134
|
+
renderers, `--image-base` (a deterministic per-id off-chain still, mutually exclusive with
|
|
135
|
+
`--image-renderer`), and `--resume` (a per-id mint diff — pass the same content flags plus
|
|
136
|
+
`--mint-amount` if the original deploy premint ids).
|
|
137
|
+
- `--onchain-image` works for static 721s and editions in hot, wallet, or sponsored lanes. It cannot
|
|
138
|
+
be prepared as one cold `--unsigned` bundle because staged transactions depend on prior receipts.
|
|
139
|
+
It stores SVG, PNG, JPEG, GIF, WebP, and AVIF files, declaring each raster's type in
|
|
140
|
+
`abx_image_type`. See `reference/deploy.md` for repairing a raster that serves as SVG.
|
|
141
|
+
- Deploy tested custom hooks/renderers from exact compiled initcode with `abx deploy-contract`.
|
|
142
|
+
ABX sends the bytes; it does not compile, link, audit, or infer constructor types. Test on the
|
|
143
|
+
paired testnet and source-verify before wiring a production address. Under `--sponsor`, the
|
|
144
|
+
keyless CREATE2 proxy is the constructor caller, so pass ownership explicitly instead of relying
|
|
145
|
+
on `msg.sender` in the constructor.
|
|
146
|
+
- A code project may need no public host when its image/traits are computed by Solidity renderers.
|
|
147
|
+
A JavaScript program still needs a deliberate marketplace-image plan even when its animation is
|
|
148
|
+
chain-complete.
|
|
149
|
+
- Content size is not a fixed refusal. The CLI measures write cost and the active RPC's read reach.
|
|
150
|
+
State the measured reach; never generalize it to every marketplace endpoint.
|
|
151
|
+
|
|
152
|
+
## Treat public surfaces as an acceptance test
|
|
153
|
+
|
|
154
|
+
Before deploying, write down the promised value for each applicable row:
|
|
155
|
+
|
|
156
|
+
| Surface | Verify with |
|
|
157
|
+
|---|---|
|
|
158
|
+
| Contract identity and owner powers | `abx state <addr>` and the deploy readout |
|
|
159
|
+
| Token metadata | `abx tokenuri <addr> --token <id>` |
|
|
160
|
+
| Collection metadata | `abx contracturi <addr>` |
|
|
161
|
+
| Image | decoded metadata plus a successful fetch or on-chain field provenance |
|
|
162
|
+
| Animation/live view | the decoded `animation_url`, loaded with a real minted token |
|
|
163
|
+
| Marketplace traits | decoded `attributes`, not merely console output from the program |
|
|
164
|
+
| Parameters and values | `abx state` for schemas; `abx tokens --json` for token values |
|
|
165
|
+
| Attached artifacts | `abx artifacts <addr> --token <id>` (entries + current/stale effect rows); attachments are not enumerable in bare on-chain metadata |
|
|
166
|
+
| Byte integrity | `abx verify <addr>` |
|
|
167
|
+
| Hosted lifecycle | `abx status --remote <name> --watch` or provider status |
|
|
168
|
+
|
|
169
|
+
Do not call a launch complete because the transaction mined. Complete it when every promised surface
|
|
170
|
+
has the expected provenance and is retrievable through the path collectors will use.
|
|
171
|
+
|
|
172
|
+
## Confirm irreversible and shared-state choices
|
|
173
|
+
|
|
174
|
+
Before any real deploy, say these choices explicitly when relevant:
|
|
175
|
+
|
|
176
|
+
- The contract family and ERC-721 versus ERC-1155 edition shape cannot be changed later.
|
|
177
|
+
- Hooks and PostParams require a code-capable contract. A static image contract cannot gain them.
|
|
178
|
+
- `--burnable` and creator-token enrollment are deploy-time choices.
|
|
179
|
+
- A royalty cap only moves downward.
|
|
180
|
+
- Edition arithmetic is **number of ids × copies per id**. For one work with 100 copies, use one id;
|
|
181
|
+
do not accidentally create the code default's multiple-id space.
|
|
182
|
+
- An ERC-721 Series cap is lifetime minted ids: burning never reopens a slot. An ERC-1155 edition's
|
|
183
|
+
per-id cap is live supply: when burnable, a burned copy may be minted again.
|
|
184
|
+
- PostParams on an edition are stored per id, not per physical copy. A holder-authorized value is
|
|
185
|
+
shared by all holders of that id, and the last valid writer wins.
|
|
186
|
+
- Metadata, URI, script, dependency, hook, schema/value, and authority locks are distinct. Verify
|
|
187
|
+
first and lock last.
|
|
188
|
+
|
|
189
|
+
## Use capability classification, not optimism or refusal
|
|
190
|
+
|
|
191
|
+
Classify an unusual request as exactly one of:
|
|
192
|
+
|
|
193
|
+
1. **Native** — a documented CLI lane performs it.
|
|
194
|
+
2. **Extension** — a custom minter, configure/transfer/augment hook, field renderer, or seed source
|
|
195
|
+
performs it while the token remains a canonical factory clone.
|
|
196
|
+
3. **Unsupported or foreclosed** — the capability contract lists it, or the existing collection's
|
|
197
|
+
irreversible type/flags already exclude it.
|
|
198
|
+
4. **Unknown** — no route has been proven. Inspect code/help/contracts and report uncertainty; do not
|
|
199
|
+
turn absence from a no-list into a promise.
|
|
200
|
+
|
|
201
|
+
Custom Solidity is built and tested outside `abx`; `abx scaffold-renderer` supplies a Foundry
|
|
202
|
+
starting point, and `abx deploy-contract` can send its exact compiled initcode through any signing
|
|
203
|
+
lane. Read [capabilities.md](reference/capabilities.md) before designing a custom mechanic.
|
|
204
|
+
|
|
205
|
+
## Load only the reference needed
|
|
206
|
+
|
|
207
|
+
- Environment, installation, signer lanes, and safe setup → [setup.md](reference/setup.md)
|
|
208
|
+
- Static projects, editions, placement, costs, and deploy confirmation → [deploy.md](reference/deploy.md)
|
|
209
|
+
- Programs, renderers, thumbnails, traits, PostParams, seeds, and dependencies → [code.md](reference/code.md)
|
|
210
|
+
- First-party hosted services, OAuth device login, and core/provider feedback → [services.md](reference/services.md)
|
|
211
|
+
- Generic remotes, self-hosted resolvers/effects, storage, lifecycle, and migration → [hosting.md](reference/hosting.md)
|
|
212
|
+
- Existing-project reads, mint/sales, fields, transfers, authority, and locks → [operate.md](reference/operate.md)
|
|
213
|
+
- Failure classification, resume, RPC/storage/rendering faults, and retry discipline → [diagnose.md](reference/diagnose.md)
|
|
214
|
+
- Capability questions, extension seams, mechanics, and hard boundaries → [capabilities.md](reference/capabilities.md)
|
|
215
|
+
- ERC-721C/ERC-1155C enrollment and validator operations → [creator-token.md](reference/creator-token.md)
|
|
216
|
+
|
|
217
|
+
Read every reference applicable to the requested workflow before sending a real transaction. Do not
|
|
218
|
+
load unrelated references merely because they exist.
|