# Snapshot report for `src/erc721.test.ts`
The actual snapshot is saved in `erc721.test.ts.snap`.
Generated by [AVA](https://avajs.dev).
## basic
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
␊
contract MyToken is ERC721 {␊
constructor() ERC721("MyToken", "MTK") {}␊
}␊
`
## name is unicodeSafe
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
␊
contract MyTokec is ERC721 {␊
constructor() ERC721(unicode"MyTokeć", "MTK") {}␊
}␊
`
## base uri
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
␊
contract MyToken is ERC721 {␊
constructor() ERC721("MyToken", "MTK") {}␊
␊
function _baseURI() internal pure override returns (string memory) {␊
return "https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/";␊
}␊
}␊
`
## enumerable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";␊
␊
contract MyToken is ERC721, ERC721Enumerable {␊
constructor() ERC721("MyToken", "MTK") {}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721, ERC721Enumerable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721, ERC721Enumerable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, ERC721Enumerable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## uri storage
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721URIStorage} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";␊
␊
contract MyToken is ERC721, ERC721URIStorage {␊
constructor() ERC721("MyToken", "MTK") {}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function tokenURI(uint256 tokenId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (string memory)␊
{␊
return super.tokenURI(tokenId);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## mintable + uri storage
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721URIStorage} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyToken is ERC721, ERC721URIStorage, Ownable {␊
constructor(address initialOwner)␊
ERC721("MyToken", "MTK")␊
Ownable(initialOwner)␊
{}␊
␊
function safeMint(address to, uint256 tokenId, string memory uri)␊
public␊
onlyOwner␊
{␊
_safeMint(to, tokenId);␊
_setTokenURI(tokenId, uri);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function tokenURI(uint256 tokenId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (string memory)␊
{␊
return super.tokenURI(tokenId);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## mintable + uri storage + incremental
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721URIStorage} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyToken is ERC721, ERC721URIStorage, Ownable {␊
uint256 private _nextTokenId;␊
␊
constructor(address initialOwner)␊
ERC721("MyToken", "MTK")␊
Ownable(initialOwner)␊
{}␊
␊
function safeMint(address to, string memory uri)␊
public␊
onlyOwner␊
returns (uint256)␊
{␊
uint256 tokenId = _nextTokenId++;␊
_safeMint(to, tokenId);␊
_setTokenURI(tokenId, uri);␊
return tokenId;␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function tokenURI(uint256 tokenId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (string memory)␊
{␊
return super.tokenURI(tokenId);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## burnable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Burnable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";␊
␊
contract MyToken is ERC721, ERC721Burnable {␊
constructor() ERC721("MyToken", "MTK") {}␊
}␊
`
## burnable + uri storage
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Burnable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";␊
import {ERC721URIStorage} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";␊
␊
contract MyToken is ERC721, ERC721URIStorage, ERC721Burnable {␊
constructor() ERC721("MyToken", "MTK") {}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function tokenURI(uint256 tokenId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (string memory)␊
{␊
return super.tokenURI(tokenId);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, ERC721URIStorage)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## pausable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Pausable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyToken is ERC721, ERC721Pausable, Ownable {␊
constructor(address initialOwner)␊
ERC721("MyToken", "MTK")␊
Ownable(initialOwner)␊
{}␊
␊
function pause() public onlyOwner {␊
_pause();␊
}␊
␊
function unpause() public onlyOwner {␊
_unpause();␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721, ERC721Pausable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
}␊
`
## mintable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyToken is ERC721, Ownable {␊
constructor(address initialOwner)␊
ERC721("MyToken", "MTK")␊
Ownable(initialOwner)␊
{}␊
␊
function safeMint(address to, uint256 tokenId) public onlyOwner {␊
_safeMint(to, tokenId);␊
}␊
}␊
`
## mintable + roles
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
␊
contract MyToken is ERC721, AccessControl {␊
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊
␊
constructor(address defaultAdmin, address minter) ERC721("MyToken", "MTK") {␊
_grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊
_grantRole(MINTER_ROLE, minter);␊
}␊
␊
function safeMint(address to, uint256 tokenId) public onlyRole(MINTER_ROLE) {␊
_safeMint(to, tokenId);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721, AccessControl)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## mintable + managed
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
␊
contract MyToken is ERC721, AccessManaged {␊
constructor(address initialAuthority)␊
ERC721("MyToken", "MTK")␊
AccessManaged(initialAuthority)␊
{}␊
␊
function safeMint(address to, uint256 tokenId) public restricted {␊
_safeMint(to, tokenId);␊
}␊
}␊
`
## mintable + incremental
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyToken is ERC721, Ownable {␊
uint256 private _nextTokenId;␊
␊
constructor(address initialOwner)␊
ERC721("MyToken", "MTK")␊
Ownable(initialOwner)␊
{}␊
␊
function safeMint(address to) public onlyOwner returns (uint256) {␊
uint256 tokenId = _nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
}␊
`
## votes
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Votes} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";␊
␊
contract MyToken is ERC721, EIP712, ERC721Votes {␊
constructor() ERC721("MyToken", "MTK") EIP712("MyToken", "1") {}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721, ERC721Votes)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721, ERC721Votes)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## votes + blocknumber
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Votes} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";␊
␊
contract MyToken is ERC721, EIP712, ERC721Votes {␊
constructor() ERC721("MyToken", "MTK") EIP712("MyToken", "1") {}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721, ERC721Votes)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721, ERC721Votes)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## votes + timestamp
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊
import {ERC721Votes} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";␊
␊
contract MyToken is ERC721, EIP712, ERC721Votes {␊
constructor() ERC721("MyToken", "MTK") EIP712("MyToken", "1") {}␊
␊
function clock() public view override returns (uint48) {␊
return uint48(block.timestamp);␊
}␊
␊
// solhint-disable-next-line func-name-mixedcase␊
function CLOCK_MODE() public pure override returns (string memory) {␊
return "mode=timestamp";␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721, ERC721Votes)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721, ERC721Votes)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## custom name + upgradeable uups + mintable + incremental
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊
␊
contract MyNFTToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊
/// @custom:storage-location erc7201:myProject.MyNFTToken␊
struct MyNFTTokenStorage {␊
uint256 _nextTokenId;␊
}␊
␊
// keccak256(abi.encode(uint256(keccak256("myProject.MyNFTToken")) - 1)) & ~bytes32(uint256(0xff))␊
bytes32 private constant MYNFTTOKEN_STORAGE_LOCATION = 0x32ea4af318b6c543ad94e548435f2d525d7e5150dce5b73780df1d77bd4d8c00;␊
␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialOwner) public initializer {␊
__ERC721_init("My NFT Token", "MTK");␊
__Ownable_init(initialOwner);␊
__EIP712_init("My NFT Token", "1");␊
__ERC721Votes_init();␊
}␊
␊
function safeMint(address to) public onlyOwner returns (uint256) {␊
MyNFTTokenStorage storage $ = _getMyNFTTokenStorage();␊
uint256 tokenId = $._nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
␊
function _getMyNFTTokenStorage()␊
private␊
pure␊
returns (MyNFTTokenStorage storage $)␊
{␊
assembly { $.slot := MYNFTTOKEN_STORAGE_LOCATION }␊
}␊
␊
function _authorizeUpgrade(address newImplementation)␊
internal␊
override␊
onlyOwner␊
{}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## custom name + upgradeable transparent + mintable + incremental + namespacePrefix
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
␊
contract MyNFTToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable {␊
/// @custom:storage-location erc7201:myNftProject.MyNFTToken␊
struct MyNFTTokenStorage {␊
uint256 _nextTokenId;␊
}␊
␊
// keccak256(abi.encode(uint256(keccak256("myNftProject.MyNFTToken")) - 1)) & ~bytes32(uint256(0xff))␊
bytes32 private constant MYNFTTOKEN_STORAGE_LOCATION = 0xbc340a7d926d36b5de4ded13cac8359cd837661c277311536754e62ca069dd00;␊
␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialOwner) public initializer {␊
__ERC721_init("My NFT Token", "MTK");␊
__Ownable_init(initialOwner);␊
__EIP712_init("My NFT Token", "1");␊
__ERC721Votes_init();␊
}␊
␊
function safeMint(address to) public onlyOwner returns (uint256) {␊
MyNFTTokenStorage storage $ = _getMyNFTTokenStorage();␊
uint256 tokenId = $._nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
␊
function _getMyNFTTokenStorage()␊
private␊
pure␊
returns (MyNFTTokenStorage storage $)␊
{␊
assembly { $.slot := MYNFTTOKEN_STORAGE_LOCATION }␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## upgradeable transparent + mintable + incremental + empty namespacePrefix
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, OwnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable {␊
/// @custom:storage-location erc7201:MyToken␊
struct MyTokenStorage {␊
uint256 _nextTokenId;␊
}␊
␊
// keccak256(abi.encode(uint256(keccak256("MyToken")) - 1)) & ~bytes32(uint256(0xff))␊
bytes32 private constant MYTOKEN_STORAGE_LOCATION = 0xe50b25623ebee85cbe908e55dc189e9b1da401843a56196aa3162de9203a5100;␊
␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialOwner) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__Ownable_init(initialOwner);␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function safeMint(address to) public onlyOwner returns (uint256) {␊
MyTokenStorage storage $ = _getMyTokenStorage();␊
uint256 tokenId = $._nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
␊
function _getMyTokenStorage() private pure returns (MyTokenStorage storage $) {␊
assembly { $.slot := MYTOKEN_STORAGE_LOCATION }␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
}␊
`
## full upgradeable transparent
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊
import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊
import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, OwnableUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable {␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialOwner) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__ERC721Enumerable_init();␊
__ERC721Pausable_init();␊
__Ownable_init(initialOwner);␊
__ERC721Burnable_init();␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function pause() public onlyOwner {␊
_pause();␊
}␊
␊
function unpause() public onlyOwner {␊
_unpause();␊
}␊
␊
function safeMint(address to, uint256 tokenId) public onlyOwner {␊
_safeMint(to, tokenId);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## full upgradeable uups
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊
import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊
import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, OwnableUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialOwner) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__ERC721Enumerable_init();␊
__ERC721Pausable_init();␊
__Ownable_init(initialOwner);␊
__ERC721Burnable_init();␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function pause() public onlyOwner {␊
_pause();␊
}␊
␊
function unpause() public onlyOwner {␊
_unpause();␊
}␊
␊
function safeMint(address to, uint256 tokenId) public onlyOwner {␊
_safeMint(to, tokenId);␊
}␊
␊
function _authorizeUpgrade(address newImplementation)␊
internal␊
override␊
onlyOwner␊
{}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## full upgradeable uups + managed
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊
import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊
import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, AccessManagedUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialAuthority) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__ERC721Enumerable_init();␊
__ERC721Pausable_init();␊
__AccessManaged_init(initialAuthority);␊
__ERC721Burnable_init();␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function pause() public restricted {␊
_pause();␊
}␊
␊
function unpause() public restricted {␊
_unpause();␊
}␊
␊
function safeMint(address to, uint256 tokenId) public restricted {␊
_safeMint(to, tokenId);␊
}␊
␊
function _authorizeUpgrade(address newImplementation)␊
internal␊
override␊
restricted␊
{}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## full upgradeable uups + managed + incremental
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊
import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊
import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, AccessManagedUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊
/// @custom:storage-location erc7201:myProject.MyToken␊
struct MyTokenStorage {␊
uint256 _nextTokenId;␊
}␊
␊
// keccak256(abi.encode(uint256(keccak256("myProject.MyToken")) - 1)) & ~bytes32(uint256(0xff))␊
bytes32 private constant MYTOKEN_STORAGE_LOCATION = 0xfbb7c9e4123fcf4b1aad53c70358f7b1c1d7cf28092f5178b53e55db565e9200;␊
␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialAuthority) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__ERC721Enumerable_init();␊
__ERC721Pausable_init();␊
__AccessManaged_init(initialAuthority);␊
__ERC721Burnable_init();␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function pause() public restricted {␊
_pause();␊
}␊
␊
function unpause() public restricted {␊
_unpause();␊
}␊
␊
function safeMint(address to) public restricted returns (uint256) {␊
MyTokenStorage storage $ = _getMyTokenStorage();␊
uint256 tokenId = $._nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
␊
function _getMyTokenStorage() private pure returns (MyTokenStorage storage $) {␊
assembly { $.slot := MYTOKEN_STORAGE_LOCATION }␊
}␊
␊
function _authorizeUpgrade(address newImplementation)␊
internal␊
override␊
restricted␊
{}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`
## full upgradeable uups + managed + incremental + empty namespacePrefix
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.5.0␊
pragma solidity ^0.8.27;␊
␊
import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊
import {EIP712Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";␊
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊
import {ERC721BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";␊
import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";␊
import {ERC721PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";␊
import {ERC721VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721VotesUpgradeable.sol";␊
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊
␊
contract MyToken is Initializable, ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, AccessManagedUpgradeable, ERC721BurnableUpgradeable, EIP712Upgradeable, ERC721VotesUpgradeable, UUPSUpgradeable {␊
/// @custom:storage-location erc7201:MyToken␊
struct MyTokenStorage {␊
uint256 _nextTokenId;␊
}␊
␊
// keccak256(abi.encode(uint256(keccak256("MyToken")) - 1)) & ~bytes32(uint256(0xff))␊
bytes32 private constant MYTOKEN_STORAGE_LOCATION = 0xe50b25623ebee85cbe908e55dc189e9b1da401843a56196aa3162de9203a5100;␊
␊
/// @custom:oz-upgrades-unsafe-allow constructor␊
constructor() {␊
_disableInitializers();␊
}␊
␊
function initialize(address initialAuthority) public initializer {␊
__ERC721_init("MyToken", "MTK");␊
__ERC721Enumerable_init();␊
__ERC721Pausable_init();␊
__AccessManaged_init(initialAuthority);␊
__ERC721Burnable_init();␊
__EIP712_init("MyToken", "1");␊
__ERC721Votes_init();␊
}␊
␊
function pause() public restricted {␊
_pause();␊
}␊
␊
function unpause() public restricted {␊
_unpause();␊
}␊
␊
function safeMint(address to) public restricted returns (uint256) {␊
MyTokenStorage storage $ = _getMyTokenStorage();␊
uint256 tokenId = $._nextTokenId++;␊
_safeMint(to, tokenId);␊
return tokenId;␊
}␊
␊
function _getMyTokenStorage() private pure returns (MyTokenStorage storage $) {␊
assembly { $.slot := MYTOKEN_STORAGE_LOCATION }␊
}␊
␊
function _authorizeUpgrade(address newImplementation)␊
internal␊
override␊
restricted␊
{}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address to, uint256 tokenId, address auth)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable)␊
returns (address)␊
{␊
return super._update(to, tokenId, auth);␊
}␊
␊
function _increaseBalance(address account, uint128 value)␊
internal␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721VotesUpgradeable)␊
{␊
super._increaseBalance(account, value);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC721Upgradeable, ERC721EnumerableUpgradeable)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
}␊
`