@artblocks/abx-cli 0.1.0-alpha.31 → 0.1.0-alpha.32

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,166 @@
1
1
  # @artblocks/abx-cli
2
2
 
3
+ ## 0.1.0-alpha.32
4
+
5
+ ### Patch Changes
6
+
7
+ - 61503c3: On-chain content: measure the RPC instead of guessing, and refuse no size.
8
+
9
+ `deploy --onchain-image`, `deploy-series --onchain-image` and `set-field --file` refused content past
10
+ **100 KB per token**. That threshold was reasoned from geth's 50M `--rpc.gascap` default minus a
11
+ margin, on the stated theory that "hosted providers commonly cap well below geth's default".
12
+
13
+ Measured 2026-08-24, with a state-override `eth_call` that reports the gas a node actually provisions:
14
+
15
+ | Endpoint | `eth_call` cap | Content it serves |
16
+ | ------------------------------------------------------------------ | --------------- | ----------------- |
17
+ | **`sepolia.base.org`** — the default endpoint of our default chain | **600,000,000** | **~729 KB** |
18
+ | `base-sepolia.publicnode.com` · `base-sepolia.drpc.org` | 50,000,000 | ~117 KB |
19
+ | `ethereum-sepolia.publicnode.com` | 50,000,000 | ~117 KB |
20
+
21
+ Providers do not commonly cap lower — **50M is the floor**, and the chain we ship as the default serves
22
+ twelve times that. So the refusal sat _below every endpoint that could be found_: it blocked content all
23
+ of them could read, and was 7x too strict on the default chain. A creator who wanted a 312 KB image
24
+ permanently on-chain was told no by a number about somebody else's infrastructure.
25
+
26
+ **There is now no refusal at any size**, and `--allow-unreadable-onchain` is gone with it (it existed
27
+ only to skip the refusal). In its place the toolkit states both costs and measures the one that varies:
28
+
29
+ - **Write** is chunked into 22,000-byte SSTORE2 transactions, so no block gas limit binds it at any
30
+ size. It is purely money at ~200 gas/byte, and the CLI now says so instead of implying a ceiling.
31
+ - **Read** is one `eth_call`, and whether it succeeds belongs to whoever's endpoint is asking. Below
32
+ ~117 KB (~50M gas) every endpoint measured serves it, and the CLI prints a plain note. Above that it
33
+ probes the RPC you are actually on — no transaction, no key, one call — and reports its real
34
+ allowance beside the estimate.
35
+
36
+ ```
37
+ ⚠ big.png is 312KB on-chain — reading tokenURI costs ~172M gas, which is past the ~50M gas floor
38
+ that every endpoint serves.
39
+ Your RPC allows ~600M gas (sepolia.base.org), so it reads for you — up to ~729KB. A 50M-capped
40
+ provider stops at ~117KB, and marketplaces or indexers on one will see a REVERT rather than your
41
+ token. Writing is unaffected: ~64M gas, chunked, no block-limit issue. This is the
42
+ permanence-vs-reach trade — --backend arweave is the other side of it.
43
+ ```
44
+
45
+ The distinction the output keeps making, because it is the one that matters: **your RPC is not the
46
+ marketplace's RPC.** A measured cap proves _you_ can read the token, never that OpenSea can. Past even
47
+ your own endpoint's cap the CLI says that plainly — and still does not stop you, because bytes someone
48
+ wants permanent are their call, not ours.
49
+
50
+ New in the SDK: `probeEthCallGasCap` / `probeBestEthCallGasCap` (in `probe.ts`, alongside the existing
51
+ getLogs capability probe that already argued this exact principle — measure the endpoint, don't trust a
52
+ table), `ETH_CALL_GAS_FLOOR`, and `readableBytesAtGas`. `classifyOnchainReadSize(bytesLen, capGas?)`
53
+ now returns `'ok' | 'endpoint-dependent' | 'beyond-local-rpc'` — none of them a refusal — and
54
+ `ONCHAIN_READ_REFUSE_BYTES` / `ONCHAIN_READ_GETH_CAP_BYTES` are removed.
55
+
56
+ An endpoint that rejects state overrides yields "unknown", which degrades to the conservative floor and
57
+ is tested to never throw and never block.
58
+
59
+ ## Follow-up audit: the other hardcoded third-party assumptions
60
+
61
+ **Three different limits were being called "the gas limit", and they differ by orders of magnitude on
62
+ the same endpoint.** Measured 2026-08-24:
63
+
64
+ | | `eth_call` cap | `eth_estimateGas` cap | block `gasLimit` |
65
+ | --------------------------------- | ------------------------ | --------------------- | ------------------------ |
66
+ | Base Sepolia — `sepolia.base.org` | 600,000,000 | 16,777,216 | 1,200,000,000 |
67
+ | Base Sepolia — publicnode · drpc | 50,000,000 | 16,777,216 | 1,200,000,000 |
68
+ | Sepolia — publicnode | 50,000,000–2,000,000,000 | 16,777,216 | 60,000,000 |
69
+ | Base mainnet · Ethereum mainnet | — | — | 400,000,000 · 60,000,000 |
70
+
71
+ - **"L1 block limits sit in the mid-30-millions"** (SDK, docs) was stale in the direction that makes
72
+ on-chain look worse than it is. It is 60M on Ethereum and Sepolia, 400M on Base, and **1,200M on Base
73
+ Sepolia** — so the claim that _"past ~90 KB no contract can read the token inside a transaction"_ was
74
+ off by more than 12x on our own default chain, where the real figure is ~1,100 KB. Removed everywhere.
75
+ - **`DEFAULT_TX_GAS_BUDGET = 8M` was right for the wrong reason, and the wrong reason was dangerous.**
76
+ It said "comfortably under mainnet's ~30M block limit". The limit that actually binds is
77
+ `eth_estimateGas`, capped at **16,777,216 (2²⁴)** on every endpoint tried — every send estimates
78
+ first, so a batch planned above that fails before anything is sent. Anyone correcting the stale block
79
+ figure would have raised the budget and broken every deploy. The constant is unchanged; its rationale
80
+ now names the limit that holds it, and says not to raise it toward a block limit.
81
+ - **A measured cap is point-in-time, not a property.** Sepolia's publicnode endpoint measured 50M one
82
+ hour and 2,000M the next — pooled endpoints rotate between backends with different configs. The probe
83
+ and the output now say so.
84
+ - **The probe could not tell "capped at exactly my ask" from "not capped at all".** A node that returns
85
+ the full 2,000,000,000 it was asked for did not clamp; reporting that as a 2,000M cap invents a limit
86
+ out of our own request. It now returns `Infinity` and the CLI prints "no eth_call cap at all".
87
+
88
+ ## And the reframe that makes the whole question smaller
89
+
90
+ A large read is a **serving** problem, not a preservation one — and the resolver already solves it.
91
+ `resolveFieldBytes` reads `inline` / `inline-gzip` / `reader` / `reader-gzip` with the resolver's own
92
+ RPC and serves the result as ordinary HTTP, so a marketplace fetches a URL and never makes the large
93
+ `eth_call`. `abx set-renderer <addr> --off` points `tokenURI` at it with every byte left where it is.
94
+
95
+ Every warning now says this, because it changes the decision: **storage and serving are separate.**
96
+ On-chain is the strongest storage answer available at any size; self-resolving-versus-a-resolver is a
97
+ serving choice the creator can change later. A token whose read is too large for some endpoint is not a
98
+ lost token — it is one that wants a reader in front of it.
99
+
100
+ And the framing that replaces the old false precision: **we can measure your RPC; we cannot know a
101
+ marketplace's or an indexer's**, and theirs are the ones that decide whether the token displays.
102
+
103
+ - 61503c3: Skill: stop agents declining capabilities ABX has, and teach the four extension seams up front.
104
+
105
+ Three field reports in one week share a shape — an agent told a creator "ABX can't do that" about
106
+ something ABX does:
107
+
108
+ - a **77 KB PNG fully on-chain** was called "not practical" and the creator was routed to another
109
+ protocol's on-chain filesystem. It ships today: the CLI warns once, ~16M gas to write and ~31M to
110
+ read. 100 KB is the refusal; 40 KB is only where reads stop being comfortable.
111
+ - a **transfer-restriction + mutable-state** mechanic was declared impossible, then built in an
112
+ afternoon once the creator said the word "hooks".
113
+ - a bespoke **non-canonical token contract** was written for a mechanic two stock hooks cover,
114
+ permanently forfeiting the `isAbxClone` provenance that is the reason to deploy here at all.
115
+
116
+ None of those agents lacked information. Each answered from the **command list**, and the command list
117
+ is a set of recommended routes, not the edge of the protocol — so falling off the end of a routing
118
+ table read as a "no". Another warning paragraph would not have helped; the skill already had one.
119
+
120
+ What changed, structurally:
121
+
122
+ - **A new `reference/capabilities.md`** — the inverse of the decision tree. It answers "can ABX do X?"
123
+ instead of "what do I run?": the four seams, the three hooks in depth, a mechanic→seam lookup table,
124
+ the on-chain size bands as _costs_ rather than walls, and a short, bounded **genuine no-list** — which
125
+ is what makes "don't say no" safe to follow.
126
+ - **A gate on the utterance, in Read first.** There is no CLI choke point for a wrong answer given in
127
+ chat, so the enforcement analogue is a rule that fires on the words themselves: before _not possible_,
128
+ _not practical_, _you'd need a different_, or the name of another protocol, check the seams and the
129
+ no-list. If it is on neither, it is possible — answer with the cost. And never route a creator to
130
+ another protocol for something ABX does.
131
+ - **The three hooks are taught as power, not just as liability.** Every prior mention sat in the
132
+ lock/disclosure register ("a standing power over whether a collector can sell"), and the **augment
133
+ hook did not appear in SKILL.md at all**. The honest claim is now stated where it is read: ABX runs
134
+ your arbitrary Solidity at write time (`--configure`, vetoes the write), transfer time (`--transfer`,
135
+ vetoes the move, sees mints and burns) and read time (`--augment`, adds and overrides `tokenData` keys
136
+ from anything a `view` can reach, for no gas on the token and no ~24 KB blob ceiling).
137
+ - **The deploy-time precondition is surfaced before the deploy.** Hooks exist only on
138
+ `SeriesCode`/`EditionCode`, the contract type is fixed forever, and that fact previously lived in one
139
+ parenthetical deep in a reference file. A creator who hints at _any_ rule should be deployed with
140
+ `deploy-code` even when the art is a static image — this is the mechanism that corners an agent into
141
+ writing a custom contract later.
142
+ - **"What this toolkit does NOT do" was itself teaching false impossibility.** It listed auctions and
143
+ allowlists next to mainnet. Now split: a genuine no-list, and a "not a flag, but here is the seam"
144
+ list. Auctions, allowlists, raffles, ERC-20 pricing, soulbinding, vesting, escrow, redemption and
145
+ oracle-fed metadata are all seams.
146
+ - **The skill `description` now routes capability questions here.** It listed only deploy/operate verbs,
147
+ so "can I make it soulbound?" or "can I run an auction?" never loaded the skill — the outermost
148
+ membrane was the first place the answer went wrong.
149
+ - **Size guidance reframed as a cost band** in all three places an agent meets it, with the 40–100 KB
150
+ band named as _warns once and ships_.
151
+
152
+ Also fixed, found while checking: **five dead links in `reference/decisions.md`** (sibling references
153
+ written as `reference/hosting.md` from inside `reference/`, resolving to `reference/reference/…`), and a
154
+ link from `reference/code-projects.md` into `docs/research/` that is dead for every installed user,
155
+ since `abx skill install` copies only the skill directory. A new `skill-integrity.test.ts` pins both —
156
+ every reference file is reachable from SKILL.md, and every relative link resolves.
157
+
158
+ - Updated dependencies [61503c3]
159
+ - @artblocks/abx-sdk@0.1.0-alpha.24
160
+ - @artblocks/abx-indexer@0.1.0-alpha.25
161
+ - @artblocks/abx-storage@0.1.0-alpha.24
162
+ - @artblocks/abx-token-api@0.1.0-alpha.27
163
+
3
164
  ## 0.1.0-alpha.31
