// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0-rc.0) (token/ERC20/extensions/ERC20VotesComp.sol) pragma solidity ^0.8.0; import "./ERC20VotesUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's * interface, with the drawback of only supporting supply up to (2^96^ - 1). * * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the * {ERC20Votes} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * * _Available since v4.2._ */ abstract contract ERC20VotesCompUpgradeable is Initializable, ERC20VotesUpgradeable { function __ERC20VotesComp_init() internal onlyInitializing { } function __ERC20VotesComp_init_unchained() internal onlyInitializing { } /** * @dev Comp version of the {getVotes} accessor, with `uint96` return type. */ function getCurrentVotes(address account) external view virtual returns (uint96) { return SafeCastUpgradeable.toUint96(getVotes(account)); } /** * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type. */ function getPriorVotes(address account, uint256 blockNumber) external view virtual returns (uint96) { return SafeCastUpgradeable.toUint96(getPastVotes(account, blockNumber)); } /** * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface. */ function _maxSupply() internal view virtual override returns (uint224) { return type(uint96).max; } /** * This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }