From e7b1c339557a4153edc0774512aa311a10ff2877 Mon Sep 17 00:00:00 2001 From: pipaman Date: Tue, 23 May 2017 13:24:51 -0300 Subject: [PATCH] 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; + } }