@artblocks/abx-cli 0.1.0-alpha.16 → 0.1.0-alpha.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +385 -0
  2. package/dist/commands/deploy.d.ts +181 -0
  3. package/dist/commands/deploy.d.ts.map +1 -0
  4. package/dist/commands/deploy.js +2974 -0
  5. package/dist/commands/deploy.js.map +1 -0
  6. package/dist/commands/project.d.ts +134 -0
  7. package/dist/commands/project.d.ts.map +1 -0
  8. package/dist/commands/project.js +919 -0
  9. package/dist/commands/project.js.map +1 -0
  10. package/dist/commands/reads.d.ts +64 -0
  11. package/dist/commands/reads.d.ts.map +1 -0
  12. package/dist/commands/reads.js +635 -0
  13. package/dist/commands/reads.js.map +1 -0
  14. package/dist/commands/scaffold.d.ts +55 -0
  15. package/dist/commands/scaffold.d.ts.map +1 -0
  16. package/dist/commands/scaffold.js +470 -0
  17. package/dist/commands/scaffold.js.map +1 -0
  18. package/dist/commands/service.d.ts +41 -0
  19. package/dist/commands/service.d.ts.map +1 -0
  20. package/dist/commands/service.js +572 -0
  21. package/dist/commands/service.js.map +1 -0
  22. package/dist/commands/storage.d.ts +37 -0
  23. package/dist/commands/storage.d.ts.map +1 -0
  24. package/dist/commands/storage.js +335 -0
  25. package/dist/commands/storage.js.map +1 -0
  26. package/dist/config.d.ts +72 -2
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +201 -4
  29. package/dist/config.js.map +1 -1
  30. package/dist/deps.d.ts +6 -39
  31. package/dist/deps.d.ts.map +1 -1
  32. package/dist/deps.js +4 -68
  33. package/dist/deps.js.map +1 -1
  34. package/dist/errors.d.ts +20 -0
  35. package/dist/errors.d.ts.map +1 -0
  36. package/dist/errors.js +25 -0
  37. package/dist/errors.js.map +1 -0
  38. package/dist/flags.d.ts +34 -0
  39. package/dist/flags.d.ts.map +1 -1
  40. package/dist/flags.js +74 -0
  41. package/dist/flags.js.map +1 -1
  42. package/dist/jsonout.d.ts +37 -0
  43. package/dist/jsonout.d.ts.map +1 -0
  44. package/dist/jsonout.js +68 -0
  45. package/dist/jsonout.js.map +1 -0
  46. package/dist/main.js +133 -6223
  47. package/dist/main.js.map +1 -1
  48. package/dist/mintpage.d.ts.map +1 -1
  49. package/dist/mintpage.js +34 -40
  50. package/dist/mintpage.js.map +1 -1
  51. package/dist/output.d.ts +137 -0
  52. package/dist/output.d.ts.map +1 -0
  53. package/dist/output.js +504 -0
  54. package/dist/output.js.map +1 -0
  55. package/dist/ownerops.d.ts +37 -44
  56. package/dist/ownerops.d.ts.map +1 -1
  57. package/dist/ownerops.js +274 -233
  58. package/dist/ownerops.js.map +1 -1
  59. package/dist/preview.d.ts +8 -4
  60. package/dist/preview.d.ts.map +1 -1
  61. package/dist/preview.js +8 -17
  62. package/dist/preview.js.map +1 -1
  63. package/dist/provision.d.ts.map +1 -1
  64. package/dist/provision.js +10 -7
  65. package/dist/provision.js.map +1 -1
  66. package/dist/remote.d.ts +72 -7
  67. package/dist/remote.d.ts.map +1 -1
  68. package/dist/remote.js +211 -9
  69. package/dist/remote.js.map +1 -1
  70. package/dist/riskgate.d.ts +29 -0
  71. package/dist/riskgate.d.ts.map +1 -0
  72. package/dist/riskgate.js +91 -0
  73. package/dist/riskgate.js.map +1 -0
  74. package/dist/schema.d.ts +6 -0
  75. package/dist/schema.d.ts.map +1 -1
  76. package/dist/schema.js +12 -16
  77. package/dist/schema.js.map +1 -1
  78. package/dist/served.d.ts +30 -0
  79. package/dist/served.d.ts.map +1 -0
  80. package/dist/served.js +112 -0
  81. package/dist/served.js.map +1 -0
  82. package/dist/signer.d.ts +13 -0
  83. package/dist/signer.d.ts.map +1 -1
  84. package/dist/signer.js +42 -19
  85. package/dist/signer.js.map +1 -1
  86. package/dist/update-check.d.ts +27 -0
  87. package/dist/update-check.d.ts.map +1 -1
  88. package/dist/update-check.js +30 -0
  89. package/dist/update-check.js.map +1 -1
  90. package/package.json +6 -6
  91. package/skill/SKILL.md +9 -13
  92. package/skill/reference/code-projects.md +7 -6
  93. package/skill/reference/hosting.md +6 -6
  94. package/skill/reference/operating.md +2 -5
  95. package/skill/reference/setup.md +4 -3
  96. package/skill/reference/troubleshooting.md +14 -1
  97. package/dist/gas.d.ts +0 -63
  98. package/dist/gas.d.ts.map +0 -1
  99. package/dist/gas.js +0 -76
  100. package/dist/gas.js.map +0 -1
  101. package/dist/inspect.d.ts +0 -48
  102. package/dist/inspect.d.ts.map +0 -1
  103. package/dist/inspect.js +0 -290
  104. package/dist/inspect.js.map +0 -1
  105. package/dist/migrate.d.ts +0 -65
  106. package/dist/migrate.d.ts.map +0 -1
  107. package/dist/migrate.js +0 -180
  108. package/dist/migrate.js.map +0 -1
  109. package/dist/onchain-uri.d.ts +0 -81
  110. package/dist/onchain-uri.d.ts.map +0 -1
  111. package/dist/onchain-uri.js +0 -251
  112. package/dist/onchain-uri.js.map +0 -1
  113. package/dist/upload.d.ts +0 -28
  114. package/dist/upload.d.ts.map +0 -1
  115. package/dist/upload.js +0 -41
  116. package/dist/upload.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,390 @@
1
1
  # @artblocks/abx-cli
2
2
 
