# Mint pattern requirements

{% hint style="info" %}
This option is suitable **for advances users** who can create their NFTs deploying their own contract.  \
\
This way, when you will use the contract that follows the requirements below and select "Mint" pattern when[ setting up a campaign](https://docs.linkdrop.io/linkdrop-dashboard/creating-links-in-bulk/main-guide/setting-up-a-campaign), your NFTs will not be *pre-minted,* but can be *minted at claim, when user will follow the claim link.*
{% endhint %}

## NFT requirements to use mint pattern

In order to be able to use the “mint at claim” pattern the NFT **contract** in addition to standard ERC721/1155 ABIs, contracts should have the functions based on OpenZeppelin Access pattern (<https://wizard.openzeppelin.com/#erc721>).

### **ERC721 Mintable ABI:**

```
interface IERC721Mintable {
  function safeMint(address to) external; // increments token ID for each minted token incrementally starting from 1
  function grantRole(bytes32 role, address account) external;
  function hasRole(bytes32 role, address account) public view returns (bool)
}
```

Please note that `safeMint` function doesn’t have `tokenURI` parameter, so metadata for ERC721 tokens should be uploaded to all tokens in advance and `tokenURI` function should automatically compute metadata URL by concatenating `baseURI` and \`tokenId together.You can see an example ERC721 Mintable Contract implementation here -<https://polygonscan.com/address/0xc5271d9Df75c0FBE241730F2Fbc9e2480359Cf77#code>

### **ERC1155 Mintable ABI:**

```
interface IERC1155Mintable {
 function mintTo(address account, uint256 id, string calldata tokenURI, uint256 amount) external;
 function grantRole(bytes32 role, address account) external;
 function hasRole(bytes32 role, address account) public view returns (bool)
}
```

When claiming ERC1155 token, Linkdrop Escrow contract will call the NFT contract's `mintTo` function and empty string will be passed as  tokenURI. \
Metadata for each token id should be prepared before claim by minting 0 tokens and passing correct tokenURI for that token id. The NFT contract should respect that logic, please refer to the [Thirdweb ERC1155 implementation](https://portal.thirdweb.com/solidity/base-contracts/erc1155base) to learn more.&#x20;

### Please also note

`safeMint` for ERC721 and `mint` for ERC1155 contracts should both respect MINTER\_ROLE, which is computed the following way:\
`bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");`
