I have the following scenario.
contract GovernanceERC20 is ERC165Upgradeable, ERC20VotesUpgradeable, {
bytes4 private constant GOVERNANCE_INTERFACE_ID;
/// @inheritdoc ERC165Upgradeable
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return
interfaceId == GOVERNANCE_INTERFACE_ID ||
interfaceId == type(IERC20Upgradeable).interfaceId ||
interfaceId == type(IERC20PermitUpgradeable).interfaceId ||
interfaceId == type(IERC20MetadataUpgradeable).interfaceId ||
interfaceId == type(ERC20VotesUpgradeable).interfaceId ||
super.supportsInterface(interfaceId);
}
function initialize() public view returns(uint) {
return 10;
}
function mint(address to, uint256 amount) external {
_mint(to, amount);
}
function great() public view returns(uint) {
return 10;
}
}
As you can see, I am thinking what GOVERNANCE_INTERFACE_ID
should be.
Way 1: I can't do GOVERNANCE_INTERFACE_ID = type(GovernanceERC20).interfaceId as
GovernanceERC20` isn't abstract.
Way 2: I don't want to create any interface for GovernanceERC20
.
What should GOVERNANCE_INTERFACE_ID
be ?
Option A:
GOVERNANCE_INTERFACE_ID = this.initialize.selector ^ this.great.selector ^ this.mint.selector;
Option B:
GOVERNANCE_INTERFACE_ID = type(IERC20Upgradeable).interfaceId ^ type(IERC20PermitUpgradeable).interfaceId ^ type(IERC20MetadataUpgradeable).interfaceId ^ type(ERC20VotesUpgradeable).interfaceId ^ this.initialize.selector ^ this.great.selector ^ this.mint.selector;