@artblocks/abx-cli 0.1.0-alpha.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +402 -0
- package/assets/renderer-scaffold/README.md +44 -13
- package/assets/renderer-scaffold/foundry.toml +5 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +132 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +175 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +483 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/contract.d.ts +19 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +171 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/deploy.d.ts +296 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5736 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +154 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/maintenance.d.ts +4 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +114 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/project.d.ts +458 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1837 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +85 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +881 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +741 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +761 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +399 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +102 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +638 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +94 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +332 -12
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +400 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/creator-agent.d.ts +49 -0
- package/dist/creator-agent.d.ts.map +1 -0
- package/dist/creator-agent.js +363 -0
- package/dist/creator-agent.js.map +1 -0
- package/dist/creator-keyring.d.ts +26 -0
- package/dist/creator-keyring.d.ts.map +1 -0
- package/dist/creator-keyring.js +57 -0
- package/dist/creator-keyring.js.map +1 -0
- package/dist/creator-signer.d.ts +52 -0
- package/dist/creator-signer.d.ts.map +1 -0
- package/dist/creator-signer.js +267 -0
- package/dist/creator-signer.js.map +1 -0
- package/dist/deploy-plan.d.ts +218 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +20 -0
- package/dist/deploy-plan.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +188 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +53 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +151 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +79 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +859 -5374
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +184 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +774 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +450 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2219 -358
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +116 -9
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +371 -14
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +101 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +343 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +20 -1
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +110 -18
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +60 -9
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +105 -18
- package/dist/update-check.js.map +1 -1
- package/package.json +17 -12
- package/skill/SKILL.md +211 -354
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +195 -0
- package/skill/reference/code.md +236 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +177 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +191 -102
- package/skill/reference/operate.md +237 -0
- package/skill/reference/services.md +173 -0
- package/skill/reference/setup.md +221 -42
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -118
- package/skill/reference/troubleshooting.md +0 -28
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Operating an existing ABX project
|
|
2
|
+
|
|
3
|
+
Use this reference for inspection, minting and sales, transfers, fields, gateways, URI pointers,
|
|
4
|
+
royalties, supply, attachments, refreshes, ownership transfer, and locks.
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- [Read before writing](#read-before-writing)
|
|
9
|
+
- [Mint and run primary sales](#mint-and-run-primary-sales)
|
|
10
|
+
- [Transfer tokens and authority](#transfer-tokens-and-authority)
|
|
11
|
+
- [Operate metadata and data](#operate-metadata-and-data)
|
|
12
|
+
- [Manage economics and supply](#manage-economics-and-supply)
|
|
13
|
+
- [Lock precisely](#lock-precisely)
|
|
14
|
+
|
|
15
|
+
## Read before writing
|
|
16
|
+
|
|
17
|
+
Never infer contract type or current authority from the original launch notes. Read the contract:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
abx state <address>
|
|
21
|
+
abx tokens <address> --json
|
|
22
|
+
abx contracturi <address> --json
|
|
23
|
+
abx tokenuri <address> --token <id>
|
|
24
|
+
abx verify <address> --json
|
|
25
|
+
abx artifacts <address> --token <id> --json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`abx artifacts` reads a token's `artifacts` manifest directly, without fetching and parsing the whole
|
|
29
|
+
served document — entries plus every registered effect row (current and stale, labeled against the
|
|
30
|
+
token's active `inputsHash`). Report which surface answered: this node's local projection, or (with
|
|
31
|
+
`--remote <name|url>`) the hosted resolver that actually owns a hosted project's real artifact set.
|
|
32
|
+
Neither "not registered here" nor "not registered on that remote" is an error — both return a stable
|
|
33
|
+
`{surface, registered, available, reason, entries, effects}` shape. Nothing it reports is onchain data
|
|
34
|
+
itself; every entry is a resolver-published projection.
|
|
35
|
+
|
|
36
|
+
Use `abx status` or its remote form for projection/render lifecycle. Record active chain, detected
|
|
37
|
+
family, owner/admin, supply and pause state, minter/payee, royalty/cap, URI renderer/pointers, code
|
|
38
|
+
dependencies, schemas/hooks, and lock state.
|
|
39
|
+
|
|
40
|
+
Before every write, run its help and dry-run form when available. Confirm sender, target, value,
|
|
41
|
+
token/id/amount, and permanence. Let the CLI validate contract type; do not send raw ABI calls to make
|
|
42
|
+
an operation fit the wrong family.
|
|
43
|
+
|
|
44
|
+
## Mint and run primary sales
|
|
45
|
+
|
|
46
|
+
`abx mint` follows the detected family:
|
|
47
|
+
|
|
48
|
+
- A 1/1 issues its single token.
|
|
49
|
+
- A Series mints the next id in order; `--count` can mint multiple sequential ids.
|
|
50
|
+
- An edition requires `--token-id` except where the contract has only the single 1/1-edition id, and
|
|
51
|
+
uses `--amount` for copies. `--count` is not an edition synonym.
|
|
52
|
+
|
|
53
|
+
Confirm the recipient. Minting may trigger a transfer hook; a hook that vetoes mint will revert the
|
|
54
|
+
whole transaction.
|
|
55
|
+
|
|
56
|
+
### Shared fixed-price minter
|
|
57
|
+
|
|
58
|
+
Use the shared minter commands for ordinary ETH primary sales:
|
|
59
|
+
|
|
60
|
+
1. `abx minter configure <token> …` sets price and allocation. Editions require a token id and use a
|
|
61
|
+
per-id sale configuration.
|
|
62
|
+
2. `abx set-minter <token> --minter <address>` authorizes the minter.
|
|
63
|
+
3. `abx set-primary-payee <token> --payee <address>` declares payout.
|
|
64
|
+
4. `abx unpause <token>` opens minting when the family supports the pause gate.
|
|
65
|
+
5. `abx minter show <token> …` verifies the public sale state.
|
|
66
|
+
6. `abx minter buy <token> …` is the public purchase path; editions use quantity and token id.
|
|
67
|
+
|
|
68
|
+
Do not call a sale live until price units, allocation, payee, minter address, pause state, and a
|
|
69
|
+
representative purchase are verified. `abx mint-page` scaffolds a client for the shared minter; it does
|
|
70
|
+
not configure the on-chain sale for you.
|
|
71
|
+
|
|
72
|
+
Use a custom minter for auctions, allowlists, raffles, free claims, ERC-20 pricing, or other issuance
|
|
73
|
+
rules. The custom contract calls the canonical token's mint authority; the token itself remains a
|
|
74
|
+
factory clone. Read [capabilities.md](capabilities.md).
|
|
75
|
+
|
|
76
|
+
## Transfer tokens and authority
|
|
77
|
+
|
|
78
|
+
`abx transfer` moves token ownership/copies, not contract administration.
|
|
79
|
+
|
|
80
|
+
- A 721 transfer names token id and destination.
|
|
81
|
+
- An edition transfer names token id, amount, destination, and source holder because an id can have
|
|
82
|
+
multiple holders.
|
|
83
|
+
- Creator-token validation or a transfer hook may reject the move. Diagnose the actual revert; do not
|
|
84
|
+
bypass or clear an enforcement mechanism without the owner's explicit intent.
|
|
85
|
+
|
|
86
|
+
`abx set-admin --to <address>` transfers contract authority. Treat it as a high-risk, potentially
|
|
87
|
+
irrecoverable handoff:
|
|
88
|
+
|
|
89
|
+
1. Verify the recipient is correct for the active chain.
|
|
90
|
+
2. Inventory unfinished operations and unlocked surfaces.
|
|
91
|
+
3. State which powers move and which external controllers remain separate.
|
|
92
|
+
4. Receive exact human confirmation.
|
|
93
|
+
5. Execute once, then read state from chain to prove the new owner.
|
|
94
|
+
|
|
95
|
+
Never interpret a token transfer as a sale listing. ABX has no secondary order book; a marketplace or
|
|
96
|
+
manual transfer handles secondary exchange.
|
|
97
|
+
|
|
98
|
+
## Operate metadata and data
|
|
99
|
+
|
|
100
|
+
### URI pointers and renderers
|
|
101
|
+
|
|
102
|
+
Use `set-token-uri`, `set-contract-uri`, and `set-renderer` only after reading the current configuration
|
|
103
|
+
and verifying the destination. Switching `set-renderer --off` can place an HTTP resolver in front of
|
|
104
|
+
content that remains stored on-chain. Switching to the canonical renderer makes configured on-chain
|
|
105
|
+
fields self-resolving when the contract supports them.
|
|
106
|
+
|
|
107
|
+
Never hand-build a resolver path. Read `tokenURI`/`contractURI`, decode it, and follow what the
|
|
108
|
+
contract actually returns. A correct-looking URL constructed from memory is not evidence.
|
|
109
|
+
|
|
110
|
+
### Fields
|
|
111
|
+
|
|
112
|
+
`abx set-field` writes one metadata field representation at token or collection scope. Representations
|
|
113
|
+
include inline data, reader/chunk pointers, hashes, public locators, and renderer pointers as supported
|
|
114
|
+
by the contract. Collection-scope values act as shared defaults; token-scope values override them.
|
|
115
|
+
|
|
116
|
+
Use reserved fields such as description, attributes, creator, license, display notes, and links
|
|
117
|
+
according to command help. Verify the resulting provenance in decoded metadata. On-chain-wins means a
|
|
118
|
+
new on-chain value can intentionally supersede a resolver projection.
|
|
119
|
+
|
|
120
|
+
### Gateways
|
|
121
|
+
|
|
122
|
+
`abx set-gateway` changes the serving prefix for IPFS/Arweave locator representations without moving
|
|
123
|
+
the content. Verify a representative locator through the new gateway before changing it. A gateway
|
|
124
|
+
repoint is not a re-upload and does not change the committed CID/transaction id.
|
|
125
|
+
|
|
126
|
+
### Attachments versus parameters
|
|
127
|
+
|
|
128
|
+
`abx attach <addr> <key> <locator>` records a named artifact. It prints the CANONICAL fetch URL for
|
|
129
|
+
every key (`{base}/{chainId}/{address}[/<id>]/data/<key>`) directly — never hand-build that route.
|
|
130
|
+
It also distinguishes the on-chain field write from off-chain SERVING: an on-chain write can succeed
|
|
131
|
+
while nothing can serve it. With no resolver base baked in at all, it warns there is no serving path
|
|
132
|
+
whatsoever. With one baked in, it probes whether a resolver actually answers for this token right
|
|
133
|
+
now (before the write, since the key itself doesn't exist yet) and warns if not — "the on-chain
|
|
134
|
+
document carries reserved fields only" is a real gap creators hit; the write landing is not proof
|
|
135
|
+
anything can serve it. Bare on-chain metadata cannot enumerate arbitrary field keys, so consumers
|
|
136
|
+
need a resolver to discover all attachments even when each locator is durable and hash-anchored.
|
|
137
|
+
|
|
138
|
+
PostParams are different: the parameter store enumerates schemas and values on-chain. Read schemas
|
|
139
|
+
with `state` and values with `tokens --json`. Parameters do not require a resolver merely to be
|
|
140
|
+
canonical or enumerable.
|
|
141
|
+
|
|
142
|
+
### Replacing an unlocked script
|
|
143
|
+
|
|
144
|
+
`abx replace-script <addr> --script <file>` ships a fix to a code project's on-chain program any
|
|
145
|
+
time before `abx lock-script`. It refuses outright — never warns and proceeds — on a locked script
|
|
146
|
+
or a target that isn't SeriesCode/EditionCode. It diffs by content against what's on-chain (an index
|
|
147
|
+
that already matches is never re-sent), folds every write and remove into ONE atomic transaction (so
|
|
148
|
+
a revert can never leave a half-applied script), and reads the completed script back to verify exact
|
|
149
|
+
reassembly before reporting success. Prefer this over hand-encoding `setScriptChunk` calls.
|
|
150
|
+
|
|
151
|
+
`--chunk-size <bytes>` overrides the default on-chain split size (~22 KB) — the same flag
|
|
152
|
+
`deploy-code` accepts (see [code.md](code.md#choose-the-runtime-lane)). A small value forces a
|
|
153
|
+
multi-chunk layout, which is the cheap way to exercise growing/shrinking a program across several
|
|
154
|
+
chunks (including the on-chain removal of surplus chunks when shrinking) without needing a large
|
|
155
|
+
real program.
|
|
156
|
+
|
|
157
|
+
### Refresh and URI events
|
|
158
|
+
|
|
159
|
+
`abx refresh` asks external marketplaces to fetch metadata again; it does not fix the metadata or
|
|
160
|
+
mutate canonical state. First prove that the current URI resolves and returns the intended document.
|
|
161
|
+
For editions, `ping-uri` re-emits native URI events for selected ids after a repoint. Use the smallest
|
|
162
|
+
id set needed and verify the new path before signalling indexers.
|
|
163
|
+
|
|
164
|
+
## Manage economics and supply
|
|
165
|
+
|
|
166
|
+
Use `set-royalty` to change receiver/rate within the collection's permanent royalty ceiling. Use
|
|
167
|
+
`set-royalty-cap` only to lower that ceiling. State the old and new values and confirm the irreversible
|
|
168
|
+
loss of future headroom.
|
|
169
|
+
|
|
170
|
+
Series supply caps and edition per-id caps are monotonic downward. Before lowering one, read the
|
|
171
|
+
Series issuance cursor or the edition id's live supply, respectively; never propose a value below that
|
|
172
|
+
floor. For editions, name the id and distinguish its live per-id cap from aggregate collection supply.
|
|
173
|
+
|
|
174
|
+
Pause/unpause controls the supported mint gate, not transfers or every external minter behavior.
|
|
175
|
+
Read state after changing it.
|
|
176
|
+
|
|
177
|
+
Primary payee declares sale proceeds; royalty receiver handles secondary royalty reporting. Keep them
|
|
178
|
+
separate. Changing one does not update the other.
|
|
179
|
+
|
|
180
|
+
## Lock precisely
|
|
181
|
+
|
|
182
|
+
Lock last, after production-path verification. Every lock freezes a different surface:
|
|
183
|
+
|
|
184
|
+
**Never lock a token or collection URI to a domain the creator does not own.** A managed remote's
|
|
185
|
+
URL is not creator custody. Route a creator-controlled domain only when the provider supports it,
|
|
186
|
+
verify the route, then lock that domain. ABX Services does not currently support custom-domain
|
|
187
|
+
routing, so never lock an `abx.io` URI. The CLI refuses to do so.
|
|
188
|
+
|
|
189
|
+
| Lock | Freezes | Does not necessarily freeze |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `lock-field` | one token/collection field representation | other fields, URI pointer, program, params |
|
|
192
|
+
| `lock-uri` | URI configuration/pointer at selected scope | program/dependencies/params/hooks |
|
|
193
|
+
| `lock-script` | code-project script chunks | dependencies, metadata, params, external renderer code |
|
|
194
|
+
| `lock-dependencies` | dependency list and registry pointer | bytes returned later by a live registry entry |
|
|
195
|
+
| `lock-param-hooks` | configure/transfer/augment addresses | behavior behind an upgradeable address |
|
|
196
|
+
| governed schema/value lock | writes governed by that schema/key | unrelated or ungoverned params; some inherited defaults |
|
|
197
|
+
| ownership transfer | future owner-only authority at this contract | powers held by external minters/hooks/providers |
|
|
198
|
+
|
|
199
|
+
For a code project, metadata locks alone do not freeze the program. A strong freeze normally requires
|
|
200
|
+
script, dependency, relevant field/URI, hook, and governed-parameter decisions, plus immutable external
|
|
201
|
+
renderer/hook/dependency deployments.
|
|
202
|
+
|
|
203
|
+
Important qualifications:
|
|
204
|
+
|
|
205
|
+
- An ungoverned parameter remains writable despite metadata locks.
|
|
206
|
+
- A schema-welded token value is stronger than a collection default inherited by many tokens; the
|
|
207
|
+
recovery path may still allow a poisoned collection default to be cleared.
|
|
208
|
+
- A registry dependency may return different bytes behind a frozen reference.
|
|
209
|
+
- A locked pointer to an upgradeable proxy fixes the address, not its behavior.
|
|
210
|
+
- A transfer-hook address represents a standing ability to veto mints/transfers. Freezing an empty
|
|
211
|
+
hook set is the proof that this power cannot later be added.
|
|
212
|
+
- `lock-field` targets one scope (token, or `--collection`); a token-scope value wins over a
|
|
213
|
+
collection-scope one when both are set. Locking a scope that ISN'T actually serving the value
|
|
214
|
+
freezes an empty or overridden slot, not what a viewer sees — the CLI refuses this by default and
|
|
215
|
+
names the correct command; only `--force-field` proceeds (with a loud warning, never silently).
|
|
216
|
+
Check `abx tokenuri --token <id>`'s `abx_provenance` (or just try the lock without `--force-field`)
|
|
217
|
+
before assuming a scope holds the value.
|
|
218
|
+
|
|
219
|
+
Use `abx verify` and direct state reads to enumerate what remains mutable. Describe the guarantee as
|
|
220
|
+
specific stored values and addresses that can no longer change; do not promise immutable output unless
|
|
221
|
+
every live input and external implementation has actually been bounded.
|
|
222
|
+
|
|
223
|
+
`abx state <address> --json` reports every lock above in one `locks` object — token/contract URI,
|
|
224
|
+
script, dependencies, param hooks, and the standard `METADATA_FIELD` set — each as `true` (frozen),
|
|
225
|
+
`false` (open), or `null` (unread; never report an unread lock as off). A project's own custom field
|
|
226
|
+
keys are real and independently lockable but are not enumerable from a bare head read; say so rather
|
|
227
|
+
than implying the field scan is exhaustive. Every lock is independent: never infer one lock's state
|
|
228
|
+
from another's.
|
|
229
|
+
|
|
230
|
+
`abx verify --json` separates two verdicts that must not be conflated: `ok`/`contentIntegrity` is
|
|
231
|
+
content-integrity ONLY (a hash mismatch, or none to check) and is the only field the exit code
|
|
232
|
+
reflects; `availability` is a sibling verdict for render/serve readiness (`available` / `partial` /
|
|
233
|
+
`unavailable` / `unknown`) that a missing render or an un-refetched `ipfs`/`arweave`/`url` locator
|
|
234
|
+
moves, while `ok` stays unaffected by design. Report both, never collapse one into the other.
|
|
235
|
+
`abx verify` also flags whether the project's stored `tokenURIRenderer`/generator pointers are the
|
|
236
|
+
CURRENT canonical singletons — a `false` here means an older-but-working deployment (or a fully
|
|
237
|
+
custom one), never "broken".
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# First-party services and feedback
|
|
2
|
+
|
|
3
|
+
Use this reference for the public ABX service, API-key login, hosted resolver/rendering, or feedback.
|
|
4
|
+
For provider-independent hosting and migration, also read [hosting.md](hosting.md).
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- [First-party service](#first-party-service)
|
|
9
|
+
- [Creator wallet and sponsorship](#creator-wallet-and-sponsorship)
|
|
10
|
+
- [Feedback targets](#feedback-targets)
|
|
11
|
+
|
|
12
|
+
## First-party service
|
|
13
|
+
|
|
14
|
+
The documented endpoints are:
|
|
15
|
+
|
|
16
|
+
- documentation: `https://docs.abx.io`
|
|
17
|
+
- service catalog, account, and control: `https://services.abx.io`
|
|
18
|
+
- public token data: `https://resolver.abx.io` (discover it from the catalog; do not hardcode it)
|
|
19
|
+
- OAuth discovery: `https://services.abx.io/.well-known/oauth-authorization-server`
|
|
20
|
+
- manual signup fallback: `https://services.abx.io/signup`
|
|
21
|
+
|
|
22
|
+
The first-party provider has the built-in remote name `abx`:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
abx remote abx
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
It needs `ABX_SERVICES_API_KEY` in the project's ignored `.env`; it does not need
|
|
29
|
+
`ABX_REMOTE_ABX_URL`. When the key is absent, use:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
abx auth login
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The CLI starts the OAuth device flow and shows a verified browser URL plus a matching short code.
|
|
36
|
+
The human completes name, email, one-time-code verification, and approval in that browser. The CLI
|
|
37
|
+
polls at the provider-declared interval, receives the API key, and writes it directly to ignored
|
|
38
|
+
`.env` without printing it. The browser never receives the key. Do not ask the human to paste an OTP
|
|
39
|
+
or key into chat. `--no-open` leaves the browser handoff as a link; `--force` is required to replace
|
|
40
|
+
an existing local credential, but does not revoke the displaced provider key. For normal rotation,
|
|
41
|
+
run `abx auth logout` and then `abx auth login`; reserve `--force` for recovery. The CLI refuses
|
|
42
|
+
tracked or unignored `.env` files.
|
|
43
|
+
|
|
44
|
+
The issued API key is long-lived and remains valid until it is revoked. Reuse the stored key across
|
|
45
|
+
tasks and agent sessions; do not start a new login merely because a task or conversation ended. If
|
|
46
|
+
`abx remote abx` authenticates successfully, no login is needed. `abx auth login` also detects an
|
|
47
|
+
already loaded credential and reuses it instead of issuing another.
|
|
48
|
+
|
|
49
|
+
In an agent runner, start `abx auth login --no-open` with a short initial yield or a resumable
|
|
50
|
+
background session. Relay the printed URL and code immediately while that same process keeps polling,
|
|
51
|
+
then resume it after human approval. Do not start another login or add an outer retry loop. If the
|
|
52
|
+
runner cannot yield control while a command waits, ask the human to run the command in their terminal.
|
|
53
|
+
|
|
54
|
+
Logout only for intentional teardown, suspected compromise, deliberate rotation, or to free an
|
|
55
|
+
active-key slot. When revoking, do not only delete the local value:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
abx auth logout # first-party service
|
|
59
|
+
abx auth logout <name> # another OAuth-capable named remote
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Logout discovers the provider's RFC 7009 endpoint, revokes the current key, and only then removes the
|
|
63
|
+
matching `.env` assignment. If the key came from a shell or another environment source, the CLI
|
|
64
|
+
revokes it and tells the human where it still needs to be unset. A repeated logout with no active
|
|
65
|
+
local credential is safe.
|
|
66
|
+
|
|
67
|
+
An account may have up to five active keys. The service stores hashes, so it can list key metadata
|
|
68
|
+
but cannot recover a lost secret. Use `abx auth keys` to inspect active keys and
|
|
69
|
+
`abx auth revoke-key <key-id>` to revoke an unused non-current key. Use `abx auth logout` for the
|
|
70
|
+
current key. Only create another key when a separate environment actually needs its own credential.
|
|
71
|
+
|
|
72
|
+
Use `/signup` only as the manual recovery path. It shows the raw key once, so the human—not the
|
|
73
|
+
agent—must place it in `.env`. An already verified email reuses its account and may receive another
|
|
74
|
+
key, subject to the same limit.
|
|
75
|
+
|
|
76
|
+
Availability, pricing, and quotas are service policy rather than protocol guarantees. Confirm current
|
|
77
|
+
terms before making a durable hosting choice and keep the exit route explicit: the same remote-service
|
|
78
|
+
contract supports another provider or a creator-operated resolver/effects deployment.
|
|
79
|
+
|
|
80
|
+
Before depending on hosted behavior, inspect the live descriptor with `abx remote abx`; do not infer
|
|
81
|
+
capabilities from this file. A remote is a provider catalog and may advertise different HTTPS
|
|
82
|
+
origins for token resolution, control, account operations, and creator wallets. Trust the advertised
|
|
83
|
+
interface endpoint, not a guessed hostname. Use `--remote abx` on commands that accept a managed
|
|
84
|
+
resolver and verify the resulting public surfaces as described in [hosting.md](hosting.md).
|
|
85
|
+
|
|
86
|
+
## Creator wallet and sponsorship
|
|
87
|
+
|
|
88
|
+
An account with a verified email can use one persistent ABX creator wallet. The
|
|
89
|
+
`ABX_SERVICES_API_KEY` identifies the account but cannot sign. `--sponsor` discovers the provider's
|
|
90
|
+
`abx-creator-wallet/v1` endpoint and provisions or reuses the wallet. The first sponsored command
|
|
91
|
+
asks the human to match one code and approve a Privy agent grant. The CLI keeps the rotating grant in
|
|
92
|
+
the operating system's credential store and reuses it for up to 30 days, unless the creator revokes
|
|
93
|
+
it first. The request-signing key remains memory-only. A reused grant removes another browser step; it does
|
|
94
|
+
not remove the dry run, transaction summary, or production confirmation.
|
|
95
|
+
|
|
96
|
+
The approval is authority for the agent to use the creator wallet, not approval of one displayed
|
|
97
|
+
transaction. Review each exact network and transaction plan in the terminal. The creator can inspect
|
|
98
|
+
and revoke active grants at `https://services.abx.io/authorize`.
|
|
99
|
+
|
|
100
|
+
Treat the live descriptor and account capabilities as the authority for sponsored networks. The
|
|
101
|
+
public [network table](https://docs.abx.io/docs/reference/deployments) is the human-readable summary,
|
|
102
|
+
but it does not guarantee sponsorship for an account or moment. When the creator has not selected
|
|
103
|
+
another signer, prefer this lane for an eligible testnet operation. For production, prove the flow on
|
|
104
|
+
the paired testnet and repeat the production warning before confirmation. Before using it:
|
|
105
|
+
|
|
106
|
+
1. run `abx auth login` if the account has no API key;
|
|
107
|
+
2. inspect `abx capabilities --json` and the command help;
|
|
108
|
+
3. run the same command with `--dry-run --json`;
|
|
109
|
+
4. summarize the network, creator-wallet address, transaction group, zero value, permanent choices,
|
|
110
|
+
and any experimental or beta status;
|
|
111
|
+
5. repeat with `--sponsor`; if no usable grant exists, give the human the verified URL and code and
|
|
112
|
+
resume the same command after approval.
|
|
113
|
+
|
|
114
|
+
The lane accepts zero-value calls and receipt-dependent staged content groups up to the live network
|
|
115
|
+
and provider policy. ABX does not impose an additional per-transaction gas ceiling. Use
|
|
116
|
+
`abx deploy-contract` for exact already-compiled creation bytecode; its sponsored path calls the
|
|
117
|
+
keyless CREATE2 proxy because provider-backed raw creation is unsupported. The constructor therefore
|
|
118
|
+
sees the proxy as `msg.sender`; use explicit constructor arguments for ownership. ABX does not
|
|
119
|
+
compile or audit it. Never add retries around a sponsored write. An `unknown` outcome means the
|
|
120
|
+
provider may have submitted it: preserve the operation ID and reconcile status before any new send.
|
|
121
|
+
|
|
122
|
+
Sponsorship is optional service policy, not protocol support. `--send`, `--sign`, and `--unsigned`
|
|
123
|
+
remain first-class bring-your-own alternatives. Honor an explicit choice of any of them. If the
|
|
124
|
+
provider does not advertise the chain, the account is ineligible, or the transaction group exceeds
|
|
125
|
+
policy, select one of those lanes rather than refusing the underlying operation. Do not use
|
|
126
|
+
sponsorship on a production network unless the live descriptor, account capabilities, and command
|
|
127
|
+
all explicitly support it. Never infer eligibility merely because the CLI recognizes the lane.
|
|
128
|
+
|
|
129
|
+
## Feedback targets
|
|
130
|
+
|
|
131
|
+
`abx feedback` has two deliberately separate targets:
|
|
132
|
+
|
|
133
|
+
| Intent | Command | Recipient |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| ABX protocol, contracts, CLI, SDK, skill, or docs | `abx feedback` | core ABX team |
|
|
136
|
+
| A remote provider's resolver, rendering, auth, or operations | `abx feedback --remote <name>` | that provider |
|
|
137
|
+
|
|
138
|
+
For first-party hosted-service feedback use `--remote abx`. A third-party remote can advertise the
|
|
139
|
+
optional `abx-service-feedback/v1` interface and operate its own feedback store. Never send
|
|
140
|
+
provider-specific incidents through core feedback merely because both first-party targets currently
|
|
141
|
+
share infrastructure.
|
|
142
|
+
|
|
143
|
+
Discovery and report previews are public. Submission (`--yes`) and `--mine` require the same key
|
|
144
|
+
created by `abx auth login`; login once rather than creating a separate feedback credential. Run the
|
|
145
|
+
command without report flags to inspect its live schema and instructions. To report, provide the
|
|
146
|
+
required structured flags; use `--detail-file` or `--context-file` rather than fragile shell quoting
|
|
147
|
+
for longer content. The CLI shows the exact destination and payload first. Review and redact the
|
|
148
|
+
preview with the human, then repeat with `--yes` only after explicit approval.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Preview core feedback; nothing is sent.
|
|
152
|
+
abx feedback --area cli --kind bug --summary "Concise summary" --detail-file report.md
|
|
153
|
+
|
|
154
|
+
# After the human approves this exact preview.
|
|
155
|
+
abx feedback --area cli --kind bug --summary "Concise summary" --detail-file report.md --yes
|
|
156
|
+
|
|
157
|
+
# Provider-specific preview.
|
|
158
|
+
abx feedback --remote abx --component rendering --kind bug --summary "Concise summary"
|
|
159
|
+
|
|
160
|
+
# Review reports previously submitted with the current key.
|
|
161
|
+
abx feedback --mine
|
|
162
|
+
abx feedback --remote abx --mine
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Do not attach `.env`, credentials, wallet/session URLs, full transcripts, or unrelated source files.
|
|
166
|
+
Prefer the smallest reproduction and relevant version/chain/address context. The API key authenticates
|
|
167
|
+
the reporter; hosted-service entitlement is evaluated separately. It never grants transaction-signing
|
|
168
|
+
authority.
|
|
169
|
+
|
|
170
|
+
Use the CLI instead of hand-written HTTP or retry loops. The device flow already handles pending,
|
|
171
|
+
slow-down, and transient polling responses until its fixed expiry. Treat `401` as missing/invalid credentials,
|
|
172
|
+
`403` as recognized credentials without the required entitlement, and schema/interface errors as a
|
|
173
|
+
request or provider-contract mismatch. Read [diagnose.md](diagnose.md) and make one state transition.
|