Pārlūkot izejas kodu

Use unchecked in ERC20Votes and fix typo (#3748)

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
z0r0z 3 gadi atpakaļ
vecāks
revīzija
02722fcc03
2 mainītis faili ar 19 papildinājumiem un 10 dzēšanām
  1. 1 0
      CHANGELOG.md
  2. 18 10
      contracts/token/ERC20/extensions/ERC20Votes.sol

+ 1 - 0
CHANGELOG.md

@@ -3,6 +3,7 @@
 ## Unreleased
 
  * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714))
+ * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748))
 
 ## Unreleased
 

+ 18 - 10
contracts/token/ERC20/extensions/ERC20Votes.sol

@@ -63,7 +63,9 @@ abstract contract ERC20Votes is IVotes, ERC20Permit {
      */
     function getVotes(address account) public view virtual override returns (uint256) {
         uint256 pos = _checkpoints[account].length;
-        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
+        unchecked {
+            return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
+        }
     }
 
     /**
@@ -80,7 +82,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit {
 
     /**
      * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
-     * It is but NOT the sum of all the delegated votes!
+     * It is NOT the sum of all the delegated votes!
      *
      * Requirements:
      *
@@ -130,7 +132,9 @@ abstract contract ERC20Votes is IVotes, ERC20Permit {
             }
         }
 
-        return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;
+        unchecked {
+            return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;
+        }
     }
 
     /**
@@ -243,15 +247,19 @@ abstract contract ERC20Votes is IVotes, ERC20Permit {
     ) private returns (uint256 oldWeight, uint256 newWeight) {
         uint256 pos = ckpts.length;
 
-        Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);
+        unchecked {
+            Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);
 
-        oldWeight = oldCkpt.votes;
-        newWeight = op(oldWeight, delta);
+            oldWeight = oldCkpt.votes;
+            newWeight = op(oldWeight, delta);
 
-        if (pos > 0 && oldCkpt.fromBlock == block.number) {
-            _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);
-        } else {
-            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
+            if (pos > 0 && oldCkpt.fromBlock == block.number) {
+                _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);
+            } else {
+                ckpts.push(
+                    Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})
+                );
+            }
         }
     }