@@ -81,7 +81,7 @@ contract StandardToken is ERC20 {
81
81
// allowance to zero by calling `approve(_spender, 0)` if it is not
82
82
// already 0 to mitigate the race condition described here:
83
83
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
84
- require ((_value == 0 ) || ( allowed[msg .sender ][_spender] == 0 ) );
84
+ require (allowed[msg .sender ][_spender] == 0 );
85
85
allowed[msg .sender ][_spender] = _value;
86
86
Approval (msg .sender , _spender, _value);
87
87
return true ;
@@ -96,6 +96,29 @@ contract StandardToken is ERC20 {
96
96
function allowance (address _owner , address _spender ) constant returns (uint256 remaining ) {
97
97
return allowed[_owner][_spender];
98
98
}
99
+
100
+ /**
101
+ * approve should be called when allowed[_spender] == 0. To increment
102
+ * allowed value is better to use this function to avoid 2 calls (and wait until
103
+ * the first transaction is mined)
104
+ * From MonolithDAO Token.sol
105
+ */
106
+ function increaseApproval (address _spender , uint _addedValue ) public returns (bool ) {
107
+ allowed[msg .sender ][_spender] = allowed[msg .sender ][_spender].add (_addedValue);
108
+ Approval (msg .sender , _spender, allowed[msg .sender ][_spender]);
109
+ return true ;
110
+ }
111
+
112
+ function decreaseApproval (address _spender , uint _subtractedValue ) public returns (bool ) {
113
+ uint oldValue = allowed[msg .sender ][_spender];
114
+ if (_subtractedValue > oldValue) {
115
+ allowed[msg .sender ][_spender] = 0 ;
116
+ } else {
117
+ allowed[msg .sender ][_spender] = oldValue.sub (_subtractedValue);
118
+ }
119
+ Approval (msg .sender , _spender, allowed[msg .sender ][_spender]);
120
+ return true ;
121
+ }
99
122
}
100
123
101
124
contract Ownable {
0 commit comments