From e7b1c339557a4153edc0774512aa311a10ff2877 Mon Sep 17 00:00:00 2001 From: pipaman Date: Tue, 23 May 2017 13:24:51 -0300 Subject: [PATCH 1/4] Update StandardToken.sol Added increaseApproval and decreaseApproval to increase / decrease the approval in 1 transaction. --- contracts/token/StandardToken.sol | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/contracts/token/StandardToken.sol b/contracts/token/StandardToken.sol index 42a5d561d..47feb936f 100644 --- a/contracts/token/StandardToken.sol +++ b/contracts/token/StandardToken.sol @@ -63,5 +63,32 @@ contract StandardToken is ERC20, BasicToken { function allowance(address _owner, address _spender) constant returns (uint256 remaining) { return allowed[_owner][_spender]; } + + /* + * approve should be called when allowed[_spender] == 0. To increment + * allowed value is better to use this function to avoid 2 calls (and wait until + * the first transaction is mined) + * From MonolithDAO Token.sol + */ + function increaseApproval (address _spender, uint _addedValue) + onlyPayloadSize(2 * 32) + returns (bool success) { + allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; + } + + function decreaseApproval (address _spender, uint _subtractedValue) + onlyPayloadSize(2 * 32) + returns (bool success) { + uint oldValue = allowed[msg.sender][_spender]; + if (_subtractedValue > oldValue) { + allowed[msg.sender][_spender] = 0; + } else { + allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); + } + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; + } } From 21f251eafb256a6f8614b4758d66284ed7f39250 Mon Sep 17 00:00:00 2001 From: Rudy Godoy Date: Sun, 20 Aug 2017 23:11:23 -0500 Subject: [PATCH 2/4] Removed onlyPayloadSize modifier --- contracts/token/StandardToken.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/token/StandardToken.sol b/contracts/token/StandardToken.sol index 47feb936f..407ba0532 100644 --- a/contracts/token/StandardToken.sol +++ b/contracts/token/StandardToken.sol @@ -71,7 +71,6 @@ contract StandardToken is ERC20, BasicToken { * From MonolithDAO Token.sol */ function increaseApproval (address _spender, uint _addedValue) - onlyPayloadSize(2 * 32) returns (bool success) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); @@ -79,7 +78,6 @@ contract StandardToken is ERC20, BasicToken { } function decreaseApproval (address _spender, uint _subtractedValue) - onlyPayloadSize(2 * 32) returns (bool success) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { From 8b11035b39a909befc225ef50d77572f4781791e Mon Sep 17 00:00:00 2001 From: Rudy Godoy Date: Sun, 20 Aug 2017 23:13:26 -0500 Subject: [PATCH 3/4] Indentation refactoring. --- contracts/token/StandardToken.sol | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/contracts/token/StandardToken.sol b/contracts/token/StandardToken.sol index 407ba0532..358d6f05e 100644 --- a/contracts/token/StandardToken.sol +++ b/contracts/token/StandardToken.sol @@ -72,21 +72,21 @@ contract StandardToken is ERC20, BasicToken { */ function increaseApproval (address _spender, uint _addedValue) returns (bool success) { - allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); - Approval(msg.sender, _spender, allowed[msg.sender][_spender]); - return true; - } + allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; + } function decreaseApproval (address _spender, uint _subtractedValue) returns (bool success) { - uint oldValue = allowed[msg.sender][_spender]; - if (_subtractedValue > oldValue) { - allowed[msg.sender][_spender] = 0; - } else { - allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); - } - Approval(msg.sender, _spender, allowed[msg.sender][_spender]); - return true; + uint oldValue = allowed[msg.sender][_spender]; + if (_subtractedValue > oldValue) { + allowed[msg.sender][_spender] = 0; + } else { + allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); + } + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; } } From 289fd87ef847ce43049d5674f777a6ad15340df8 Mon Sep 17 00:00:00 2001 From: Rudy Godoy Date: Sun, 20 Aug 2017 23:19:50 -0500 Subject: [PATCH 4/4] Tests increase and decrease allowance for spender - Spender starts with 0 tokens allowed to spend - Spender is granted 50, then decreased it's allowance by 10 Refs PR #224 --- test/StandardToken.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/StandardToken.js b/test/StandardToken.js index 3a96be81b..96a51afe5 100644 --- a/test/StandardToken.js +++ b/test/StandardToken.js @@ -70,4 +70,22 @@ contract('StandardToken', function(accounts) { } }); + describe('validating allowance updates to spender', function() { + let preApproved; + + it('should start with zero', async function() { + preApproved = await token.allowance(accounts[0], accounts[1]); + assert.equal(preApproved, 0); + }) + + it('should increase by 50 then decrease by 10', async function() { + await token.increaseApproval(accounts[1], 50); + let postIncrease = await token.allowance(accounts[0], accounts[1]); + preApproved.plus(50).should.be.bignumber.equal(postIncrease); + await token.decreaseApproval(accounts[1], 10); + let postDecrease = await token.allowance(accounts[0], accounts[1]); + postIncrease.minus(10).should.be.bignumber.equal(postDecrease); + }) + }); + });