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
ipIdandtokenIdin theIPRegisteredevent
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
AuctionRevealConditionso it can only be decrypted after the deadline and aftertrigger()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:
- Your wallet signs the reserve amount using
personal_sign(no gas — this is a signature, not a transaction). - The app encrypts the signed payload via TDH2 into a CDR ciphertext (via the
/api/encrypt-bidserver route — CDR's WASM runs server-side). - 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
submitEncryptedReservedirectly — 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
- Choosing license terms — pick the right preset
- Fees and royalties — what flows where
- Lifecycle — what happens after you list