Skip to content

Zora coin metadata guide, and EVM and x402 on the turbo-upload page - #190

Draft
vilenarios wants to merge 5 commits into
mainfrom
docs/zora-coins-turbo
Draft

vilenarios wants to merge 5 commits into
mainfrom
docs/zora-coins-turbo

Conversation

@vilenarios

@vilenarios vilenarios commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Adds a guide for storing a Zora coin's metadata and image on Arweave with @ardrive/turbo-zora-uploader. The coin's metadata pointer is https://turbo-gateway.com/ITEM_ID, because Zora's create API accepts only an https or ipfs pointer, and media inside the metadata is ar://ITEM_ID. It also brings the turbo-upload page up to 0.7.0: EVM signing (ANS-104 type 3) and x402 uploads.

Merge after @ardrive/turbo-zora-uploader is published on npm. The guide links its npm page and installs it by name, and neither works until it is published. The guide matches the package at commit 340a3b9; if the package changes before publishing, re-sync the quickstart, testnet and browser samples. @ardrive/turbo-upload@0.7.0 is already on npm.

Merging deploys nothing: deploys are manual.

It also corrects a false claim on build/upload/x402-uploading-to-turbo: the unsigned x402 route has no free tier. An unpaid POST of five bytes to /v1/x402/upload/unsigned answers 402 with a USDC price; only signed items within the free tier upload free. The page also says that maxMUSDCAmount is optional, and that without it x402-fetch caps the price at 0.10 USDC. It says that x402-fetch is an optional peer you install. And it fixes the uploadRawX402Data sample, which passed a number where turbo-sdk 2.1.2 types maxMUSDCAmount as a BigNumber: the sample now uses new BigNumber(...) from bignumber.js 9. A BigNumber from another major version fails to type-check. The same free-tier claim lives in generated copies of the Turbo SDK README (sdks/turbo-sdk/(apis)/turboauthenticatedclient.mdx, sdks/turbo-sdk/llm.txt, public/sdks/turbo-sdk/llm.txt, public/llms-full.txt), which this PR does not edit: the fix belongs in the ardriveapp/turbo-sdk README, and the weekly regenerate run carries it here.

Needs your judgement

  1. The pointer names one gateway. With the default uri: "auto", the metadata JSON returns https://turbo-gateway.com/ITEM_ID and every other file ar://ITEM_ID. Zora's create API refuses an ar:// pointer with HTTP 500, uri is required and needs to be an ipfs:// or https:// uri (checked on Base and Base Sepolia, with no transaction sent). turbo-gateway.com serves a fresh item at once as exactly application/json, so Zora's metadata check passes. The guide makes no claim about how Zora's app renders ar:// media.
  2. A coin cannot be created from testnet uploads. The guide says so, dated 2026-10-15: ar-io.dev serves JSON with a charset, which fails Zora's check, and on Base Sepolia Zora's create API reverts the factory's coinAddress call. The uploads themselves work on testnet.
  3. content/build/testnet/index.mdx said 105 KiB uploads free on testnet, where the same page and the live /v1/info say 5 MiB. The guide links this page, so this PR fixes that line.
  4. Heading case. The guide's title is Title Case, to match its siblings in the sidebar, and its section headings are sentence case. On the turbo-upload page, the two new sections use Title Case to match the page.
  5. content/sdks/index.mdx said turbo-upload is server-side only. The web build has shipped since 0.5.0, so this PR changes that sentence and widens the turbo-upload line.

What changed

  • content/build/guides/zora-coin-metadata.mdx (new): when to use the uploader, install (with tsx), the package README's quickstart verbatim, who pays (signed free tier or x402 in USDC; the item limit is freeUploadLimitBytes in the upload service's /v1/info), the URLs it returns and why, private key, browser and smart-contract wallet signers, testnet, and the errors to catch.
  • content/sdks/turbo-upload/index.mdx: EVM signers and x402 uploads sections, the comparison table (keys, browser support, size measured for 0.7.0), requirements, and the description.
  • content/build/upload/x402-uploading-to-turbo.mdx: the unsigned-route correction described earlier.
  • public/SKILL.md: an install line for each package, turbo-upload EVM and x402 recipes, and a Zora recipe matching the guide. public/llms.txt: one line for the guide (the file is hand-written; no generator touches it).
  • content/build/testnet/index.mdx: the testnet free item size is 5 MiB.
  • content/build/guides/meta.json and the guides landing page: list the guide. The folder sorts by title, so it lands last.

Not changed: content/sdks/turbo-upload/llm.txt, public/sdks/turbo-upload/llm.txt and public/llms-full.txt are generated, so the weekly regenerate run picks these edits up.

