erc20.test.ts.md•54.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);␊
}␊
}␊
`