How to list your NFTs that were minted with a custom Manifold contract for a fixed price on Zora with the primary and secondary royalties paid out via 0xsplits
0x2b47
May 8th, 2022

Introduction

The title is quite a mouthful, but it’s the most accurate summary of what I’m about to explain in this article. For an upcoming audio-visual NFT release I tried to find a technical solution where:

a) my collaborator and I would be able to mint on our own custom contract

b) have both primary and secondary sales split directly into two different wallets and

c) have the NFT listed on the Zora marketplace

As it turns out, there is no off-the-shelf solution for this, so I started to investigate further. My plan was to really understand how contracts, modules and tokens interact with my wallet and the blockchain so I reached out to @sweetman.eth and @0xSplits who were so kind to invest their time to explain everything to me in detail. This article explains everything I learned in the process. I hope you will find it useful!

Overview

First of all, let’s get an overview what we’re actually doing here from a conceptual standpoint:

  • A contract on 0xsplits distributes incoming fees according to a defined split to different wallets. This is the contract address where all sales profits (both primary and secondary) will be directed to
  • A custom contract on Manifold will be used for minting the tokens. This is where the assets will be uploaded to IPFS. Gas fees occur once for the deployment of the contract, and once for every token that is minted. Also, this is where you set the wallet address for secondary sales.
  • In order for the token to be indexed by Zora (and subsequently appear on the Zora marketplace), the Zora Transfer helper has to be be approved. Gas fees occur once for this.
  • To be able to define the details for token listing, the Zora Asks V1.1 module has to be approved for the Module Manager. Gas fees occur once for this.
  • As a last step, the sales price, currency and payout address need to be set for the token on the Zora Asks V1.1 module. Once the Zora Transfer Helper and Zora Asks V1.1 module are approved for your contract, this is the only step that needs be repeated for every new token you want to list.
Relationships between the different contracts, modules, the token and the wallet
Relationships between the different contracts, modules, the token and the wallet

Step-by-step guide

This part of the article is the most detailed, as I wanted to make sure every step is explained and every on-screen reference is explained. I would suggest to take note of a few important details because you embark on your journey as you will have to return to them frequently throughout the process. These are:

  • Your wallet address
  • Manifold contract address
  • ERC-721 Helper
  • Zora Module Manager
  • Asks V1.1 Address

Also, I would suggest to do a trial run on the Rinkeby testnet before moving to mainnet. This has been really useful for me, as I didn’t have to worry about wasting gas fees on mistakes. You can request Rinekby Eth via the link at the end of the article. Be aware that the Zora contract addresses are different for Rinkeby and mainnet, so make sure you use the correct ones depending on which you are using.

All in all there are six steps required to list your NFTs that were minted with a custom Manifold contract for a fixed price on Zora with the primary and secondary royalties paid out via 0xsplits (hence the title of this article):

Step 1: create a royalty split via 0xsplits

  • Connect to https://app.0xsplits.xyz/
  • Define the split of the sales between the different artists that participate in your project
  • Note the address of your split contract

Step 2: create a custom contract via Manifold

  • Connect to https://studio.manifold.xyz/
  • Deploy a custom ERC-721 contract (costs: less than 0.001 ETH)
  • Select „Settings“ and set „Default Royalties“ to the 0xsplits contract address
  • Note the address of your Manifold custom contract

Step 3: mint a ERC-721 token to your custom Manifold contract

  • Upload a file and specify artwork title and description
  • Select „View on OpenSea“ and expand „Details“
  • Note the ID of your token

Step 4a: approve the Zora Transfer Helper

  • Connect to https://etherscan.io/
  • Enter your Manifold contract address and select „Contract“ Select „Write as proxy“ and expand „23. setApprovalForAll“
  • set „operator“ to the contract address of the Zora ERC-721 helper
  • set „approved (bool)“ to „true“

Step 4b: check the status of the Zora Transfer Helper -

  • Connect to https://etherscan.io/
  • Enter your Manifold contract address and select „Contract“
  • Select „Read as proxy“ and expand „10. isApprovedForAll“
  • set „owner“ to your wallet address
  • set „operator“ to the contract address of the Zora ERC-721 helper
  • „Query“ should return „bool: True“

Step 5a: approve the Zora Asks V1.1 module

  • Connect to https://etherscan.io/
  • Enter the contract address of the Zora Module Manager and select „Contract“
  • Select „2. Select Approval for Module“
  • set „module“ to the Zora Asks V1.1 contract address
  • set „approved (bool)“ to „true“

Step 5b: Check the status of the Zora Asks V1.1 module

  • Connect to https://etherscan.io/
  • Enter the contract address of the Zora Module Manager and select „Contract“
  • Select „Read Contract“ and expand „1. isModuleApproved“
  • set „user (address)“ to your wallet address
  • set „module“ to the Zora Asks V1.1 contract address
  • „Query“ should return „bool: False“

Step 6a: create a Zora Asks V1.1 for the token minted on your custom contract

  • Connect to https://etherscan.io/
  • Enter the contract address of the Zora Asks V1.1 module and select „Contract“
  • Select „Write Contract“ and expand „3. createAsk“
  • set „tokenContract (address)“ to your Manifold custom contract address
  • set „input (uint256)“ to the ID of the token you minted
  • set „askPrice“ to the sales price in in Gwei (example: 0.1 ETH = 100000000)
  • set “askCurrency to the ID of the ERC-20 token you want to sell on (example:
  • 0x0000000000000000000000000000000000000000 for ETH)
  • set „sellerFundsRecipient (address)“ to the address of your 0xsplits contract
  • set „findersFeeBps (uint16)“ to „0“ if you only want to list on Zora

Step 6b: check the status of the Zora Asks V1.1 for the token minted on your custom contract

  • Connect to https://etherscan.io/
  • Enter the contract address of the Zora Asks V1.1 module and select „Contract“
  • Select „Read Contract“ and expand „1. askForNFT“ set „input (address)“ to your Manifold custom contract address set „input (uint256)“ to the ID of the token you minted
  • „Query“ should return the correct wallet addresses in „seller“ and „sellerFundsRecipient“

Important Resources

Closing Thoughts

I hope this article brought some value to your web3 journey. In case you come across any factual errors or wrong terminology please drop me a line so we can improve this together.

Arweave TX
V6n4wj3ianxtuxYlV3XMbPb7ksPOR9-ZvoqkPNux5Qg
Ethereum Address
0x2b4706043bA86AEEa7395942404a82CC6ee3E861
Content Digest
CKikAuMK71sdfrfDb5qUb-Hwp-PwbhC0v2muIUyCcm0