3
+ ## 0.1.0-alpha.18
4
+
5
+ ### Minor Changes
6
+
7
+ - 11fa933: Phase 5 interface unifications: the self resolver becomes a named remote, doctor absorbs the
8
+ version/install/provenance ladder, deploy previews stop showing addresses they can't keep,
9
+ approvals are counted honestly, render×storage combos are validated once, and storage config gets
10
+ a real probe.
11
+
12
+ - **Self resolver is a named remote (breaking, client-side only)**: the CLIENT credential for the
13
+ local/self resolver moves from `ABX_RESOLVER_ADMIN_TOKEN` to the named-remote grammar
14
+ (`ABX_REMOTE_SELF_URL` / `ABX_REMOTE_SELF_TOKEN` — "self" is just a conventional remote name, zero
15
+ special-casing). The SERVER side (token-api control-plane auth, `provision.ts`, the Fly.io secret)
16
+ keeps its old name — it's the service's own config, not a client credential, so deployed resolvers
17
+ need no change. The old client var, if still set, is now a pointed `CliError` naming both new vars
18
+ (no silent fallback); `abx doctor` flags it too, and the near-miss `_KEY`-vs-`_TOKEN` detector keeps
19
+ working under the unified grammar.
20
+ - **`abx doctor` absorbs the version/install/provenance ladder** the skill used to only teach in
21
+ prose: one new ✓/✗ block for binary provenance (source checkout / npm install / npx — the silent-
22
+ stale-npx-cache trap), npm currency (reuses the existing cached update check), and skill↔CLI
23
+ version match (reuses `abx skill`'s own discovery). Each row names the exact fix.
24
+ - **Deploy previews stop showing addresses they can't keep**: `--dry-run` (`deploy` /
25
+ `deploy-series` / `deploy-code`) **without `--salt`** no longer prints a "deterministic address" —
26
+ that salt was just freshly, randomly reserved, so the address was real for that one preview and
27
+ never reproducible by a plain re-run. It now prints the salt itself, prominently, plus how to pin
28
+ it: re-run with `--salt <shown>` (guaranteed same address), or `abx predict --salt <shown> --for
29
+ <signer>`. **With `--salt`, the address prints exactly as before** (it IS stable) — `abx predict`
30
+ is unchanged. The same rule applies to `--json`: without `--salt`, `address` reports `null` rather
31
+ than a value the real deploy won't land at (`saltPinned` still says why).
32
+ - **`approvals` — a labeled, honest signature count**: every deploy-family `--dry-run` preview and
33
+ `--confirm` summary now carries one uniform `approvals N wallet approval(s)` line/clause — the
34
+ number of **wallet TX signatures** the real run will ask for (a connected-wallet storage upload,
35
+ e.g. Arweave via `--storage-signer eth`, is a message signature, not a transaction, and stays
36
+ listed separately, as it already was). It's derived from the exact same staging/setup-multicall
37
+ math that sizes the wallet-lane session's own `total`, so the two can never disagree — this caught
38
+ (and fixed) `deploy-code`'s wallet-lane session `total` being hardcoded to `2` even on the 1-tx path
39
+ (no chunks/schema/deps/on-chain-uri legs/setup-carried mints), which would have shown "transaction
40
+ 1 of 2" and then silently never asked for a second.
41
+ - **One validator for render×storage combos**: `@artblocks/abx-storage` gains
42
+ `validateRenderStorageCombo()` (`content-plan.ts`) — the single source of truth for two known-bad
43
+ configurations, each checked against the ACTUAL fact that makes it bad (not against an unrelated
44
+ flag): (1) `--image-base` needs a backend that can overwrite a stable per-token key in place; an
45
+ ipfs/arweave-_shaped URL_ is refused regardless of this deploy's own `--backend`, because those are
46
+ content-addressed — a re-upload gets a new address, so no fixed URL can point at it. (2) publishing
47
+ a render to a resolver that doesn't share this machine's disk needs a backend that can hand back a
48
+ public URL at all — `fs` (or `cloud` with no public base) can't. `deploy-code` wires this into BOTH
49
+ its real-run refusal (`--image-base`) and a new `render/storage ✓|✗ <reason>` dry-run row;
50
+ `requirePublishableBackend` (the existing `abx render --remote` / `abx effects` guard) now consults
51
+ the same validator for its ok/not-ok decision, so the two surfaces can't drift apart.
52
+ - **`abx storage show --check`**: a real read/write against the resolved storage config, not just
53
+ "is it configured." `cloud` PUTs a tiny object through the signed API and GETs it back over the
54
+ PUBLIC base with a plain unsigned fetch — the only check that catches the R2/S3
55
+ endpoint-vs-public-base trap (`health()` alone only proves the API credentials work); on failure
56
+ both URLs print, so the mismatch is visible. `ipfs`/`fs` reuse their existing `health()` verbatim
57
+ (gateway/API reachability, dir writability — no upload, no pin — reused, not reimplemented).
58
+ `arweave` adds an identity+balance READ, never a paid upload. Exit code is meaningful (0 ok / 1 any
59
+ ✗) so a script can gate a launch on it. `abx doctor`'s storage row now runs the same fuller probe
60
+ (bounded to 1.5s, matching its other fast network checks) instead of a bare `health()` call.
61
+
62
+ ### Patch Changes
63
+
64
+ - 11fa933: The remaining phases of the simplification refactor that hadn't yet gotten a changeset: the CLI's
65
+ internal module split, the token-api/effects/mint-page convergence on the SDK, the shipped skill's
66
+ rewrite for the simplified surface, and a new SDK README.
67
+
68
+ - **`abx`'s `main.ts` split into domain command modules** (`commands/{deploy,project,reads,service,
69
+ scaffold,storage}.ts`, shared `output.ts`/`errors.ts`), with one exit-discipline rule
70
+ (`process.exitCode` + return, or a typed `CliError`, everywhere — bare `process.exit` only at the
71
+ entry guard, the top-level catch, and the keep-alive SIGINT handler). Purely internal: a 207-fixture
72
+ byte-diff matrix (every help text, dry-run, error path, and exit code) confirmed identical output
73
+ before and after.
74
+ - **token-api / effects / mint-page converge on the SDK**: `@artblocks/abx-storage` gains one
75
+ `resolveGatewayBase` (`readiness.ts`), replacing three near-identical copies (two in token-api, one
76
+ inline in storage itself); token-api exports `buildGeneratorDocument` so the CLI's `abx preview`
77
+ consumes the real generator-document assembler instead of a hand-kept duplicate; the effects runner
78
+ now resolves its config via the SDK's `readEnv` and gets a `makePublicClient` fallback transport, so
79
+ `ABX_RPC_URL` accepts a comma-separated failover list like every other RPC var; the scaffolded
80
+ mint-page app now imports ABIs from `@artblocks/abx-sdk/abi` and a browser-safe `makePublicClient` +
81
+ typed `readSaleConfig` instead of hand-rolled fetch/decode, and pins its generated `package.json` to
82
+ the SDK's _resolved_ version via a new `@artblocks/abx-sdk/package.json` export (alpha version
83
+ counters diverge per package under changesets, so pinning the CLI's own number could produce an
84
+ unsatisfiable range).
85
+ - **The shipped skill (`.claude/skills/abx-self-host/`) is rewritten for the surface phases 0–5
86
+ actually shipped**: every warning made obsolete by an enforcement is deleted rather than softened —
87
+ predict-only deploy-preview addresses, the `approvals N` line, the single `ABX_REMOTE_SELF_*`
88
+ credential grammar, `doctor`'s version/provenance ladder, `storage show --check`, the render/storage
89
+ combo validator's dry-run row, and `ABX_DEPLOYER_PK` as the only key name. Retired names swept from
90
+ `dev-loop-test`, the agent-eval scenarios, and spec prose. The skill ships bundled inside this CLI
91
+ package (co-versioned via `SKILL.md` frontmatter), so it rides this same patch.
92
+ - **New `packages/sdk/README.md`**: what the SDK is, the send-injection model (`PreparedTx` +
93
+ `SendTx`, `makeHotSender` for a hot key, bring-your-own for a wallet/multisig), a complete
94
+ deploy → upload → mint → read walkthrough against real exports, and browser-use notes (explicit
95
+ `rpcUrls`, no env, the `/node` subpath is Node-only). Included in the npm tarball automatically
96
+ (README is one of the files npm always packs, regardless of the `files` allowlist).
97
+
98
+ - 11fa933: Two ripouts, no functional loss: the retired `params.keys` read fallback in `abx state`, and the `abx changelog` command.
99
+
100
+ **`abx state`'s legacy `params.keys` fallback.** On-chain param enumeration (`contractParamKeys` /
101
+ `tokenParamKeys` / `paramSchemaKeys`) shipped a while back and every project deployed since enumerates
102
+ its own param surface — nothing writes the old `params.keys` CSV any more. The only thing still reading
103
+ it was `abx state`, so it could keep describing the handful of pre-enumeration testnet projects that
104
+ predate the switch. That reader (`readLegacyParamsKeys`) and its `legacy`-branching in `cmdStateBody`
105
+ are gone; `abx state` now shows exactly what it reads from on-chain enumeration, an empty PostParams
106
+ list for a pre-enumeration contract included. (The repoint guard that refuses to point a legacy token's
107
+ field renderer at the canonical generator is a separate, still-live safeguard — untouched.)
108
+
109
+ **`abx changelog`.** A `CHANGELOG.md`-reading command that duplicated what any agent or human can do by
110
+ reading the file that already ships with the package (`package.json` `files`) — one more command to
111
+ document and maintain for a read `cat` already covers. `CHANGELOG.md` keeps shipping; the update-nag
112
+ banner and the docs now point at the file and at npm's version list
113
+ (`https://www.npmjs.com/package/@artblocks/abx-cli?activeTab=versions`) instead of a command.
114
+
115
+ - 11fa933: The extraction phase of the simplification refactor: business logic that lived only inside the CLI
116
+ is now importable — the CLI calls the same functions you can.
117
+
118
+ **Into the SDK:** the five trust-anchor bootstraps (`ensureFactory`, `ensureSeriesFactory`,
119
+ `ensureSeriesCodeFactory`, `ensureRenderer`, `ensureSeedSource` — `anchors.ts`, on the same
120
+ injected-`send` + `onEvent` pattern as `ensureChunkStore`, with a typed `AnchorUnavailableError`),
121
+ `detectCanonicalFactory`/`resolveScanFloor`, the on-chain-URI setup composer (`onchain-uri.ts`),
122
+ interrupted-deploy resume planning (`resume.ts`), migration plan/parity reconciliation
123
+ (`migrate.ts`), the `abx.js` static analyzer (`inspect.ts`), dependency setup legs (`deps.ts`),
124
+ content-staging plans (`staging.ts` — `planStagedContent`, `stageFieldContent` with `StagingEvent`),
125
+ `mintedTokenIds`, and a typed `readSaleConfig` for the fixed-price minter.
126
+
127
+ **Into storage:** `uploadAndLocate`, `repinNodeCustody` (the byte-custody half of migration),
128
+ `decideImageContentLane`, `assessStorageReadiness`/`assessTurboFunds` (the Arweave/Turbo funding
129
+ math), and `awaitLocatorReady` (poll a locator until it serves).
130
+
131
+ **CLI hardening that fell out of the dedup:** one risk gate (`gatedSend`) now guards every write —
132
+ `--dry-run` and `--confirm` mean the same thing on every command, all owner-ops gain `--confirm`,
133
+ and a write reaching the send lane under `--dry-run` is structurally impossible (grep-enforced by
134
+ test). One `CHAIN` source of truth; one memoized local-indexer accessor.
135
+
136
+ - 11fa933: Phase 1 of the simplification refactor: one transaction shape with one send-injection point, and an SDK that never touches `.env` or a Node-only global on its own. Two related passes, same release.
137
+
138
+ **One transaction shape, one executor.** `StagingTx`/`SendStagingTx` are gone — everything is a `PreparedTx` sent through a single `SendTx`. New `execute.ts` carries `makeHotSender` (pins the nonce once, detects an under-estimated gas limit against a just-deployed target, throws a typed `TxRevertedError` instead of reporting a reverted tx as confirmed) plus `pinGas`/`waitForCodeAt`, moved from the CLI (`gas.ts` is gone) with their design comments intact. Every `deployX` is now `prepareDeployX` (pure) + `deployX(send, ...)`; the CLI's hot lane and `abx deploy-code --resume` both delegate to the same sender instead of hand-rolling their own nonce/gas loop — the class of bug that reported a burned, reverted transaction as a successful deploy can't recur in a second call site because there is no longer a second implementation.
139
+
140
+ **The SDK never loads `.env` implicitly.** `loadDotEnv`/`parseEnvContent` moved to a new `@artblocks/abx-sdk/node` subpath — the only module that touches `node:fs`/`node:path`. The package's main entry is now browser-bundle-safe (a permanent esbuild smoke test guards it); a host calls `loadDotEnv()` once at startup (the CLI's `main()`, the effects runner's `main()`) and the SDK core reads whatever's already in `process.env` through a tiny `readEnv` that no-ops outside Node. `ClientOptions` gained `rpcUrls?: string[]` and `makeWalletClient`/`envSigningKey` gained a `privateKey`/`override` escape — explicit config now wins outright over env resolution, following the same override → env → manifest precedence `deployments.ts` already used for contract addresses.
141
+
142
+ **Single signing-key name.** `ABX_DEPLOYER_PK` is the only env var the SDK reads for a hot key — `SEPOLIA_FUNDED_PK` and `SEPOLIA_WALLET_PK` (earlier-alpha names) are no longer consulted. A caller with one of the old names set now gets a `MissingSigningKeyError` that names the new one explicitly and says the old ones are retired, rather than a plain "no key found" that leaves an upgrader hunting for why a key that's clearly _there_ isn't being read. Sandbox/e2e scripts and test fixtures move to the new name too.
143
+
144
+ **Shared, environment-neutral utilities.** New `sdk/src/util.ts`: `sleep`, a `linearBackoffDelay` helper (service.ts's retry ladder and the effects runner's resolver poll both use it now instead of hand-rolled backoff math), `parseDataUri` (replaces three near-identical `data:` URI regexes across the CLI and the tokenURI probe with one permissive parser), and `tryReadContract` (replaces three near-identical try/read-return-undefined helpers; the CLI's "no contract at this address" diagnostic still wraps it where that mattered). `Buffer` is gone from the SDK core (chunk hex-encoding and param base64-encoding now use viem's `bytesToHex` and a ~12-line dependency-free base64 codec) — nothing in the SDK's main import graph is Node-only any more.
145
+
146
+ - Updated dependencies [11fa933]
147
+ - Updated dependencies [11fa933]
148
+ - Updated dependencies [11fa933]
149
+ - Updated dependencies [11fa933]
150
+ - @artblocks/abx-sdk@0.1.0-alpha.10
151
+ - @artblocks/abx-storage@0.1.0-alpha.10
152
+ - @artblocks/abx-token-api@0.1.0-alpha.13
153
+ - @artblocks/abx-indexer@0.1.0-alpha.11
154
+
155
+ ## 0.1.0-alpha.17
156
+
157
+ ### Patch Changes
158
+
159
+ - df298d8: `abx attach` takes several `<key> <uri>` pairs and sends ONE transaction
160
+
161
+ The safety half of backlog B20. The CLI's most-documented flow — mint, then attach each artifact, then
162
+ refresh — sent one transaction per step with **no all-or-nothing boundary**, so a failure partway
163
+ through left a permanently half-written token, and a mint cannot be undone. An integrator hit exactly
164
+ that and folded 8 operations into 1 transaction (846,556 gas) using the SDK's `batchOps` — a primitive
165
+ the CLI already shipped and did not call. Now it calls it.
166
+
167
+ ```bash
168
+ abx attach 0x… stems ipfs://…/stems.wav score ipfs://…/score.pdf readme ar://…
169
+ # → 3 artifacts, one multicall: a revert lands NONE of them
170
+ ```
171
+
172
+ Three things make the batch safe rather than merely shorter:
173
+
174
+ - **Every pair is validated before anything is sent.** A bad locator in pair 5 stops pair 1 — otherwise
175
+ batching would defeat its own purpose.
176
+ - **A key repeated inside one batch is refused.** A field holds one active value, so the later write
177
+ would silently win — the same full-column-upsert hazard that was a real bug in the resolver's
178
+ `register` and a real trap in `lock-field`.
179
+ - **A single pair is unchanged.** `batchOps` passes a lone op through untouched, so the one-artifact
180
+ case sends the identical plain field transaction it always did — no multicall wrapper, no new gas.
181
+
182
+ An odd number of positionals is refused and names the dangling argument, rather than silently ignoring
183
+ it.
184
+
185
+ Still open in B20, and recorded there rather than quietly skipped: batching **`set-field` across several
186
+ fields** needs a flag-grammar decision first (`attach` batched cleanly because its arguments are
187
+ positional pairs; `set-field` takes one `--field` with a correlated `--text`/`--value`, and the parser
188
+ has no notion of correlated repeats). Same for an all-or-nothing "mint and configure" — mint and
189
+ configure are separate commands, so that needs a verb that owns both.
190
+
191
+ - df298d8: `abx deploy-code --resume <address>` — finish a deploy whose setup transaction failed
192
+
193
+ Closes backlog B15. A code project deploys in **two** transactions: create the clone, then one atomic
194
+ `multicall` carrying the script chunks, the PostParam schemas, the dependency declarations, the
195
+ on-chain-URI legs, and any reserve mints. There is no rollback. When the second one fails you own a
196
+ live-but-unusable contract — and the CREATE2 salt reserved for its address is **spent**, so the dry
197
+ run's pinned-salt reproduce command can never be run again. One reporter session produced three
198
+ orphaned contracts from three attempts; another produced five.
199
+
200
+ The useful half of that report is that those contracts were **recoverable, not lost**: resending the
201
+ setup with an adequate gas limit completed one, after which `abx verify` reported chain-complete and the
202
+ token returned its on-chain `animation_url`. The tester did it by hand with `cast`. We deliberately
203
+ never documented that as a recipe — telling a creator to hand-assemble a multicall is worse than telling
204
+ them nothing — so this is the verb.
205
+
206
+ ```bash
207
+ abx deploy-code --resume 0x… <the same content flags the original deploy used> --dry-run
208
+ ```
209
+
210
+ It deploys nothing. It reads what the contract already holds and sends only the missing legs, in one
211
+ transaction — safe to run twice, and if nothing is missing it sends nothing and says so. Three judgments
212
+ carry it:
213
+
214
+ - **Chunks compare by content, not by count.** A count check would call a chunk "present" when a hand
215
+ repair wrote different bytes at that index — and a hand repair with `cast` is exactly what happened.
216
+ - **A schema that already exists is left alone.** Re-writing one is an upsert that can strand values
217
+ already stored under it; that hazard belongs to `set-schema` and its guard, never to a repair.
218
+ - **Mints are a shortfall against current supply, never a re-send.** `mint` is the one non-idempotent
219
+ leg, and a token cannot be un-minted.
220
+
221
+ `--salt`, `--721c`, `--bootstrap-factory` and `--mint-all` are refused rather than ignored: they all
222
+ describe how a contract is _created_, and this creates nothing. ERC-721C especially — enrollment is
223
+ deploy-time-only and permanent, so silently accepting the flag would imply it can be added later.
224
+
225
+ It shares the deploy's own setup-leg builder, so a resume can never drift from what a fresh deploy would
226
+ have written — a second implementation of that sequence is the failure mode a repair verb most easily
227
+ introduces. Signing goes through the same choke point as every other write, so `--sign` / `--unsigned` /
228
+ the owner check / the chain-id guard all apply, and `--dry-run` previews the repair (one bug found and
229
+ fixed while building this: the deploy's dry-run block returned first, so `--resume … --dry-run` printed a
230
+ fresh-deploy plan with a newly-reserved salt and a different predicted address).
231
+
232
+ 15 tests, including every diff branch and the four refusals.
233
+
234
+ - df298d8: `--json` on every value-emitting command: `mint`, `deploy`, `deploy-series`, `deploy-code`, `state`, `verify`
235
+
236
+ Closes backlog B19. The rule it enforces, from an integrator who drove the CLI from a server: **a value
237
+ a program needs must be obtainable without parsing prose.** They had to regex-scrape ANSI-coloured
238
+ stdout for every value — and an escape code was captured into a locator, written into a _stored_ player
239
+ URL, and 404'd in production. The cause was found only by inspecting stored bytes.
240
+
241
+ Under `--json`, **stdout carries exactly one JSON document and nothing else.** Every narration line the
242
+ command would print for a human moves to **stderr** — diverted, not suppressed, because a human
243
+ watching a deploy still wants to see it while a program redirecting stdout still gets a clean parse.
244
+ (The update check already wrote to stderr for exactly this reason; this carries the instinct through to
245
+ the values themselves.)
246
+
247
+ - **`mint --json`** → `{tokenIds, txHash, blockNumber, sent, …}`. The token ids come from the mint's own
248
+ `Transfer(from=0x0)` logs, not from re-reading `nextTokenId` afterwards — a concurrent mint would make
249
+ that answer wrong, and a number that is usually right is worse than no number. A `--count N` batch
250
+ reports all N.
251
+ - **`deploy` / `deploy-series` / `deploy-code --json`** → the address, emitted _the moment it is known_
252
+ rather than at the end, so a failure in the indexing steps that follow still leaves the caller with
253
+ the address of a contract that really exists. That matters most for `deploy-code`, which is two
254
+ transactions: if the setup tx fails, the address of the live-but-incomplete contract is exactly what a
255
+ recovery needs (backlog B15). With `--dry-run` it reports the **predicted** address plus
256
+ `saltPinned` — false meaning a plain re-run reserves a fresh salt and lands elsewhere, so a caller
257
+ must not treat it as reserved.
258
+ - **`state --json`** → the on-chain snapshot as data, with canonical **names** for param types and auth
259
+ legs rather than raw Solidity enum indices (a caller must not have to know the enum ordering), and
260
+ `undefined` (getter absent) kept distinct from a zero address (present, deliberately unset).
261
+ - **`verify --json`** → the findings, with `ok` matching the exit code. This is the one command a CI job
262
+ would gate on, since it already exits non-zero on a byte mismatch. The tri-states stay tri-states:
263
+ `canonical` and each check's `verified` are `true | false | null`, because collapsing "couldn't check"
264
+ into "failed" would report a normal state as a failure.
265
+
266
+ The mechanism is a single shared helper (`withJson`) rather than a `quiet` flag threaded through every
267
+ command body — deliberately, since the alternative is touching dozens of call sites where the one that
268
+ gets missed is a stray line that corrupts a parse, i.e. the exact failure being fixed. A command that
269
+ emits no payload leaves stdout **empty** and exits non-zero rather than printing a `{}` a caller would
270
+ trust. 8 tests cover the channel contract itself, including that the swap is restored when a body
271
+ throws.
272
+
273
+ - df298d8: `abx storage status <locator>` — is it retrievable yet, or only accepted?
274
+
275
+ Backlog B21, and the second half of a gap two independent integrations hit eight days apart. An upload
276
+ service answers "accepted" the moment it holds your bytes; a gateway serves them only once they
277
+ propagate, and on Arweave that runs to minutes. Nothing in the upload result distinguished the two, so
278
+ the natural implementation — upload during a mint, write the locator into the token — mints a token
279
+ that renders broken for the first minutes of its life.
280
+
281
+ The first reporter rebuilt this layer themselves (ranged GETs, a propagating/ready model, retry ladders
282
+ lengthened after measuring real times) and concluded "every serious integrator will rebuild some
283
+ version of this." The second published 32 renders and found **32/32 404ing on `arweave.net` while 22/32
284
+ already served from `permagate.io` and `vilenarios.com`**, with the uploader reporting `CONFIRMED`
285
+ throughout — and the expensive part is what a creator does next, since a placeholder on a fresh drop
286
+ reads as a failed render, so you re-run `abx render --force` and re-upload everything for nothing.
287
+
288
+ That second observation shapes the design: propagation is **per-gateway**, so the check probes the
289
+ gateway your project actually uses _plus two others_, which buys a third verdict the reporters' own
290
+ two-state model couldn't express.
291
+
292
+ - **`ready`** — your gateway serves the bytes. Safe to reference.
293
+ - **`propagating`** — another gateway serves them, so the data **provably exists** on the network and
294
+ yours is merely behind. Waiting is the fix, and the command says plainly not to re-upload.
295
+ - **`unreachable`** — nothing probed serves them. Deliberately _not_ called propagating: from outside,
296
+ a locator that is still settling and one that is simply wrong look identical, and reporting the
297
+ friendlier of the two is how a tool teaches someone to ignore it. When every gateway rejects the id
298
+ itself (a 4xx that isn't 404) rather than just missing it, that _is_ evidence, and the output says
299
+ "malformed locator, waiting will not fix it" — the inverse mistake of waiting out a typo costs more
300
+ than a needless re-upload.
301
+
302
+ Accepts every form a locator arrives in (`ar://`, `ipfs://`, a gateway URL, a bare txid/CID, with a
303
+ directory path suffix), reads **headers only** via a ranged request with the body cancelled — so
304
+ checking a 40 MB asset doesn't download it — and **exits non-zero unless ready**, which makes waiting a
305
+ one-liner instead of a retry ladder: `until abx storage status <loc> --json; do sleep 10; done`.
306
+
307
+ The primitive is `locatorStatus()` in `@artblocks/abx-storage`, not CLI-only (per B20): anything
308
+ programmatic should call it in-process rather than spawning the CLI per check. `abx render`'s existing
309
+ propagation note now points at the command, so the advisory has an answer attached.
310
+
311
+ - df298d8: `abx tokens <address>` — every token's owner, seed, and params, from chain alone
312
+
313
+ The most obvious post-deploy question about a generative collection — _what did the seeds actually
314
+ deal?_ — had no command. `abx verify` reports per-token minted/render status but no seed; `abx
315
+ tokenuri` prints one token and the seed lives inside its base64 `animation_url`; `abx inspect` is
316
+ pre-deploy and static. An agent's workaround was to start `abx serve`, `GET /api/project/<addr>`,
317
+ base64-decode each `tokenURI`, base64-decode the `animation_url` inside it, then regex
318
+ `0x[0-9a-f]{64}` out of the resulting HTML — 32 times. Every input to that was already a plain
319
+ contract read.
320
+
321
+ `abx tokens <address> [--json] [--from <id>] [--limit <n>]` is chain-only: no indexer projection, no
322
+ running resolver, no event scan. The params store maintains its own key lists inside its write paths
323
+ (`tokenParamKeys` / `contractParamKeys`) and `seed` is a reserved param read by name, so the whole
324
+ listing is `eth_call`s — available to anyone with an RPC URL, including before any indexing has
325
+ happened. Seeds print in full (truncating the one value the command exists for would repeat the
326
+ `tokenuri` bug); `--json` emits `{tokenId, owner, seed, params}` per token, contract-scope params
327
+ once on the parent rather than copied into every row.
328
+
329
+ It reports honestly across all three token types rather than failing: a 1/1 has no params extension
330
+ and says so (owners still list), a pre-enumeration project still yields seeds and flags that params
331
+ can't be enumerated, and an id whose `ownerOf` reverts is `null` — not "not minted", because a
332
+ burned id and an unminted id revert identically and a chain-only read can't tell them apart.
333
+
334
+ Two things it deliberately is not. It is not a trait spread: a trait comes from running the script
335
+ against the seed, which is `abx render`'s job — the token-scope _param_ spread it does print is
336
+ labelled as such. And the reader is in the **SDK** (`listTokens`), not just the CLI, so a
337
+ programmatic integrator gets it without reimplementing it.
338
+
339
+ Backlog B25 (from the 2026-08-04 tester batch, feedback `dcfdc6f4`).
340
+
341
+ - df298d8: `abx tokenuri --fetch` — follow the URL the contract commits to and print what is actually served
342
+
343
+ Closes backlog B14. No command printed the served JSON body: `tokenuri` read the chain, `verify`
344
+ re-hashed bytes, `status` reported the indexing lifecycle — each a different slice, none of them the
345
+ document a marketplace actually reads. An agent in a cold sweep fell back to raw `curl` for exactly
346
+ this, which is the tell that a command was missing.
347
+
348
+ ```bash
349
+ abx tokenuri 0x… --fetch # GET the baked URL, print the served body + HTTP status
350
+ abx tokenuri 0x… --fetch --json # {tokenURI, onChain, served: {url, status, contentType, body}}
351
+ ```
352
+
353
+ It also answers the question a _warning_ could not, which is why the other half of B14 stays declined.
354
+ "Nothing tells you the provider you registered with isn't the base baked on-chain" is a real gap, but
355
+ the obvious check — compare the remote's base URL to the on-chain one — false-positives on the common
356
+ custom-domain case (a baked `meta.artist.xyz` fronting `api.provider.xyz`), and a warning that cries
357
+ wolf on the correct setup is worse than none. Fetching what the **baked** base returns makes the
358
+ mismatch self-evident instead: you see the other provider's 404, or another project's document, with no
359
+ guessing and no false positive.
360
+
361
+ Three judgments worth naming:
362
+
363
+ - **A `data:` URI is not a failure.** It IS the document, and a fully-on-chain project's whole point is
364
+ that there is no server to ask — so it reports "nothing to fetch" and exits 0. Treating it as an error
365
+ would punish the strongest configuration the protocol offers.
366
+ - **A dead host and a served error are different answers**, because they route to different fixes ("your
367
+ provider said no" vs "the URL a marketplace will ask is unreachable").
368
+ - **A non-2xx says it is about the SERVICE, never a mistyped path** — the URL came from the chain, so it
369
+ is right by construction, and the readout points at `abx status --remote` for the lifecycle.
370
+
371
+ Under `--json` the body is verbatim and untruncated and a non-2xx exits non-zero, so CI can gate on it;
372
+ the human readout clips at 1200 chars and says how many it clipped. The fetch itself lives in
373
+ `src/served.ts` with an injectable `fetch`, since `main.ts` exports nothing — the same reason
374
+ `scaffold.ts` was extracted.
375
+
376
+ This retired the last two `curl` recommendations in the shipped skill: verifying an attach is now
377
+ `abx tokenuri <addr> --fetch` (the served document carries the `artifacts` manifest), and the skill's
378
+ claim that `tokenuri` "follows" the URL — previously true only of `contracturi` — is now accurate.
379
+
380
+ - Updated dependencies [df298d8]
381
+ - Updated dependencies [df298d8]
382
+ - Updated dependencies [df298d8]
383
+ - @artblocks/abx-sdk@0.1.0-alpha.9
384
+ - @artblocks/abx-token-api@0.1.0-alpha.12
385
+ - @artblocks/abx-storage@0.1.0-alpha.9
386
+ - @artblocks/abx-indexer@0.1.0-alpha.10
387
+
3
388
  ## 0.1.0-alpha.16
4
389
 
5
390
  ### Patch Changes
@@ -0,0 +1,181 @@
1
+ import { SelfHostIndexer } from '@artblocks/abx-indexer';
2
+ import { type Address, type OnChainFieldInput, type OpenSeaAttribute, type ProjectState, type PublicClient, type SeriesTokenFieldInput } from '@artblocks/abx-sdk';
3
+ import { type Hex } from 'viem';
4
+ import { type StorageOverrides } from '../config.js';
5
+ import { type Flags } from '../flags.js';
6
+ export declare const DIMENSIONS: Record<string, {
7
+ label: string;
8
+ aliases: string[];
9
+ }>;
10
+ export declare function resolveDimension(type: string): string;
11
+ /**
12
+ * A `--dry-run` computes the deterministic deploy address, which is a pure function of
13
+ * (factory, salt, deployer) — so it needs a deployer even though it signs nothing. Resolve it the
14
+ * same way the preview will (`--for`, else an env key) and fail EARLY with the fix if neither
15
+ * exists, rather than after the preview has printed several steps of work.
16
+ */
17
+ /**
18
+ * A dry run only checks whether a factory address is CONFIGURED, not whether it has code on this
19
+ * chain — and the manifest always has an address, so a chain where the trust anchor isn't deployed
20
+ * (a private/local chain, or a wrong-network RPC) sailed past this and died inside
21
+ * `predictDeterministicAddress` with a raw `returned no data ("0x")` and a list of ABI hypotheses.
22
+ * The real deploy and `abx predict` both explain that case; a preview of the same deploy must too.
23
+ * Returns false when the caller should stop (message already printed).
24
+ */
25
+ export declare function previewFactoryLive(client: PublicClient, factory: Address, label: string): Promise<boolean>;
26
+ /**
27
+ * Placeholder-identity guard, shared by ALL THREE deploy commands. `name`/`symbol` are written
28
+ * on-chain as the public collection identity and are effectively permanent, so a real deploy must
29
+ * never bake a tool default silently: warn in a preview, HARD-STOP a real send unless `--yes`.
30
+ *
31
+ * It was duplicated per command, and `deploy-series` simply never got a copy — its default
32
+ * "ABX Series"/"ABXS" went on-chain with at most a warning, while the skill promises the CLI
33
+ * refuses demo defaults. (deploy-code's copy even said "mirror deploy/deploy-series", which made
34
+ * the gap look closed.) One predicate now, like `loopbackBaseUrl()`, so a fourth command can't drift.
35
+ */
36
+ export declare function assertRealIdentity(flags: Flags, o: {
37
+ name: string;
38
+ symbol: string;
39
+ dryRun: boolean;
40
+ }): void;
41
+ export declare function assertPreviewDeployer(flags: Flags): void;
42
+ export declare function warnUnfunded(publicClient: PublicClient, address: Address): Promise<void>;
43
+ export declare function shArg(v: string): string;
44
+ export declare function deployCommandLine(flags: Flags, salt: string): string;
45
+ export declare function deploySeriesCommandLine(flags: Flags, salt: string): string;
46
+ export declare function deployCodeCommandLine(flags: Flags, salt: string): string;
47
+ export declare const imageKeccakField: (value: Hex) => OnChainFieldInput;
48
+ export declare const imageInlineField: (svg: string) => OnChainFieldInput;
49
+ /** An `image` field pointing at an off-chain URL (the renderer emits it verbatim). */
50
+ export declare const imageUrlField: (url: string) => OnChainFieldInput;
51
+ /** An `image` field as a `url-template` — `{id}` is substituted with the tokenId at render, so ONE
52
+ * (collection-scope) field addresses a whole pinned directory / Arweave manifest. */
53
+ export declare const imageUrlTemplateField: (template: string) => OnChainFieldInput;
54
+ export declare const looksLikeSvg: (s: string) => boolean;
55
+ /**
56
+ * Does the IMAGE itself end up on-chain for this deploy? Two ways it can:
57
+ * • `--onchain-image` — the bytes are staged in the chunk store and read back via a `reader` field.
58
+ * • `--onchain-uri` with an SVG — v1 inlines SVG directly as a data: URI (raster cannot be).
59
+ * Anything else falls through to keccak256 custody, and the on-chain renderer serves its PLACEHOLDER
60
+ * image. This distinction is the difference between a token that is durable and one that only looks
61
+ * durable, so it must be computed from the actual file — never inferred from the flag alone (the
62
+ * success banner used to claim "fully on-chain, no hosting needed" for a keccak-anchored raster).
63
+ */
64
+ /**
65
+ * Will `tokenURI` resolve to the creator's REAL image, with nothing to keep running?
66
+ *
67
+ * Three ways yes, and they are not the same promise: the bytes are on-chain
68
+ * ({@link imageEndsUpOnChain}), or they sit at a durable public URL that the on-chain JSON points at
69
+ * (a direct-URL backend — the "no server" pattern). Only `fs` custody under `--onchain-uri` fails,
70
+ * because the renderer then holds a hash and nothing can serve it. Keep this separate from
71
+ * "fully on-chain": conflating them is what let a keccak-anchored raster ship under a permanence
72
+ * banner it did not earn.
73
+ */
74
+ export declare function imageResolvesWithoutServer(flags: Flags, onchainImage: boolean): boolean;
75
+ export declare function imageEndsUpOnChain(flags: Flags, onchainImage: boolean): boolean;
76
+ /** A browser wallet reached through an open sign session, used as the Turbo (Arweave) upload
77
+ * identity so the wallet's own credits pay — `signMessage` returns the `0x` EIP-191 signature. */
78
+ export type RemoteEthUpload = {
79
+ address: Address;
80
+ signMessage: (message: Uint8Array) => Promise<string>;
81
+ };
82
+ export declare function prepareContent(imagePath: string | undefined, clone: Address, overrides: StorageOverrides, store?: boolean, // false for --dry-run: compute the hash but don't custody bytes
83
+ onChain?: boolean, // true (--onchain-uri): put the image ON-CHAIN (inline SVG) so it self-resolves
84
+ remoteEth?: RemoteEthUpload, // wallet-lane Turbo uploads: sign+pay with the connected browser wallet
85
+ walletAddr?: string): Promise<{
86
+ tokenFields: OnChainFieldInput[];
87
+ contentNote: string;
88
+ }>;
89
+ /**
90
+ * Real OpenSea traits supplied by the creator, from `--attributes <file.json>` (canonical array or
91
+ * `{name: value}` map) and/or `--traits "Background=Blue; Edition=3"` (quick inline form). These are
92
+ * the marketplace trait array — NOT a place for protocol facts. Empty when neither flag is given.
93
+ */
94
+ export declare function parseDeployTraits(flags: Flags): OpenSeaAttribute[];
95
+ /** Encode creator traits as the on-chain `attributes` field (inline JSON bytes) — for `--traits-onchain`. */
96
+ export declare const attributesInlineField: (attrs: OpenSeaAttribute[]) => OnChainFieldInput;
97
+ /** Warn when IPFS/Arweave custody is pointed at a LOCAL gateway: the served image URL
98
+ * (`<gateway>/ipfs/<cid>`) would resolve only on this machine, so marketplaces/wallets can't
99
+ * load it — a pinning service + a PUBLIC gateway is part of operating off-chain custody. */
100
+ export declare function localGatewayWarning(flags: Flags): string | null;
101
+ /** A readout line for an optional creator text field — states exactly what's written (and where),
102
+ * or that NOTHING is, so the deploy never silently invents one. */
103
+ export declare function describeDeployField(label: string, value: string | undefined, onchain: boolean): string;
104
+ /** Readout lines for whichever authorship/rights fields a deploy will write (always on-chain,
105
+ * inline collection fields). Empty when none are set — so the readout stays quiet by default. */
106
+ export declare function authorshipReadout(flags: Flags): string[];
107
+ /** A readout line for creator traits — the exact traits written (and where), or that none are. */
108
+ export declare function describeTraits(traits: OpenSeaAttribute[], onchain: boolean): string;
109
+ export declare function cmdDeploy(flags: Flags, serveAfter: boolean): Promise<void>;
110
+ export declare function cmdDeployBody(flags: Flags, serveAfter: boolean, emit: (p: Record<string, unknown>) => void): Promise<void>;
111
+ export declare const tokenFieldOf: (tokenId: number, f: OnChainFieldInput) => SeriesTokenFieldInput;
112
+ export declare function cmdDeploySeries(flags: Flags): Promise<void>;
113
+ export declare function cmdDeploySeriesBody(flags: Flags, emit: (p: Record<string, unknown>) => void): Promise<void>;
114
+ /**
115
+ * `abx deploy-code` — deploy a code project ({SeriesCode}) end to end, hot lane:
116
+ * the canonical factory + seed source from the manifest, fat initialize (the `code`
117
+ * field rides it in directory mode), then ONE post-deploy multicall for the script
118
+ * chunks (template mode) + any PostParam schemas, optional reserve mints, and local
119
+ * register + index. Grown directly from the Sepolia drop rehearsal
120
+ * (`packages/cli/scripts/code-drop-rehearsal.ts`).
121
+ *
122
+ * Modes (exactly one):
123
+ * --script <file> template mode — the program stored on-chain in chunks
124
+ * --code-dir <dir> directory mode — the build uploaded via the storage backend
125
+ * (`putDirectory`; ipfs/arweave), its root as the `code` field
126
+ *
127
+ * Schemas: --schema key:Type:Auth[,key:Type:Auth…] (e.g. palette:HexColor:TokenOwner).
128
+ * Seeds: canonical randomizer by default; --no-seed opts out.
129
+ */
130
+ /**
131
+ * The deterministic part of a projection: everything that is a pure function of the chain.
132
+ * Deliberately EXCLUDES `reconstructedAt`, `rpcUrl` and `toBlock` — a timestamp, the endpoint that
133
+ * happened to answer, and the head at scan time all legitimately differ between two replays, so
134
+ * folding them in would make the rebuild proof fail for reasons that aren't about correctness.
135
+ */
136
+ export declare function projectionFingerprint(s: ProjectState): string;
137
+ /**
138
+ * Print the reconstructed spine — the point being that this list IS the database. Rendered inside
139
+ * the index step (no header of its own: "Index it — replay the event spine" immediately followed by
140
+ * a separate "The event spine" step read as a stutter).
141
+ */
142
+ export declare function walkthroughSpine(state: ProjectState): void;
143
+ /**
144
+ * [4] The claim, demonstrated: delete the local projection and rebuild it from the chain.
145
+ *
146
+ * This is the one step that can't be faked by good output — it drops the projection for real
147
+ * (registration kept), confirms it's gone, replays from the deploy block, and compares a
148
+ * fingerprint of everything chain-derived. If ABX's premise is wrong, this step fails loudly.
149
+ */
150
+ export declare function walkthroughRebuild(indexer: SelfHostIndexer, address: Address, before: ProjectState): Promise<void>;
151
+ /**
152
+ * [5] Read the token back the way a marketplace would.
153
+ *
154
+ * Which is genuinely a different act per lane, so it reads from the real source in each case rather
155
+ * than always going through the local server:
156
+ * • fully on-chain → call `tokenURI(0)` on the contract. That IS what a marketplace does, and on
157
+ * this lane the whole answer (art included) comes back from the chain with nothing else running.
158
+ * • off-chain custody → fetch the resolver, because that's what the baked URI points at.
159
+ * Reading the on-chain lane over HTTP would have quietly implied the local server was load-bearing
160
+ * when it isn't — the opposite of the lesson.
161
+ */
162
+ export declare function walkthroughReadBack(state: ProjectState, baseUrl: string, onChainUri: boolean): Promise<void>;
163
+ /** Every flag `deploy-code` recognizes — so an unsupported/typo'd one warns instead of silently
164
+ * no-opping. Keep in lockstep with the flags read below + the storageOverrides/lane helpers. */
165
+ export declare const DEPLOY_CODE_FLAGS: Set<string>;
166
+ export declare const SHARED_DEPLOY_FLAGS: string[];
167
+ export declare const DEPLOY_FLAGS: Set<string>;
168
+ export declare const DEPLOY_SERIES_FLAGS: Set<string>;
169
+ export declare function cmdDeployCode(flags: Flags): Promise<void>;
170
+ export declare function cmdDeployCodeBody(flags: Flags, emit: (p: Record<string, unknown>) => void): Promise<void>;
171
+ /**
172
+ * Resolve `--721c` into the InitParams `transferValidator`. Absent → `zeroAddress`: a plain
173
+ * ERC-721, byte-for-byte the pre-721C deploy — no prompts, no output, no mention of 721C.
174
+ * `--721c` / `--721c recommended` → the per-chain recommended validator (refused, naming the
175
+ * chains that have one, when the manifest has no entry); `--721c 0x…` → checksum-validated AND
176
+ * pre-checked for code on this chain (the factory would revert `InvalidTransferValidator()` —
177
+ * surface it before any upload/staging/gas). When enrolling, prints the one plain statement of
178
+ * what enforcement means — once, adapted to the chosen validator.
179
+ */
180
+ export declare function resolveTransferValidatorFlag(flags: Flags, publicClient: PublicClient, dryRun: boolean): Promise<Address>;
181
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,YAAY,EAKjB,KAAK,qBAAqB,EAqC3B,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EAAC,KAAK,GAAG,EAAyC,MAAM,MAAM,CAAC;AACtE,OAAO,EAGL,KAAK,gBAAgB,EAgBtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAC,KAAK,KAAK,EAA8E,MAAM,aAAa,CAAC;AA+CpH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAC,CAGzE,CAAC;AACF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;;;GAKG;AACH;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShH;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAC,GAAG,IAAI,CASzG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAWxD;AAID,wBAAsB,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9F;AAUD,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBpE;AAKD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB1E;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBxE;AAOD,eAAO,MAAM,gBAAgB,GAAI,OAAO,GAAG,KAAG,iBAI5C,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,iBAI7C,CAAC;AAEH,sFAAsF;AACtF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,iBAI1C,CAAC;AAEH;sFACsF;AACtF,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,iBAIvD,CAAC;AAEH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,OAAsC,CAAC;AAEhF;;;;;;;;GAQG;AACH;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAGvF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAY/E;AAED;mGACmG;AACnG,MAAM,MAAM,eAAe,GAAG;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAC,CAAC;AAExG,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,gBAAgB,EAC3B,KAAK,UAAO,EAAE,gEAAgE;AAC9E,OAAO,UAAQ,EAAE,gFAAgF;AACjG,SAAS,CAAC,EAAE,eAAe,EAAE,wEAAwE;AACrG,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,CAgGlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,EAAE,CAQlE;AAED,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,GAAI,OAAO,gBAAgB,EAAE,KAAG,iBAIhE,CAAC;AAEH;;6FAE6F;AAC7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAW/D;AAED;oEACoE;AACpE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGtG;AAED;kGACkG;AAClG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAExD;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAInF;AAGD,wBAAsB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,iBAIhE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,iBAonBhH;AAgBD,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,GAAG,iBAAiB,KAAG,qBAKnE,CAAC;AAEH,wBAAsB,eAAe,CAAC,KAAK,EAAE,KAAK,iBAEjD;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,iBAygBjG;AAGD;;;;;;;;;;;;;;;GAeG;AAWH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAgB7D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAmB1D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxH;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDlH;AAED;iGACiG;AACjG,eAAO,MAAM,iBAAiB,aAmB5B,CAAC;AAGH,eAAO,MAAM,mBAAmB,UAK/B,CAAC;AAEF,eAAO,MAAM,YAAY,aAKvB,CAAC;AAEH,eAAO,MAAM,mBAAmB,aAM9B,CAAC;AAEH,wBAAsB,aAAa,CAAC,KAAK,EAAE,KAAK,iBAE/C;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,iBA+iC/F;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAgC9H"}