@artblocks/abx-cli 0.1.0-alpha.28 → 0.1.0-alpha.29

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 CHANGED
@@ -1,5 +1,149 @@
1
1
  # @artblocks/abx-cli
2
2
 
3
+ ## 0.1.0-alpha.29
4
+
5
+ ### Minor Changes
6
+
7
+ - c9f7aeb: Fold the burn, and make "canonically ABX v2" sayable — from abx-services' 2026-08-20 reply
8
+ (`reviews/2026-08/services-reply-docs-23.md`). All off-chain: no contract changed, no address moved.
9
+
10
+ **SDK — `foldSpine` now folds an ERC-721 burn, and `TokenState.minted` is replaced by `lifecycle`
11
+ (BREAKING).** A burn wrote the zero address into `TokenState.owner` — where nothing downstream could
12
+ tell it from a holder — and `minted` latched `true` at mint and was never recomputed, so a burned
13
+ token reconstructed as live. `lifecycle: 'unminted' | 'live' | 'burned' | 'no-live-copies'` replaces it,
14
+ and `owner` is `null` for a burned id rather than a sentinel. An enum rather than the `minted` +
15
+ `burned` pair the report asked for: a boolean whose `false` has two meanings leaves the burn case one
16
+ forgotten field away from rendering as "not yet minted", which is exactly what our own CLI did.
17
+
18
+ **`'burned'` is terminal and ERC-721-only; an edition at zero live copies is `'no-live-copies'`.** The
19
+ first cut of this enum shared `'burned'` across both standards, on the grounds that "one vocabulary on
20
+ both lanes" was the honest shape. It wasn't: the correct _response_ to destruction differs by standard
21
+ (a 721 id is gone forever and must `410`; an edition id can mint again and must not), so a shared word
22
+ put every consumer one forgotten `contractType` branch away from serving `410 Gone` for a token the
23
+ contract still resolves — and our own migration note told the first consumer to map the shared word
24
+ straight onto their `410` sites. abx-services caught it in review before it published. Splitting the
25
+ word moves the rule out of prose and into the type: **`lifecycle === 'burned'` is safe to treat as
26
+ permanent on either standard, with no carve-out**, which let the reference resolver's `isEditionState`
27
+ guard go away entirely. Pinned from both ends — no edition history can fold to `'burned'`, and the
28
+ route asserts its own standard-blindness.
29
+
30
+ **The two lanes now agree id-for-id.** The same review found `TokenRow.lifecycle` (head reads) reporting
31
+ `'unknown'` for a fully-burned edition id while the fold reported `'burned'` for that same id — under a
32
+ docstring claiming the two lanes used the same words. That is the sibling-drift class this repo treats
33
+ as a bug (see `TokenState.maxSupply`'s note, the last time one field name carried two meanings). Both
34
+ lanes now answer `'no-live-copies'` there: the fold _could_ distinguish never-minted from fully-burned
35
+ and deliberately does not, because the distinction has no consumer. `'unknown'` survives for the one
36
+ case where a head read genuinely cannot say — a 1/1 has no mint frontier, so a reverting `ownerOf`
37
+ there is evidence of nothing.
38
+
39
+ What the latched boolean was costing, all in our own tree: the effects harness re-rendered destroyed
40
+ tokens on every sweep, forever; `onchain-uri`'s probe reads the LOWEST live id, so burning token 0 made
41
+ a healthy collection's on-chain-URI lane report as **broken**; the resolver served metadata — and the
42
+ pre-mint _warming placeholder_, i.e. "still loading" forever — for ids the contract disowns; `mintedCount`
43
+ never went down; and `abx state` printed "not yet minted" for a token that had been destroyed.
44
+
45
+ **SDK — `BurnConfigured` and `MaxRoyaltyBpsUpdated` fold into `ProjectState.burnable` /
46
+ `.maxRoyaltyBps`.** Both events shipped in the ABI and in `SPINE_EVENT_DOC` and reached no field of
47
+ state; the upgrade memo then told consumers the doc entry _was_ the fold, which it has never been (it
48
+ supplies `register`/`what` on the event record, full stop). Both are tri-state: `null` means the spine
49
+ never stated it — an implementation with no `burn` entrypoint and an unpublished ceiling — which is not
50
+ `false`, and not 10%. The ceiling is deliberately not nested inside `royalty`, since clearing a royalty
51
+ nulls that field while the ceiling stays binding on chain.
52
+
53
+ **SDK — a fold-coverage guard, because this was the second instance in four days.** `DefaultMaxSupplySet`
54
+ did the same thing on 2026-08-17. `SPINE_EVENT_NO_FOLD` now lists the events that deliberately reach no
55
+ state _and why_ (a ping whose value is a head read, a factory's own log, a minter sibling, an allowance),
56
+ and `spine-fold-coverage.test.ts` asserts every decodable event is either folded or excused. A new event
57
+ is unfolded and unexcused until someone decides which.
58
+
59
+ **SDK — a burned 1/1 no longer vanishes from `listTokens`.** The id range fell back to `totalSupply`
60
+ (live: mints − burns) when a token type exposes no `nextTokenId`, so burning a 1/1's only token made the
61
+ listing enumerate ZERO ids — `abx tokens` printed nothing at all, indistinguishable from a collection
62
+ with no tokens. A 1/1's id space is `{0}` forever regardless of what is live. Found by burning a real
63
+ token on Sepolia rather than by any fixture, which is the only way this one surfaces.
64
+
65
+ **SDK — head reads can now say `burned`.** `nextTokenId` is a mint frontier that only rises, so an id
66
+ below it whose `ownerOf` reverts was minted and destroyed. `TokenRow.lifecycle` (`'live'` / `'burned'` /
67
+ `'unminted'` / `'unknown'`) and `TokenListing.burnedCount` (`nextTokenId − totalSupply`) drop out of that,
68
+ with no event log. `'unknown'` stays a real member where the chain declines to say: a 1/1 has no frontier,
69
+ and an edition's `supply == 0` cannot distinguish never-minted from fully-burned.
70
+
71
+ **SDK — `burned` joins `ServiceErrorCode`, paired with `410 Gone`.** A remote token API had nothing
72
+ honest to say about a destroyed id and was sending `410` with `code: 'not_registered'` — a statement
73
+ about the _contract_. The rule behind the pairing is the general one: **a resolver answers what the
74
+ contract's own URI getter answers.** A burned 721's `tokenURI` reverts `NonexistentToken`, so serving a
75
+ document would contradict the contract; an ERC-1155's `uri(id)` has no existence gate and a zero-supply
76
+ id can mint again, so **an edition never 410s** — it serves, with `supply: 0`.
77
+
78
+ **SDK — `readCollectionPolicy`, `canonicalFactories`, `verifyProvenance`: protocol knowledge moves out
79
+ of the CLI.** The CLI was declaring its own ABI fragments for `burnable`/`maxRoyaltyBps` and reading
80
+ them itself in two places, so no other integrator could reach either fact. `canonicalFactories(chainId)`
81
+ replaces two copies of the six-anchor enumeration inside `anchors.ts` — the list whose completeness _is_
82
+ the trust model. `verifyCanonical` gains `opts.factories`, which **replaces** the manifest set rather
83
+ than appending to it, so a multi-tenant operator's pinned allowlist can drive the gate without silently
84
+ widening it.
85
+
86
+ **SDK — anchor generations: "canonically ABX v2", not a bare `false`.** `verifyCanonical` reported
87
+ "deployed by an ABX factory since replaced" and "deployed outside the toolkit entirely" identically —
88
+ its own docstring admitted it — and the first is a perfectly good collection. `ANCHOR_GENERATIONS` keys
89
+ each generation of the six trust anchors by the **on-chain core version** its clones report, and
90
+ `verifyProvenance` returns `{canonical, generation: 'current' | 'prior' | null, coreVersion, factory,
91
+ anchorsAnswered}`. The version is on the clone itself, so the answer is chain-verified rather than a
92
+ manifest claim, and it keeps working after a factory retires. Retired generations never feed
93
+ `verifyCanonical`: provenance is not trust — a superseded generation can predate a security remediation.
94
+ Pre-launch testnet generations are deliberately not backfilled.
95
+
96
+ **Redeploy process — a token-layer runtime change is a new anchor generation.** It bumps
97
+ `AbxVersion.CORE_VERSION` and moves the SDK's `isCurrent*` probes in lockstep. That is now a checklist
98
+ step (`contracts/README.md`, `CLAUDE.md`) _enforced by_ `deployments.test.ts`: recorded generations must
99
+ have unique, increasing core versions and the newest must match the constant in `AbxVersion.sol`, so a
100
+ batch cannot record a generation without bumping or bump without recording. The gap that prompted it: the
101
+ 2026-08-20 batch added `burn()`, `burnable()`, `maxRoyaltyBps()` and `reduceMaxRoyaltyBps()` to the CORE
102
+ base — burn is not an extension, so no extension version moved either — and left the constant at 2, so
103
+ `abxVersion() == 2` cannot tell a burn-capable token from a pre-burn one.
104
+
105
+ **CLI — the royalty ceiling is shown with its rate, and headroom is named.** A ceiling above the live
106
+ rate is royalty the owner can add unilaterally, and a listing page never shows it. `abx state` prints the
107
+ pair and, when there is headroom, says the useful thing: reducing the cap **to** the current rate is what
108
+ turns "5% today" into "5%, provably, forever". (Named by abx-services as their `royalty-headroom` flag —
109
+ a marketplace can compute it, so a creator should hear it from us first.)
110
+
111
+ **Reference stack — the same fixes, so the reference is exemplary rather than the counter-example.**
112
+ `mintedCount` keeps its name and counts LIVE ids, with `burnedCount` added only when non-zero (so a
113
+ project with no burns serves byte-identical JSON, and a consumer's fixtures keep telling the truth);
114
+ the indexer projection carries `lifecycle`; the effects status route and the render sweep skip destroyed
115
+ ids; the dashboard badges a burned token instead of calling it minted; and `abx verify` / the migrate and
116
+ re-point probes never choose a burned token as their subject.
117
+
118
+ **CLI — `--send` is accepted on the deploy paths, and two lane flags is refused.** Every deploy's help
119
+ advertises the signing lanes as `--send hot/env key · --sign wallet page · --unsigned print tx`, in 25
120
+ places, and `--send` was the one of the three the deploy allowlist rejected: typing what the help showed
121
+ produced `unrecognized flag(s): --send` from the guard whose whole purpose is catching flags that would
122
+ be silently ignored — the guard firing on the tool's own documentation. Found by using the CLI as a cold
123
+ reader of its own `--help` while setting up an on-chain test. While there, lane resolution moved from
124
+ truthiness to **presence** (`--sign=` parses to `''`, which is falsy, so a caller who explicitly named
125
+ the wallet lane was routed to the unattended env key — the one direction of that bug that costs
126
+ something), and naming two lanes at once now refuses instead of resolving by an undocumented precedence.
127
+
128
+ **Packaging — every published tarball ships its CHANGELOG.** `files` was `['dist', 'LICENSE']` on the
129
+ SDK, indexer, storage, effects and token-api, so the only package whose release notes reached consumers
130
+ was the CLI. A downstream team upgrading the SDK had no CHANGELOG in the tarball and diffed two `dist/`
131
+ trees to find out what moved — then reported the release notes as missing, which cost a whole exchange
132
+ to adjudicate. One line each.
133
+
134
+ **Docs + spec.** The event spine gains a Burn section and the `MaxRoyaltyBpsUpdated` row, both with the
135
+ fold rules an indexer relies on; three stale deploy-event-order lists are corrected; the remote-services
136
+ error taxonomy gains the `410 burned` row and the edition carve-out; `owner-powers` explains headroom and
137
+ burn permanence; and `indexing-notes` states plainly that documenting an event is not folding it.
138
+
139
+ ### Patch Changes
140
+
141
+ - Updated dependencies [c9f7aeb]
142
+ - @artblocks/abx-sdk@0.1.0-alpha.21
143
+ - @artblocks/abx-storage@0.1.0-alpha.21
144
+ - @artblocks/abx-indexer@0.1.0-alpha.22
145
+ - @artblocks/abx-token-api@0.1.0-alpha.24
146
+
3
147
  ## 0.1.0-alpha.28
4
148
 
5
149
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -2776,7 +2776,7 @@ export function projectionFingerprint(s) {
2776
2776
  royalty: s.royalty ? { bps: s.royalty.bps, receiver: s.royalty.receiver.toLowerCase() } : null,
2777
2777
  extensions: s.extensions.map((e) => e.name).sort(),
2778
2778
  collectionFields: s.collectionFields.map((f) => `${f.field}=${f.value}`).sort(),
2779
- tokens: s.tokens.map((t) => ({ id: t.tokenId, minted: t.minted, owner: t.owner?.toLowerCase() ?? null })),
2779
+ tokens: s.tokens.map((t) => ({ id: t.tokenId, lifecycle: t.lifecycle, owner: t.owner?.toLowerCase() ?? null })),
2780
2780
  events: s.events.map((e) => `${e.blockNumber}:${e.logIndex}:${e.name}`),
2781
2781
  };
2782
2782
  return createHash('sha256').update(JSON.stringify(canonical)).digest('hex');
@@ -2844,8 +2844,8 @@ export async function walkthroughRebuild(indexer, address, before) {
2844
2844
  export async function walkthroughReadBack(state, baseUrl, onChainUri) {
2845
2845
  step('Read it back the way a marketplace would');
2846
2846
  const token = state.tokens[0];
2847
- if (!token?.minted) {
2848
- info('no minted token to read yet.');
2847
+ if (token?.lifecycle !== 'live') {
2848
+ info(token?.lifecycle === 'burned' ? 'token #0 was burned — nothing to read back.' : 'no minted token to read yet.');
2849
2849
  return;
2850
2850
  }
2851
2851
  if (onChainUri) {
@@ -2912,8 +2912,8 @@ export const DEPLOY_CODE_FLAGS = new Set([
2912
2912
  'public-base-url', 'onchain-uri', 'generator', 'renderer', 'port',
2913
2913
  // storage (directory mode) — mirrors storageOverrides()
2914
2914
  'backend', 'endpoint', 'bucket', 'region', 'prefix', 'public-base', 'gateway', 'mode', 'api-url', 'upload-url', 'provider', 'storage-signer',
2915
- // signing lane + safety + trust anchor
2916
- 'sign', 'unsigned', 'for', 'salt', 'factory', 'bootstrap-factory', 'sign-url-file',
2915
+ // signing lane + safety + trust anchor ('send' = the default lane, stated explicitly; see SHARED_DEPLOY_FLAGS)
2916
+ 'send', 'sign', 'unsigned', 'for', 'salt', 'factory', 'bootstrap-factory', 'sign-url-file',
2917
2917
  // preview / confirm
2918
2918
  'dry-run', 'confirm', 'yes',
2919
2919
  'json', // B19: the deployed ADDRESS as data, narration to stderr
@@ -2927,6 +2927,13 @@ export const SHARED_DEPLOY_FLAGS = [
2927
2927
  // which is where the CLI uploads and probes; `--gateway` seeds these for the backend in use, and
2928
2928
  // these override it when the two should differ. Every deploy path takes them.
2929
2929
  'ipfs-gateway', 'arweave-gateway',
2930
+ // `--send` is the DEFAULT lane, and it is accepted explicitly because every deploy's own help
2931
+ // advertises it by name ("signing: --send hot/env key · --sign wallet page · --unsigned print tx").
2932
+ // It was the one of the three the parser rejected, so a reader who typed what the help showed got
2933
+ // `unrecognized flag(s): --send` from the guard whose whole job is catching flags that would be
2934
+ // ignored — the guard firing on the tool's own documentation. Explicit is also better than bare for
2935
+ // a script or an agent: the lane that signs and sends is worth stating out loud.
2936
+ 'send',
2930
2937
  'sign', 'unsigned', 'for', 'sign-url-file', 'dry-run', 'confirm', 'yes', 'salt', 'factory', 'bootstrap-factory', 'port', 'renderer', 'public-base-url',
2931
2938
  '721c', // opt-in ERC-721C enrollment (recommended | 0x…) — every deploy path takes it
2932
2939
  'json', // B19: the deployed ADDRESS as data, narration to stderr — every deploy path takes it