Document VotesExtended assumptions (#5306)

Co-authored-by: ernestognw <ernestognw@gmail.com>
pull/5315/head^2
Hadrien Croubois 2 months ago committed by GitHub
parent e1d44e0342
commit 2562c11f25
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 22
      contracts/governance/utils/VotesExtended.sol
  2. 0
      test/governance/utils/VotesExtended.test.js

@ -7,6 +7,28 @@ import {SafeCast} from "../../utils/math/SafeCast.sol";
/** /**
* @dev Extension of {Votes} that adds checkpoints for delegations and balances. * @dev Extension of {Votes} that adds checkpoints for delegations and balances.
*
* WARNING: While this contract extends {Votes}, valid uses of {Votes} may not be compatible with
* {VotesExtended} without additional considerations. This implementation of {_transferVotingUnits} must
* run AFTER the voting weight movement is registered, such that it is reflected on {_getVotingUnits}.
*
* Said differently, {VotesExtended} MUST be integrated in a way that calls {_transferVotingUnits} AFTER the
* asset transfer is registered and balances are updated:
*
* ```solidity
* contract VotingToken is Token, VotesExtended {
* function transfer(address from, address to, uint256 tokenId) public override {
* super.transfer(from, to, tokenId); // <- Perform the transfer first ...
* _transferVotingUnits(from, to, 1); // <- ... then call _transferVotingUnits.
* }
*
* function _getVotingUnits(address account) internal view override returns (uint256) {
* return balanceOf(account);
* }
* }
* ```
*
* {ERC20Votes} and {ERC721Votes} follow this pattern and are thus safe to use with {VotesExtended}.
*/ */
abstract contract VotesExtended is Votes { abstract contract VotesExtended is Votes {
using SafeCast for uint256; using SafeCast for uint256;

Loading…
Cancel
Save