4
165
 
5
166
  ### 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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"}
@@ -21,7 +21,7 @@ import { DEFAULT_PORT, contentHash, generateContent, resolveBaseUrl, startTokenA
21
21
  import { encodeFunctionData, getAddress, toHex, zeroAddress } from 'viem';
22
22
  import { CHAIN, explorerBase, assertTurboFundsForUpload, backendResolution, collectContentLocators, ensureArweaveIdentityForUpload, factoryAddress, faucetHint, localIndexer, loopbackBaseUrl, noteArweavePlan, noteStorageReadiness, rendererAddress, seriesFactoryAddress, oneOfOneEditionFactoryAddress, editionFactoryAddress, editionCodeFactoryAddress, storageOptions, storageOverrides, storageSignerChoice, } from '../config.js';
23
23
  import { parseDepFlag } from '../deps.js';
24
- import { allowUnreadableOnchain, isDryRun, parseSaltFlag, refuseStrayFlags, warnSignWithoutFor } from '../flags.js';
24
+ import { isDryRun, parseSaltFlag, refuseStrayFlags, warnSignWithoutFor } from '../flags.js';
25
25
  import { isEditionContract } from '../kind.js';
26
26
  import { jsonSafe, withJson } from '../jsonout.js';
27
27
  import { planOnChainScript } from '../script-chunks.js';
@@ -886,12 +886,12 @@ export async function cmdDeployBody(flags, serveAfter, emit) {
886
886
  }
887
887
  step('Stage on-chain image');
888
888
  if (dryRun) {
889
- info(previewImageStaging(flags.image, parseCompress(flags.compress), allowUnreadableOnchain(flags)));
889
+ info(await previewImageStaging(flags.image, parseCompress(flags.compress)));
890
890
  }
891
891
  else if (lane === 'send') {
892
892
  // hot lane: the env key stages now (deployer-independent — the manifest doesn't depend
893
893
  // on the clone address), then the deploy below bakes in the reader field.
894
- const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), envStagingSender(), allowUnreadableOnchain(flags));
894
+ const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), envStagingSender());
895
895
  bakedImage = field;
896
896
  info(note);
897
897
  }
@@ -1082,7 +1082,7 @@ export async function cmdDeployBody(flags, serveAfter, emit) {
1082
1082
  try {
1083
1083
  const signer = await session.connect();
1084
1084
  // Stage on-chain through the session (sets bakedImage, which buildForDeployer reads below).
1085
- const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), sessionStagingSender(session), allowUnreadableOnchain(flags));
1085
+ const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), sessionStagingSender(session));
1086
1086
  bakedImage = field;
1087
1087
  info(note);
1088
1088
  const { clone: predicted, params, salt, contentNote } = await buildForDeployer(signer);
@@ -1410,7 +1410,7 @@ export async function cmdDeployOneOfOneEditionBody(flags, emit) {
1410
1410
  // connect, so the connecting wallet pays for and owns every chunk write. `stageNow` is the hot-lane
1411
1411
  // (and dry-run) path; the session branch below calls the same helper with a session-backed sender.
1412
1412
  const stageOnChainImage = async (sender) => {
1413
- const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), sender, allowUnreadableOnchain(flags));
1413
+ const { field, note } = await stageImageField(flags.image, parseCompress(flags.compress), sender);
1414
1414
  bakedImage = field;
1415
1415
  info(note);
1416
1416
  };
@@ -1419,7 +1419,7 @@ export async function cmdDeployOneOfOneEditionBody(flags, emit) {
1419
1419
  throw new Error('--onchain-image needs --image <path> (the bytes to put on-chain)');
1420
1420
  step('Stage on-chain image');
1421
1421
  if (dryRun)
1422
- info(previewImageStaging(flags.image, parseCompress(flags.compress), allowUnreadableOnchain(flags)));
1422
+ info(await previewImageStaging(flags.image, parseCompress(flags.compress)));
1423
1423
  else if (lane === 'send')
1424
1424
  await stageOnChainImage(envStagingSender());
1425
1425
  // lane === 'sign' → staged inside the wallet session further down.
@@ -1868,7 +1868,7 @@ export async function cmdDeploySeriesBody(flags, emit) {
1868
1868
  const buildImageFields = async (stage) => {
1869
1869
  // --onchain-image: stage every token's bytes into ONE shared chunk store, each a `reader` field.
1870
1870
  if (onchainImage) {
1871
- const { fields } = await stageImageFieldsBatch(tokenPaths.map((s) => s.path), compress, stage, flags['chunk-store'], allowUnreadableOnchain(flags));
1871
+ const { fields } = await stageImageFieldsBatch(tokenPaths.map((s) => s.path), compress, stage, flags['chunk-store']);
1872
1872
  tokenFields = tokenPaths.map(({ tokenId }, i) => tokenFieldOf(tokenId, fields[i]));
1873
1873
  return;
1874
1874
  }
@@ -2053,7 +2053,7 @@ export async function cmdDeploySeriesBody(flags, emit) {
2053
2053
  }
2054
2054
  if (onchainImage) {
2055
2055
  for (const { tokenId, name: fname, path } of tokenPaths) {
2056
- info(`token ${tokenId} ← ${fname}: ${previewImageStaging(path, compress, allowUnreadableOnchain(flags))}`);
2056
+ info(`token ${tokenId} ← ${fname}: ${await previewImageStaging(path, compress)}`);
2057
2057
  }
2058
2058
  }
2059
2059
  info(`approvals ${approvals} wallet approval(s)`); // B2 — TX signatures only
@@ -2390,7 +2390,7 @@ export async function cmdDeployEditionImageBody(flags, emit) {
2390
2390
  // already deployed. Same per-id predicate either way (`guardOnChainSize` runs again during staging).
2391
2391
  if (onchainImage && dryRun) {
2392
2392
  for (const { name, path } of tokenPaths)
2393
- guardOnChainSize(statSync(path).size, name, allowUnreadableOnchain(flags));
2393
+ await guardOnChainSize(statSync(path).size, name);
2394
2394
  }
2395
2395
  // Say WHICH backend holds the bytes, exactly as the 1/1 lane does. Both Series lanes resolved a
2396
2396
  // backend and never named it, so a creator asking for "images on IPFS" had no way to confirm from
@@ -2426,7 +2426,7 @@ export async function cmdDeployEditionImageBody(flags, emit) {
2426
2426
  // field pointing at its manifest. Ported from the 721 Series twin — the edition lane refused this
2427
2427
  // outright before (B28), though nothing on-chain prevented it.
2428
2428
  if (onchainImage) {
2429
- const { fields } = await stageImageFieldsBatch(tokenPaths.map((s) => s.path), compress, stage, flags['chunk-store'], allowUnreadableOnchain(flags));
2429
+ const { fields } = await stageImageFieldsBatch(tokenPaths.map((s) => s.path), compress, stage, flags['chunk-store']);
2430
2430
  tokenPaths.forEach(({ tokenId }, i) => tokenFields.push(tokenFieldOf(tokenId, fields[i])));
2431
2431
  if (seriesTraitsOnchain)
2432
2432
  for (const [tokenId, attrs] of seriesTraits)
@@ -2947,7 +2947,7 @@ export const SHARED_DEPLOY_FLAGS = [
2947
2947
  // A 1/1 `abx deploy` accepts these (see `abx help deploy`). Anything else warns (typo'd/unsupported).
2948
2948
  export const DEPLOY_FLAGS = new Set([
2949
2949
  'image', 'name', 'symbol', 'type', 'description', 'description-onchain', 'external-url', 'traits', 'traits-onchain', 'attributes',
2950
- 'onchain-uri', 'onchain-image', 'compress', 'allow-unreadable-onchain', 'royalty-bps', 'royalty-cap', 'burnable', 'no-mint',
2950
+ 'onchain-uri', 'onchain-image', 'compress', 'royalty-bps', 'royalty-cap', 'burnable', 'no-mint',
2951
2951
  ...AUTHORSHIP_DEPLOY_FIELDS.map(([flag]) => flag),
2952
2952
  ...SHARED_DEPLOY_FLAGS,
2953
2953
  ]);
@@ -2955,7 +2955,7 @@ export const DEPLOY_FLAGS = new Set([
2955
2955
  export const DEPLOY_SERIES_FLAGS = new Set([
2956
2956
  'dir', 'count', 'name', 'symbol', 'description', 'external-url', 'royalty-bps', 'royalty-cap', 'burnable', 'attributes', 'traits-onchain',
2957
2957
  'no-mint', 'mint-all', 'mint-count', 'unpaused', 'minter', 'primary-payee',
2958
- 'onchain-uri', 'onchain-image', 'compress', 'allow-unreadable-onchain', 'chunk-store',
2958
+ 'onchain-uri', 'onchain-image', 'compress', 'chunk-store',
2959
2959
  ...AUTHORSHIP_DEPLOY_FIELDS.map(([flag]) => flag),
2960
2960
  ...SHARED_DEPLOY_FLAGS,
2961
2961
  ]);