# 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](/linkdrop-dashboard/creating-links-in-bulk/main-guide/setting-up-a-campaign.md), 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");`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.linkdrop.io/linkdrop-dashboard/creating-links-in-bulk/main-guide/mint-pattern-requirements.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
