@artblocks/abx-token-api 0.1.0-alpha.2 → 0.1.0-alpha.20
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/dist/code.d.ts +33 -12
- package/dist/code.d.ts.map +1 -1
- package/dist/code.js +45 -55
- package/dist/code.js.map +1 -1
- package/dist/{art.d.ts → content.d.ts} +5 -5
- package/dist/content.d.ts.map +1 -0
- package/dist/{art.js → content.js} +6 -6
- package/dist/content.js.map +1 -0
- package/dist/control-plane.d.ts +85 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +721 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/dashboard.d.ts +1 -1
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +39 -16
- package/dist/dashboard.js.map +1 -1
- package/dist/deps.d.ts +28 -110
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +34 -184
- package/dist/deps.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +29 -2
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +298 -104
- package/dist/metadata.js.map +1 -1
- package/dist/resolve.d.ts +0 -2
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +0 -5
- package/dist/resolve.js.map +1 -1
- package/dist/server.d.ts +4 -27
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +251 -418
- package/dist/server.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +137 -8
- package/dist/watcher.js.map +1 -1
- package/package.json +4 -4
- package/dist/abxjs.d.ts +0 -13
- package/dist/abxjs.d.ts.map +0 -1
- package/dist/abxjs.js +0 -49
- package/dist/abxjs.js.map +0 -1
- package/dist/art.d.ts.map +0 -1
- package/dist/art.js.map +0 -1
- package/dist/inline.d.ts +0 -19
- package/dist/inline.d.ts.map +0 -1
- package/dist/inline.js +0 -23
- package/dist/inline.js.map +0 -1
package/dist/deps.js
CHANGED
|
@@ -1,188 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { codeField } from '@artblocks/abx-sdk';
|
|
4
|
-
import { escapeInlineScript } from './inline.js';
|
|
1
|
+
import { activeRegistry, codeField, dependencyScriptTags as sdkDependencyScriptTags, DEPENDENCY_REGISTRY_ABI, registryDepUrl, resetRegistryDependencyCache, resolveRegistryDep as sdkResolveRegistryDep, URL_BUDGET_BYTES, } from '@artblocks/abx-sdk';
|
|
2
|
+
import { nodeInflate } from '@artblocks/abx-sdk/node';
|
|
5
3
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* The resolver-only half of the dependency-registry lane: the query-string size budget and the
|
|
5
|
+
* directory-serving observability surface that `GET /api/deps/:chainId/:addr` reports.
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* The registry-resolution vocabulary itself — `DEPENDENCY_REGISTRY_ABI`, `activeRegistry`,
|
|
8
|
+
* `resolveRegistryDep`, `registryDepUrl`, `dependencyScriptTags`, `URL_BUDGET_BYTES` — moved to
|
|
9
|
+
* `@artblocks/abx-sdk` (src/deps.ts) in the abx-services integrator ask: it's chain-read +
|
|
10
|
+
* string-assembly logic with no resolver-specific behavior, so a third-party provider or the
|
|
11
|
+
* CLI's offline preview can now share the identical resolution order instead of reimplementing
|
|
12
|
+
* it. This module re-exports that family below, PRE-WIRED with `nodeInflate`
|
|
13
|
+
* (`@artblocks/abx-sdk/node`) — the SDK core takes decompression as an injected `inflate` rather
|
|
14
|
+
* than importing `node:zlib` directly (it has to stay reachable from a browser bundle), and this
|
|
15
|
+
* resolver runs on Node, so the wiring happens once, here, rather than at every call site.
|
|
11
16
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* This module also owns the query-string size budget for URL-carried tokenData (~8KB
|
|
19
|
-
* request-line caps at gateway front-ends). It applies only to the directory 302 fallback
|
|
20
|
-
* — the primary inline-injection path carries tokenData inside the document. Over-budget
|
|
21
|
-
* redirects are still served IN FULL (never silently drop params), but warn loudly — once
|
|
22
|
-
* per project per process, then debug.
|
|
17
|
+
* What stays here: `depStatusReport`'s per-dep status assembly (a read-only dry run of the same
|
|
18
|
+
* resolution the generator document uses, sharing its cache), the query-string budget check +
|
|
19
|
+
* flag (`checkUrlBudget`/`urlBudgetStatus`), and which directory-serving path a live view
|
|
20
|
+
* actually took (`recordDirectoryServe`) — all resolver-serving observability, not resolution
|
|
21
|
+
* rules, so they don't belong in the neutral layer.
|
|
23
22
|
*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{ name: 'additionalCDNCount', type: 'uint24' },
|
|
36
|
-
{ name: 'preferredRepository', type: 'string' },
|
|
37
|
-
{ name: 'additionalRepositoryCount', type: 'uint24' },
|
|
38
|
-
{ name: 'dependencyWebsite', type: 'string' },
|
|
39
|
-
{ name: 'availableOnChain', type: 'bool' },
|
|
40
|
-
{ name: 'scriptCount', type: 'uint24' },
|
|
41
|
-
],
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
type: 'function',
|
|
45
|
-
name: 'getDependencyScript',
|
|
46
|
-
stateMutability: 'view',
|
|
47
|
-
inputs: [
|
|
48
|
-
{ name: 'dependencyNameAndVersion', type: 'bytes32' },
|
|
49
|
-
{ name: 'index', type: 'uint256' },
|
|
50
|
-
],
|
|
51
|
-
outputs: [{ type: 'string' }],
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
// Resolved registry entries are effectively immutable (admin-gated writes), so an in-process
|
|
55
|
-
// cache is safe; the TTL only guards admin updates. Failures negative-cache briefly so a dead
|
|
56
|
-
// registry doesn't cost an eth_call (and a warn) per request.
|
|
57
|
-
const CACHE_TTL_MS = 60 * 60 * 1000; // 1h
|
|
58
|
-
const NEGATIVE_TTL_MS = 60 * 1000; // 1min
|
|
59
|
-
const registryCache = new Map();
|
|
60
|
-
/** Reset all in-process dependency state (cache + budget flags + serve modes) — for tests. */
|
|
23
|
+
export { DEPENDENCY_REGISTRY_ABI, activeRegistry, registryDepUrl, URL_BUDGET_BYTES };
|
|
24
|
+
/** `resolveRegistryDep`, pre-wired with `nodeInflate` — same signature callers here always used. */
|
|
25
|
+
export function resolveRegistryDep(client, registry, dep) {
|
|
26
|
+
return sdkResolveRegistryDep(client, registry, dep, { inflate: nodeInflate });
|
|
27
|
+
}
|
|
28
|
+
/** `dependencyScriptTags`, pre-wired with `nodeInflate` — same signature callers here always used. */
|
|
29
|
+
export function dependencyScriptTags(client, state) {
|
|
30
|
+
return sdkDependencyScriptTags(client, state, { inflate: nodeInflate });
|
|
31
|
+
}
|
|
32
|
+
/** Reset all in-process dependency state (the SDK's registry-resolution cache + this module's
|
|
33
|
+
* budget flags + serve modes) — for tests. */
|
|
61
34
|
export function resetDependencyResolutionState() {
|
|
62
|
-
|
|
35
|
+
resetRegistryDependencyCache();
|
|
63
36
|
budgetFlags.clear();
|
|
64
37
|
directoryServeModes.clear();
|
|
65
38
|
}
|
|
66
|
-
/** The collection's registry pointer, if set to a real address (zero/undefined ⇒ none). */
|
|
67
|
-
export function activeRegistry(state) {
|
|
68
|
-
const registry = state.dependencies?.registry ?? null;
|
|
69
|
-
if (!registry || /^0x0{40}$/i.test(registry))
|
|
70
|
-
return null;
|
|
71
|
-
return registry;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Resolve one `name@version` ref through the collection's registry. Returns the resolution
|
|
75
|
-
* (or null when the registry couldn't answer — caller falls back to the built-in map) plus
|
|
76
|
-
* whether it was served from cache. Never throws; a fresh failure logs ONE warn (the
|
|
77
|
-
* negative cache rate-limits it) naming the dep and why.
|
|
78
|
-
*/
|
|
79
|
-
export async function resolveRegistryDep(client, registry, dep) {
|
|
80
|
-
const key = `${registry.toLowerCase()}|${dep.refDecoded}`;
|
|
81
|
-
const hit = registryCache.get(key);
|
|
82
|
-
if (hit && hit.expiresAt > Date.now()) {
|
|
83
|
-
return { resolution: hit.value, cached: true, error: hit.error };
|
|
84
|
-
}
|
|
85
|
-
try {
|
|
86
|
-
// nameAndVersion rides as readable-ASCII bytes32 — the raw evented ref, right-padded.
|
|
87
|
-
const ref = padHex(dep.ref, { size: 32, dir: 'right' });
|
|
88
|
-
const details = (await client.readContract({
|
|
89
|
-
address: registry,
|
|
90
|
-
abi: DEPENDENCY_REGISTRY_ABI,
|
|
91
|
-
functionName: 'getDependencyDetails',
|
|
92
|
-
args: [ref],
|
|
93
|
-
}));
|
|
94
|
-
const [nameAndVersion, , preferredCDN, , , , , availableOnChain, scriptCount] = details;
|
|
95
|
-
if (availableOnChain && scriptCount > 0) {
|
|
96
|
-
// Per-chunk reads; the concatenated chunk strings form one base64(gzip(script)) stream.
|
|
97
|
-
const chunks = (await Promise.all(Array.from({ length: Number(scriptCount) }, (_, i) => client.readContract({
|
|
98
|
-
address: registry,
|
|
99
|
-
abi: DEPENDENCY_REGISTRY_ABI,
|
|
100
|
-
functionName: 'getDependencyScript',
|
|
101
|
-
args: [ref, BigInt(i)],
|
|
102
|
-
}))));
|
|
103
|
-
const script = gunzipSync(Buffer.from(chunks.join(''), 'base64')).toString('utf8');
|
|
104
|
-
const value = { kind: 'onchain', script };
|
|
105
|
-
registryCache.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
106
|
-
return { resolution: value, cached: false };
|
|
107
|
-
}
|
|
108
|
-
if (preferredCDN) {
|
|
109
|
-
const value = { kind: 'cdn', url: preferredCDN };
|
|
110
|
-
registryCache.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
111
|
-
return { resolution: value, cached: false };
|
|
112
|
-
}
|
|
113
|
-
// An empty struct back means the entry simply isn't registered.
|
|
114
|
-
const why = nameAndVersion
|
|
115
|
-
? 'registered but has neither on-chain bytes nor a preferredCDN'
|
|
116
|
-
: 'not registered in the registry';
|
|
117
|
-
return failResolution(key, dep, registry, why);
|
|
118
|
-
}
|
|
119
|
-
catch (err) {
|
|
120
|
-
return failResolution(key, dep, registry, `registry read failed: ${err.message}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/** Negative-cache a failed resolution + one warn (per negative-TTL window). Never throws. */
|
|
124
|
-
function failResolution(key, dep, registry, why) {
|
|
125
|
-
registryCache.set(key, { value: null, error: why, expiresAt: Date.now() + NEGATIVE_TTL_MS });
|
|
126
|
-
console.warn(`[deps] registry resolution failed for ${dep.refDecoded} via ${registry}: ${why} — falling back to the built-in CDN map`);
|
|
127
|
-
return { resolution: null, cached: false, error: why };
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Resolve a `name@version` registry ref to a CDN URL — the built-in reference convention,
|
|
131
|
-
* the LAST-resort rung of the resolution order (the soft registry pointer stays
|
|
132
|
-
* non-validating). Known runtimes get their real dist paths; anything else is best-effort npm.
|
|
133
|
-
*/
|
|
134
|
-
export function registryDepUrl(ref) {
|
|
135
|
-
const at = ref.lastIndexOf('@');
|
|
136
|
-
if (at <= 0)
|
|
137
|
-
return null;
|
|
138
|
-
const name = ref.slice(0, at);
|
|
139
|
-
const version = ref.slice(at + 1);
|
|
140
|
-
const known = {
|
|
141
|
-
p5js: `https://cdn.jsdelivr.net/npm/p5@${version}/lib/p5.min.js`,
|
|
142
|
-
p5: `https://cdn.jsdelivr.net/npm/p5@${version}/lib/p5.min.js`,
|
|
143
|
-
threejs: `https://cdn.jsdelivr.net/npm/three@${version}/build/three.min.js`,
|
|
144
|
-
three: `https://cdn.jsdelivr.net/npm/three@${version}/build/three.min.js`,
|
|
145
|
-
tonejs: `https://cdn.jsdelivr.net/npm/tone@${version}/build/Tone.js`,
|
|
146
|
-
};
|
|
147
|
-
return known[name] ?? `https://cdn.jsdelivr.net/npm/${name}@${version}`;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* The ordered dependency `<script>` tags for the generator document, each dep resolved per
|
|
151
|
-
* the Consumers table: registry on-chain bytes → registry preferredCDN → built-in map;
|
|
152
|
-
* `onchain`-resolution refs read their SSTORE2 data contract directly (never a registry).
|
|
153
|
-
* Never throws — an unresolvable dep is skipped (after the warn) and the document assembles.
|
|
154
|
-
*/
|
|
155
|
-
export async function dependencyScriptTags(client, state) {
|
|
156
|
-
const registry = activeRegistry(state);
|
|
157
|
-
const tags = [];
|
|
158
|
-
for (const dep of state.dependencies?.list ?? []) {
|
|
159
|
-
if (dep.resolution === 'registry') {
|
|
160
|
-
if (registry) {
|
|
161
|
-
const { resolution } = await resolveRegistryDep(client, registry, dep);
|
|
162
|
-
if (resolution?.kind === 'onchain') {
|
|
163
|
-
tags.push(`<script>${escapeInlineScript(resolution.script)}</script>`);
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
if (resolution?.kind === 'cdn') {
|
|
167
|
-
tags.push(`<script src="${resolution.url}"></script>`);
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
// fell through — resolveRegistryDep already warned; last resort below
|
|
171
|
-
}
|
|
172
|
-
const url = registryDepUrl(dep.refDecoded);
|
|
173
|
-
if (url)
|
|
174
|
-
tags.push(`<script src="${url}"></script>`);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
// on-chain dep: an SSTORE2 data contract holding the JS (code = 0x00 ‖ content)
|
|
178
|
-
const bytecode = await client.getCode({ address: dep.refDecoded });
|
|
179
|
-
if (bytecode && bytecode.length > 4) {
|
|
180
|
-
tags.push(`<script>${escapeInlineScript(Buffer.from(bytecode.slice(4), 'hex').toString('utf8'))}</script>`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return tags;
|
|
185
|
-
}
|
|
186
39
|
// The last directory serve outcome per project (in-process): inline injection is the
|
|
187
40
|
// primary; a redirect only happens when the entry-document fetch failed. /api/deps reports it.
|
|
188
41
|
const directoryServeModes = new Map();
|
|
@@ -191,18 +44,15 @@ export function recordDirectoryServe(address, mode) {
|
|
|
191
44
|
directoryServeModes.set(address.toLowerCase(), { mode, at: new Date().toISOString() });
|
|
192
45
|
}
|
|
193
46
|
// ── the query-string size budget (URL-carried tokenData lanes only) ──────────────
|
|
194
|
-
/** Gateway front-ends commonly cap request lines near 8KB — the spec's URL budget. It
|
|
195
|
-
* applies to URL-carried `?abx=` payloads (the 302 fallback); resolver inline serving
|
|
196
|
-
* injects tokenData into the document and is unaffected. */
|
|
197
|
-
export const URL_BUDGET_BYTES = 8192;
|
|
198
47
|
// Per-project over-budget observations (in-process). First breach warns loudly; repeats
|
|
199
48
|
// drop to debug so a hot token doesn't spam the log once the fact is known.
|
|
200
49
|
const budgetFlags = new Map();
|
|
201
50
|
/**
|
|
202
51
|
* Measure a URL-carried `?abx=` payload (the directory 302 fallback) against the ~8KB
|
|
203
|
-
* budget. The FULL URL is always served —
|
|
204
|
-
* breach visible: a loud structured warn on the
|
|
205
|
-
* process, debug-level after. Inline-injection
|
|
52
|
+
* budget ({@link URL_BUDGET_BYTES}, from `@artblocks/abx-sdk`). The FULL URL is always served —
|
|
53
|
+
* params are never dropped — this only makes the breach visible: a loud structured warn on the
|
|
54
|
+
* first over-budget redirect per project per process, debug-level after. Inline-injection
|
|
55
|
+
* serving never routes through here.
|
|
206
56
|
*/
|
|
207
57
|
export function checkUrlBudget(address, tokenId, redirectUrl) {
|
|
208
58
|
const bytes = Buffer.byteLength(redirectUrl, 'utf8');
|
package/dist/deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @artblocks/abx-token-api — Layer 3 reference token API + byte-custody server.
|
|
3
3
|
*
|
|
4
|
-
* Serves standard ERC-721 / ERC-
|
|
5
|
-
* API, and a demo dashboard — all from
|
|
6
|
-
* URIs point here, so this node is the resolver;
|
|
4
|
+
* Serves standard token metadata (ERC-721 tokenURI / ERC-1155 editions' uri), ERC-7572
|
|
5
|
+
* collection metadata, the token image, a JSON state API, and a demo dashboard — all from
|
|
6
|
+
* the reconstructed projection. The on-chain URIs point here, so this node is the resolver;
|
|
7
|
+
* switching nodes is a repoint.
|
|
7
8
|
*/
|
|
8
9
|
export { createTokenApiServer, startTokenApiServer, resolveBaseUrl, resolveContent, verifyProject, DEFAULT_PORT, type ServerOptions, } from './server.js';
|
|
9
10
|
export { buildTokenMetadata, buildContractMetadata, tokenImageUrl, type DisplayMeta, type FieldProvenance } from './metadata.js';
|
|
10
|
-
export { currentRenderArtifact,
|
|
11
|
-
export { ABX_JS } from '
|
|
12
|
-
export { escapeInlineScript, escapeInlineJson } from './inline.js';
|
|
11
|
+
export { currentRenderArtifact, liveViewEnabled } from './code.js';
|
|
12
|
+
export { ABX_JS, buildGeneratorDocument, escapeInlineJson, escapeInlineScript, injectTokenDataIntoHtml } from '@artblocks/abx-sdk';
|
|
13
13
|
export { depStatusReport, dependencyScriptTags, resolveRegistryDep, registryDepUrl, activeRegistry, urlBudgetStatus, URL_BUDGET_BYTES, DEPENDENCY_REGISTRY_ABI, type DepStatus, type DirectoryServeMode, type RegistryResolution, type ResolvedVia, } from './deps.js';
|
|
14
14
|
export { startChainWatcher, notifyEffects, watchIntervalMs, DEFAULT_WATCH_INTERVAL_MS, type WatcherOptions, type WatcherStatus } from './watcher.js';
|
|
15
|
-
export {
|
|
15
|
+
export { generateContent, contentHash, fallbackImageSvg, IMAGE_MEDIA_TYPE } from './content.js';
|
|
16
16
|
export { renderDashboard } from './dashboard.js';
|
|
17
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAC,MAAM,eAAe,CAAC;AAC/H,OAAO,EAAC,qBAAqB,EAAE,eAAe,EAAC,MAAM,WAAW,CAAC;AAMjE,OAAO,EAAC,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AACjI,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,yBAAyB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAC,MAAM,cAAc,CAAC;AACnJ,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @artblocks/abx-token-api — Layer 3 reference token API + byte-custody server.
|
|
3
3
|
*
|
|
4
|
-
* Serves standard ERC-721 / ERC-
|
|
5
|
-
* API, and a demo dashboard — all from
|
|
6
|
-
* URIs point here, so this node is the resolver;
|
|
4
|
+
* Serves standard token metadata (ERC-721 tokenURI / ERC-1155 editions' uri), ERC-7572
|
|
5
|
+
* collection metadata, the token image, a JSON state API, and a demo dashboard — all from
|
|
6
|
+
* the reconstructed projection. The on-chain URIs point here, so this node is the resolver;
|
|
7
|
+
* switching nodes is a repoint.
|
|
7
8
|
*/
|
|
8
9
|
export { createTokenApiServer, startTokenApiServer, resolveBaseUrl, resolveContent, verifyProject, DEFAULT_PORT, } from './server.js';
|
|
9
10
|
export { buildTokenMetadata, buildContractMetadata, tokenImageUrl } from './metadata.js';
|
|
10
|
-
export { currentRenderArtifact,
|
|
11
|
-
// The runtime companion
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
export { currentRenderArtifact, liveViewEnabled } from './code.js';
|
|
12
|
+
// The generator-document family (the runtime companion, the inline-safety escapes, and the
|
|
13
|
+
// document-shape builders) now lives in `@artblocks/abx-sdk` — the abx-services integrator ask
|
|
14
|
+
// (it's a pure string-ops surface with no resolver-specific behavior; the SDK, the CLI's
|
|
15
|
+
// `abx preview`, and any third-party provider all consume the same one). Re-exported here
|
|
16
|
+
// unchanged: this package's public API is unaffected by where the implementation lives.
|
|
17
|
+
export { ABX_JS, buildGeneratorDocument, escapeInlineJson, escapeInlineScript, injectTokenDataIntoHtml } from '@artblocks/abx-sdk';
|
|
16
18
|
export { depStatusReport, dependencyScriptTags, resolveRegistryDep, registryDepUrl, activeRegistry, urlBudgetStatus, URL_BUDGET_BYTES, DEPENDENCY_REGISTRY_ABI, } from './deps.js';
|
|
17
19
|
export { startChainWatcher, notifyEffects, watchIntervalMs, DEFAULT_WATCH_INTERVAL_MS } from './watcher.js';
|
|
18
|
-
export {
|
|
20
|
+
export { generateContent, contentHash, fallbackImageSvg, IMAGE_MEDIA_TYPE } from './content.js';
|
|
19
21
|
export { renderDashboard } from './dashboard.js';
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,EACb,YAAY,GAEb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAyC,MAAM,eAAe,CAAC;AAC/H,OAAO,EAAC,qBAAqB,EAAE,eAAe,EAAC,MAAM,WAAW,CAAC;AACjE,2FAA2F;AAC3F,+FAA+F;AAC/F,yFAAyF;AACzF,0FAA0F;AAC1F,wFAAwF;AACxF,OAAO,EAAC,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AACjI,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GAKxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAC,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,yBAAyB,EAA0C,MAAM,cAAc,CAAC;AACnJ,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC"}
|
package/dist/metadata.d.ts
CHANGED
|
@@ -44,7 +44,12 @@ export type ProvenanceStatus = 'on-chain' | 'verified' | 'mismatch' | 'anchored'
|
|
|
44
44
|
export interface FieldProvenance {
|
|
45
45
|
field: string;
|
|
46
46
|
source: 'inline' | 'inline-gzip' | 'reader' | 'reader-gzip' | 'renderer' | 'keccak256' | 'sha256' | 'arweave' | 'ipfs' | 'url' | 'url-template' | 'off-chain' | 'fallback' | 'placeholder' | `effect:${string}` | 'live-view';
|
|
47
|
-
|
|
47
|
+
/** NOTE: there is deliberately no `onChain` boolean. It was exactly `status === 'on-chain'`, so it
|
|
48
|
+
* carried no information — and it carried the on-chain renderer's ambiguity with it, where the
|
|
49
|
+
* same field claimed `false` for a `url` (whose URL string IS stored on chain) and `true` for an
|
|
50
|
+
* `inline` value that was itself a pointer. `source` says where the bytes came from and `status`
|
|
51
|
+
* says what was verified about them; whether a given value resolves on chain is visible in the
|
|
52
|
+
* value, and that determination belongs to the reader. */
|
|
48
53
|
status: ProvenanceStatus;
|
|
49
54
|
/** Integrity-anchor kind for off-chain bytes, e.g. `keccak256` — the on-chain hash you verify against. */
|
|
50
55
|
anchor?: 'keccak256' | 'sha256';
|
|
@@ -65,6 +70,9 @@ export interface PlaneArtifactRow {
|
|
|
65
70
|
outputKey: string;
|
|
66
71
|
contentType: string | null;
|
|
67
72
|
locator: string | null;
|
|
73
|
+
/** A BOUND output's content (`specs/protocol/effects.md → Bound vs referenced`) — the bytes that
|
|
74
|
+
* stitch into this JSON, held with the row. `null`/absent for every referenced output. */
|
|
75
|
+
bytes?: Uint8Array | null;
|
|
68
76
|
}
|
|
69
77
|
/** The resolver's read surface over the effect-artifact registry — how the manifest enumerates
|
|
70
78
|
* the plane's effect source without learning any effect's internals. */
|
|
@@ -74,6 +82,24 @@ export interface PlaneAccess {
|
|
|
74
82
|
/** One row by artifact key (the image seam's published-locator check). */
|
|
75
83
|
get(key: string): PlaneArtifactRow | null;
|
|
76
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* The project's preferred gateway prefix per scheme, resolved ONCE per document.
|
|
87
|
+
*
|
|
88
|
+
* The off-chain twin of `AbxMetadataRenderer._gatewayPrefix` (spec v11): the collection's reserved
|
|
89
|
+
* `abx_gateway_ipfs` / `abx_gateway_arweave` field, else this host's env default, else the public
|
|
90
|
+
* floor. Two conforming resolvers given the same chain must emit the same `image`, so the env read
|
|
91
|
+
* is a FLOOR and never an override — a project that stated a preference on chain gets that
|
|
92
|
+
* preference from every resolver, and a host's own gateway only ever fills a silence (which is the
|
|
93
|
+
* only way a managed provider serving a token it does not own can offer a better default).
|
|
94
|
+
*/
|
|
95
|
+
export declare function projectGateways(state: Pick<ProjectState, 'collectionFields'>): GatewayPrefixes;
|
|
96
|
+
/** The two prefixes, threaded through a document build. Required rather than optional wherever it
|
|
97
|
+
* is passed, for the reason {@link resolveText} gives about `tokenAddress`: an optional input that
|
|
98
|
+
* silently disables a whole representation is how the `renderer` branch went missing here once. */
|
|
99
|
+
export interface GatewayPrefixes {
|
|
100
|
+
ipfs: string;
|
|
101
|
+
arweave: string;
|
|
102
|
+
}
|
|
77
103
|
/**
|
|
78
104
|
* The declared-type ladder for a FIELD artifact (`data-plane.md → Declared type, never sniffed`):
|
|
79
105
|
* the representation is the declaration channel — `renderer` returns its contentType from chain;
|
|
@@ -82,7 +108,8 @@ export interface PlaneAccess {
|
|
|
82
108
|
* → `application/octet-stream`, never omitted (the complete-listing rule).
|
|
83
109
|
*/
|
|
84
110
|
export declare function fieldMimeType(client: PublicClient, state: ProjectState, entry: MetadataField, field: string, tokenId: string, display: DisplayMeta, storage?: StorageBackend): Promise<string>;
|
|
85
|
-
/**
|
|
111
|
+
/** Token metadata JSON — the `tokenURI` target (ERC-721) / the `uri(id)` target (ERC-1155
|
|
112
|
+
* editions), assembled identically either way + `abx_provenance` + `artifacts`. */
|
|
86
113
|
export declare function buildTokenMetadata(client: PublicClient, state: ProjectState, token: TokenState, baseUrl: string, chainId: number, display?: DisplayMeta, storage?: StorageBackend, plane?: PlaneAccess): Promise<Record<string, unknown>>;
|
|
87
114
|
/** ERC-7572 collection metadata JSON (the `contractURI` target) + `abx_provenance`. */
|
|
88
115
|
export declare function buildContractMetadata(client: PublicClient, state: ProjectState, baseUrl: string, chainId: number, display?: DisplayMeta, storage?: StorageBackend): Promise<Record<string, unknown>>;
|
package/dist/metadata.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|