Browse Source

Add a Counter.reset function (#2678)

Hadrien Croubois 4 years ago
parent
commit
8ea06b75aa

+ 1 - 0
CHANGELOG.md

@@ -5,6 +5,7 @@
 * `ERC20Votes`: add a new extension of the `ERC20` token with support for voting snapshots and delegation. This extension is compatible with Compound's `Comp` token interface. ([#2632](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2632))
  * Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`.
  * Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`.
+ * `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678))
 
 ## 4.1.0 (2021-04-29)
 

+ 4 - 0
contracts/mocks/CountersImpl.sol

@@ -20,4 +20,8 @@ contract CountersImpl {
     function decrement() public {
         _counter.decrement();
     }
+
+    function reset() public {
+        _counter.reset();
+    }
 }

+ 5 - 1
contracts/utils/Counters.sol

@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
 /**
  * @title Counters
  * @author Matt Condon (@shrugs)
- * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
+ * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
  * of elements in a mapping, issuing ERC721 ids, or counting request ids.
  *
  * Include with `using Counters for Counters.Counter;`
@@ -35,4 +35,8 @@ library Counters {
             counter._value = value - 1;
         }
     }
+
+    function reset(Counter storage counter) internal {
+        counter._value = 0;
+    }
 }

+ 1 - 1
contracts/utils/README.adoc

@@ -10,7 +10,7 @@ The {Address}, {Arrays} and {Strings} libraries provide more operations related
 
 For new data types:
 
- * {Counters}: a simple way to get a counter that can only be incremented or decremented. Very useful for ID generation, counting contract activity, among others.
+ * {Counters}: a simple way to get a counter that can only be incremented, decremented or reset. Very useful for ID generation, counting contract activity, among others.
  * {EnumerableMap}: like Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] type, but with key-value _enumeration_: this will let you know how many entries a mapping has, and iterate over them (which is not possible with `mapping`).
  * {EnumerableSet}: like {EnumerableMap}, but for https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets]. Can be used to store privileged accounts, issued IDs, etc.
 

+ 20 - 0
test/utils/Counters.test.js

@@ -61,4 +61,24 @@ contract('Counters', function (accounts) {
       });
     });
   });
+
+  describe('reset', function () {
+    context('null counter', function () {
+      it('does not throw', async function () {
+        await this.counter.reset();
+        expect(await this.counter.current()).to.be.bignumber.equal('0');
+      });
+    });
+
+    context('non null counter', function () {
+      beforeEach(async function () {
+        await this.counter.increment();
+        expect(await this.counter.current()).to.be.bignumber.equal('1');
+      });
+      it('reset to 0', async function () {
+        await this.counter.reset();
+        expect(await this.counter.current()).to.be.bignumber.equal('0');
+      });
+    });
+  });
 });