# Extensions Functions

These functions are functions called by extensions built for ERC721 and ERC1155 Creator Contracts

## General Functions

<details>

<summary>tokenExtension</summary>

*Get the extension that minted the specified token. If not minted by a token, will return the `0x0` address*

***Permissions:** Public function callable by anyone.*

```solidity
function tokenExtension(uint256 tokenId) external view returns (address)
```

</details>

## Extension Mangement

Functions used to manage installed extensions

<details>

<summary>getExtensions</summary>

*Gets a list of all registered extensions.*

***Permissions:** Public function callable by anyone.*

```solidity
function getExtensions() view returns (address[] memory extensions)
```

</details>

<details>

<summary>registerExtension</summary>

*Registers an extension, allowing it to access the mint function, and ability to set a token’s metadata URI or a base URI for that extension. The token URI for tokens minted by this extension will be baseURI\<tokenID>. When registering an extension you can specify a third boolean parameter of "true" for baseURIIdentical to specify the token URI for all tokens to be identical (will not increment with appended tokenId).*

***Permissions:** Owner/Admin function callable by contract owner only.*

```solidity
function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical)s, baseURI (string), baseURI (string)

function registerExtension(address extension, string calldata baseURI)
```

</details>

<details>

<summary>unregisterExtension</summary>

*Unregisters an extension and removes access to the mint function and all other extension capabilities.*

***Permissions:** Owner/Admin function callable by contract owner only.*

```solidity
function unregisterExtension(address extension)
```

</details>

<details>

<summary>blacklistExtension</summary>

*Blacklists an extension, preventing future registrations of the address. This function also destroys all references to metadata associated with tokens created by this extension, making them effectively useless.*

***Permissions:** Owner/Admin function callable by contract owner only.*

```solidity
function blacklistExtension(address extension)
```

</details>

<details>

<summary>setApproveTransferExtension</summary>

*Set the overall contract's approve transfer extension (See how to* [*Receive a Transfer Callback here*](https://docs.manifold.xyz/manifold-for-developers/smart-contracts/manifold-creator/contracts/extensions)*).  Applies to all tokens in the contract and takes precedent over any extension level approve transfer functionality.*\
\
*Unset by setting the extension to the 0x0 address.*

***Permissions:** Owner/Admin function callable by contract owner only.*

```solidity
function setApproveTransferExtension(address extension)
```

</details>

<details>

<summary>setRoyaltiesExtension</summary>

Override the royalties for all tokens minted by the specified extension

***Permissions:** Owner/Admin function callable by contract owner only.*

```solidity
function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints)
```

</details>

## Extension Metadata Functions

Functions used by extensions to set the metadata of tokens minted by the extension

<details>

<summary>setBaseTokenURIExtension</summary>

*Sets the base URI for any tokens minted from this extension. Once set, the metadata URI will be base\_uri/\<tokenId> by default.*

***Permissions:** Only callable by an extension*

```solidity
function setBaseTokenURIExtension(string calldata uri)
```

</details>

<details>

<summary>setTokenURIPrefixExtension</summary>

*Sets a prefix for all tokens minted from this extension. If configured, and a token has a URI set, tokenURI will return \<prefixURI>\<tokenURI>.*

***Permissions:** Only callable by an extension*

```solidity
function setTokenURIPrefixExtension(string calldata prefix)
```

</details>

<details>

<summary>setTokenURIExtension</summary>

*Set the tokenURI for a specific token minted from this extension. Useful if you want to do something with a dynamic metadata server and need sequential numbering of tokens. Various methods defined below.*

***Permissions:** Only callable by an extension and only on token minted by the extension*

```solidity
function setTokenURIExtension(uint256 tokenId, string calldata uri) external

function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri)
```

</details>

## Extension Logic Overriding

The powerful thing about Manifold Creator is the ability for extensions to fully override core functionality of NFT smart contracts.  The following is a list of functionality extensions can override.

### Metadata Handling

An extension can fully manage the token metadata logic by implementing the [ICreatorExtensionTokenURI ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ICreatorExtensionTokenURI.sol)interface.

If an extension implements this interface then all metadata logic will be deferred to the extension's `tokenURI` function.

### Token Transfer Approval

An extension can control whether or not a token can be transferred. To do this, the extension must implement the [IERC721CreatorExtensionApproveTransfer ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ERC721/IERC721CreatorExtensionApproveTransfer.sol)interface (for ERC721) or the [IERC1155CreatorExtensionApproveTransfer ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ERC1155/IERC1155CreatorExtensionApproveTransfer.sol)interface (for ERC1155).

If an extension implements this interface, by default, all transfers will call the extension's `approveTransfer` function prior to every token transfer. An extension can enable/disable this by calling the [setApproveTransferExtension ](#setapprovetransferextension)function.

### **Token Burn Callback**

An extension can receive a callback whenever a token is burned. To do this, the extension must implement the [IERC721CreatorExtensionBurnable ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ERC721/IERC721CreatorExtensionBurnable.sol)interface (for ERC721) or the [IERC1155CreatorExtensionBurnable ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ERC1155/IERC1155CreatorExtensionBurnable.sol)interface (for ERC1155).

If an extension implements this interface, every time a token is burned it will call the extension's `onBurn` function.

### Royalties

An extension can define the royalties for any tokens they mint. To do this, the extension must implement the [ICreatorExtensionRoyalties ](https://github.com/manifoldxyz/creator-core-solidity/blob/main/contracts/extensions/ICreatorExtensionRoyalties.sol)interface.

If an extension implements this interface, the Creator Contract will defer all royalty lookups to the extension for tokens minted by it.

## Minting

These are functions used by extensions to mint NFTs.  NFTs minted by the extension will adhere to the extension's overriding logic.

### ERC721

<details>

<summary>mintExtension</summary>

*Mints a token from the extension. Also can set token URI or token data (immutable for a token) if desired.*

*Token Data is useful if you wish to store additional data needed by the extension at no additional cost (e.g. mint ordering data).*

***Permissions:** Only callable by an installed extension*

```solidity
function mintExtension(address to) returns (uint256)

function mintExtension(address to, string calldata uri) returns (uint256)

function mintExtension(address to, uint80 data) returns (uint256)
```

</details>

<details>

<summary>mintExtensionBatch</summary>

*Batch mints tokens from the extension. Also can set token URI or token data (immutable for a token) if desired.*

*Token Data is useful if you wish to store additional data needed by the extension at no additional cost (e.g. mint ordering data).*

***Permissions:** Only callable by an installed extension*

```solidity
function mintExtensionBatch(address to, uint16 count) returns (uint256[] memory)

function mintExtensionBatch(address to, string[] calldata uris) returns (uint256[] memory)

function mintExtensionBatch(address to, uint80[] calldata data) returns (uint256[] memory)
```

</details>

### ERC1155

<details>

<summary>mintExtensionNew</summary>

*Mints a completely new token with the given amount from an extension. If URI is empty, URI will fall back to the default URI configured.*

***Permissions:** Only callable by an installed extension*

```solidity
function mintExtensionNew(address[] calldata to, uint256[] calldata amounts, string[] calldata uris) returns (uint256[] memory)
```

</details>

<details>

<summary>mintExtensionExisting</summary>

*Mints more of an existing token from the extension. Requires that the original token already exist and that it is not a token from an extension.*

***Permissions:** Only callable by an installed extension*

```solidity
function mintExtensionExisting(address[] calldata to, uint256[] calldata tokenIds, uint256[] calldata amounts)
```

</details>
