From 7d59faa65069f11bf873215d531637fa0a732232 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Fri, 1 Dec 2017 16:47:38 -0800 Subject: Add updated ERC20 implementation, update WETH --- packages/contracts/contracts/base/ERC20Token.sol | 50 +++++++++++++++++++ .../contracts/contracts/deprecated/EtherToken.sol | 56 ++++++++++++++++++++++ packages/contracts/contracts/tokens/EtherToken.sol | 6 ++- 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 packages/contracts/contracts/base/ERC20Token.sol create mode 100644 packages/contracts/contracts/deprecated/EtherToken.sol (limited to 'packages/contracts') diff --git a/packages/contracts/contracts/base/ERC20Token.sol b/packages/contracts/contracts/base/ERC20Token.sol new file mode 100644 index 000000000..765cd7274 --- /dev/null +++ b/packages/contracts/contracts/base/ERC20Token.sol @@ -0,0 +1,50 @@ +pragma solidity 0.4.11; + +import "./Token.sol"; + +contract ERC20Token is Token { + + uint constant MAX_UINT = 2**256 - 1; + + function transfer(address _to, uint _value) returns (bool) { + require(balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]); + balances[msg.sender] -= _value; + balances[_to] += _value; + Transfer(msg.sender, _to, _value); + return true; + } + + /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717 + /// @param _from Address to transfer from. + /// @param _to Address to transfer to. + /// @param _value Amount to transfer. + /// @return Success of transfer. + function transferFrom(address _from, address _to, uint _value) returns (bool) { + require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]); + balances[_to] += _value; + balances[_from] -= _value; + if (allowance < MAX_UINT) { + allowed[_from][msg.sender] -= _value; + } + Transfer(_from, _to, _value); + return true; + } + + function balanceOf(address _owner) constant returns (uint) { + return balances[_owner]; + } + + function approve(address _spender, uint _value) returns (bool) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + return true; + } + + function allowance(address _owner, address _spender) constant returns (uint) { + return allowed[_owner][_spender]; + } + + mapping (address => uint) balances; + mapping (address => mapping (address => uint)) allowed; + uint public totalSupply; +} \ No newline at end of file diff --git a/packages/contracts/contracts/deprecated/EtherToken.sol b/packages/contracts/contracts/deprecated/EtherToken.sol new file mode 100644 index 000000000..68148e095 --- /dev/null +++ b/packages/contracts/contracts/deprecated/EtherToken.sol @@ -0,0 +1,56 @@ +/* + + Copyright 2017 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity 0.4.11; + +import "./UnlimitedAllowanceToken.sol"; +import "./../base/SafeMath.sol"; + +contract EtherToken is UnlimitedAllowanceToken, SafeMath { + + string constant public name = "Ether Token"; + string constant public symbol = "WETH"; + uint8 constant public decimals = 18; + + /// @dev Fallback to calling deposit when ether is sent directly to contract. + function() + public + payable + { + deposit(); + } + + /// @dev Buys tokens with Ether, exchanging them 1:1. + function deposit() + public + payable + { + balances[msg.sender] = safeAdd(balances[msg.sender], msg.value); + totalSupply = safeAdd(totalSupply, msg.value); + } + + /// @dev Sells tokens in exchange for Ether, exchanging them 1:1. + /// @param amount Number of tokens to sell. + function withdraw(uint amount) + public + { + balances[msg.sender] = safeSub(balances[msg.sender], amount); + totalSupply = safeSub(totalSupply, amount); + require(msg.sender.send(amount)); + } +} diff --git a/packages/contracts/contracts/tokens/EtherToken.sol b/packages/contracts/contracts/tokens/EtherToken.sol index 68148e095..5c0f0e536 100644 --- a/packages/contracts/contracts/tokens/EtherToken.sol +++ b/packages/contracts/contracts/tokens/EtherToken.sol @@ -18,10 +18,10 @@ pragma solidity 0.4.11; -import "./UnlimitedAllowanceToken.sol"; +import "./ERC20Token.sol"; import "./../base/SafeMath.sol"; -contract EtherToken is UnlimitedAllowanceToken, SafeMath { +contract EtherToken is ERC20Token, SafeMath { string constant public name = "Ether Token"; string constant public symbol = "WETH"; @@ -42,6 +42,7 @@ contract EtherToken is UnlimitedAllowanceToken, SafeMath { { balances[msg.sender] = safeAdd(balances[msg.sender], msg.value); totalSupply = safeAdd(totalSupply, msg.value); + Transfer(address(0), msg.sender, msg.value); } /// @dev Sells tokens in exchange for Ether, exchanging them 1:1. @@ -52,5 +53,6 @@ contract EtherToken is UnlimitedAllowanceToken, SafeMath { balances[msg.sender] = safeSub(balances[msg.sender], amount); totalSupply = safeSub(totalSupply, amount); require(msg.sender.send(amount)); + Tranfer(msg.sender, address(0), msg.value); } } -- cgit v1.2.3