# Contract Overview

## Basic NFT Mint Contract

* `_baseURI()`: This is an internal, virtual function that returns the base URI for the NFTs. It is called by other functions in the contract to generate the full URI for a specific NFT.
* `mint()`: This function mints a specified number of NFTs and sends them to the caller's address. It requires that the sale is not paused, that a valid number of NFTs is specified, and that the maximum supply has not been exceeded. If the caller is not the contract owner, it also requires that the caller has sent sufficient funds to cover the cost of the NFTs. It calls the `_safeMint()` function to mint the NFTs and transfers the corresponding amount of ERC20 tokens to the caller's address.
* `mintFor()`: This function is similar to `mint()`, but allows the caller to specify the address to which the NFTs and ERC20 tokens should be sent.
* `airDrop()`: This function allows the contract owner to mint a specified number of NFTs and send them to a specified address for free. It requires that a valid number of NFTs is specified and that the maximum supply has not been exceeded.&#x20;
* `walletOfOwner()`: This function returns an array of the token IDs for all NFTs owned by a specified address.
* `tokenURI()`: This function returns the URI for a specific NFT. It concatenates the base URI and the token ID to generate the full URI.
* `setBaseURI()`: This function allows the contract owner to set the base URI for the NFTs.
* `setNotRevealedURI()`: This function allows the contract owner to set the URI that should be used for NFTs whose metadata has not yet been revealed.
* `setCost()`: This function allows the contract owner to set the cost of minting an NFT.
* `pause()`: This function allows the contract owner to pause the sale of NFTs.
* `reveal()`: This function allows the contract owner to reveal the metadata for all NFTs whose metadata has not yet been revealed.
* `transferOwnership`: This function allows the current owner of a smart contract to transfer ownership to a new address. It is usually only accessible to the current owner and takes a single input parameter of the new owner's address. This function is often used to change the owner of the contract or to update the owner's address.
* `renounceOwnership`: This function allows the current owner of a smart contract to give up their ownership. It is usually only accessible to the current owner and does not take any input parameters. Once called, the current owner's ownership is removed and the contract is left without an owner.
* `withdraw`: This function is a function that allows the contract owner to withdraw the balance of the contract's account.

## Allowlist Contract's functions

* `mint()`: This function mints a specified number of NFTs and sends them to the caller's address. It requires that the sale is not paused, that a valid number of NFTs is specified, and that the maximum supply has not been exceeded. If the caller is not the contract owner, it also requires that the caller has sent sufficient funds to cover the cost of the NFTs, and that the caller is on the allowlist if the allowlist sale is enabled. It calls the `_safeMint()` function to mint the NFTs.
* `mintFor()`: This function is similar to `mint()`, but allows the caller to specify the address to which the NFTs should be sent.
* `airDrop()`: This function allows the contract owner to mint a specified number of NFTs and send them to a specified address for free. It requires that a valid number of NFTs is specified and that the maximum supply has not been exceeded. It calls the `_safeMint()` function to mint the NFTs.
* `setAllowlistSale()`: This function allows the contract owner to enable or disable the allowlist sale, to enable set it to `True`, to disable to `False`
* `addAllowlistSpot()`: This function allows the contract owner to add an address and amount to the allowlist.
* `addToAllowlistMultiple()`: This function allows the contract owner to add a specified number of allowlist spots for multiple addresses. It takes two input parameters: an array of addresses (`to`) and an array of integers representing the number of spots to be added for each address (`_amounts`)

## BEP20-linked NFT Contracts

* `receive()`: This function allows the contract to receive Ether payments. It increments the `tokenBalance` variable by the amount of Ether received and emits an `TransferReceived` event.
* `transferToken()`: This function transfers a specified amount of the ERC20 token associated with the NFT contract to a specified address. It requires that the contract has a sufficient balance of the ERC20 token and emits an `TransferSent` event upon success.
* `setToken()`: This function allows the contract owner to set the address of the ERC20 token associated with the NFT contract.
* `setTokenAmount()`: This function allows you to specify the number of ERC20 tokens that will be distributed with each NFT minting.
* `emergencyTokenWithdraw`: This function allows the contract owner to withdraw all of the ERC20 tokens held by the contract and pause the contract. It is only accessible to the contract owner.

## Additional Functions

* `setMaxSupply()`: This function allows the contract owner to decrease the maximum number of NFTs that can be minted, but it cannot be used to increase the maximum beyond the initial setting.

## Ad
