Skip to content

Latest commit

 

History

History
1405 lines (1289 loc) · 54 KB

File metadata and controls

1405 lines (1289 loc) · 54 KB

Snapshot report for src/erc20.test.ts

The actual snapshot is saved in erc20.test.ts.snap.

Generated by AVA.

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 {␊
    /// @custom:storage-location erc7201:myProject.MyToken␊
    struct MyTokenStorage {␊
        address tokenBridge;␊
    }␊

    // keccak256(abi.encode(uint256(keccak256("myProject.MyToken")) - 1)) & ~bytes32(uint256(0xff))␊
    bytes32 private constant MYTOKEN_STORAGE_LOCATION = 0xfbb7c9e4123fcf4b1aad53c70358f7b1c1d7cf28092f5178b53e55db565e9200;␊

    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");␊
        MyTokenStorage storage $ = _getMyTokenStorage();␊
        $.tokenBridge = tokenBridge_;␊
    }␊

    function _checkTokenBridge(address caller) internal view override {␊
        MyTokenStorage storage $ = _getMyTokenStorage();␊
        if (caller != $.tokenBridge) revert Unauthorized();␊
    }␊

    function _getMyTokenStorage() private pure returns (MyTokenStorage storage $) {␊
        assembly { $.slot := MYTOKEN_STORAGE_LOCATION }␊
    }␊
}␊
`

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);␊
    }␊
}␊
`