Checks

  • npm run lint, npx tsc --noEmit: pass.
  • npm run check-links: 344 files, 0 errors.
  • npm run build: passes; the guide renders at /build/guides/zora-coin-metadata/ and sits last in the Guides sidebar.
  • Every code sample in the guide and the new SKILL.md recipes type-checks against @zoralabs/coins-sdk@0.8.0, viem@2.53.1, @ardrive/turbo-upload@0.7.0 and the uploader packed from 340a3b9. The guide's quickstart, testnet and browser samples are byte-identical to the package README at 340a3b9. The x402 page's two turbo-sdk samples type-check against @ardrive/turbo-sdk@2.1.2.
  • Run on testnet with a throwaway key:
    • The testnet sample returned ar:// for an image and the gateway URL for JSON.
    • The quickstart flow, with testnet: true on Base Sepolia, uploaded for free, and its metadata names the image as ar://. createCoin then failed Zora's check, as the guide says.
    • The guide's browser-wallet uploader, through an emulated wallet, also passed.
    • So did the turbo-upload EVM sample, its browser wallet wrapper and the SKILL.md EVM recipe.
  • The turbo-upload x402 sample ran to the service's 402 quote and stopped before signing, so nothing was paid.
  • The production quickstart ran up to reading coin.png, with no file present, so nothing was uploaded and no transaction was sent. No production upload or Base transaction was made from this PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8

vilenarios and others added 5 commits October 14, 2026 20:21
…rbo-upload

- build/guides/zora-coin-metadata: store a Zora coin's metadata and image
  with @ardrive/turbo-zora-uploader. Quickstart matches the package README;
  covers who pays (free signed uploads, x402 in USDC), why the URL is https,
  browser and smart-contract wallets, testnet and its metadata-check gap,
  and the errors to catch.
- sdks/turbo-upload: EVM signers (ANS-104 type 3) and x402 uploads from
  0.7.0; the comparison table and requirements no longer say Node only.
- sdks/index: turbo-upload runs in browsers, through a wallet signer.
- public/SKILL.md: turbo-upload EVM and x402 recipes, and the Zora recipe.
- public/llms.txt, build/guides nav and landing card: link the guide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8
The page said unsigned x402 uploads under 105 KiB are free and work from
an unauthenticated client. They are not: an unpaid POST of five bytes to
/v1/x402/upload/unsigned (and to /v1/x402/data-item/unsigned) answers 402
with a USDC price. Only signed items within the free tier upload free.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8
The uploader returns ar://ITEM_ID and assumes no gateway (package head
3411139). The guide's quickstart and testnet sample are re-synced from its
README, so the createCoin call sets skipMetadataValidation: true.

- "Why the URLs are ar://": ar:// is gateway-neutral and permanent; Zora's
  SDK 0.8.0 fetches ar:// through http://arweave.net/, which can lag a fresh
  upload, so the check is skipped; createCoin succeeds, and Zora's app might
  not show the name, image or description until arweave.net serves the
  metadata. uri "https" with a gateway you choose keeps the check.
- Removes every sentence that made turbo-gateway.com the default.
- Node.js 20.3 or later; the item limit is freeUploadLimitBytes; adds a
  TurboValidationError row; mode "signed" refuses maxUsdc.
- public/SKILL.md, public/llms.txt and the guides landing card match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8
Zora's create API refuses an ar:// coin metadata URI ("uri is required and
needs to be an ipfs:// or https:// uri", checked on Base and Base Sepolia).
The uploader (package head 9520ff4) defaults to uri "auto": the metadata
JSON returns https://turbo-gateway.com/ITEM_ID and media returns
ar://ITEM_ID. The quickstart, testnet and browser samples are re-synced
from its README, so skipMetadataValidation is gone.

- "The URLs it returns": why the pointer is https, why turbo-gateway.com
  passes Zora's check, and that media names no gateway.
- Testnet: uploads work; creating a coin does not (ar-io.dev adds a
  charset, and Zora's API reverts coinAddress on Base Sepolia).
- Errors: tags over 3072 bytes are TurboConfigError at creation;
  TurboValidationError covers a file over about 75 MiB or tags plus the
  Content-Type tag over 3072 bytes at upload.
- tsx in the install step; the notice carries no cross-reference; a signer
  with signMessage and recoverPublicKey is tried on the signed path first.
- x402 page: maxMUSDCAmount is optional; x402-fetch caps at 0.10 USDC.
- turbo-upload page and sdks index: signer list widened.
- public/SKILL.md: uploader install line, ar://ITEM_ID, imageFile
  declared, free-tier wording. llms.txt and the landing card match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8
Guide (matches @ardrive/turbo-zora-uploader at 340a3b9):
- The 1.2 s check result is dated rather than credited to tests that do
  not ship; the Base Sepolia refusal, ar-io.dev's charset and the ar://
  refusal are dated too.
- Carries the README caveat that how Zora's apps display ar:// media is
  not verified; "a gateway that has the item" can resolve ar://.
- ITEM_ID is defined before its first use; the smart-wallet sample wraps
  at 80 columns; Node.js 20 or later, as the package's engines say.
- Errors table: one TurboTimeoutError / AbortError / TimeoutError row,
  and the TurboPaymentError caveat to check transfers before retrying.

x402 page: uploadRawX402Data takes maxMUSDCAmount as a BigNumber from
bignumber.js 9 (a number, or BigNumber from another major, fails to
type-check against turbo-sdk 2.1.2); x402-fetch is an optional peer to
install.

Testnet Sandbox: the free item size is 5 MiB, as /v1/info reports, not
105 KiB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015JYw2Nzv95CXaVZwUKS5n8

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant