Skip to main content
Glama

OpenZeppelin Contracts MCP Server

Official
by OpenZeppelin
erc20.test.ts.md54.6 kB
# Snapshot report for `src/erc20.test.ts` The actual snapshot is saved in `erc20.test.ts.snap`. Generated by [AVA](https://avajs.dev). ## basic erc20 > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 name is unicodeSafe > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyTokec is ERC20, ERC20Permit {␊ constructor() ERC20(unicode"MyTokeć", "MTK") ERC20Permit(unicode"MyTokeć") {}␊ }␊ ` ## erc20 burnable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Burnable, ERC20Permit {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 pausable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, ERC20Pausable, Ownable, ERC20Permit {␊ constructor(address initialOwner)␊ ERC20("MyToken", "MTK")␊ Ownable(initialOwner)␊ ERC20Permit("MyToken")␊ {}␊ ␊ function pause() public onlyOwner {␊ _pause();␊ }␊ ␊ function unpause() public onlyOwner {␊ _unpause();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Pausable)␊ {␊ super._update(from, to, value);␊ }␊ }␊ ` ## erc20 pausable with roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Pausable, AccessControl, ERC20Permit {␊ bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ ␊ constructor(address defaultAdmin, address pauser)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(PAUSER_ROLE, pauser);␊ }␊ ␊ function pause() public onlyRole(PAUSER_ROLE) {␊ _pause();␊ }␊ ␊ function unpause() public onlyRole(PAUSER_ROLE) {␊ _unpause();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Pausable)␊ {␊ super._update(from, to, value);␊ }␊ }␊ ` ## erc20 pausable with managed > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Pausable, AccessManaged, ERC20Permit {␊ constructor(address initialAuthority)␊ ERC20("MyToken", "MTK")␊ AccessManaged(initialAuthority)␊ ERC20Permit("MyToken")␊ {}␊ ␊ function pause() public restricted {␊ _pause();␊ }␊ ␊ function unpause() public restricted {␊ _unpause();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Pausable)␊ {␊ super._update(from, to, value);␊ }␊ }␊ ` ## erc20 burnable pausable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊ import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, ERC20Burnable, ERC20Pausable, Ownable, ERC20Permit {␊ constructor(address initialOwner)␊ ERC20("MyToken", "MTK")␊ Ownable(initialOwner)␊ ERC20Permit("MyToken")␊ {}␊ ␊ function pause() public onlyOwner {␊ _pause();␊ }␊ ␊ function unpause() public onlyOwner {␊ _unpause();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Pausable)␊ {␊ super._update(from, to, value);␊ }␊ }␊ ` ## erc20 preminted > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _mint(recipient, 1000 * 10 ** decimals());␊ }␊ }␊ ` ## erc20 premint of 0 > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 premint - max literal - valid > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _mint(recipient, 115792089237316195423570985008687907853269984665640564039457584007913129639935 * 10 ** (decimals() - 18));␊ }␊ }␊ ` ## erc20 premint - no arithmetic overflow - valid > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _mint(recipient, 115792089237316195423570985008687907853269984665640564039457 * 10 ** decimals());␊ }␊ }␊ ` ## erc20 premint - e notation - valid > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _mint(recipient, 100000000000000000000000000000000000000000000000000000000000 * 10 ** decimals());␊ }␊ }␊ ` ## erc20 mintable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, Ownable, ERC20Permit {␊ constructor(address initialOwner)␊ ERC20("MyToken", "MTK")␊ Ownable(initialOwner)␊ ERC20Permit("MyToken")␊ {}␊ ␊ function mint(address to, uint256 amount) public onlyOwner {␊ _mint(to, amount);␊ }␊ }␊ ` ## erc20 mintable with roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, AccessControl, ERC20Permit {␊ bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ ␊ constructor(address defaultAdmin, address minter)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(MINTER_ROLE, minter);␊ }␊ ␊ function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ _mint(to, amount);␊ }␊ }␊ ` ## erc20 callback > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1363} from "@openzeppelin/contracts/token/ERC20/extensions/ERC1363.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC1363, ERC20Permit {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 permit > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 votes > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";␊ import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit, ERC20Votes {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Votes)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20Permit, Nonces)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 votes + blocknumber > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";␊ import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit, ERC20Votes {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Votes)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20Permit, Nonces)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 votes + timestamp > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";␊ import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit, ERC20Votes {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ ␊ 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 from, address to, uint256 value)␊ internal␊ override(ERC20, ERC20Votes)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20Permit, Nonces)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 flashmint > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20FlashMint} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit, ERC20FlashMint {␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ }␊ ` ## erc20 crossChainBridging custom > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit {␊ address public tokenBridge;␊ error Unauthorized();␊ ␊ constructor(address tokenBridge_)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");␊ tokenBridge = tokenBridge_;␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (caller != tokenBridge) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging custom ownable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit, Ownable {␊ address public tokenBridge;␊ error Unauthorized();␊ ␊ constructor(address tokenBridge_, address initialOwner)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ Ownable(initialOwner)␊ {␊ require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");␊ tokenBridge = tokenBridge_;␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (caller != tokenBridge) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging custom ownable mintable burnable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Burnable, Ownable, ERC20Permit {␊ address public tokenBridge;␊ error Unauthorized();␊ ␊ constructor(address tokenBridge_, address initialOwner)␊ ERC20("MyToken", "MTK")␊ Ownable(initialOwner)␊ ERC20Permit("MyToken")␊ {␊ require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");␊ tokenBridge = tokenBridge_;␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (caller != tokenBridge) revert Unauthorized();␊ }␊ ␊ function mint(address to, uint256 amount) public onlyOwner {␊ _mint(to, amount);␊ }␊ }␊ ` ## erc20 crossChainBridging custom roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, AccessControl, ERC20Permit {␊ bytes32 public constant TOKEN_BRIDGE_ROLE = keccak256("TOKEN_BRIDGE_ROLE");␊ error Unauthorized();␊ ␊ constructor(address defaultAdmin, address tokenBridge)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(TOKEN_BRIDGE_ROLE, tokenBridge);␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (!hasRole(TOKEN_BRIDGE_ROLE, caller)) revert Unauthorized();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function supportsInterface(bytes4 interfaceId)␊ public␊ view␊ override(ERC20Bridgeable, AccessControl)␊ returns (bool)␊ {␊ return super.supportsInterface(interfaceId);␊ }␊ }␊ ` ## erc20 crossChainBridging custom managed > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ import {AuthorityUtils} from "@openzeppelin/contracts/access/manager/AuthorityUtils.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, AccessManaged, ERC20Permit {␊ error Unauthorized();␊ ␊ constructor(address initialAuthority)␊ ERC20("MyToken", "MTK")␊ AccessManaged(initialAuthority)␊ ERC20Permit("MyToken")␊ {}␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ (bool immediate,) = AuthorityUtils.canCallWithDelay(authority(), caller, address(this), bytes4(_msgData()[0:4]));␊ if (!immediate) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging superchain > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {}␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging superchain ownable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit, Ownable {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ constructor(address initialOwner)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ Ownable(initialOwner)␊ {}␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging superchain roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit, AccessControl {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ constructor(address defaultAdmin)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ }␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function supportsInterface(bytes4 interfaceId)␊ public␊ view␊ override(ERC20Bridgeable, AccessControl)␊ returns (bool)␊ {␊ return super.supportsInterface(interfaceId);␊ }␊ }␊ ` ## erc20 crossChainBridging superchain managed > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit, AccessManaged {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ constructor(address initialAuthority)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ AccessManaged(initialAuthority)␊ {}␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging custom upgradeable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BridgeableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BridgeableUpgradeable, ERC20PermitUpgradeable {␊ address public tokenBridge;␊ error Unauthorized();␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize(address tokenBridge_) public initializer {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Bridgeable_init();␊ __ERC20Permit_init("MyToken");␊ ␊ require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");␊ tokenBridge = tokenBridge_;␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (caller != tokenBridge) revert Unauthorized();␊ }␊ }␊ ` ## erc20 crossChainBridging superchain upgradeable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BridgeableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BridgeableUpgradeable, ERC20PermitUpgradeable {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize() public initializer {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Bridgeable_init();␊ __ERC20Permit_init("MyToken");␊ }␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ }␊ ` ## erc20 premint ignores chainId when not crossChainBridging > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Permit {␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ _mint(recipient, 2000 * 10 ** decimals());␊ }␊ }␊ ` ## erc20 premint chainId crossChainBridging custom > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit {␊ address public tokenBridge;␊ error Unauthorized();␊ ␊ constructor(address tokenBridge_, address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ require(tokenBridge_ != address(0), "Invalid tokenBridge_ address");␊ tokenBridge = tokenBridge_;␊ if (block.chainid == 10) {␊ _mint(recipient, 2000 * 10 ** decimals());␊ }␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (caller != tokenBridge) revert Unauthorized();␊ }␊ }␊ ` ## erc20 premint chainId crossChainBridging superchain > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊ import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊ ␊ contract MyToken is ERC20, ERC20Bridgeable, ERC20Permit {␊ address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;␊ error Unauthorized();␊ ␊ constructor(address recipient)␊ ERC20("MyToken", "MTK")␊ ERC20Permit("MyToken")␊ {␊ if (block.chainid == 10) {␊ _mint(recipient, 2000 * 10 ** decimals());␊ }␊ }␊ ␊ /**␊ * @dev Checks if the caller is the predeployed SuperchainTokenBridge. Reverts otherwise.␊ *␊ * IMPORTANT: The predeployed SuperchainTokenBridge is only available on chains in the Superchain.␊ */␊ function _checkTokenBridge(address caller) internal pure override {␊ if (caller != SUPERCHAIN_TOKEN_BRIDGE) revert Unauthorized();␊ }␊ }␊ ` ## erc20 full crossChainBridging custom upgradeable uups > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ import {ERC1363Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol";␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BridgeableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20BridgeableUpgradeable.sol";␊ import {ERC20BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";␊ import {ERC20FlashMintUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";␊ import {ERC20PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {ERC20VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ import {NoncesUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BridgeableUpgradeable, AccessControlUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, ERC1363Upgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable, UUPSUpgradeable {␊ bytes32 public constant TOKEN_BRIDGE_ROLE = keccak256("TOKEN_BRIDGE_ROLE");␊ error Unauthorized();␊ bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize(address defaultAdmin, address tokenBridge, address recipient, address pauser, address minter, address upgrader)␊ public␊ initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Bridgeable_init();␊ __AccessControl_init();␊ __ERC20Burnable_init();␊ __ERC20Pausable_init();␊ __ERC1363_init();␊ __ERC20Permit_init("MyToken");␊ __ERC20Votes_init();␊ __ERC20FlashMint_init();␊ __UUPSUpgradeable_init();␊ ␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(TOKEN_BRIDGE_ROLE, tokenBridge);␊ if (block.chainid == 10) {␊ _mint(recipient, 2000 * 10 ** decimals());␊ }␊ _grantRole(PAUSER_ROLE, pauser);␊ _grantRole(MINTER_ROLE, minter);␊ _grantRole(UPGRADER_ROLE, upgrader);␊ }␊ ␊ function _checkTokenBridge(address caller) internal view override {␊ if (!hasRole(TOKEN_BRIDGE_ROLE, caller)) revert Unauthorized();␊ }␊ ␊ function pause() public onlyRole(PAUSER_ROLE) {␊ _pause();␊ }␊ ␊ function unpause() public onlyRole(PAUSER_ROLE) {␊ _unpause();␊ }␊ ␊ function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ _mint(to, amount);␊ }␊ ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ override␊ onlyRole(UPGRADER_ROLE)␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function supportsInterface(bytes4 interfaceId)␊ public␊ view␊ override(ERC20BridgeableUpgradeable, AccessControlUpgradeable, ERC1363Upgradeable)␊ returns (bool)␊ {␊ return super.supportsInterface(interfaceId);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20PermitUpgradeable, NoncesUpgradeable)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 full upgradeable transparent > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ import {ERC1363Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol";␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";␊ import {ERC20FlashMintUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";␊ import {ERC20PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {ERC20VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ import {NoncesUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, AccessControlUpgradeable, ERC1363Upgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable {␊ bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize(address recipient, address defaultAdmin, address pauser, address minter)␊ public␊ initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ __ERC20Pausable_init();␊ __AccessControl_init();␊ __ERC1363_init();␊ __ERC20Permit_init("MyToken");␊ __ERC20Votes_init();␊ __ERC20FlashMint_init();␊ ␊ _mint(recipient, 2000 * 10 ** decimals());␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(PAUSER_ROLE, pauser);␊ _grantRole(MINTER_ROLE, minter);␊ }␊ ␊ function pause() public onlyRole(PAUSER_ROLE) {␊ _pause();␊ }␊ ␊ function unpause() public onlyRole(PAUSER_ROLE) {␊ _unpause();␊ }␊ ␊ function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ _mint(to, amount);␊ }␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function supportsInterface(bytes4 interfaceId)␊ public␊ view␊ override(AccessControlUpgradeable, ERC1363Upgradeable)␊ returns (bool)␊ {␊ return super.supportsInterface(interfaceId);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20PermitUpgradeable, NoncesUpgradeable)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 full upgradeable uups > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ import {ERC1363Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol";␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";␊ import {ERC20FlashMintUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";␊ import {ERC20PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {ERC20VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ import {NoncesUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, AccessControlUpgradeable, ERC1363Upgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable, UUPSUpgradeable {␊ bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊ bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊ bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");␊ ␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize(address recipient, address defaultAdmin, address pauser, address minter, address upgrader)␊ public␊ initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ __ERC20Pausable_init();␊ __AccessControl_init();␊ __ERC1363_init();␊ __ERC20Permit_init("MyToken");␊ __ERC20Votes_init();␊ __ERC20FlashMint_init();␊ __UUPSUpgradeable_init();␊ ␊ _mint(recipient, 2000 * 10 ** decimals());␊ _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ _grantRole(PAUSER_ROLE, pauser);␊ _grantRole(MINTER_ROLE, minter);␊ _grantRole(UPGRADER_ROLE, upgrader);␊ }␊ ␊ function pause() public onlyRole(PAUSER_ROLE) {␊ _pause();␊ }␊ ␊ function unpause() public onlyRole(PAUSER_ROLE) {␊ _unpause();␊ }␊ ␊ function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊ _mint(to, amount);␊ }␊ ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ override␊ onlyRole(UPGRADER_ROLE)␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function supportsInterface(bytes4 interfaceId)␊ public␊ view␊ override(AccessControlUpgradeable, ERC1363Upgradeable)␊ returns (bool)␊ {␊ return super.supportsInterface(interfaceId);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20PermitUpgradeable, NoncesUpgradeable)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ ` ## erc20 full upgradeable uups managed > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts ^5.4.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ import {ERC1363Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC1363Upgradeable.sol";␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ import {ERC20BurnableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";␊ import {ERC20FlashMintUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";␊ import {ERC20PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";␊ import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";␊ import {ERC20VotesUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";␊ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";␊ import {NoncesUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";␊ ␊ contract MyToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, AccessManagedUpgradeable, ERC1363Upgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable, UUPSUpgradeable {␊ /// @custom:oz-upgrades-unsafe-allow constructor␊ constructor() {␊ _disableInitializers();␊ }␊ ␊ function initialize(address recipient, address initialAuthority)␊ public␊ initializer␊ {␊ __ERC20_init("MyToken", "MTK");␊ __ERC20Burnable_init();␊ __ERC20Pausable_init();␊ __AccessManaged_init(initialAuthority);␊ __ERC1363_init();␊ __ERC20Permit_init("MyToken");␊ __ERC20Votes_init();␊ __ERC20FlashMint_init();␊ __UUPSUpgradeable_init();␊ ␊ _mint(recipient, 2000 * 10 ** decimals());␊ }␊ ␊ function pause() public restricted {␊ _pause();␊ }␊ ␊ function unpause() public restricted {␊ _unpause();␊ }␊ ␊ function mint(address to, uint256 amount) public restricted {␊ _mint(to, amount);␊ }␊ ␊ function _authorizeUpgrade(address newImplementation)␊ internal␊ override␊ restricted␊ {}␊ ␊ // The following functions are overrides required by Solidity.␊ ␊ function _update(address from, address to, uint256 value)␊ internal␊ override(ERC20Upgradeable, ERC20PausableUpgradeable, ERC20VotesUpgradeable)␊ {␊ super._update(from, to, value);␊ }␊ ␊ function nonces(address owner)␊ public␊ view␊ override(ERC20PermitUpgradeable, NoncesUpgradeable)␊ returns (uint256)␊ {␊ return super.nonces(owner);␊ }␊ }␊ `

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OpenZeppelin/contracts-wizard'

If you have feedback or need assistance with the MCP directory API, please join our Discord server