stablecoin.test.ts.md•25.2 kB
# Snapshot report for `src/stablecoin.test.ts`
The actual snapshot is saved in `stablecoin.test.ts.snap`.
Generated by [AVA](https://avajs.dev).
## basic stablecoin
> 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 MyStablecoin is ERC20, ERC20Permit {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Burnable, ERC20Permit {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Pausable, Ownable, ERC20Permit {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
Ownable(initialOwner)␊
ERC20Permit("MyStablecoin")␊
{}␊
␊
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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Pausable, AccessControl, ERC20Permit {␊
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");␊
␊
constructor(address defaultAdmin, address pauser)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
{␊
_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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Pausable, AccessManaged, ERC20Permit {␊
constructor(address initialAuthority)␊
ERC20("MyStablecoin", "MST")␊
AccessManaged(initialAuthority)␊
ERC20Permit("MyStablecoin")␊
{}␊
␊
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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Burnable, ERC20Pausable, Ownable, ERC20Permit {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
Ownable(initialOwner)␊
ERC20Permit("MyStablecoin")␊
{}␊
␊
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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit {␊
constructor(address recipient)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
{␊
_mint(recipient, 1000 * 10 ** decimals());␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, Ownable, ERC20Permit {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
Ownable(initialOwner)␊
ERC20Permit("MyStablecoin")␊
{}␊
␊
function mint(address to, uint256 amount) public onlyOwner {␊
_mint(to, amount);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, AccessControl, ERC20Permit {␊
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");␊
␊
constructor(address defaultAdmin, address minter)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
{␊
_grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊
_grantRole(MINTER_ROLE, minter);␊
}␊
␊
function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {␊
_mint(to, amount);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC1363, ERC20Permit {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin custodian
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.4.0 and Community Contracts commit b0ddd27␊
pragma solidity ^0.8.27;␊
␊
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊
import {ERC20Custodian} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Custodian.sol";␊
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyStablecoin is ERC20, ERC20Permit, ERC20Custodian, Ownable {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
Ownable(initialOwner)␊
{}␊
␊
function _isCustodian(address user) internal view override returns (bool) {␊
return user == owner();␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address from, address to, uint256 value)␊
internal␊
override(ERC20, ERC20Custodian)␊
{␊
super._update(from, to, value);␊
}␊
}␊
`
## stablecoin allowlist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.4.0 and Community Contracts commit b0ddd27␊
pragma solidity ^0.8.27;␊
␊
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊
import {ERC20Allowlist} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Allowlist.sol";␊
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyStablecoin is ERC20, ERC20Permit, ERC20Allowlist, Ownable {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
Ownable(initialOwner)␊
{}␊
␊
function allowUser(address user) public onlyOwner {␊
_allowUser(user);␊
}␊
␊
function disallowUser(address user) public onlyOwner {␊
_disallowUser(user);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address from, address to, uint256 value)␊
internal␊
override(ERC20, ERC20Allowlist)␊
{␊
super._update(from, to, value);␊
}␊
␊
function _approve(address owner, address spender, uint256 value, bool emitEvent)␊
internal␊
override(ERC20, ERC20Allowlist)␊
{␊
super._approve(owner, spender, value, emitEvent);␊
}␊
}␊
`
## stablecoin blocklist
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.4.0 and Community Contracts commit b0ddd27␊
pragma solidity ^0.8.27;␊
␊
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊
import {ERC20Blocklist} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Blocklist.sol";␊
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";␊
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊
␊
contract MyStablecoin is ERC20, ERC20Permit, ERC20Blocklist, Ownable {␊
constructor(address initialOwner)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
Ownable(initialOwner)␊
{}␊
␊
function blockUser(address user) public onlyOwner {␊
_blockUser(user);␊
}␊
␊
function unblockUser(address user) public onlyOwner {␊
_unblockUser(user);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address from, address to, uint256 value)␊
internal␊
override(ERC20, ERC20Blocklist)␊
{␊
super._update(from, to, value);␊
}␊
␊
function _approve(address owner, address spender, uint256 value, bool emitEvent)␊
internal␊
override(ERC20, ERC20Blocklist)␊
{␊
super._approve(owner, spender, value, emitEvent);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit, ERC20Votes {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
␊
// 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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit, ERC20Votes {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
␊
// 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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit, ERC20Votes {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
␊
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);␊
}␊
}␊
`
## stablecoin 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 MyStablecoin is ERC20, ERC20Permit, ERC20FlashMint {␊
constructor() ERC20("MyStablecoin", "MST") ERC20Permit("MyStablecoin") {}␊
}␊
`
## stablecoin full
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts ^5.4.0 and Community Contracts commit b0ddd27␊
pragma solidity ^0.8.27;␊
␊
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊
import {ERC1363} from "@openzeppelin/contracts/token/ERC20/extensions/ERC1363.sol";␊
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊
import {ERC20Allowlist} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Allowlist.sol";␊
import {ERC20Bridgeable} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol";␊
import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";␊
import {ERC20Custodian} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Custodian.sol";␊
import {ERC20FlashMint} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";␊
import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.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 MyStablecoin is ERC20, ERC20Bridgeable, AccessControl, ERC20Burnable, ERC20Pausable, ERC1363, ERC20Permit, ERC20Votes, ERC20FlashMint, ERC20Custodian, ERC20Allowlist {␊
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 CUSTODIAN_ROLE = keccak256("CUSTODIAN_ROLE");␊
bytes32 public constant LIMITER_ROLE = keccak256("LIMITER_ROLE");␊
␊
constructor(address defaultAdmin, address tokenBridge, address recipient, address pauser, address minter, address custodian, address limiter)␊
ERC20("MyStablecoin", "MST")␊
ERC20Permit("MyStablecoin")␊
{␊
_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(CUSTODIAN_ROLE, custodian);␊
_grantRole(LIMITER_ROLE, limiter);␊
}␊
␊
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 _isCustodian(address user) internal view override returns (bool) {␊
return hasRole(CUSTODIAN_ROLE, user);␊
}␊
␊
function allowUser(address user) public onlyRole(LIMITER_ROLE) {␊
_allowUser(user);␊
}␊
␊
function disallowUser(address user) public onlyRole(LIMITER_ROLE) {␊
_disallowUser(user);␊
}␊
␊
// The following functions are overrides required by Solidity.␊
␊
function _update(address from, address to, uint256 value)␊
internal␊
override(ERC20, ERC20Pausable, ERC20Votes, ERC20Custodian, ERC20Allowlist)␊
{␊
super._update(from, to, value);␊
}␊
␊
function _approve(address owner, address spender, uint256 value, bool emitEvent)␊
internal␊
override(ERC20, ERC20Allowlist)␊
{␊
super._approve(owner, spender, value, emitEvent);␊
}␊
␊
function supportsInterface(bytes4 interfaceId)␊
public␊
view␊
override(ERC20Bridgeable, AccessControl, ERC1363)␊
returns (bool)␊
{␊
return super.supportsInterface(interfaceId);␊
}␊
␊
function nonces(address owner)␊
public␊
view␊
override(ERC20Permit, Nonces)␊
returns (uint256)␊
{␊
return super.nonces(owner);␊
}␊
}␊
`