@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.40
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 +16 -0
- package/assets/renderer-scaffold/README.md +29 -11
- package/assets/renderer-scaffold/foundry.toml +1 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -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 +94 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +135 -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 +447 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/deploy.d.ts +242 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +4763 -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 +147 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/project.d.ts +257 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1414 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +64 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +701 -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 +733 -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 +741 -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 +370 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +59 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +513 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +90 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +284 -11
- 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 +390 -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/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 +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -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 +180 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +41 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +111 -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 +68 -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 +747 -4838
- 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 +179 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +780 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +312 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +1808 -357
- 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/prompt.d.ts +17 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +19 -0
- package/dist/prompt.js.map +1 -0
- 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 +157 -52
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +435 -46
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +62 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +234 -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 +13 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +84 -15
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +86 -5
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +161 -20
- package/dist/update-check.js.map +1 -1
- package/package.json +13 -12
- package/skill/SKILL.md +179 -347
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +188 -0
- package/skill/reference/code.md +211 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +167 -0
- package/skill/reference/diagnose.md +165 -0
- package/skill/reference/hosting.md +161 -94
- package/skill/reference/operate.md +181 -0
- package/skill/reference/services.md +121 -0
- package/skill/reference/setup.md +140 -36
- 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 -116
- package/skill/reference/troubleshooting.md +0 -28
package/skill/SKILL.md
CHANGED
|
@@ -1,352 +1,184 @@
|
|
|
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
|
+
testnets: 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.1.0-alpha.
|
|
12
|
+
version: "0.1.0-alpha.40"
|
|
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
|
-
|
|
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
|
-
3. Relay: "Open `<url>`, connect your wallet, approve." Don't auto-open (node may be remote). Multi-tx → tell them it's N approvals in one session.
|
|
95
|
-
4. Human approves; only the signed tx hash returns.
|
|
96
|
-
5. Let the background command finish (it signs + confirms + re-indexes), then report. Don't kill it.
|
|
97
|
-
|
|
98
|
-
**⚠ Run wallet-lane ops ONE AT A TIME — never start the next `--sign` op until the previous background command has finished (step 5).** Each op is its own process serving its own page; overlapping them means the human can land on the *previous* action's page, which (having already completed) shows "done" instantly — that "done" is the last op, not the new one. If a session is genuinely stuck (human never signs), the next op will open a *fresh, different* URL — so relay the new URL from the file and tell them to open that one, not the old tab.
|
|
99
|
-
|
|
100
|
-
- **Sign page is operation-aware** — shows decoded intent ("Transfer #0 → 0x…"), gates on network + signing wallet + the tx, and the CLI refuses a mismatched signer server-side too.
|
|
101
|
-
- **Multi-tx signs in ONE session** (hot + wallet only). `--onchain-image` stages bytes before the deploy that references them; the human connects once and walks `Transaction 1 of N`. Cold can't (staging is interactive) — `--unsigned --onchain-image` errors; use `--send`/`--sign`.
|
|
102
|
-
- **Keep tx count low and say it up front.** A configured token deploys in one tx; `--onchain-image` adds staging tx(s); several owner edits collapse into one atomic `multicall`.
|
|
103
|
-
- **Off-chain storage uploads are NOT wallet approvals — never count them as signatures.** An IPFS upload (Pinata `PINATA_JWT`) or a managed-key Arweave upload happens *before* signing with **no wallet prompt**; only **on-chain staging + the deploy** are approvals. So an off-chain IPFS/Arweave deploy is **one** wallet approval (the deploy). Say it that way — *"1 approval (the deploy); your N images upload to IPFS first, no signature"* — don't fold uploads into the MetaMask count (the classic "2 txs, approve both" mistake). *Exception:* `--storage-signer eth --sign` makes each upload a `personal_sign` in the same session (no gas) — then, and only then, they're approvals too.
|
|
104
|
-
|
|
105
|
-
## Quick start
|
|
106
|
-
|
|
107
|
-
**Custody is the master call; resolve it before signing/identity.** The rule, by size:
|
|
108
|
-
|
|
109
|
-
| Art size | Default | Why |
|
|
110
|
-
|---|---|---|
|
|
111
|
-
| **Tiny** (≲ 24 KB/file, ≲ 256 KB total) | fully **on-chain** (`--onchain-image --compress fastlz`) | no host, renders forever, cheaper *at this size* |
|
|
112
|
-
| **Bigger / photographic** (most PNG/JPEG) | image **off-chain**, JSON on-chain (`--onchain-uri --backend arweave`) | on-chain is ~200 gas/byte → far more expensive here; Arweave is pay-once permanent |
|
|
113
|
-
|
|
114
|
-
On-chain's edge past tiny is self-resolution/permanence, **never cost** — don't call it "cheaper" above the thresholds. The CLI warns when an on-chain image exceeds them.
|
|
115
|
-
|
|
116
|
-
**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.
|
|
117
|
-
|
|
118
|
-
Tiny-art path:
|
|
119
|
-
1. **Confirm identity** (name, symbol, `--description`, royalty, owner) via the [readout](#confirm-before-sending).
|
|
120
|
-
2. **Deploy + mint in one go:**
|
|
121
|
-
```bash
|
|
122
|
-
abx deploy --image art.svg --name "…" --symbol … --description "…" --onchain-image --compress fastlz [--sign --for 0x…]
|
|
123
|
-
```
|
|
124
|
-
= staging tx(s) + one deploy-that-mints. **Mint at deploy — no `--no-mint`** (nothing to warm).
|
|
125
|
-
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>`.
|
|
126
|
-
|
|
127
|
-
For large/dynamic media, off-chain custody, or operating an existing project, use the framework + reference files below.
|
|
128
|
-
|
|
129
|
-
## Series (multi-token drops)
|
|
130
|
-
|
|
131
|
-
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`.
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
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]
|
|
135
|
-
```
|
|
136
|
-
**Quick start — a folder of photos, permanent, no server:**
|
|
137
|
-
```bash
|
|
138
|
-
abx deploy-series --dir ./photos --name "My Series" --symbol MS --onchain-uri --backend arweave --mint-all --sign
|
|
139
|
-
```
|
|
140
|
-
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.)*
|
|
141
|
-
|
|
142
|
-
## Code projects (generative / code-based drops)
|
|
143
|
-
|
|
144
|
-
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)**.
|
|
145
|
-
|
|
146
|
-
**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:
|
|
147
|
-
- **Off-chain resolver** (`--public-base-url` + an effects runner, ~a few $/mo) — **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`.
|
|
148
|
-
- **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.)*
|
|
149
|
-
|
|
150
|
-
**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).
|
|
151
|
-
|
|
152
|
-
**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:
|
|
153
|
-
|
|
154
|
-
| Surface | On-chain | Off-chain |
|
|
155
|
-
|---|---|---|
|
|
156
|
-
| **tokenURI + animation** | `--onchain-uri` — *if* script + every dep fit one `tokenURI` eth_call (`abx inspect` estimates) | a resolver (`--public-base-url`) |
|
|
157
|
-
| **thumbnail (`image`)** | ❌ never computed on-chain — needs a public destination: `--image-base <S3/R2/CDN you own>`. **No destination ⇒ placeholder FOREVER + orphaned render, not backfillable. Never localhost.** | a resolver's `/image` |
|
|
158
|
-
| **traits (`attributes`)** | a Solidity `--attributes-renderer 0x…` you **DEPLOY** (fork `SeedTraitsRenderer`) — **not a free flag or guessable address** (`deploy-code` refuses a codeless one; "ports to Solidity" ≠ "deployed") | a resolver stitches the JS `abx.traits()` |
|
|
159
|
-
| **PostParams** | declare EVERY key the script reads: `--schema key:Type:Auth` (a palette collectors set = `palette:HexColor:TokenOwner`) — else silently dropped at render | — |
|
|
160
|
-
|
|
161
|
-
**The resolver is the pivot: choosing *no resolver* forecloses the off-chain column for thumbnail + traits.** (On `--onchain-uri`, an unauthenticated Etherscan "Read Contract" can hit its gas cap on the big doc and look like a revert — expected; verify with `abx tokenuri`, never `abx index --full` to "fix" it. Diagnosis depth → [reference/troubleshooting.md](reference/troubleshooting.md).)
|
|
162
|
-
|
|
163
|
-
**Pick your code lane** (all `abx deploy-code`):
|
|
164
|
-
|
|
165
|
-
| Your sketch | Flags | Result |
|
|
166
|
-
|---|---|---|
|
|
167
|
-
| Vanilla JS, no libraries | `--script f.js --onchain-uri` | **fully on-chain** — resolves from any RPC forever |
|
|
168
|
-
| Script + a library on-chain (e.g. `p5@1.0.0`, **Sepolia only** — needs the AB dependency registry, absent on Base Sepolia) | `--script f.js --onchain-uri --dep p5@1.0.0` | **fully on-chain** — *iff the dep report says “ON-CHAIN bytes available”* |
|
|
169
|
-
| Script + a CDN-only library, or very large params | `--script f.js --public-base-url https://…` | **resolver lane** — you host a resolver; live metadata |
|
|
170
|
-
| A pre-built app (webpack/vite output) | `--code-dir build/` (+ `--onchain-uri` or `--public-base-url`) | **no server to run**, gateway-served → **never** chain-complete (8KB param budget) |
|
|
171
|
-
| A **Solidity renderer** (SVG on-chain, from seed+params) | `--image-renderer 0x<svg> [--attributes-renderer 0x<traits>] --onchain-uri` (**no `--script`**) | **truly in-chain** — image + traits computed on-chain, tokenURI on-chain, **zero infra** |
|
|
172
|
-
|
|
173
|
-
**⭐ In-chain Solidity lane — recommend on-chain `tokenURI` without hesitation.** The artwork is a Solidity `IAbxFieldRenderer` returning an SVG from seed+params (not a JS program), wired `--image-renderer 0x… [--attributes-renderer 0x…] --onchain-uri` with **no `--script`/`--code-dir`**: image AND traits computed on-chain, `tokenURI` assembled on-chain — **genuinely nothing to run** (a small SVG, so the large-`tokenURI` caveat doesn't apply). **NOT no-code, though**: the renderer is a contract the creator compiles + deploys with Foundry. **`abx scaffold-renderer <dir>`** writes a ready-to-build project (worked renderer + coherent traits + the interfaces with invariants + never-revert tests + deploy script); they `forge test`, deploy, and hand the address to `--image-renderer 0x…` (which verifies code-at-address, never compiles/deploys Solidity). Not comfortable with Solidity? Steer to the resolver or (tiny static SVG) `--onchain-image`. Depth → [reference/code-projects.md](reference/code-projects.md#in-chain-solidity-svg--the-zero-dependency-lane) · interface/invariants → https://abx.docs.artblocks.io/protocol/renderers/.
|
|
174
|
-
|
|
175
|
-
## Decisions (real launch)
|
|
176
|
-
|
|
177
|
-
Master call is **custody × mutability**:
|
|
178
|
-
|
|
179
|
-
| | **Mutable** (name/desc/traits may change) | **Immutable** (never changes) |
|
|
180
|
-
|---|---|---|
|
|
181
|
-
| **Tiny static** (≲ 24 KB/file, ≲ 256 KB total) | **on-chain renderer** — `--onchain-image --compress fastlz`. No host, mutable via `set-field`, permanent. | on-chain renderer + `lock-field` + `lock-uri` once it resolves. |
|
|
182
|
-
| **Bigger / dynamic** (most PNG/JPEG) | **image off-chain, JSON on-chain, no server** — `--onchain-uri --backend arweave` (or `ipfs`). Renderer assembles JSON pointing at the bytes; many files → one `url-template` (O(1)). For metadata you edit often, a **hosted resolver** instead (`abx deploy-resolver`, [hosting.md](reference/hosting.md)). Not fully on-chain (~200 gas/byte). | image off-chain (Arweave = permanent) + on-chain renderer + `lock-field`/`lock-uri`. Or a frozen `ipfs://` override + `lock-uri`. |
|
|
183
|
-
|
|
184
|
-
**Four patterns, by where bytes live × how `tokenURI` resolves:**
|
|
185
|
-
1. **Fully on-chain** (`--onchain-image`) — bytes + JSON on-chain. Tiny art only.
|
|
186
|
-
2. **Image off-chain, JSON on-chain, no server** (`--onchain-uri --backend arweave|ipfs|cloud`) — the sweet spot for static art. Arweave/IPFS (permanent, content-addressed) or your S3/CDN (`--backend cloud --public-base <url>`; centralized, mutable). Many files → one `url-template`.
|
|
187
|
-
3. **Hosted resolver** (`--public-base-url` + `abx deploy-resolver`) — for mutable/dynamic metadata; you run a node.
|
|
188
|
-
4. **Inline SVG on-chain** — self-contained vector art inlined into `tokenURI`. For a **1/1** that's `abx deploy … --onchain-uri`; for a **Series** of tiny SVGs use `abx deploy-series … --onchain-image --compress fastlz` (bare `--onchain-uri` on a folder does NOT inline the images — it's the image-custody flag `--onchain-image` that puts SVG bytes on-chain per token).
|
|
189
|
-
|
|
190
|
-
**Picking IPFS (or Arweave) does NOT mean running a server.** The `--onchain-uri --backend ipfs|arweave` path (pattern 2) bakes the image's public **gateway** URL into on-chain JSON — a pinning service's read endpoint (a *dedicated* Pinata gateway for IPFS), not a resolver you host. So when a creator chooses IPFS, **default to this no-server path** — image on IPFS, JSON on-chain, nothing to keep running (just keep the pin alive). You only need a **hosted resolver** (pattern 3) if they want *freely editable* metadata. Never present IPFS as blocked on "a public URL" or "a server always online": the gateway belongs to the pinning service and the JSON lives on-chain. (The one real input IPFS needs is `PINATA_JWT` in `.env` for pinning — that's an API upload, not a host.)
|
|
191
|
-
|
|
192
|
-
**No-server tradeoff (patterns 1, 2, 4):** with the on-chain renderer only the *image* is off-chain — any **description / traits / animation_url live on-chain** (gas to write, permanent, lockable), vs a hosted resolver where they're free to edit. Cheap (a shared value is **one collection-scope field**, not one per token — the renderer falls back token→collection), but the creator should choose "no server" knowing their text metadata is on-chain.
|
|
193
|
-
|
|
194
|
-
Get decisions 1–2 right before deploy (image commitment + resolver URL are written then; re-pointable, but):
|
|
195
|
-
|
|
196
|
-
**1. Storage permanence** — where bytes live. Not irreversible: bytes are content-addressed by their on-chain keccak, so start on one backend and move later (`abx verify` confirms the hash). Don't let it block a first deploy.
|
|
197
|
-
- `arweave` = pay-once permanent, no recurring fee. `cloud` (S3/R2) = durable, you maintain it. `ipfs` = decentralized, you pin it. `fs` = zero-config start, dies with the disk → move before it matters.
|
|
198
|
-
- **`arweave` is nearly as easy as `fs` for small art** — Turbo default: **under 100 KB free, no setup** (a managed `.abx-self-host/arweave-key.json` minted on first upload; back it up with `abx storage backup-key`). Choose per command with `--backend` (stateless, no config file); a backend missing its secret falls back to `fs`.
|
|
199
|
-
- **Who pays is a lane (`--storage-signer`)** — Turbo credits attach to an identity (managed key · `.env` key · browser wallet). **Before any top-up, check BOTH balances** (`abx storage balance --backend arweave` shows the managed key AND the wallet — spend the wallet's credits if present). On an upload error surface it verbatim — `…already been uploaded…` is *success* (dedup); don't reflexively top-up or switch to IPFS. Full lanes + failure playbook → [hosting.md](reference/hosting.md#arweave-via-turbo--the-easy-permanent-path-read-before-quoting-setup).
|
|
200
|
-
|
|
201
|
-
**2. Public host URL** — where the resolver runs (**off-chain custody only**). Baked into `tokenURI` at deploy, so the CLI **refuses an off-chain deploy without a public URL** (`ABX_PUBLIC_BASE_URL` or `--public-base-url https://…`) and **never bakes localhost** (that token resolves for no one). No exceptions.
|
|
202
|
-
- **First ask whether you need a host at all** — tiny art is cheaper and more durable on-chain (no host). For bigger art, Arweave (no host to run) beats a resolver unless you need mutability or serve many files.
|
|
203
|
-
- **Tunnels (ngrok/cloudflared) are preview-only — never bake one on-chain** (dies on sleep, rotates on restart). A real launch puts the resolver on a host you control under your own domain (move = a DNS re-point).
|
|
204
|
-
|
|
205
|
-
**3. Identity** — `--name`, `--symbol`, `--royalty-bps` (default 500 = 5%), `--description "…"`, `--external-url <url>` (both served in the metadata — set them or the description is boilerplate). Owner + royalty receiver = the deploying wallet. These default to off-chain operator metadata (editable via `abx add <addr> --description "…"`). For a description that should outlast any node, add `--description-onchain` (or later `abx set-field <addr> --field description --text "…"`) → on-chain, freezable via `lock-field`; the resolver prefers the on-chain value. This is the per-field on-chain model — any field on-chain or off, one active `representation` (inline · reader · keccak256 · arweave · ipfs · url). Background: [metadata model](https://abx.docs.artblocks.io/protocol/metadata/).
|
|
206
|
-
- **Credit + license** — deploy flags `--artist "…"` · `--license "…"` (also `--display-notes`, `--artist-links`) bake authorship + rights ON-CHAIN in the deploy tx (all three deploy commands); or set/change them later with `abx set-field <addr> --collection --field artist|license --text "…"`. Reserved collection fields served in `contractURI`, on any type (1/1 · Series · code). Detail: [operating.md → Authorship + rights](reference/operating.md#authorship--rights-credit--license).
|
|
207
|
-
- **Propose a real name/symbol and confirm — never silently bake a generic folder-name guess.** A folder called `series`/`images`/`photos` infers junk ("Series" / "SRS"), and the CLI *refuses* demo defaults without `--name`/`--symbol` precisely because on-chain identity is effectively permanent. Suggest a specific title + a short ticker-style symbol drawn from the actual work, and get an explicit yes before deploying. Inference is a suggestion to confirm, not a default to ship — if the folder name is generic, say so and ask rather than proposing it.
|
|
208
|
-
|
|
209
|
-
**4. Image placement** — `--image <path>` (png · jpg · gif · svg · webp). The on-chain keccak256 (`image` field) anchors integrity; size is bounded by the backend, not the chain.
|
|
210
|
-
- *Off-chain:* the served `image` is the backend's **gateway HTTPS URL** (`https://<gateway>/ipfs/<cid>`), not raw `ipfs://` (wallets/marketplaces can't render that). So off-chain needs a pinning service + a **public** gateway — with Pinata use a **dedicated** gateway (`--gateway https://<you>.mypinata.cloud`); a local kubo gateway is preview-only. The keccak stays the anchor → move gateways without a tx.
|
|
211
|
-
- *Fully on-chain:* `abx set-field <addr> --field image --file <path> [--compress fastlz]` splits into SSTORE2 chunks behind the shared reader; or bake it in with `abx deploy --image <path> --onchain-image [--compress fastlz]`.
|
|
212
|
-
|
|
213
|
-
**Inline vs reader — default to the reader for real artwork.** `--onchain-uri` alone inlines the SVG (1 tx, ~700 gas/byte); `--onchain-image --compress fastlz` stages via SSTORE2 + a small `reader` pointer (~200 gas/byte, +1 tx) — **cheaper above ~0.5 KB** and widening with size. So: tiny (<~0.5 KB, a one-line SVG/short text) → `--onchain-uri` inline; real artwork (a few KB+) → `--onchain-image --compress fastlz`. **Never `--compress gzip` for an on-chain-rendered token** — gzip decodes off-chain only, breaking `--onchain-uri`; use fastlz (it decodes *in* the reader).
|
|
214
|
-
|
|
215
|
-
**5. On-chain vs off-chain resolution** — by default `tokenURI`/`contractURI` point at your resolver. `--onchain-uri` = JSON assembled *on-chain* by the shared `AbxMetadataRenderer`, self-resolving forever — so it pairs with on-chain content, cost-effective only for tiny art (thresholds above).
|
|
216
|
-
- **Fully on-chain = no server.** Don't stand one up; never cite a localhost URL. **Prove it with `abx tokenuri <addr>`** (reads `tokenURI(0)` over RPC, no `serve`). `abx serve` is only for off-chain-resolving tokens.
|
|
217
|
-
- **The off-chain `tokenURI` is a base, not a per-token URL** — the contract stores a base and derives `{base}/{chainId}/{address}/{tokenId}`. Set via `--public-base-url` or `set-token-uri --uri <base>` later.
|
|
218
|
-
- **Don't default to a frozen `ipfs://` tokenURI** — every edit then = re-pin + on-chain re-point, and the event spine stops driving the token (exiting the spec). Right only for true immutability, then lock it (`set-token-uri --override ipfs://<cid>` then `lock-uri`).
|
|
219
|
-
- **Store ≠ lock; lock last.** On-chain ≠ frozen. Deploy unlocked, confirm it resolves in production, *then* freeze. Two locks: `lock-field <addr> --field <name>` (a value) + `lock-uri <addr>` (how it resolves). Both = provably immutable. A deliberate follow-up, not the first deploy.
|
|
220
|
-
|
|
221
|
-
**6. When to mint** → [Deploy strategy](#deploy-strategy--when-to-mint).
|
|
222
|
-
|
|
223
|
-
## Confirm before sending
|
|
224
|
-
|
|
225
|
-
Run `abx deploy --dry-run` for real values, present **this exact shape** — one row per on-chain value — then wait for go-ahead. **Mirror the dry-run's values; don't compose your own.**
|
|
226
|
-
|
|
227
|
-
```
|
|
228
|
-
Deploy config — confirm before I send (everything below is written on-chain):
|
|
229
|
-
|
|
230
|
-
Name Donuts & Cake ⚠ inferred from filename — confirm or rename
|
|
231
|
-
Symbol DONUTS ⚠ inferred — confirm
|
|
232
|
-
Description "<the creator's words>" ⚠ I have nothing from you — give me a line, or I deploy with none
|
|
233
|
-
Traits none ⚠ none written — add --traits "Key=Value" or skip
|
|
234
|
-
Image donuts-cake.svg · 2.4 KB → reader (fastlz, 1 chunk) · on-chain
|
|
235
|
-
Resolution on-chain via renderer 0x5F36…1829 — no server, no localhost
|
|
236
|
-
Royalty 5% (500 bps) → 0x0248…b13C (default; confirm rate + receiver)
|
|
237
|
-
Owner 0x0248…b13C (the deploying wallet)
|
|
238
|
-
Mint token #0 → owner, at deploy
|
|
239
|
-
Address 0x2619…9Da9 (salt-pinned: --salt 0x…)
|
|
240
|
-
Locking deploying UNLOCKED — lock later, after verifying it resolves
|
|
241
|
-
Transactions stage image (1) + deploy + mint (1) = 2
|
|
242
|
-
|
|
243
|
-
Reply to change anything, or say go.
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Rules:
|
|
247
|
-
- **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.
|
|
248
|
-
- **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.)
|
|
249
|
-
- **Flag every inferred/defaulted value** with `⚠` + where it came from (name/symbol from filename, royalty default, owner = signing key).
|
|
250
|
-
- **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.
|
|
251
|
-
- **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.
|
|
252
|
-
- **Show real values** — the real name, description, address + pinned salt, chunk/tx count from the dry-run.
|
|
253
|
-
- 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.
|
|
254
|
-
|
|
255
|
-
## Deploy strategy — when to mint
|
|
256
|
-
|
|
257
|
-
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`.
|
|
258
|
-
|
|
259
|
-
| Path | When | Flow |
|
|
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
|
+
- Operate only on chains reported by `abx capabilities`; the toolkit is testnet-only today. Select
|
|
28
|
+
the chain with `ABX_CHAIN=<chain>`; there is deliberately no `--chain` flag.
|
|
29
|
+
- Run `abx help <command>` immediately before composing a non-trivial command. Do not recover flag
|
|
30
|
+
syntax from this skill.
|
|
31
|
+
- Never infer that a capability is absent because a flag is absent. Run `abx capabilities --json`,
|
|
32
|
+
identify a native lane or extension seam, and read [capabilities.md](reference/capabilities.md).
|
|
33
|
+
- Never hand-roll transactions, nonces, retry loops, resolver URLs, or contract-type detection when
|
|
34
|
+
the CLI exposes the operation. One EOA must have one serialized write sequence.
|
|
35
|
+
- Never send, mint, transfer, lower a cap, change authority, or apply a lock until the human confirms
|
|
36
|
+
the exact action. Locks, ownership transfers, and several deploy choices are irreversible.
|
|
37
|
+
- Never submit feedback, project data, logs, or agent/session context to ABX or a remote provider
|
|
38
|
+
until the human reviews the preview and approves that specific report. Redact credentials and
|
|
39
|
+
unrelated personal or project information. `abx feedback` previews by default; `--yes` sends.
|
|
40
|
+
- Never fold `abx submit-app` into deployment. Listing is a separate, optional post-deploy action.
|
|
41
|
+
|
|
42
|
+
## Use the lifecycle
|
|
43
|
+
|
|
44
|
+
Follow this state machine instead of accumulating retries:
|
|
45
|
+
|
|
46
|
+
1. **Discover** — identify the working directory, CLI provenance/version, active chain, artifacts,
|
|
47
|
+
existing contract addresses, configured remote, and signer preference. Run `abx doctor` for a
|
|
48
|
+
deployment or unfamiliar environment.
|
|
49
|
+
2. **Classify surfaces** — decide collection shape, runtime, required public surfaces, custody,
|
|
50
|
+
resolution, authority, mutability, and mint/sale timing. Use the model below.
|
|
51
|
+
3. **Inspect** — run `abx capabilities --json`; for code run `abx inspect` and `abx preview`. For an
|
|
52
|
+
existing collection run `abx state`, `abx tokens`, `abx tokenuri`, and `abx verify` as relevant.
|
|
53
|
+
4. **Plan** — use the selected deploy command with `--dry-run --json`. Read its normalized shape,
|
|
54
|
+
addresses, surface warnings, transaction count, storage activity, and irreversible choices back
|
|
55
|
+
to the creator. A dry run may perform read-only network probes; it must not send or store.
|
|
56
|
+
5. **Confirm** — confirm name, symbol, token standard, code-capable/static type, burnability,
|
|
57
|
+
ERC-721C/ERC-1155C enrollment, edition arithmetic, royalty ceiling, signer, costs, public URLs,
|
|
58
|
+
initial mint, and every requested lock.
|
|
59
|
+
6. **Execute** — let the CLI sign and serialize the operation. Do not start a second write process
|
|
60
|
+
with the same EOA. Honor structured lifecycle states and terminal errors.
|
|
61
|
+
7. **Verify** — verify the contract and each promised surface from its canonical path. Use on-chain
|
|
62
|
+
reads for self-resolving metadata and `abx verify`/remote status for hosted surfaces. Mint token 0
|
|
63
|
+
before expecting token-specific renders.
|
|
64
|
+
8. **Operate** — configure sales, publish renders, migrate, refresh marketplaces, transfer authority,
|
|
65
|
+
or lock only after verification. Record the contract address, chain, deploy block, custody,
|
|
66
|
+
resolution, owner powers, and remaining mutable surfaces.
|
|
67
|
+
|
|
68
|
+
When diagnosing, identify the current state and choose one next transition. Read
|
|
69
|
+
[diagnose.md](reference/diagnose.md); do not build a ladder of speculative retries.
|
|
70
|
+
|
|
71
|
+
## Model the project by independent dimensions
|
|
72
|
+
|
|
73
|
+
Keep these concepts separate. Most bad ABX plans collapse two of them into “hosting.”
|
|
74
|
+
|
|
75
|
+
| Dimension | Decide |
|
|
76
|
+
|---|---|
|
|
77
|
+
| **Collection shape** | one work; N unique works; one or N ids with limited/open copies |
|
|
78
|
+
| **Runtime** | static media; JavaScript program; build directory; Solidity field renderer |
|
|
79
|
+
| **Public surfaces** | metadata, image, animation, traits, attachments, PostParams |
|
|
80
|
+
| **Custody** | on-chain bytes, Arweave, IPFS, cloud, or local development storage |
|
|
81
|
+
| **Resolution** | on-chain renderer, hosted resolver, or on-chain JSON pointing at external media |
|
|
82
|
+
| **Rendering** | no derived render, one-shot stills, continuous effects, or Solidity-computed fields |
|
|
83
|
+
| **Authority** | owner, token holder, delegated address, minter, hook, transfer validator |
|
|
84
|
+
| **Mutability** | editable values/pointers, governed values, and the locks applied after verification |
|
|
85
|
+
|
|
86
|
+
Use precise language:
|
|
87
|
+
|
|
88
|
+
- **On-chain bytes** describes custody. **Self-resolving** describes resolution.
|
|
89
|
+
- **Chain-complete** means the requested document has no off-chain dependency. It does not promise
|
|
90
|
+
immutability or that every third-party RPC can execute a large read.
|
|
91
|
+
- **Locked** names a particular stored value or pointer. It does not prove that code behind a proxy
|
|
92
|
+
is immutable or that every output input is frozen.
|
|
93
|
+
- Marketplace refresh re-fetches a projection; it does not mutate canonical state.
|
|
94
|
+
|
|
95
|
+
## Choose the native deployment family
|
|
96
|
+
|
|
97
|
+
Run `abx capabilities --json` for the current matrix, then load [deploy.md](reference/deploy.md).
|
|
98
|
+
|
|
99
|
+
| Intent | Command | Default contract shape |
|
|
260
100
|
|---|---|---|
|
|
261
|
-
|
|
|
262
|
-
|
|
|
263
|
-
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
-
|
|
339
|
-
-
|
|
340
|
-
-
|
|
341
|
-
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
## Guarantees
|
|
346
|
-
|
|
347
|
-
- **Reconstruction from chain alone** — deterministic, idempotent; delete the projection, replay yields identical state.
|
|
348
|
-
- **Trust = the factory** — a clone is canonical only when the ownerless factory's `isAbxClone` confirms it (the `AbxDeployed` beacon is discovery, and spoofable).
|
|
349
|
-
- **Content is verifiable** — the on-chain keccak256 lets anyone re-hash the served bytes (the `verify` route), zero trust in the node.
|
|
350
|
-
- **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).
|
|
351
|
-
|
|
352
|
-
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/)).
|
|
101
|
+
| One static work | `abx deploy` | ERC-721 1/1 |
|
|
102
|
+
| Folder of distinct static works | `abx deploy-series` | ERC-721 Series |
|
|
103
|
+
| Program or state-derived work | `abx deploy-code` | ERC-721 SeriesCode |
|
|
104
|
+
| One program, each token carries its own data | `deploy-code --script` + `<key>:Bytes:Creator` | SeriesCode + payload param |
|
|
105
|
+
| Copies of any family | add `--copies <n|open>` | corresponding ERC-1155 edition |
|
|
106
|
+
|
|
107
|
+
Important boundaries:
|
|
108
|
+
|
|
109
|
+
- `deploy-code --copies` supports `--script`, dependencies, and Solidity image/attributes renderers.
|
|
110
|
+
It does not currently support `--code-dir`, `--image-base`, or `--resume`.
|
|
111
|
+
- `--onchain-image` works for static 721s and editions in hot or wallet-signing lanes. It cannot be
|
|
112
|
+
prepared as one cold `--unsigned` bundle because staged transactions depend on prior receipts.
|
|
113
|
+
- A code project may need no public host when its image/traits are computed by Solidity renderers.
|
|
114
|
+
A JavaScript program still needs a deliberate marketplace-image plan even when its animation is
|
|
115
|
+
chain-complete.
|
|
116
|
+
- Content size is not a fixed refusal. The CLI measures write cost and the active RPC's read reach.
|
|
117
|
+
State the measured reach; never generalize it to every marketplace endpoint.
|
|
118
|
+
|
|
119
|
+
## Treat public surfaces as an acceptance test
|
|
120
|
+
|
|
121
|
+
Before deploying, write down the promised value for each applicable row:
|
|
122
|
+
|
|
123
|
+
| Surface | Verify with |
|
|
124
|
+
|---|---|
|
|
125
|
+
| Contract identity and owner powers | `abx state <addr>` and the deploy readout |
|
|
126
|
+
| Token metadata | `abx tokenuri <addr> --token <id>` |
|
|
127
|
+
| Collection metadata | `abx contracturi <addr>` |
|
|
128
|
+
| Image | decoded metadata plus a successful fetch or on-chain field provenance |
|
|
129
|
+
| Animation/live view | the decoded `animation_url`, loaded with a real minted token |
|
|
130
|
+
| Marketplace traits | decoded `attributes`, not merely console output from the program |
|
|
131
|
+
| Parameters and values | `abx state` for schemas; `abx tokens --json` for token values |
|
|
132
|
+
| Attached artifacts | resolver metadata and `/data/<key>`; attachments are not enumerable in bare on-chain metadata |
|
|
133
|
+
| Byte integrity | `abx verify <addr>` |
|
|
134
|
+
| Hosted lifecycle | `abx status --remote <name> --watch` or provider status |
|
|
135
|
+
|
|
136
|
+
Do not call a launch complete because the transaction mined. Complete it when every promised surface
|
|
137
|
+
has the expected provenance and is retrievable through the path collectors will use.
|
|
138
|
+
|
|
139
|
+
## Confirm irreversible and shared-state choices
|
|
140
|
+
|
|
141
|
+
Before any real deploy, say these choices explicitly when relevant:
|
|
142
|
+
|
|
143
|
+
- The contract family and ERC-721 versus ERC-1155 edition shape cannot be changed later.
|
|
144
|
+
- Hooks and PostParams require a code-capable contract. A static image contract cannot gain them.
|
|
145
|
+
- `--burnable` and creator-token enrollment are deploy-time choices.
|
|
146
|
+
- A royalty cap only moves downward.
|
|
147
|
+
- Edition arithmetic is **number of ids × copies per id**. For one work with 100 copies, use one id;
|
|
148
|
+
do not accidentally create the code default's multiple-id space.
|
|
149
|
+
- An ERC-721 Series cap is lifetime minted ids: burning never reopens a slot. An ERC-1155 edition's
|
|
150
|
+
per-id cap is live supply: when burnable, a burned copy may be minted again.
|
|
151
|
+
- PostParams on an edition are stored per id, not per physical copy. A holder-authorized value is
|
|
152
|
+
shared by all holders of that id, and the last valid writer wins.
|
|
153
|
+
- Metadata, URI, script, dependency, hook, schema/value, and authority locks are distinct. Verify
|
|
154
|
+
first and lock last.
|
|
155
|
+
|
|
156
|
+
## Use capability classification, not optimism or refusal
|
|
157
|
+
|
|
158
|
+
Classify an unusual request as exactly one of:
|
|
159
|
+
|
|
160
|
+
1. **Native** — a documented CLI lane performs it.
|
|
161
|
+
2. **Extension** — a custom minter, configure/transfer/augment hook, field renderer, or seed source
|
|
162
|
+
performs it while the token remains a canonical factory clone.
|
|
163
|
+
3. **Unsupported or foreclosed** — the capability contract lists it, or the existing collection's
|
|
164
|
+
irreversible type/flags already exclude it.
|
|
165
|
+
4. **Unknown** — no route has been proven. Inspect code/help/contracts and report uncertainty; do not
|
|
166
|
+
turn absence from a no-list into a promise.
|
|
167
|
+
|
|
168
|
+
Custom Solidity is built and deployed outside `abx`; `abx scaffold-renderer` supplies a Foundry
|
|
169
|
+
starting point. Read [capabilities.md](reference/capabilities.md) before designing a custom mechanic.
|
|
170
|
+
|
|
171
|
+
## Load only the reference needed
|
|
172
|
+
|
|
173
|
+
- Environment, installation, signer lanes, and safe setup → [setup.md](reference/setup.md)
|
|
174
|
+
- Static projects, editions, placement, costs, and deploy confirmation → [deploy.md](reference/deploy.md)
|
|
175
|
+
- Programs, renderers, thumbnails, traits, PostParams, seeds, and dependencies → [code.md](reference/code.md)
|
|
176
|
+
- First-party hosted services, OAuth device login, and core/provider feedback → [services.md](reference/services.md)
|
|
177
|
+
- Generic remotes, self-hosted resolvers/effects, storage, lifecycle, and migration → [hosting.md](reference/hosting.md)
|
|
178
|
+
- Existing-project reads, mint/sales, fields, transfers, authority, and locks → [operate.md](reference/operate.md)
|
|
179
|
+
- Failure classification, resume, RPC/storage/rendering faults, and retry discipline → [diagnose.md](reference/diagnose.md)
|
|
180
|
+
- Capability questions, extension seams, mechanics, and hard boundaries → [capabilities.md](reference/capabilities.md)
|
|
181
|
+
- ERC-721C/ERC-1155C enrollment and validator operations → [creator-token.md](reference/creator-token.md)
|
|
182
|
+
|
|
183
|
+
Read every reference applicable to the requested workflow before sending a real transaction. Do not
|
|
184
|
+
load unrelated references merely because they exist.
|