Browse Source

decrease approval condition fix (greater than and equal to) (#1063)

* decrease approval condition fix (greater than and equal to)

* sol lint fixed

* Improved standard token decreaseApprovalTests.
zaryab 7 years ago
parent
commit
ebd4b5e73d
2 changed files with 18 additions and 4 deletions
  1. 1 1
      contracts/token/ERC20/StandardToken.sol
  2. 17 3
      test/token/ERC20/StandardToken.test.js

+ 1 - 1
contracts/token/ERC20/StandardToken.sol

@@ -112,7 +112,7 @@ contract StandardToken is ERC20, BasicToken {
     returns (bool)
   {
     uint256 oldValue = allowed[msg.sender][_spender];
-    if (_subtractedValue > oldValue) {
+    if (_subtractedValue >= oldValue) {
       allowed[msg.sender][_spender] = 0;
     } else {
       allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);

+ 17 - 3
test/token/ERC20/StandardToken.test.js

@@ -295,15 +295,29 @@ contract('StandardToken', function ([_, owner, recipient, anotherAccount]) {
         });
 
         describe('when the spender had an approved amount', function () {
+          const approvedAmount = amount;
+
           beforeEach(async function () {
-            await this.token.approve(spender, amount + 1, { from: owner });
+            await this.token.approve(spender, approvedAmount, { from: owner });
           });
 
           it('decreases the spender allowance subtracting the requested amount', async function () {
-            await this.token.decreaseApproval(spender, amount, { from: owner });
+            await this.token.decreaseApproval(spender, approvedAmount - 5, { from: owner });
 
             const allowance = await this.token.allowance(owner, spender);
-            assert.equal(allowance, 1);
+            assert.equal(allowance, 5);
+          });
+
+          it('sets the allowance to zero when all allowance is removed', async function () {
+            await this.token.decreaseApproval(spender, approvedAmount, { from: owner });
+            const allowance = await this.token.allowance(owner, spender);
+            assert.equal(allowance, 0);
+          });
+
+          it('sets the allowance to zero when more than the full allowance is removed', async function () {
+            await this.token.decreaseApproval(spender, approvedAmount + 5, { from: owner });
+            const allowance = await this.token.allowance(owner, spender);
+            assert.equal(allowance, 0);
           });
         });
       });