@artblocks/abx-cli 0.1.0-alpha.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/LICENSE +21 -0
- package/assets/renderer-scaffold/README.md +59 -0
- package/assets/renderer-scaffold/foundry.toml +15 -0
- package/assets/renderer-scaffold/remappings.txt +3 -0
- package/assets/renderer-scaffold/script/Deploy.s.sol +23 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +123 -0
- package/assets/renderer-scaffold/src/MyTraits.sol +75 -0
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +32 -0
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +26 -0
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +110 -0
- package/dist/config.d.ts +69 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/deps.d.ts +46 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +90 -0
- package/dist/deps.js.map +1 -0
- package/dist/flags.d.ts +25 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +34 -0
- package/dist/flags.js.map +1 -0
- package/dist/inspect.d.ts +48 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +184 -0
- package/dist/inspect.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +5102 -0
- package/dist/main.js.map +1 -0
- package/dist/migrate.d.ts +65 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +180 -0
- package/dist/migrate.js.map +1 -0
- package/dist/mintpage.d.ts +46 -0
- package/dist/mintpage.d.ts.map +1 -0
- package/dist/mintpage.js +461 -0
- package/dist/mintpage.js.map +1 -0
- package/dist/onchain-uri.d.ts +97 -0
- package/dist/onchain-uri.d.ts.map +1 -0
- package/dist/onchain-uri.js +243 -0
- package/dist/onchain-uri.js.map +1 -0
- package/dist/ownerops.d.ts +195 -0
- package/dist/ownerops.d.ts.map +1 -0
- package/dist/ownerops.js +1270 -0
- package/dist/ownerops.js.map +1 -0
- package/dist/provision.d.ts +86 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +372 -0
- package/dist/provision.js.map +1 -0
- package/dist/remote.d.ts +58 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +54 -0
- package/dist/remote.js.map +1 -0
- package/dist/schema.d.ts +15 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +125 -0
- package/dist/schema.js.map +1 -0
- package/dist/series-traits.d.ts +30 -0
- package/dist/series-traits.d.ts.map +1 -0
- package/dist/series-traits.js +103 -0
- package/dist/series-traits.js.map +1 -0
- package/dist/signer.d.ts +80 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +520 -0
- package/dist/signer.js.map +1 -0
- package/dist/upload.d.ts +28 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +41 -0
- package/dist/upload.js.map +1 -0
- package/package.json +55 -0
- package/skill/SKILL.md +304 -0
- package/skill/reference/code-projects.md +211 -0
- package/skill/reference/hosting.md +138 -0
- package/skill/reference/operating.md +116 -0
- package/skill/reference/setup.md +36 -0
- package/skill/reference/troubleshooting.md +28 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { arweaveAddress, generateArweaveJwk, } from '@artblocks/abx-storage';
|
|
4
|
+
import { resolveChain, DEFAULT_CHAIN_KEY, resolveFactory, resolveSeriesFactory, resolveRenderer, resolveChunkStore, resolveFixedPriceMinter, envSigningKey, } from '@artblocks/abx-sdk';
|
|
5
|
+
/**
|
|
6
|
+
* Runtime resolution for the CLI — deliberately **stateless about decisions**. There is no
|
|
7
|
+
* tool-written config file: every choice is resolved fresh per invocation from explicit flags,
|
|
8
|
+
* the operator's environment, and shipped constants, so a command's behavior is a pure function
|
|
9
|
+
* of its inputs (nothing a previous command silently mutated feeds a later one).
|
|
10
|
+
*
|
|
11
|
+
* - Canonical infra (factory / renderer / chunk store): resolved from the SDK's shipped
|
|
12
|
+
* {@link resolveFactory} manifest, overridable by flag or env. See `@artblocks/abx-sdk` deployments.
|
|
13
|
+
* - Storage backend + non-secret settings: resolved here as **override → env → default**.
|
|
14
|
+
* - Secrets (signing keys, S3 creds, the Pinata JWT, the Arweave key): env / the key file only.
|
|
15
|
+
*
|
|
16
|
+
* The only thing that persists on disk is the project-local, chain-rebuildable projection
|
|
17
|
+
* (the indexer's SQLite store under the data dir) — that's DATA, not config.
|
|
18
|
+
*/
|
|
19
|
+
const CHAIN = process.env.ABX_CHAIN ?? DEFAULT_CHAIN_KEY;
|
|
20
|
+
const chainId = () => resolveChain(CHAIN).id;
|
|
21
|
+
export function dataDir() {
|
|
22
|
+
return process.env.ABX_DATA_DIR ?? resolve(process.cwd(), '.abx-self-host');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether `baseUrl` is a localhost/loopback address — a URL that, once baked into an on-chain
|
|
26
|
+
* `tokenURI`/`contractURI`, resolves for NO ONE off this machine. The single source of truth for
|
|
27
|
+
* the off-chain-deploy refusal shared by `deploy`, `deploy-series`, and `deploy-code` (previously
|
|
28
|
+
* duplicated inline — that drift is exactly how `deploy-code` shipped without the guard).
|
|
29
|
+
*/
|
|
30
|
+
export function loopbackBaseUrl(baseUrl) {
|
|
31
|
+
return /^https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\])(?:[:/]|$)/i.test(baseUrl);
|
|
32
|
+
}
|
|
33
|
+
// ── canonical infrastructure (shipped manifest → env → flag) ─────────────────
|
|
34
|
+
// Thin CLI wrappers over the SDK resolvers, pinned to the active chain. Return null (not
|
|
35
|
+
// undefined) to read cleanly at call sites (`factoryAddress() ?? 'none'`). `null` means the
|
|
36
|
+
// chain isn't shipped and nothing was declared — the deploy/owner-ops path deploys + prints one.
|
|
37
|
+
/** Canonical clone factory for the active chain — flag override → `ABX_FACTORY` → manifest. */
|
|
38
|
+
export function factoryAddress(override) {
|
|
39
|
+
return resolveFactory(chainId(), override) ?? null;
|
|
40
|
+
}
|
|
41
|
+
/** Canonical Series clone factory — flag override → `ABX_SERIES_FACTORY` → manifest. */
|
|
42
|
+
export function seriesFactoryAddress(override) {
|
|
43
|
+
return resolveSeriesFactory(chainId(), override) ?? null;
|
|
44
|
+
}
|
|
45
|
+
/** Canonical on-chain metadata renderer — flag override → `ABX_RENDERER` → manifest. */
|
|
46
|
+
export function rendererAddress(override) {
|
|
47
|
+
return resolveRenderer(chainId(), override) ?? null;
|
|
48
|
+
}
|
|
49
|
+
/** Canonical multi-chunk on-chain content store — flag override → `ABX_CHUNK_STORE` → manifest. */
|
|
50
|
+
export function chunkStoreAddress(override) {
|
|
51
|
+
return resolveChunkStore(chainId(), override) ?? null;
|
|
52
|
+
}
|
|
53
|
+
/** Canonical shared fixed-price minter — flag override → `ABX_FIXED_PRICE_MINTER` → manifest. */
|
|
54
|
+
export function fixedPriceMinterAddress(override) {
|
|
55
|
+
return resolveFixedPriceMinter(chainId(), override) ?? null;
|
|
56
|
+
}
|
|
57
|
+
/** Resolve the storage-signer lane: flag → `ABX_STORAGE_SIGNER` → default `arweave`. */
|
|
58
|
+
export function storageSignerChoice(ov = {}) {
|
|
59
|
+
const v = ov.storageSigner ?? process.env.ABX_STORAGE_SIGNER;
|
|
60
|
+
return v === 'eth' ? 'eth' : 'arweave';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build the storage backend options the SDK needs, resolving **explicit override → env →
|
|
64
|
+
* default** for non-secret values; secrets come from env only. No persisted config layer — a
|
|
65
|
+
* flag or a declared env var is the only way to choose a backend, so nothing is hidden.
|
|
66
|
+
*/
|
|
67
|
+
export function storageOptions(ov = {}) {
|
|
68
|
+
const backend = ov.backend ?? process.env.ABX_STORAGE_BACKEND ?? 'fs';
|
|
69
|
+
const opts = { backend, dataDir: dataDir() };
|
|
70
|
+
if (backend === 'cloud' || backend === 's3') {
|
|
71
|
+
opts.cloud = {
|
|
72
|
+
endpoint: ov.endpoint ?? process.env.ABX_S3_ENDPOINT ?? '',
|
|
73
|
+
bucket: ov.bucket ?? process.env.ABX_S3_BUCKET ?? '',
|
|
74
|
+
region: ov.region ?? process.env.ABX_S3_REGION ?? 'auto',
|
|
75
|
+
prefix: ov.prefix ?? process.env.ABX_S3_PREFIX ?? 'abx/content/',
|
|
76
|
+
accessKeyId: process.env.ABX_S3_ACCESS_KEY_ID ?? '', // secret: env only
|
|
77
|
+
secretAccessKey: process.env.ABX_S3_SECRET_ACCESS_KEY ?? '', // secret: env only
|
|
78
|
+
service: 's3',
|
|
79
|
+
publicBase: ov.publicBase ?? process.env.ABX_S3_PUBLIC_BASE,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
else if (backend === 'ipfs') {
|
|
83
|
+
const mode = (ov.mode ?? process.env.ABX_IPFS_MODE ?? (process.env.PINATA_JWT ? 'pinata' : 'kubo'));
|
|
84
|
+
opts.ipfs = {
|
|
85
|
+
mode,
|
|
86
|
+
gateway: ov.gateway ?? process.env.ABX_IPFS_GATEWAY ?? (mode === 'pinata' ? 'https://gateway.pinata.cloud' : 'http://127.0.0.1:8080'),
|
|
87
|
+
apiUrl: ov.apiUrl ?? process.env.ABX_IPFS_API_URL ?? 'http://127.0.0.1:5001',
|
|
88
|
+
pinataEndpoint: process.env.ABX_PINATA_ENDPOINT ?? 'https://api.pinata.cloud',
|
|
89
|
+
pinataJwt: process.env.PINATA_JWT, // secret: env only
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else if (backend === 'arweave') {
|
|
93
|
+
const uploadUrl = ov.uploadUrl ?? process.env.ABX_ARWEAVE_UPLOAD_URL;
|
|
94
|
+
// Default to Turbo (free <100 KiB, fiat top-up above); an explicit upload endpoint implies
|
|
95
|
+
// the http-bundler escape hatch. Explicit --provider always wins.
|
|
96
|
+
const provider = (ov.provider ?? process.env.ABX_ARWEAVE_PROVIDER ?? (uploadUrl ? 'http-bundler' : 'turbo'));
|
|
97
|
+
// Turbo identity: default the CLI-managed Arweave key; `--storage-signer eth` reuses the .env
|
|
98
|
+
// EVM signing key so credits funded on that wallet's Turbo balance are spendable here. The eth
|
|
99
|
+
// key takes precedence in the storage layer, so only set it when that lane is chosen.
|
|
100
|
+
const useEth = provider === 'turbo' && storageSignerChoice(ov) === 'eth';
|
|
101
|
+
const managedTurbo = provider === 'turbo' && !useEth;
|
|
102
|
+
opts.arweave = {
|
|
103
|
+
provider,
|
|
104
|
+
gateway: ov.gateway ?? process.env.ABX_ARWEAVE_GATEWAY ?? 'https://arweave.net',
|
|
105
|
+
uploadUrl,
|
|
106
|
+
token: process.env.ARWEAVE_UPLOAD_TOKEN, // secret: env only (http-bundler)
|
|
107
|
+
jwk: managedTurbo ? loadArweaveJwk() : undefined, // secret: LOAD-only (reads/serve must never mint a key)
|
|
108
|
+
// Mint-on-first-WRITE: the backend invokes this ONLY when an upload actually runs and no key
|
|
109
|
+
// exists yet — so `deploy-code --backend arweave` (and any upload) "just works" with no setup
|
|
110
|
+
// step, while serve/verify/doctor never create a key. Prints one notice on creation.
|
|
111
|
+
ensureJwk: managedTurbo ? ensureManagedArweaveJwk : undefined,
|
|
112
|
+
ethSignerKey: useEth ? envSigningKey() : undefined, // secret: env only (the hot signing key)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return opts;
|
|
116
|
+
}
|
|
117
|
+
/** The active backend id, for display (no secrets, no construction). */
|
|
118
|
+
export function activeBackendId() {
|
|
119
|
+
return process.env.ABX_STORAGE_BACKEND ?? 'fs';
|
|
120
|
+
}
|
|
121
|
+
/** Resolve the active backend id + where it came from — for transparent readouts. */
|
|
122
|
+
export function backendResolution(ov = {}) {
|
|
123
|
+
if (ov.backend)
|
|
124
|
+
return { backend: ov.backend, source: 'flag' };
|
|
125
|
+
if (process.env.ABX_STORAGE_BACKEND)
|
|
126
|
+
return { backend: process.env.ABX_STORAGE_BACKEND, source: 'env' };
|
|
127
|
+
return { backend: 'fs', source: 'default' };
|
|
128
|
+
}
|
|
129
|
+
// ── Arweave (Turbo) identity ─────────────────────────────────────────────────
|
|
130
|
+
// The Turbo provider signs uploads with — and holds prepaid credits on — a single persistent
|
|
131
|
+
// Arweave key. It's the one wallet reused across every upload and project, so leftover credits
|
|
132
|
+
// are always there next time. We keep it next to the projection (gitignored), never collected in
|
|
133
|
+
// chat. A managed key is the default; bring your own with ARWEAVE_JWK (inline secret) or
|
|
134
|
+
// ABX_ARWEAVE_KEY_FILE (a path to your own JWK).
|
|
135
|
+
function arweaveKeyFile() {
|
|
136
|
+
return process.env.ABX_ARWEAVE_KEY_FILE ?? resolve(dataDir(), 'arweave-key.json');
|
|
137
|
+
}
|
|
138
|
+
/** Where the managed Turbo identity lives — for display ("back this up"). */
|
|
139
|
+
export function arweaveKeyFilePath() {
|
|
140
|
+
return arweaveKeyFile();
|
|
141
|
+
}
|
|
142
|
+
function parseJwk(raw) {
|
|
143
|
+
const text = raw.trim().startsWith('{') ? raw : Buffer.from(raw, 'base64').toString('utf8');
|
|
144
|
+
return JSON.parse(text);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Load the Turbo identity if one exists — env inline secret, an explicit key-file path, or the
|
|
148
|
+
* managed location. **Never creates** (read-only paths like `serve`/`status` must not mint a key)
|
|
149
|
+
* and **never silently replaces** a corrupt key (that would strand its credits) — a bad key throws.
|
|
150
|
+
*/
|
|
151
|
+
export function loadArweaveJwk() {
|
|
152
|
+
if (process.env.ARWEAVE_JWK)
|
|
153
|
+
return parseJwk(process.env.ARWEAVE_JWK);
|
|
154
|
+
const p = arweaveKeyFile();
|
|
155
|
+
if (existsSync(p))
|
|
156
|
+
return JSON.parse(readFileSync(p, 'utf8'));
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
/** Load or CREATE the managed Turbo identity, persisting a fresh key (0600) to the data dir. */
|
|
160
|
+
export function ensureArweaveJwk() {
|
|
161
|
+
const p = arweaveKeyFile();
|
|
162
|
+
const existing = loadArweaveJwk();
|
|
163
|
+
if (existing)
|
|
164
|
+
return { jwk: existing, address: arweaveAddress(existing), created: false, path: p };
|
|
165
|
+
const jwk = generateArweaveJwk();
|
|
166
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
167
|
+
writeFileSync(p, JSON.stringify(jwk), { mode: 0o600 });
|
|
168
|
+
return { jwk, address: arweaveAddress(jwk), created: true, path: p };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The write-path mint hook the Arweave backend calls on a first upload with no identity yet (wired
|
|
172
|
+
* into {@link storageOptions} as `arweave.ensureJwk`). Mints + persists the managed key and prints
|
|
173
|
+
* ONE notice on creation — the key holds the prepaid Turbo upload credits, so it's worth backing up.
|
|
174
|
+
* Read paths (serve/verify/doctor) never reach this — the backend only calls it inside `put`.
|
|
175
|
+
*/
|
|
176
|
+
function ensureManagedArweaveJwk() {
|
|
177
|
+
const r = ensureArweaveJwk();
|
|
178
|
+
if (r.created) {
|
|
179
|
+
console.log(` created a managed Arweave upload identity ${r.address}\n` +
|
|
180
|
+
` ${r.path} — it holds your Turbo upload credits; back it up: \`abx storage backup-key --out <path>\``);
|
|
181
|
+
}
|
|
182
|
+
return r.jwk;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/deps.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type Address, type DependencyReadClient, type Hex, type ParsedDependencyRef, type RegistryDependencyDetails } from '@artblocks/abx-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Parse the accumulated `--dep` flag value (repeats comma-join — see flags.ts — and each
|
|
4
|
+
* value may itself be comma-separated) into ordered refs. Order is load-bearing: the first
|
|
5
|
+
* ref becomes dependency index 0 — the runtime, by convention.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseDepFlag(value: string | undefined): ParsedDependencyRef[];
|
|
8
|
+
/**
|
|
9
|
+
* The registry pointer a deploy with ≥1 Registry-resolution dep should set: an explicit
|
|
10
|
+
* `--dep-registry` wins (validated), else the chain's known AB registry (env-overridable),
|
|
11
|
+
* else none — the caller WARNS and skips the leg (soft pointer; the resolver falls back to
|
|
12
|
+
* its built-in CDN map). Never a blocker.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveDepRegistryPointer(flagValue: string | undefined, chainId: number): {
|
|
15
|
+
registry: Address | null;
|
|
16
|
+
source: 'flag' | 'default' | 'none';
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The dependency legs of the setup multicall: one `setDependency(i, resolution, ref)` per
|
|
20
|
+
* dep in index order, plus the `setDependencyRegistry` leg when a pointer resolved. These
|
|
21
|
+
* ride the SAME atomic setup multicall as script chunks/schemas/mints, in every signing lane.
|
|
22
|
+
*/
|
|
23
|
+
export declare function dependencySetupCalls(deps: ParsedDependencyRef[], registry: Address | null): Hex[];
|
|
24
|
+
/** One dep's selection-time verdict (Registry-resolution deps only — OnChain refs never touch a registry). */
|
|
25
|
+
export type DepCheck = {
|
|
26
|
+
dep: string;
|
|
27
|
+
status: 'found';
|
|
28
|
+
details: RegistryDependencyDetails;
|
|
29
|
+
} | {
|
|
30
|
+
dep: string;
|
|
31
|
+
status: 'not-found';
|
|
32
|
+
} | {
|
|
33
|
+
dep: string;
|
|
34
|
+
status: 'skipped';
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Best-effort existence/on-chain-ness check of every Registry-resolution dep against the
|
|
38
|
+
* pointer registry. A revert or an empty record ⇒ `not-found` (a warning — the owner may
|
|
39
|
+
* intend a custom registry). A transport failure ⇒ the remaining checks are `skipped` and
|
|
40
|
+
* `rpcOk: false` — one info line, never an error: the deploy proceeds regardless.
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkRegistryDeps(client: DependencyReadClient, registry: Address, deps: ParsedDependencyRef[]): Promise<{
|
|
43
|
+
checks: DepCheck[];
|
|
44
|
+
rpcOk: boolean;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAOA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,GAAG,EACR,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC/B,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAW7E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,GACd;IAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAAC,CASjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,GAAG,EAAE,CAQjG;AAED,8GAA8G;AAC9G,MAAM,MAAM,QAAQ,GAChB;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAC,GAClE;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAC,GAClC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,CAAC;AAErC;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,mBAAmB,EAAE,GAC1B,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAC,CAAC,CAyB/C"}
|
package/dist/deps.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The deploy-time dependency lane for `abx deploy-code` — pure flag parsing, registry-pointer
|
|
3
|
+
* defaulting, and setup-multicall leg composition (all unit-testable, no network), plus the
|
|
4
|
+
* BEST-EFFORT selection-time registry check (an eth_call per Registry dep; never blocks a
|
|
5
|
+
* deploy). See specs/protocol/dependency-registry.md — the pointer is soft and non-validating.
|
|
6
|
+
*/
|
|
7
|
+
import { encodeFunctionData } from 'viem';
|
|
8
|
+
import { DEP_RESOLUTION, parseDependencyRef, readRegistryDependency, resolveDependencyRegistry, seriesCodeAbi, } from '@artblocks/abx-sdk';
|
|
9
|
+
/**
|
|
10
|
+
* Parse the accumulated `--dep` flag value (repeats comma-join — see flags.ts — and each
|
|
11
|
+
* value may itself be comma-separated) into ordered refs. Order is load-bearing: the first
|
|
12
|
+
* ref becomes dependency index 0 — the runtime, by convention.
|
|
13
|
+
*/
|
|
14
|
+
export function parseDepFlag(value) {
|
|
15
|
+
if (value === 'true')
|
|
16
|
+
throw new Error('--dep needs a ref: name@version (e.g. p5@1.0.0) or 0x… (an on-chain data contract)');
|
|
17
|
+
// `--dep none` (or empty) means ZERO dependencies — the explicit "no libraries" sentinel (a
|
|
18
|
+
// dependency-free vanilla-JS or renderer-only drop). Without this, "none" was parsed as a registry
|
|
19
|
+
// ref literally named "none" → a bogus setDependency leg + a "not found on registry" warning.
|
|
20
|
+
if (value === 'none')
|
|
21
|
+
return [];
|
|
22
|
+
return String(value ?? '')
|
|
23
|
+
.split(',')
|
|
24
|
+
.map((s) => s.trim())
|
|
25
|
+
.filter((s) => s && s.toLowerCase() !== 'none')
|
|
26
|
+
.map(parseDependencyRef);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The registry pointer a deploy with ≥1 Registry-resolution dep should set: an explicit
|
|
30
|
+
* `--dep-registry` wins (validated), else the chain's known AB registry (env-overridable),
|
|
31
|
+
* else none — the caller WARNS and skips the leg (soft pointer; the resolver falls back to
|
|
32
|
+
* its built-in CDN map). Never a blocker.
|
|
33
|
+
*/
|
|
34
|
+
export function resolveDepRegistryPointer(flagValue, chainId) {
|
|
35
|
+
if (flagValue !== undefined) {
|
|
36
|
+
if (flagValue === 'true' || !/^0x[0-9a-fA-F]{40}$/.test(flagValue)) {
|
|
37
|
+
throw new Error(`--dep-registry must be an address (0x + 40 hex); got '${flagValue}'`);
|
|
38
|
+
}
|
|
39
|
+
return { registry: flagValue, source: 'flag' };
|
|
40
|
+
}
|
|
41
|
+
const known = resolveDependencyRegistry(chainId);
|
|
42
|
+
return known ? { registry: known, source: 'default' } : { registry: null, source: 'none' };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The dependency legs of the setup multicall: one `setDependency(i, resolution, ref)` per
|
|
46
|
+
* dep in index order, plus the `setDependencyRegistry` leg when a pointer resolved. These
|
|
47
|
+
* ride the SAME atomic setup multicall as script chunks/schemas/mints, in every signing lane.
|
|
48
|
+
*/
|
|
49
|
+
export function dependencySetupCalls(deps, registry) {
|
|
50
|
+
const calls = deps.map((d, i) => encodeFunctionData({ abi: seriesCodeAbi, functionName: 'setDependency', args: [BigInt(i), d.resolution, d.ref] }));
|
|
51
|
+
if (deps.length && registry) {
|
|
52
|
+
calls.push(encodeFunctionData({ abi: seriesCodeAbi, functionName: 'setDependencyRegistry', args: [registry] }));
|
|
53
|
+
}
|
|
54
|
+
return calls;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Best-effort existence/on-chain-ness check of every Registry-resolution dep against the
|
|
58
|
+
* pointer registry. A revert or an empty record ⇒ `not-found` (a warning — the owner may
|
|
59
|
+
* intend a custom registry). A transport failure ⇒ the remaining checks are `skipped` and
|
|
60
|
+
* `rpcOk: false` — one info line, never an error: the deploy proceeds regardless.
|
|
61
|
+
*/
|
|
62
|
+
export async function checkRegistryDeps(client, registry, deps) {
|
|
63
|
+
const registryDeps = deps.filter((d) => d.resolution === DEP_RESOLUTION.registry);
|
|
64
|
+
const checks = [];
|
|
65
|
+
let rpcOk = true;
|
|
66
|
+
for (const d of registryDeps) {
|
|
67
|
+
if (!rpcOk) {
|
|
68
|
+
checks.push({ dep: d.display, status: 'skipped' });
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const details = await readRegistryDependency(client, registry, d.ref);
|
|
73
|
+
checks.push(details ? { dep: d.display, status: 'found', details } : { dep: d.display, status: 'not-found' });
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
// A contract revert means the registry answered "no such dependency"; anything else
|
|
77
|
+
// (DNS, timeout, HTTP) means we couldn't ask — degrade to skipped, not failed.
|
|
78
|
+
const msg = `${e.name ?? ''} ${e.message ?? ''}`;
|
|
79
|
+
if (/ContractFunction|revert|returned no data/i.test(msg)) {
|
|
80
|
+
checks.push({ dep: d.display, status: 'not-found' });
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
rpcOk = false;
|
|
84
|
+
checks.push({ dep: d.display, status: 'skipped' });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { checks, rpcOk };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=deps.js.map
|
package/dist/deps.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
|
package/dist/flags.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI flag parsing — `--k v` / `--k=v` / bare `--k` (→ 'true'). Extracted from main.ts so
|
|
3
|
+
* the parse rules are unit-testable (importing main executes the CLI).
|
|
4
|
+
*
|
|
5
|
+
* Repeated flags normally overwrite (last one wins); the flags in {@link REPEATABLE_FLAGS}
|
|
6
|
+
* instead ACCUMULATE comma-joined, so `--dep a --dep b` ≡ `--dep a,b` — order preserved
|
|
7
|
+
* (load-bearing for dependencies: index 0 = the runtime). `--schema` accumulates too, so
|
|
8
|
+
* `--schema a --schema b` ≡ `--schema a,b` — without this a second `--schema` silently drops
|
|
9
|
+
* the first (a real footgun on a multi-param drop; a Select's options use `|` not `,`, so the
|
|
10
|
+
* comma-join never collides with an option list).
|
|
11
|
+
*/
|
|
12
|
+
export type Flags = Record<string, string | undefined>;
|
|
13
|
+
/** Flags where every occurrence counts (values comma-join, in argv order). */
|
|
14
|
+
export declare const REPEATABLE_FLAGS: ReadonlySet<string>;
|
|
15
|
+
export declare function parseFlags(args: string[]): Flags;
|
|
16
|
+
/**
|
|
17
|
+
* The flag keys in `flags` that are NOT in `allowed` — for a non-fatal "unrecognized flag"
|
|
18
|
+
* notice at a command's entry. {@link parseFlags} keeps any `--k` it sees, so a typo'd or
|
|
19
|
+
* unsupported flag otherwise no-ops INVISIBLY (a creator who passes `--description` to a
|
|
20
|
+
* command that doesn't take it walks away believing it worked). Warn, don't throw: the
|
|
21
|
+
* allowlist could be incomplete, and a false warning on a valid flag must never break a
|
|
22
|
+
* scripted deploy (owner's stateless/scriptable line — see cli-ux-decisions).
|
|
23
|
+
*/
|
|
24
|
+
export declare function unknownFlags(flags: Flags, allowed: Iterable<string>): string[];
|
|
25
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEvD,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA8B,CAAC;AAEhF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAchD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAG9E"}
|
package/dist/flags.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Flags where every occurrence counts (values comma-join, in argv order). */
|
|
2
|
+
export const REPEATABLE_FLAGS = new Set(['dep', 'schema']);
|
|
3
|
+
export function parseFlags(args) {
|
|
4
|
+
const out = {};
|
|
5
|
+
const set = (k, v) => {
|
|
6
|
+
out[k] = REPEATABLE_FLAGS.has(k) && out[k] !== undefined ? `${out[k]},${v}` : v;
|
|
7
|
+
};
|
|
8
|
+
for (let i = 0; i < args.length; i++) {
|
|
9
|
+
const a = args[i];
|
|
10
|
+
if (!a.startsWith('--'))
|
|
11
|
+
continue;
|
|
12
|
+
const eq = a.indexOf('=');
|
|
13
|
+
if (eq !== -1)
|
|
14
|
+
set(a.slice(2, eq), a.slice(eq + 1));
|
|
15
|
+
else if (args[i + 1] && !args[i + 1].startsWith('--'))
|
|
16
|
+
set(a.slice(2), args[++i]);
|
|
17
|
+
else
|
|
18
|
+
set(a.slice(2), 'true');
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The flag keys in `flags` that are NOT in `allowed` — for a non-fatal "unrecognized flag"
|
|
24
|
+
* notice at a command's entry. {@link parseFlags} keeps any `--k` it sees, so a typo'd or
|
|
25
|
+
* unsupported flag otherwise no-ops INVISIBLY (a creator who passes `--description` to a
|
|
26
|
+
* command that doesn't take it walks away believing it worked). Warn, don't throw: the
|
|
27
|
+
* allowlist could be incomplete, and a false warning on a valid flag must never break a
|
|
28
|
+
* scripted deploy (owner's stateless/scriptable line — see cli-ux-decisions).
|
|
29
|
+
*/
|
|
30
|
+
export function unknownFlags(flags, allowed) {
|
|
31
|
+
const ok = new Set(allowed);
|
|
32
|
+
return Object.keys(flags).filter((k) => !ok.has(k));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAaA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEhF,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACnC,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC/C,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC7E,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,OAAyB;IAClE,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `abx inspect <script.js>` — static analysis of a generative script, BEFORE picking a lane.
|
|
3
|
+
*
|
|
4
|
+
* The membrane fix behind this: an agent (or creator) should DERIVE the deployment lane from what
|
|
5
|
+
* the script actually needs — are there traits? are they reproducible on-chain? how big is the
|
|
6
|
+
* assembled document (does a single `tokenURI` eth_call even fit)? — instead of guessing "fully
|
|
7
|
+
* on-chain!" and walking it back. This module is the pure analysis; `cmdInspect` formats it.
|
|
8
|
+
*
|
|
9
|
+
* Static only — it never executes the script (that's the resolver/runner's job, and executing
|
|
10
|
+
* untrusted art in the CLI would be a footgun). Everything here is regex/heuristic over the source.
|
|
11
|
+
*/
|
|
12
|
+
export type TraitFeasibility = 'none' | 'exact-likely' | 'careful' | 'infeasible' | 'unknown';
|
|
13
|
+
export interface ScriptAnalysis {
|
|
14
|
+
bytes: number;
|
|
15
|
+
estChunks: number;
|
|
16
|
+
traits: {
|
|
17
|
+
present: boolean;
|
|
18
|
+
keys: string[];
|
|
19
|
+
};
|
|
20
|
+
paramHints: string[];
|
|
21
|
+
prng: {
|
|
22
|
+
seeded: boolean;
|
|
23
|
+
usesBareRandom: boolean;
|
|
24
|
+
usesMathRandom: boolean;
|
|
25
|
+
usesNoise: boolean;
|
|
26
|
+
};
|
|
27
|
+
depHints: string[];
|
|
28
|
+
looksP5: boolean;
|
|
29
|
+
feasibility: {
|
|
30
|
+
verdict: TraitFeasibility;
|
|
31
|
+
reason: string;
|
|
32
|
+
};
|
|
33
|
+
doc: {
|
|
34
|
+
estBytes: number;
|
|
35
|
+
deps: string[];
|
|
36
|
+
fitsSingleCall: boolean;
|
|
37
|
+
unknownDepSizes: boolean;
|
|
38
|
+
};
|
|
39
|
+
runtime: {
|
|
40
|
+
readsTokenData: boolean;
|
|
41
|
+
reportsTraits: boolean;
|
|
42
|
+
wrongGlobal: string | null;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare function analyzeScript(source: string, declaredDeps?: string[]): ScriptAnalysis;
|
|
46
|
+
/** A one-line lane recommendation derived from the analysis (the decision-tree output). */
|
|
47
|
+
export declare function recommendLane(a: ScriptAnalysis): string;
|
|
48
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAC,CAAC;IAC9F,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE;QAAC,OAAO,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IACzD,GAAG,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAC,CAAC;IAM3F,OAAO,EAAE;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAC;CACxF;AAsDD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,cAAc,CAqEzF;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CA0BvD"}
|