Git Source

Inherits: Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721URIStorageUpgradeable, ERC721BurnableUpgradeable, OwnableUpgradeable, UUPSUpgradeable, ProtocolTokenCommonU, ReentrancyGuard

Author: @ShaneDuncan602, @oscarsernarosero, @TJ-Everett

This is the base contract for all protocol ERC721Upgradeables

State Variables

handlerAddress

address public handlerAddress;

handler

IProtocolTokenHandler handler;

_tokenIdCounter

CountersUpgradeable.Counter internal _tokenIdCounter;

baseUri

Base Contract URI

string public baseUri;

__gap

memory placeholders to allow variable addition without affecting client upgradeability

uint256[49] __gap;

Functions

constructor

constructor();

initialize

This function should be called in an “atomic” deploy script when deploying an ERC721Upgradeable contract. “Front Running” is possible if this function is called individually after the ERC721Upgradeable proxy is deployed. It is critical to ensure your deploy process mitigates this risk.

Initializer sets the name, symbol and base URI of NFT along with the App Manager and Handler Address

function initialize(
    string memory _nameProto,
    string memory _symbolProto,
    address _appManagerAddress,
    string memory _baseUri
) public virtual appAdministratorOnly(_appManagerAddress) initializer;

Parameters

NameTypeDescription
_nameProtostringName of NFT
_symbolProtostringSymbol for the NFT
_appManagerAddressaddressAddress of App Manager
_baseUristring

_initializeProtocol

Private Initializer sets the name, symbol and base URI of NFT along with the App Manager and Handler Address

function _initializeProtocol(address _appManagerAddress) private onlyInitializing;

Parameters

NameTypeDescription
_appManagerAddressaddressAddress of App Manager

_authorizeUpgrade

function _authorizeUpgrade(address newImplementation) internal override onlyOwner;

_burn

Function to burn or remove token from circulation

function _burn(uint256 tokenId) internal override(ERC721Upgradeable, ERC721URIStorageUpgradeable);

Parameters

NameTypeDescription
tokenIduint256Id of token to be burned

_baseURI

Function to return baseURI for contract

function _baseURI() internal view override returns (string memory);

Returns

NameTypeDescription
<none>stringbaseUri URI link to NFT metadata

tokenURI

Function to return tokenURI for contract

function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override(ERC721Upgradeable, ERC721URIStorageUpgradeable)
    returns (string memory);

Returns

NameTypeDescription
<none>stringtokenURI link to NFT metadata

setBaseURI

this is called in the constructor and can be called to update URI metadata pointer

Function to set URI for contract.

function setBaseURI(string memory _baseUri) public virtual appAdministratorOnly(appManagerAddress);

Parameters

NameTypeDescription
_baseUristringURI to the metadata file(s) for the contract

supportsInterface

Returns true if this contract implements the interface defined by interfaceId. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.

function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721URIStorageUpgradeable)
    returns (bool);

safeMint

END setters and getters *******

Add appAdministratorOnly modifier to restrict minting privilages

Function mints new a new token to caller with tokenId incremented by 1 from previous minted token.

function safeMint(address to) public payable virtual appAdministratorOnly(appManagerAddress);

Parameters

NameTypeDescription
toaddressAddress of recipient

_beforeTokenTransfer

Function called before any token transfers to confirm transfer is within rules of the protocol

function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize)
    internal
    override(ERC721Upgradeable, ERC721EnumerableUpgradeable)
    nonReentrant;

Parameters

NameTypeDescription
fromaddresssender address
toaddressrecipient address
tokenIduint256Id of token to be transferred
batchSizeuint256the amount of NFTs to mint in batch. If a value greater than 1 is given, tokenId will represent the first id to start the batch.

withdraw

Rule Processor Module Check

Function to withdraw Ether sent to contract

AppAdministratorOnly modifier uses appManagerAddress. Only Addresses asigned as AppAdministrator can call function.

function withdraw() public payable virtual appAdministratorOnly(appManagerAddress);

getHandlerAddress

This function returns the handler address

function getHandlerAddress() external view returns (address);

Returns

NameTypeDescription
<none>addresshandlerAddress

connectHandlerToToken

This function does not check for zero address. Zero address is a valid address for this function’s purpose.

Function to connect Token to previously deployed Handler contract

function connectHandlerToToken(address _deployedHandlerAddress) external appAdministratorOnly(appManagerAddress);

Parameters

NameTypeDescription
_deployedHandlerAddressaddressaddress of the currently deployed Handler Address