@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.41

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.
Files changed (189) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/assets/renderer-scaffold/README.md +41 -11
  3. package/assets/renderer-scaffold/foundry.toml +5 -0
  4. package/assets/renderer-scaffold/remappings.txt +1 -1
  5. package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
  6. package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
  7. package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
  8. package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
  9. package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
  10. package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
  11. package/dist/bin.d.ts +26 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +63 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/capabilities.d.ts +99 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +144 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/commands/auth.d.ts +54 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +447 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/deploy.d.ts +242 -0
  24. package/dist/commands/deploy.d.ts.map +1 -0
  25. package/dist/commands/deploy.js +5429 -0
  26. package/dist/commands/deploy.js.map +1 -0
  27. package/dist/commands/feedback.d.ts +7 -0
  28. package/dist/commands/feedback.d.ts.map +1 -0
  29. package/dist/commands/feedback.js +147 -0
  30. package/dist/commands/feedback.js.map +1 -0
  31. package/dist/commands/maintenance.d.ts +4 -0
  32. package/dist/commands/maintenance.d.ts.map +1 -0
  33. package/dist/commands/maintenance.js +114 -0
  34. package/dist/commands/maintenance.js.map +1 -0
  35. package/dist/commands/project.d.ts +429 -0
  36. package/dist/commands/project.d.ts.map +1 -0
  37. package/dist/commands/project.js +1720 -0
  38. package/dist/commands/project.js.map +1 -0
  39. package/dist/commands/reads.d.ts +85 -0
  40. package/dist/commands/reads.d.ts.map +1 -0
  41. package/dist/commands/reads.js +868 -0
  42. package/dist/commands/reads.js.map +1 -0
  43. package/dist/commands/scaffold.d.ts +89 -0
  44. package/dist/commands/scaffold.d.ts.map +1 -0
  45. package/dist/commands/scaffold.js +738 -0
  46. package/dist/commands/scaffold.js.map +1 -0
  47. package/dist/commands/service.d.ts +67 -0
  48. package/dist/commands/service.d.ts.map +1 -0
  49. package/dist/commands/service.js +748 -0
  50. package/dist/commands/service.js.map +1 -0
  51. package/dist/commands/storage.d.ts +51 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +399 -0
  54. package/dist/commands/storage.js.map +1 -0
  55. package/dist/commands/submit-app.d.ts +102 -0
  56. package/dist/commands/submit-app.d.ts.map +1 -0
  57. package/dist/commands/submit-app.js +622 -0
  58. package/dist/commands/submit-app.js.map +1 -0
  59. package/dist/config.d.ts +105 -2
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +351 -12
  62. package/dist/config.js.map +1 -1
  63. package/dist/conformance.d.ts +31 -0
  64. package/dist/conformance.d.ts.map +1 -0
  65. package/dist/conformance.js +390 -0
  66. package/dist/conformance.js.map +1 -0
  67. package/dist/contract-read-error.d.ts +5 -0
  68. package/dist/contract-read-error.d.ts.map +1 -0
  69. package/dist/contract-read-error.js +37 -0
  70. package/dist/contract-read-error.js.map +1 -0
  71. package/dist/deploy-plan.d.ts +150 -0
  72. package/dist/deploy-plan.d.ts.map +1 -0
  73. package/dist/deploy-plan.js +31 -0
  74. package/dist/deploy-plan.js.map +1 -0
  75. package/dist/deps.d.ts +6 -39
  76. package/dist/deps.d.ts.map +1 -1
  77. package/dist/deps.js +4 -68
  78. package/dist/deps.js.map +1 -1
  79. package/dist/errors.d.ts +20 -0
  80. package/dist/errors.d.ts.map +1 -0
  81. package/dist/errors.js +25 -0
  82. package/dist/errors.js.map +1 -0
  83. package/dist/flag-allowlists.d.ts +53 -0
  84. package/dist/flag-allowlists.d.ts.map +1 -0
  85. package/dist/flag-allowlists.js +184 -0
  86. package/dist/flag-allowlists.js.map +1 -0
  87. package/dist/flags.d.ts +47 -0
  88. package/dist/flags.d.ts.map +1 -1
  89. package/dist/flags.js +125 -1
  90. package/dist/flags.js.map +1 -1
  91. package/dist/jsonout.d.ts +37 -0
  92. package/dist/jsonout.d.ts.map +1 -0
  93. package/dist/jsonout.js +79 -0
  94. package/dist/jsonout.js.map +1 -0
  95. package/dist/kind.d.ts +57 -0
  96. package/dist/kind.d.ts.map +1 -0
  97. package/dist/kind.js +122 -0
  98. package/dist/kind.js.map +1 -0
  99. package/dist/main.js +786 -4838
  100. package/dist/main.js.map +1 -1
  101. package/dist/mintpage.d.ts +17 -2
  102. package/dist/mintpage.d.ts.map +1 -1
  103. package/dist/mintpage.js +241 -54
  104. package/dist/mintpage.js.map +1 -1
  105. package/dist/output.d.ts +179 -0
  106. package/dist/output.d.ts.map +1 -0
  107. package/dist/output.js +780 -0
  108. package/dist/output.js.map +1 -0
  109. package/dist/ownerops.d.ts +381 -57
  110. package/dist/ownerops.d.ts.map +1 -1
  111. package/dist/ownerops.js +2014 -359
  112. package/dist/ownerops.js.map +1 -1
  113. package/dist/preview.d.ts +23 -5
  114. package/dist/preview.d.ts.map +1 -1
  115. package/dist/preview.js +95 -43
  116. package/dist/preview.js.map +1 -1
  117. package/dist/prompt.d.ts +17 -0
  118. package/dist/prompt.d.ts.map +1 -0
  119. package/dist/prompt.js +19 -0
  120. package/dist/prompt.js.map +1 -0
  121. package/dist/provision.d.ts +3 -13
  122. package/dist/provision.d.ts.map +1 -1
  123. package/dist/provision.js +19 -21
  124. package/dist/provision.js.map +1 -1
  125. package/dist/remote.d.ts +157 -52
  126. package/dist/remote.d.ts.map +1 -1
  127. package/dist/remote.js +435 -46
  128. package/dist/remote.js.map +1 -1
  129. package/dist/riskgate.d.ts +62 -0
  130. package/dist/riskgate.d.ts.map +1 -0
  131. package/dist/riskgate.js +234 -0
  132. package/dist/riskgate.js.map +1 -0
  133. package/dist/scaffold.d.ts +12 -0
  134. package/dist/scaffold.d.ts.map +1 -0
  135. package/dist/scaffold.js +56 -0
  136. package/dist/scaffold.js.map +1 -0
  137. package/dist/schema.d.ts +36 -1
  138. package/dist/schema.d.ts.map +1 -1
  139. package/dist/schema.js +121 -26
  140. package/dist/schema.js.map +1 -1
  141. package/dist/script-chunks.d.ts +8 -0
  142. package/dist/script-chunks.d.ts.map +1 -0
  143. package/dist/script-chunks.js +35 -0
  144. package/dist/script-chunks.js.map +1 -0
  145. package/dist/served.d.ts +30 -0
  146. package/dist/served.d.ts.map +1 -0
  147. package/dist/served.js +112 -0
  148. package/dist/served.js.map +1 -0
  149. package/dist/signer.d.ts +13 -0
  150. package/dist/signer.d.ts.map +1 -1
  151. package/dist/signer.js +84 -15
  152. package/dist/signer.js.map +1 -1
  153. package/dist/update-check.d.ts +86 -5
  154. package/dist/update-check.d.ts.map +1 -1
  155. package/dist/update-check.js +161 -20
  156. package/dist/update-check.js.map +1 -1
  157. package/package.json +13 -12
  158. package/skill/SKILL.md +181 -347
  159. package/skill/agents/openai.yaml +4 -0
  160. package/skill/reference/capabilities.md +188 -0
  161. package/skill/reference/code.md +220 -0
  162. package/skill/reference/creator-token.md +94 -0
  163. package/skill/reference/deploy.md +174 -0
  164. package/skill/reference/diagnose.md +178 -0
  165. package/skill/reference/hosting.md +186 -93
  166. package/skill/reference/operate.md +220 -0
  167. package/skill/reference/services.md +121 -0
  168. package/skill/reference/setup.md +154 -36
  169. package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
  170. package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
  171. package/dist/inspect.d.ts +0 -48
  172. package/dist/inspect.d.ts.map +0 -1
  173. package/dist/inspect.js +0 -184
  174. package/dist/inspect.js.map +0 -1
  175. package/dist/migrate.d.ts +0 -65
  176. package/dist/migrate.d.ts.map +0 -1
  177. package/dist/migrate.js +0 -180
  178. package/dist/migrate.js.map +0 -1
  179. package/dist/onchain-uri.d.ts +0 -97
  180. package/dist/onchain-uri.d.ts.map +0 -1
  181. package/dist/onchain-uri.js +0 -243
  182. package/dist/onchain-uri.js.map +0 -1
  183. package/dist/upload.d.ts +0 -28
  184. package/dist/upload.d.ts.map +0 -1
  185. package/dist/upload.js +0 -41
  186. package/dist/upload.js.map +0 -1
  187. package/skill/reference/code-projects.md +0 -246
  188. package/skill/reference/operating.md +0 -116
  189. package/skill/reference/troubleshooting.md +0 -28
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
package/dist/migrate.d.ts DELETED
@@ -1,65 +0,0 @@
1
- import type { OpenSeaAttribute, ProjectState } from '@artblocks/abx-sdk';
2
- import { type StorageBackend } from '@artblocks/abx-storage';
3
- /** An image that lives ONLY on the source host (committed by hash, never pinned to a durable
4
- * backend) — there's no portable URL to copy, so its bytes must be re-pinned before cutover. */
5
- export interface NodeCustodyImage {
6
- tokenId: string;
7
- /** On-chain content hash (the `keccak256`/`sha256` commitment) — what we verify re-pinned bytes against. */
8
- hash: string;
9
- /** The source's served image URL — the old host's own `/…/image` route; where we fetch the bytes. */
10
- imageUrl: string;
11
- }
12
- /** The off-chain state to bridge to the destination resolver + what couldn't be carried cleanly. */
13
- export interface MigrationPlan {
14
- description?: string;
15
- externalUrl?: string;
16
- attributes?: OpenSeaAttribute[];
17
- /** `{ "0x<keccak>": "https://gw/ipfs/<cid>" }` — durable image locators recovered from the source. */
18
- contentLocators: Record<string, string>;
19
- /** Images served only by the source host (no durable locator) — re-pin before cutover. */
20
- nodeCustody: NodeCustodyImage[];
21
- /** Tokens whose served JSON we read to build this plan. */
22
- tokensRead: number;
23
- }
24
- export declare const tokenApiUrl: (base: string, chainId: number, addr: string, id: string) => string;
25
- export declare const contractApiUrl: (base: string, chainId: number, addr: string) => string;
26
- /**
27
- * Build the migration plan by reading the SOURCE resolver's public API, using the locally
28
- * reconstructed on-chain state (`local`) for the hash KEYS the served JSON doesn't expose.
29
- */
30
- export declare function buildMigrationPlan(sourceBase: string, chainId: number, local: ProjectState): Promise<MigrationPlan>;
31
- /**
32
- * Re-pin node-custody images to a DURABLE backend so the destination never depends on the
33
- * (soon-to-be-decommissioned) source host. For each image: fetch the bytes from the source,
34
- * **verify** them against the on-chain hash (trustless — we trust the chain, not the old node),
35
- * then `put` them to the destination operator's own backend and read back a portable locator.
36
- *
37
- * If the configured backend isn't durable (no `locator` — fs/cloud serve only through their own
38
- * node, so re-pinning there just moves the single-host dependency), we re-pin NOTHING and report
39
- * every image as `needsDurableBackend`: the right move is to configure IPFS/Arweave and re-run,
40
- * never to bridge a URL that points back at the dying host.
41
- */
42
- export interface RepinResult {
43
- /** hash → new durable locator, ready to bridge to the destination. */
44
- repinned: Record<string, string>;
45
- /** Re-pinned token ids (for reporting). */
46
- repinnedTokens: string[];
47
- /** Bytes fetched but their hash didn't match the on-chain commitment — NOT trusted, NOT pinned. */
48
- mismatched: NodeCustodyImage[];
49
- /** Couldn't fetch the bytes from the source (host down, 404). */
50
- unreachable: NodeCustodyImage[];
51
- /** Skipped because no durable backend is configured — these need IPFS/Arweave + a re-run. */
52
- needsDurableBackend: NodeCustodyImage[];
53
- }
54
- export declare function repinNodeCustody(images: NodeCustodyImage[], backend: StorageBackend): Promise<RepinResult>;
55
- /** A parity check after bridging: does the destination now serve the same image/description/traits? */
56
- export interface ParityResult {
57
- tokenId: string;
58
- imageMatch: boolean;
59
- descriptionMatch: boolean;
60
- attributesMatch: boolean;
61
- sourceImage?: string;
62
- destImage?: string;
63
- }
64
- export declare function verifyParity(sourceBase: string, destBase: string, chainId: number, addr: string, tokenId: string): Promise<ParityResult>;
65
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAqB,gBAAgB,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAc,KAAK,cAAc,EAAC,MAAM,wBAAwB,CAAC;AA4BxE;iGACiG;AACjG,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,IAAI,EAAE,MAAM,CAAC;IACb,qGAAqG;IACrG,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oGAAoG;AACpG,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,sGAAsG;IACtG,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,0FAA0F;IAC1F,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,EAAE,IAAI,MAAM,KAAG,MAC5B,CAAC;AAC3D,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MACzB,CAAC;AA+BrD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,aAAa,CAAC,CAsDxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2CAA2C;IAC3C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mGAAmG;IACnG,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,iEAAiE;IACjE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,6FAA6F;IAC7F,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;CACzC;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAyChH;AAED,uGAAuG;AACvG,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAavB"}
package/dist/migrate.js DELETED
@@ -1,180 +0,0 @@
1
- /**
2
- * Migrate a contract's OFF-CHAIN operator state from one resolver to another — the
3
- * toolkit's portability guarantee, made operational.
4
- *
5
- * Everything on-chain a new resolver gets for free: it replays the event spine from any
6
- * RPC (that's what the admin control plane's `POST /admin/projects` already does). The only
7
- * thing it can't reconstruct from chain is the operator's off-chain state — the four fields
8
- * on the registration row: `description`, `externalUrl`, off-chain `attributes`, and the
9
- * `keccak → gateway-URL` content locators.
10
- *
11
- * The key property: each resolver's served JSON is **self-describing** via `abx_provenance`,
12
- * which makes it self-MIGRATING. By reading the SOURCE resolver's public token/contract API
13
- * (plus the chain, for the locator KEYS — the on-chain hashes, which aren't in any served
14
- * JSON), we reconstruct exactly that off-chain state and bridge it to the destination through
15
- * the same control plane. The two resolvers never talk to each other; the operator's CLI
16
- * orchestrates from public endpoints alone — no shared database, no private channel.
17
- *
18
- * Two cases this can't paper over, both surfaced honestly:
19
- * - **Stitched attributes** — an off-chain trait shadowed by an on-chain one of the same
20
- * `trait_type` was never *served*, so it can't be recovered. We migrate the off-chain
21
- * remainder (served traits whose `trait_type` has no on-chain entry), which is byte-exact
22
- * for everything that was ever visible.
23
- * - **Node-custody images** — an image committed by hash but never pinned to a durable
24
- * backend is served from the source node's own `/image` route. There's no portable URL to
25
- * copy; the bytes live only on the old host. We list these so the operator re-pins them
26
- * (fetch → verify against the on-chain hash → re-upload) BEFORE tearing the old host down.
27
- */
28
- import { fieldOf, inlineText, normalizeAttributes, METADATA_REPRESENTATION as R } from '@artblocks/abx-sdk';
29
- import { hashContent } from '@artblocks/abx-storage';
30
- const trim = (base) => base.replace(/\/+$/, '');
31
- export const tokenApiUrl = (base, chainId, addr, id) => `${trim(base)}/t/${chainId}/${addr.toLowerCase()}/${id}`;
32
- export const contractApiUrl = (base, chainId, addr) => `${trim(base)}/c/${chainId}/${addr.toLowerCase()}`;
33
- async function getJson(url) {
34
- let resp;
35
- try {
36
- resp = await fetch(url);
37
- }
38
- catch (err) {
39
- throw new Error(`couldn't reach the source resolver at ${url}: ${err.message}`);
40
- }
41
- if (resp.status === 404)
42
- return null; // unknown project / unminted token — not fatal per-token
43
- if (!resp.ok)
44
- throw new Error(`source resolver ${url} → ${resp.status} ${resp.statusText}`);
45
- return (await resp.json());
46
- }
47
- const provOf = (json, field) => json?.abx_provenance?.find((p) => p.field === field);
48
- /** Off-chain attribute trait_types present on-chain (case-insensitive) — these are NOT migrated as
49
- * off-chain (the destination re-derives them from chain and they win the stitch). */
50
- function onChainTraitTypes(fields) {
51
- const entry = fieldOf(fields, 'attributes');
52
- if (!entry || entry.representation !== R.inline)
53
- return new Set();
54
- try {
55
- const parsed = JSON.parse(inlineText(entry));
56
- if (!Array.isArray(parsed))
57
- return new Set();
58
- return new Set(parsed.map((a) => String(a.trait_type).toLowerCase()));
59
- }
60
- catch {
61
- return new Set();
62
- }
63
- }
64
- /**
65
- * Build the migration plan by reading the SOURCE resolver's public API, using the locally
66
- * reconstructed on-chain state (`local`) for the hash KEYS the served JSON doesn't expose.
67
- */
68
- export async function buildMigrationPlan(sourceBase, chainId, local) {
69
- const addr = local.address;
70
- const plan = { contentLocators: {}, nodeCustody: [], tokensRead: 0 };
71
- // ── operator-level fields (one registration row applies across the collection) ──
72
- // Prefer the contract API; fall back to token #0. Take a value only when its provenance
73
- // says it's off-chain (a plain operator value) — on-chain values are re-derived by replay.
74
- const contractJson = await getJson(contractApiUrl(sourceBase, chainId, addr));
75
- const firstToken = local.tokens.find((t) => t.minted) ?? local.tokens[0];
76
- const tokenZeroJson = firstToken
77
- ? await getJson(tokenApiUrl(sourceBase, chainId, addr, firstToken.tokenId))
78
- : null;
79
- const offChainText = (json, field, value) => (value != null && provOf(json, field)?.status === 'off-chain' ? value : undefined);
80
- plan.description =
81
- offChainText(tokenZeroJson, 'description', tokenZeroJson?.description) ??
82
- offChainText(contractJson, 'description', contractJson?.description);
83
- plan.externalUrl =
84
- offChainText(tokenZeroJson, 'external_url', tokenZeroJson?.external_url) ??
85
- offChainText(contractJson, 'external_link', contractJson?.external_link);
86
- // attributes: the off-chain remainder = served traits whose trait_type has NO on-chain entry.
87
- if (tokenZeroJson?.attributes?.length && provOf(tokenZeroJson, 'attributes')?.status !== 'on-chain') {
88
- const onChain = onChainTraitTypes(firstToken?.fields ?? []);
89
- const offChain = tokenZeroJson.attributes.filter((a) => !onChain.has(String(a.trait_type).toLowerCase()));
90
- if (offChain.length)
91
- plan.attributes = normalizeAttributes(offChain);
92
- }
93
- // ── per-token content locators (image bytes that live off-chain by hash) ──
94
- for (const token of local.tokens) {
95
- const image = fieldOf(token.fields, 'image');
96
- if (!image || (image.representation !== R.keccak256 && image.representation !== R.sha256)) {
97
- continue; // on-chain content or an on-chain locator — the destination derives it from chain
98
- }
99
- const json = await getJson(tokenApiUrl(sourceBase, chainId, addr, token.tokenId));
100
- if (!json)
101
- continue; // unminted / not served
102
- plan.tokensRead++;
103
- const prov = provOf(json, 'image');
104
- const hash = image.value.toLowerCase();
105
- // A durable locator: the resolver served a portable URL (ipfs/arweave/url source). Node-custody:
106
- // the source served the bytes from its own host (source === the hash kind), so there's nothing to copy.
107
- if (json.image && prov && prov.onChain === false && (prov.source === 'ipfs' || prov.source === 'arweave' || prov.source === 'url')) {
108
- plan.contentLocators[hash] = json.image;
109
- }
110
- else if (json.image) {
111
- plan.nodeCustody.push({ tokenId: token.tokenId, hash, imageUrl: json.image });
112
- }
113
- }
114
- return plan;
115
- }
116
- export async function repinNodeCustody(images, backend) {
117
- const result = { repinned: {}, repinnedTokens: [], mismatched: [], unreachable: [], needsDurableBackend: [] };
118
- if (!images.length)
119
- return result;
120
- // A backend is "durable" for migration iff it can hand back a node-independent locator.
121
- if (!backend.locator) {
122
- result.needsDurableBackend = [...images];
123
- return result;
124
- }
125
- for (const img of images) {
126
- let bytes;
127
- let contentType;
128
- try {
129
- const resp = await fetch(img.imageUrl);
130
- if (!resp.ok) {
131
- result.unreachable.push(img);
132
- continue;
133
- }
134
- bytes = new Uint8Array(await resp.arrayBuffer());
135
- contentType = resp.headers.get('content-type') ?? 'application/octet-stream';
136
- }
137
- catch {
138
- result.unreachable.push(img);
139
- continue;
140
- }
141
- // Trustless: re-hash the fetched bytes and compare to the ON-CHAIN commitment.
142
- if (hashContent(bytes).toLowerCase() !== img.hash.toLowerCase()) {
143
- result.mismatched.push(img);
144
- continue;
145
- }
146
- await backend.put(img.hash, { bytes, contentType });
147
- const loc = await backend.locator(img.hash);
148
- if (loc) {
149
- result.repinned[img.hash.toLowerCase()] = loc;
150
- result.repinnedTokens.push(img.tokenId);
151
- }
152
- else {
153
- // Stored, but the backend still can't produce a portable locator — treat as not durable.
154
- result.needsDurableBackend.push(img);
155
- }
156
- }
157
- return result;
158
- }
159
- const sameAttrs = (a = [], b = []) => {
160
- const key = (xs) => xs
161
- .map((x) => `${String(x.trait_type).toLowerCase()}=${String(x.value)}`)
162
- .sort()
163
- .join('|');
164
- return key(a) === key(b);
165
- };
166
- export async function verifyParity(sourceBase, destBase, chainId, addr, tokenId) {
167
- const [src, dst] = await Promise.all([
168
- getJson(tokenApiUrl(sourceBase, chainId, addr, tokenId)),
169
- getJson(tokenApiUrl(destBase, chainId, addr, tokenId)),
170
- ]);
171
- return {
172
- tokenId,
173
- imageMatch: !!src && !!dst && src.image === dst.image,
174
- descriptionMatch: (src?.description ?? null) === (dst?.description ?? null),
175
- attributesMatch: sameAttrs(src?.attributes, dst?.attributes),
176
- sourceImage: src?.image,
177
- destImage: dst?.image,
178
- };
179
- }
180
- //# sourceMappingURL=migrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,uBAAuB,IAAI,CAAC,EAAC,MAAM,oBAAoB,CAAC;AAE1G,OAAO,EAAC,WAAW,EAAsB,MAAM,wBAAwB,CAAC;AAmDxE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY,EAAE,EAAU,EAAU,EAAE,CAC7F,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY,EAAU,EAAE,CACpF,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;AAErD,KAAK,UAAU,OAAO,CAAI,GAAW;IACnC,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,CAAC,yDAAyD;IAC/F,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAkD,EAAE,KAAa,EAAgC,EAAE,CACjH,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAEvD;sFACsF;AACtF,SAAS,iBAAiB,CAAC,MAAuB;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAC7C,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,OAAe,EACf,KAAmB;IAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;IAC3B,MAAM,IAAI,GAAkB,EAAC,eAAe,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAC,CAAC;IAElF,mFAAmF;IACnF,wFAAwF;IACxF,2FAA2F;IAC3F,MAAM,YAAY,GAAG,MAAM,OAAO,CAAqB,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,UAAU;QAC9B,CAAC,CAAC,MAAM,OAAO,CAAkB,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5F,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,CACnB,IAAuH,EACvH,KAAuD,EACvD,KAAyB,EACL,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE5G,IAAI,CAAC,WAAW;QACd,YAAY,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC;YACtE,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW;QACd,YAAY,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC;YACxE,YAAY,CAAC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAE3E,8FAA8F;IAC9F,IAAI,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QACpG,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC1G,IAAI,QAAQ,CAAC,MAAM;YAAE,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,6EAA6E;IAC7E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1F,SAAS,CAAC,kFAAkF;QAC9F,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAkB,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,wBAAwB;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,iGAAiG;QACjG,wGAAwG;QACxG,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;YACnI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA0BD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA0B,EAAE,OAAuB;IACxF,MAAM,MAAM,GAAgB,EAAC,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAC,CAAC;IACzH,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAElC,wFAAwF;IACxF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAAiB,CAAC;QACtB,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACjD,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,+EAA+E;QAC/E,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAChE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAW,EAAE,EAAC,KAAK,EAAE,WAAW,EAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAW,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC;YAC9C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,yFAAyF;YACzF,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAYD,MAAM,SAAS,GAAG,CAAC,IAAwB,EAAE,EAAE,IAAwB,EAAE,EAAW,EAAE;IACpF,MAAM,GAAG,GAAG,CAAC,EAAsB,EAAE,EAAE,CACrC,EAAE;SACC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;SACtE,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,IAAY,EACZ,OAAe;IAEf,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnC,OAAO,CAAkB,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO,CAAkB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;KACxE,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,UAAU,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;QACrD,gBAAgB,EAAE,CAAC,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC;QAC3E,eAAe,EAAE,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC;QAC5D,WAAW,EAAE,GAAG,EAAE,KAAK;QACvB,SAAS,EAAE,GAAG,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC"}
@@ -1,97 +0,0 @@
1
- import { type Address, type GeneratorReadClient, type GeneratorStatus, type Hex, type ParsedDependencyRef, type ProjectState } from '@artblocks/abx-sdk';
2
- import type { DepCheck } from './deps.js';
3
- /** The self-referential key: the CSV lists it too (the resolver's tokenData carries every
4
- * evented param — including `params.keys` itself — so the generator must list it to stay
5
- * byte-aligned; inputsHash parity is load-bearing). */
6
- export declare const PARAMS_KEYS = "params.keys";
7
- /** ≤ this many chars rides as a literal readable-ASCII bytes32; longer takes the data path. */
8
- export declare const PARAMS_KEYS_LITERAL_MAX = 31;
9
- /**
10
- * Compose the `params.keys` CSV: every param key the deploy writes ∪ the `--schema` keys ∪
11
- * `params.keys` itself — deduped, sorted lexicographically, comma-joined. Sorted because the
12
- * canonical tokenData serialization sorts keys; deterministic composition keeps the value
13
- * reproducible from the same flags.
14
- */
15
- export declare function composeParamsKeys(writtenParamKeys: string[], schemaKeys: string[]): string;
16
- /** Whether a CSV fits the literal bytes32 lane (printable ASCII, ≤ 31 bytes). */
17
- export declare function paramsKeysIsLiteral(csv: string): boolean;
18
- /** The `params.keys` write leg: `setContractParam` (literal bytes32) when the CSV fits,
19
- * else `setContractParamData` (one blob; hash evented — the generator reads it back whole). */
20
- export declare function paramsKeysCall(csv: string): {
21
- call: Hex;
22
- encoding: 'literal' | 'data';
23
- };
24
- /**
25
- * The `--onchain-uri` legs of the setup multicall, in order:
26
- * 1. collection-scope `animation_url` field → representation `renderer`,
27
- * value `abi.encode(generator)` (the canonical generator computes the live view on-chain);
28
- * 2. the `params.keys` contract param (the generator's tokenData enumeration seam);
29
- * 3. `setTokenURIRenderer(metadataRenderer)` — tokenURI resolves ON-CHAIN from here on;
30
- * 4. `setContractURIRenderer(metadataRenderer)` — contractURI too (parity with the 1/1 lane).
31
- * Placed BEFORE the mint legs so every token is born with the on-chain lane fully configured.
32
- */
33
- export declare function onchainUriSetupCalls(args: {
34
- generator: Address;
35
- metadataRenderer: Address;
36
- paramsKeys: string;
37
- }): {
38
- calls: Hex[];
39
- paramsKeysEncoding: 'literal' | 'data';
40
- };
41
- /** What the deploy can honestly promise about the generator's template branch, derived from
42
- * the selection-time dependency report (never a new RPC): chain-complete iff every registry
43
- * dep has proven ON-CHAIN bytes (OnChain refs read their data contract directly, so they
44
- * count as on-chain; `abx verify` is the from-chain confirmation either way). */
45
- export declare function expectedChainComplete(deps: ParsedDependencyRef[], checks: DepCheck[]): {
46
- expected: boolean | null;
47
- detail: string;
48
- };
49
- /** The generator this project's on-chain lane actually uses: the collection `animation_url`
50
- * field's `renderer` value when set (that address is what the metadata renderer staticcalls),
51
- * else the chain's canonical generator. Null when neither exists. */
52
- export declare function generatorFor(state: ProjectState, override?: string): Address | null;
53
- /** Whether verify should run the on-chain-URI report: the tokenURIRenderer toggle is on, or
54
- * the collection `animation` field points at a field renderer (the generator). */
55
- export declare function hasOnChainUriLane(state: ProjectState): boolean;
56
- export interface TokenUriProbe {
57
- tokenId: string;
58
- /** tokenURI(id) is a `data:application/json;base64,` URI (resolves on-chain, any RPC). */
59
- onChainJson: boolean;
60
- uriPrefix: string;
61
- animation: {
62
- form: 'data-html';
63
- bytes: number;
64
- marker: string | null;
65
- } | {
66
- form: 'url';
67
- url: string;
68
- } | {
69
- form: 'data-other';
70
- prefix: string;
71
- } | {
72
- form: 'missing';
73
- };
74
- }
75
- export interface OnChainUriReport {
76
- generator: Address;
77
- status: GeneratorStatus;
78
- /** Null when no token is minted yet (tokenURI would revert). */
79
- probe: TokenUriProbe | null;
80
- }
81
- /**
82
- * The verify-time on-chain-URI report: `generator.onChainStatus(token)` (branch ·
83
- * chain-completeness · unresolved refs · URL budget) plus a `tokenURI` probe of the lowest
84
- * minted token — decoded, with the `animation_url` form checked against the branch.
85
- */
86
- export declare function onChainUriReport(client: GeneratorReadClient, state: ProjectState, generatorOverride?: string): Promise<OnChainUriReport>;
87
- /**
88
- * After a param write: if the project's `params.keys` CSV exists but doesn't list the
89
- * configured key, the on-chain generator's tokenData will silently omit it (breaking byte
90
- * parity with the resolver's). Returns the fixed CSV to suggest, or null when no nudge is
91
- * warranted (no CSV = not on the on-chain lane; already listed = fine).
92
- */
93
- export declare function paramsKeysNudge(existingCsv: string | null, configuredKey: string): string | null;
94
- /** Read the project's `params.keys` contract param from chain (literal or data-backed);
95
- * null when unset. Best-effort — callers must treat a throw as "no nudge". */
96
- export declare function readParamsKeys(client: GeneratorReadClient, contract: Address): Promise<string | null>;
97
- //# sourceMappingURL=onchain-uri.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onchain-uri.d.ts","sourceRoot":"","sources":["../src/onchain-uri.ts"],"names":[],"mappings":"AAaA,OAAO,EAUL,KAAK,OAAO,EACZ,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,GAAG,EACR,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAC;AAExC;;wDAEwD;AACxD,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC,+FAA+F;AAC/F,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ1F;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;gGACgG;AAChG,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAA;CAAC,CAmBrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG;IAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,kBAAkB,EAAE,SAAS,GAAG,MAAM,CAAA;CAAC,CAuBzD;AAID;;;kFAGkF;AAClF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,EAAE,EAC3B,MAAM,EAAE,QAAQ,EAAE,GACjB;IAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAoB5C;AAID;;sEAEsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAUnF;AAED;mFACmF;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAM9D;AAYD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EACL;QAAC,IAAI,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GACzD;QAAC,IAAI,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,GAC1B;QAAC,IAAI,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,GACpC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAC,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,gEAAgE;IAChE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAC7B;AAmBD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,YAAY,EACnB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAgC3B;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhG;AAED;+EAC+E;AAC/E,wBAAsB,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB3G"}
@@ -1,243 +0,0 @@
1
- /**
2
- * The on-chain tokenURI lane for code projects (`abx deploy-code --onchain-uri`) — pure leg
3
- * composition + the verify-time honesty reads, all unit-testable with a mocked client.
4
- *
5
- * The lane (specs/protocol/code-projects.md → "The canonical generator — AbxGenerator" +
6
- * specs/protocol/onchain-metadata.md → "URI resolution"): the collection-scope `animation_url`
7
- * field points at the canonical generator via the `renderer` representation
8
- * (`abi.encode(address)`), the `params.keys` contract param enumerates the declared param
9
- * surface (the params store is unenumerable by design — the generator reads this CSV to build
10
- * on-chain tokenData), and the token's `tokenURIRenderer` toggles tokenURI to the canonical
11
- * on-chain metadata renderer. All three ride the EXISTING setup multicall, before the mints.
12
- */
13
- import { encodeFunctionData, toHex, zeroAddress } from 'viem';
14
- import { decodeFieldRenderer, decodeTag, encodeFieldRenderer, encodeTag, readGeneratorStatus, resolveGenerator, seriesCodeAbi, METADATA_FIELD as F, METADATA_REPRESENTATION as R, DEP_RESOLUTION, } from '@artblocks/abx-sdk';
15
- /** The self-referential key: the CSV lists it too (the resolver's tokenData carries every
16
- * evented param — including `params.keys` itself — so the generator must list it to stay
17
- * byte-aligned; inputsHash parity is load-bearing). */
18
- export const PARAMS_KEYS = 'params.keys';
19
- /** ≤ this many chars rides as a literal readable-ASCII bytes32; longer takes the data path. */
20
- export const PARAMS_KEYS_LITERAL_MAX = 31;
21
- /**
22
- * Compose the `params.keys` CSV: every param key the deploy writes ∪ the `--schema` keys ∪
23
- * `params.keys` itself — deduped, sorted lexicographically, comma-joined. Sorted because the
24
- * canonical tokenData serialization sorts keys; deterministic composition keeps the value
25
- * reproducible from the same flags.
26
- */
27
- export function composeParamsKeys(writtenParamKeys, schemaKeys) {
28
- const keys = new Set([...writtenParamKeys, ...schemaKeys, PARAMS_KEYS]);
29
- return [...keys]
30
- .map((k) => k.trim())
31
- .filter(Boolean)
32
- .sort()
33
- .filter((k, i, all) => i === 0 || k !== all[i - 1])
34
- .join(',');
35
- }
36
- /** Whether a CSV fits the literal bytes32 lane (printable ASCII, ≤ 31 bytes). */
37
- export function paramsKeysIsLiteral(csv) {
38
- return csv.length <= PARAMS_KEYS_LITERAL_MAX && /^[\x20-\x7e]+$/.test(csv);
39
- }
40
- /** The `params.keys` write leg: `setContractParam` (literal bytes32) when the CSV fits,
41
- * else `setContractParamData` (one blob; hash evented — the generator reads it back whole). */
42
- export function paramsKeysCall(csv) {
43
- if (paramsKeysIsLiteral(csv)) {
44
- return {
45
- call: encodeFunctionData({
46
- abi: seriesCodeAbi,
47
- functionName: 'setContractParam',
48
- args: [encodeTag(PARAMS_KEYS), encodeTag(csv)],
49
- }),
50
- encoding: 'literal',
51
- };
52
- }
53
- return {
54
- call: encodeFunctionData({
55
- abi: seriesCodeAbi,
56
- functionName: 'setContractParamData',
57
- args: [encodeTag(PARAMS_KEYS), toHex(csv)],
58
- }),
59
- encoding: 'data',
60
- };
61
- }
62
- /**
63
- * The `--onchain-uri` legs of the setup multicall, in order:
64
- * 1. collection-scope `animation_url` field → representation `renderer`,
65
- * value `abi.encode(generator)` (the canonical generator computes the live view on-chain);
66
- * 2. the `params.keys` contract param (the generator's tokenData enumeration seam);
67
- * 3. `setTokenURIRenderer(metadataRenderer)` — tokenURI resolves ON-CHAIN from here on;
68
- * 4. `setContractURIRenderer(metadataRenderer)` — contractURI too (parity with the 1/1 lane).
69
- * Placed BEFORE the mint legs so every token is born with the on-chain lane fully configured.
70
- */
71
- export function onchainUriSetupCalls(args) {
72
- const { call: paramsLeg, encoding } = paramsKeysCall(args.paramsKeys);
73
- const calls = [];
74
- // The `animation_url` leg points at the generator (which computes the doc from a PROGRAM). A
75
- // renderer-only drop (in-chain SVG, no program) has no generator — and baking this leg at a ZERO
76
- // generator would make the metadata renderer staticcall a codeless address and REVERT every
77
- // tokenURI. So emit it only when there's a real generator; otherwise there's simply no animation_url
78
- // (optional by spec — the metadata renderer omits an unset field).
79
- if (args.generator !== zeroAddress) {
80
- calls.push(encodeFunctionData({
81
- abi: seriesCodeAbi,
82
- functionName: 'setContractField',
83
- args: [encodeTag(F.animationUrl), encodeTag(R.renderer), encodeFieldRenderer(args.generator)],
84
- }));
85
- }
86
- calls.push(paramsLeg, encodeFunctionData({ abi: seriesCodeAbi, functionName: 'setTokenURIRenderer', args: [args.metadataRenderer] }), encodeFunctionData({ abi: seriesCodeAbi, functionName: 'setContractURIRenderer', args: [args.metadataRenderer] }));
87
- return { calls, paramsKeysEncoding: encoding };
88
- }
89
- // ── the chain-complete expectation (deploy-time, from the P1 dependency report) ──
90
- /** What the deploy can honestly promise about the generator's template branch, derived from
91
- * the selection-time dependency report (never a new RPC): chain-complete iff every registry
92
- * dep has proven ON-CHAIN bytes (OnChain refs read their data contract directly, so they
93
- * count as on-chain; `abx verify` is the from-chain confirmation either way). */
94
- export function expectedChainComplete(deps, checks) {
95
- if (deps.length === 0)
96
- return { expected: true, detail: 'no dependencies — the document assembles from the script chunks alone' };
97
- const registryDeps = deps.filter((d) => d.resolution === DEP_RESOLUTION.registry);
98
- if (registryDeps.length === 0) {
99
- return { expected: true, detail: 'all dependencies are on-chain data contracts (read directly)' };
100
- }
101
- const byDep = new Map(checks.map((c) => [c.dep, c]));
102
- const cdnOnly = [];
103
- const missing = [];
104
- let unknown = false;
105
- for (const d of registryDeps) {
106
- const chk = byDep.get(d.display);
107
- if (!chk || chk.status === 'skipped')
108
- unknown = true;
109
- else if (chk.status === 'not-found')
110
- missing.push(d.display);
111
- else if (!chk.details.availableOnChain)
112
- cdnOnly.push(d.display);
113
- }
114
- if (missing.length)
115
- return { expected: false, detail: `${missing.join(', ')} not on the registry — the generator will emit an unresolved marker` };
116
- if (cdnOnly.length)
117
- return { expected: false, detail: `${cdnOnly.join(', ')} CDN-served (the normal production path) — serves fine, NOT chain-complete` };
118
- if (unknown)
119
- return { expected: null, detail: 'registry check was skipped (RPC unreachable) — `abx verify` reads the truth from chain' };
120
- return { expected: true, detail: 'every dependency has ON-CHAIN bytes — no server, gateway, or CDN in the graph' };
121
- }
122
- // ── verify: the honesty reads (`onChainStatus` + a tokenURI probe) ─────────────
123
- /** The generator this project's on-chain lane actually uses: the collection `animation_url`
124
- * field's `renderer` value when set (that address is what the metadata renderer staticcalls),
125
- * else the chain's canonical generator. Null when neither exists. */
126
- export function generatorFor(state, override) {
127
- const field = state.collectionFields.find((f) => f.field === F.animationUrl && f.representation === R.renderer);
128
- if (field) {
129
- try {
130
- return decodeFieldRenderer(field.value);
131
- }
132
- catch {
133
- /* malformed value — fall through to the manifest */
134
- }
135
- }
136
- return resolveGenerator(state.chainId, override) ?? null;
137
- }
138
- /** Whether verify should run the on-chain-URI report: the tokenURIRenderer toggle is on, or
139
- * the collection `animation` field points at a field renderer (the generator). */
140
- export function hasOnChainUriLane(state) {
141
- const rendererSet = !!state.tokenURIRenderer && state.tokenURIRenderer !== zeroAddress;
142
- const animationRenderer = state.collectionFields.some((f) => f.field === F.animationUrl && f.representation === R.renderer);
143
- return rendererSet || animationRenderer;
144
- }
145
- const erc721TokenUriAbi = [
146
- {
147
- type: 'function',
148
- name: 'tokenURI',
149
- stateMutability: 'view',
150
- inputs: [{ name: 'id', type: 'uint256' }],
151
- outputs: [{ name: '', type: 'string' }],
152
- },
153
- ];
154
- /** An HTML comment marker the generator emits on degradation (`<!-- abx:… -->`), or null. */
155
- function degradationMarker(html) {
156
- const m = /<!--\s*abx:[^>]*-->/.exec(html);
157
- return m ? m[0] : null;
158
- }
159
- function probeAnimation(animationUrl) {
160
- if (!animationUrl)
161
- return { form: 'missing' };
162
- const dataHtml = /^data:text\/html;base64,(.*)$/.exec(animationUrl);
163
- if (dataHtml) {
164
- const html = Buffer.from(dataHtml[1], 'base64').toString('utf8');
165
- return { form: 'data-html', bytes: Buffer.byteLength(html), marker: degradationMarker(html) };
166
- }
167
- if (animationUrl.startsWith('data:'))
168
- return { form: 'data-other', prefix: animationUrl.slice(0, 40) };
169
- return { form: 'url', url: animationUrl };
170
- }
171
- /**
172
- * The verify-time on-chain-URI report: `generator.onChainStatus(token)` (branch ·
173
- * chain-completeness · unresolved refs · URL budget) plus a `tokenURI` probe of the lowest
174
- * minted token — decoded, with the `animation_url` form checked against the branch.
175
- */
176
- export async function onChainUriReport(client, state, generatorOverride) {
177
- const generator = generatorFor(state, generatorOverride);
178
- if (!generator) {
179
- throw new Error(`no AbxGenerator known for chain ${state.chainId} — set ABX_GENERATOR=0x… (or update @artblocks/abx-sdk's deployments manifest)`);
180
- }
181
- const status = await readGeneratorStatus(client, generator, state.address);
182
- const minted = state.tokens.filter((t) => t.minted).map((t) => BigInt(t.tokenId));
183
- let probe = null;
184
- if (minted.length) {
185
- const tokenId = minted.reduce((a, b) => (b < a ? b : a));
186
- const uri = (await client.readContract({
187
- address: state.address,
188
- abi: erc721TokenUriAbi,
189
- functionName: 'tokenURI',
190
- args: [tokenId],
191
- }));
192
- const m = /^data:application\/json;base64,(.*)$/.exec(uri);
193
- let animation = { form: 'missing' };
194
- if (m) {
195
- try {
196
- const json = JSON.parse(Buffer.from(m[1], 'base64').toString('utf8'));
197
- animation = probeAnimation(typeof json.animation_url === 'string' ? json.animation_url : undefined);
198
- }
199
- catch {
200
- /* undecodable JSON — reported as onChainJson with a missing animation */
201
- }
202
- }
203
- probe = { tokenId: tokenId.toString(), onChainJson: !!m, uriPrefix: uri.slice(0, 48), animation };
204
- }
205
- return { generator, status, probe };
206
- }
207
- // ── the configure-param nudge (params.keys drift) ──────────────────────────────
208
- /**
209
- * After a param write: if the project's `params.keys` CSV exists but doesn't list the
210
- * configured key, the on-chain generator's tokenData will silently omit it (breaking byte
211
- * parity with the resolver's). Returns the fixed CSV to suggest, or null when no nudge is
212
- * warranted (no CSV = not on the on-chain lane; already listed = fine).
213
- */
214
- export function paramsKeysNudge(existingCsv, configuredKey) {
215
- if (existingCsv === null || configuredKey === PARAMS_KEYS)
216
- return null;
217
- const listed = existingCsv.split(',').map((k) => k.trim()).filter(Boolean);
218
- if (listed.includes(configuredKey))
219
- return null;
220
- return composeParamsKeys([...listed, configuredKey], []);
221
- }
222
- /** Read the project's `params.keys` contract param from chain (literal or data-backed);
223
- * null when unset. Best-effort — callers must treat a throw as "no nudge". */
224
- export async function readParamsKeys(client, contract) {
225
- const [value, valueIsHash, isSet] = (await client.readContract({
226
- address: contract,
227
- abi: seriesCodeAbi,
228
- functionName: 'contractParam',
229
- args: [encodeTag(PARAMS_KEYS)],
230
- }));
231
- if (!isSet)
232
- return null;
233
- if (!valueIsHash)
234
- return decodeTag(value);
235
- const data = (await client.readContract({
236
- address: contract,
237
- abi: seriesCodeAbi,
238
- functionName: 'contractParamData',
239
- args: [encodeTag(PARAMS_KEYS)],
240
- }));
241
- return Buffer.from(data.slice(2), 'hex').toString('utf8');
242
- }
243
- //# sourceMappingURL=onchain-uri.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onchain-uri.js","sourceRoot":"","sources":["../src/onchain-uri.ts"],"names":[],"mappings":"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"}