Skip to main content

Mint and list a new IP

This is the most common seller path. Use it when your IP isn't already registered on Story Protocol. SealedIP handles the mint, registration, and auction setup, then guides you through sealing your reserve price.

What happens behind the four confirmations

Four on-chain steps, each requiring a separate wallet action. Steps 1 and 2 are full wallet transactions. Step 3 is a transaction. Step 4 is a personal signature (no gas) followed by one more transaction.

Step 0 — Fill the form

On sealedip.com/create, pick the Create new IP tab.

Fields:

  • Title — what bidders see on the lot card. 1–80 characters.
  • Description — optional, but recommended. A sentence about what the IP is.
  • Category — Music, Art, Characters, Worlds, Code, or Other. Powers the marketplace category chips.
  • Cover image — drag-and-drop or click to upload a PNG / JPEG / WEBP / GIF, up to 10 MB. Pinned to IPFS via Pinata.
  • License terms — one of the five PIL presets. Click "View full terms" to inspect.
  • Reserve price — your minimum acceptable bid in WIP. Bidders never see this number; it is sealed into a CDR vault and revealed only at settlement.
  • Bidding window — 5 min / 1 hour / 24 hours / 7 days / 30 days.

The listing preview on the right updates as you type so you can see how the lot will look on the marketplace.

The "What you take home" panel summarizes:

  • Marketplace fee (0%)
  • What you receive if the reserve is met
  • Royalty preview (when commercial-remix preset is picked, shows the 5% revenue share configured against your wallet)
  • The four steps that come next

Step 1 — Mint NFT + register IP

Your wallet signs RegistrationWorkflows.mintAndRegisterIp(...) on Story's SPG. This:

  • Mints a new NFT into the shared SealedIP Marketplace SPGNFT collection at 0xd93d…3f23
  • Registers it as a Story IP, creating an ERC-6551 IP account
  • Returns the ipId and tokenId in the IPRegistered event

The NFT metadata (name, description, image, category) and the IP metadata (title, description, ipType, category, creators) are both pinned to IPFS beforehand. The on-chain tokenURI points to ipfs://<cid>.

Step 2 — Attach license terms

Your wallet signs LicensingModule.attachLicenseTerms(ipId, PIL, termsId).

For presets that reuse an existing licenseTermsId (Personal use only, Non-commercial Social Remixing), the call is fast. For presets that register-on-first-use (Commercial · No remix, Commercial remix, CC Attribution), the SDK first calls PILicenseTemplate.registerLicenseTerms to get a permanent id, then attaches. The registration is idempotent — identical structs always return the same id, so the second user to pick the preset reuses the first user's registration.

Step 3 — Open the auction

Your wallet signs SealedAuction.createAuction(ipId, termsId, deadline). The contract:

  • Allocates a fresh auctionId
  • Allocates a seller-side CDR vault for your reserve (reserveUuid)
  • Registers the vault on AuctionRevealCondition so it can only be decrypted after the deadline and after trigger() is called
  • Emits AuctionCreated(auctionId, seller, ipId, licenseTermsId, reserveUuid, deadline)

The reserve is not on-chain yet at this point. Bidders cannot see it because it hasn't been written. The next step seals it.

Step 4 — Seal your reserve

After the auction is created, the app asks you to seal your reserve:

  1. Your wallet signs the reserve amount using personal_sign (no gas — this is a signature, not a transaction).
  2. The app encrypts the signed payload via TDH2 into a CDR ciphertext (via the /api/encrypt-bid server route — CDR's WASM runs server-side).
  3. Your wallet sends SealedAuction.submitEncryptedReserve(auctionId, ciphertext).

After confirmation, the contract stores that the reserve vault has a ciphertext (reserveHasCiphertext = true) and emits EncryptedReserveSubmitted. Bidders still see no number — only a "reserve sealed" indicator on the auction card.

If you skip this step: the reserve defaults to 0, meaning any bid can win. The app will prompt you to seal before you navigate away, but there's no on-chain enforcement forcing you to seal.

After the four steps

Your auction is live. Bidders can see it on the marketplace immediately. The countdown runs until your deadline.

The IP NFT is in your wallet (or wherever you specified the recipient). The license is attached to the IP. Both are visible on Storyscan.

You can navigate away. Check back on the auction detail page or My Bids page when the deadline approaches.

If something goes wrong mid-flow

Each step is independent. If one fails:

  • Step 1 fails: Nothing on-chain happened. Retry.
  • Step 2 fails: The NFT and IP exist but no terms are attached. You can manually attach terms via Storyscan's contract write tab, then use the List existing IP tab.
  • Step 3 fails: The IP exists and has terms attached. Use the List existing IP tab to skip steps 1–2, then seal your reserve after.
  • Step 4 fails: The auction is live with a floor of 0. You can retry submitEncryptedReserve directly — the contract allows it as long as the auction is still Open and you haven't already written a ciphertext.

This multi-step model exists because Story Protocol's contracts separate these operations. Bundling them into a single transaction would require a custom periphery contract; we use the standard one to avoid divergence from Story's official surface.

Next