# ERC721

This contract is an advanced iteration of the standard `ERC721`. It stands out with its versatile minting options, including standard, pre-sale, and scheduled drops, catering to various launch strategies.&#x20;

The contract also introduces airdrop capabilities for mass distribution and a whitelisting mechanism, essential for exclusive launches or pre-sale events.&#x20;

Additionally, it incorporates social media link integration, crucial for community management. The contract's design includes features for pausing operations for security and managing token supply, such as burnable tokens and limits on tokens per wallet, making it a comprehensive solution for diverse NFT projects.

## Methods

## <mark style="color:blue;">`safeMint`</mark>

Mints a new NFT to a specified address.

```solidity
function safeMint(address to, string memory uri) public { }
```

### Parameters

| Name | Type    | Description                 |
| ---- | ------- | --------------------------- |
| to   | address | The address to mint NFT to. |
| uri  | string  | URI for the NFT's metadata. |

## <mark style="color:blue;">`updateUri`</mark>

Updates the URI for a specific token.

```solidity
function updateUri(string memory _newUri, uint tokenId) public { }
```

### Parameters

| Name     | Type   | Description                      |
| -------- | ------ | -------------------------------- |
| \_newUri | string | New URI to be set for the token. |
| tokenId  | uint   | ID of the token to update.       |

## <mark style="color:blue;">`setPresaleTime`</mark>

Sets the time for pre-sale minting.

```solidity
function setPresaleTime(uint256 _preSaleTime) external { }
```

### Parameters

| Name          | Type    | Description                                 |
| ------------- | ------- | ------------------------------------------- |
| \_preSaleTime | uint256 | The timestamp for when the pre-sale starts. |

## <mark style="color:blue;">`preSaleMint`</mark>

Allows minting during the pre-sale period.

```solidity
 function preSaleMint(string memory uri) external { }
```

### Parameters

| Name  | Type     | Description                 |
| ----- | -------- | --------------------------- |
| `uri` | `string` | URI for the NFT's metadata. |

## <mark style="color:blue;">`perWalletPreSaleMint`</mark>

Allows minting during pre-sale with per-wallet limits.

```solidity
function perWalletPreSaleMint(string memory uri) external { }
```

### Parameters

| Name | Type   | Description                 |
| ---- | ------ | --------------------------- |
| uri  | string | URI for the NFT's metadata. |

## <mark style="color:blue;">`setScheduledDropMintTime`</mark>

Sets the start and end time for scheduled drop mints.

```solidity
function setScheduleDropMintTime( uint256 _startDropTime, uint _endDropTime ) external { }
```

### Parameters

| Name            | Type    | Description                   |
| --------------- | ------- | ----------------------------- |
| \_startDropTime | uint256 | Start time for the drop mint. |
| \_endDropTime   | uint256 | End time for the drop mint.   |

## <mark style="color:blue;">`scheduledDropMint`</mark>

Allows minting during a scheduled drop.

```solidity
function scheduledDropMint(string memory uri) external { }
```

### Parameters

| Name | Type   | Description                 |
| ---- | ------ | --------------------------- |
| uri  | string | URI for the NFT's metadata. |

## <mark style="color:blue;">`airdropNFTs`</mark>

Distributes NFTs to multiple addresses.

```solidity
function airdropNFTs(address[] memory recipients, string[] memory uris) external onlyOwner { }
```

### Parameters

| Name       | Type       | Description                             |
| ---------- | ---------- | --------------------------------------- |
| recipients | address\[] | Array of recipient addresses.           |
| uris       | string\[]  | Array of URIs for each recipient's NFT. |

## <mark style="color:blue;">`setTwitterProfile`</mark>

Sets the Twitter profile link for the contract.

```solidity
 function setTwitterProfile(string memory _twitterProfile) external { }
```

### Parameters

| Name             | Type   | Description                 |
| ---------------- | ------ | --------------------------- |
| \_twitterProfile | string | URL of the Twitter profile. |

## <mark style="color:blue;">`setTelegramChannel`</mark>

Sets the Telegram channel link for the contract.

```solidity
function setTelegramChannel(string memory _telegramChannel) external { }
```

### Parameters

| Name              | Type   | Description                  |
| ----------------- | ------ | ---------------------------- |
| \_telegramChannel | string | URL of the Telegram channel. |

## <mark style="color:blue;">`setWebsiteURL`</mark>

Sets the website URL for the contract.

```solidity
function setWebsiteURL(string memory _websiteURL) external onlyOwner { }
```

### Parameters

| Name         | Type   | Description         |
| ------------ | ------ | ------------------- |
| \_websiteURL | string | URL of the website. |

## <mark style="color:blue;">`_burn`</mark>

Burns a token and adjusts the total supply.

```solidity
function _burn(uint256 tokenId) internal { }
```

### Parameters

| Name    | Type    | Description                   |
| ------- | ------- | ----------------------------- |
| tokenId | uint256 | ID of the token to be burned. |

## <mark style="color:blue;">`tokenURI`</mark>

Retrieves the URI of a specific token.

```solidity
 function tokenURI(uint256 tokenId) public view { }
```

### Parameters

| Name    | Type    | Description                          |
| ------- | ------- | ------------------------------------ |
| tokenId | uint256 | ID of the token to retrieve URI for. |

### Returns

| Name | Type   | Description                 |
| ---- | ------ | --------------------------- |
| URI  | string | URI of the specified token. |

## <mark style="color:blue;">`pause`</mark>

Pauses all token transfers. This can be used in case of an emergency to prevent any further transfers.

```solidity
function pause() external onlyOwner whenNotPaused { }
```

## <mark style="color:blue;">`unpause`</mark>

Unpauses the contract, re-enabling token transfers.

```solidity
 function unpause() external onlyOwner { }
```

## <mark style="color:blue;">`addToWhitelist`</mark>

Adds addresses to the whitelist, allowing them to participate in activities like pre-sale minting.

```solidity
function addToWhitelist(address[] memory accounts) external onlyOwner { }
```

### Parameters

| Name     | Type       | Description                                 |
| -------- | ---------- | ------------------------------------------- |
| accounts | address\[] | Array of addresses to add to the whitelist. |

## <mark style="color:blue;">`removeFromWhitelist`</mark>

Removes addresses from the whitelist.

```solidity
function removeFromWhitelist(address[] memory accounts) external onlyOwner { }
```

### Parameters

| Name       | Type        | Description                                      |
| ---------- | ----------- | ------------------------------------------------ |
| `accounts` | `address[]` | Array of addresses to remove from the whitelist. |

## <mark style="color:blue;">`isWhitelisted`</mark>

Checks if an address is on the whitelist.

```solidity
function whitelistMint(string calldata uri) external { }
```

### Parameters

| Name    | Type    | Description                                |
| ------- | ------- | ------------------------------------------ |
| account | address | The address to check for whitelist status. |

### Returns

| Name        | Type | Description                                                  |
| ----------- | ---- | ------------------------------------------------------------ |
| whitelisted | bool | Returns true if the address is whitelisted, false otherwise. |
