mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			152 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| /*
 | |
| This file is part of the DAO.
 | |
| 
 | |
| The DAO is free software: you can redistribute it and/or modify
 | |
| it under the terms of the GNU lesser General Public License as published by
 | |
| the Free Software Foundation, either version 3 of the License, or
 | |
| (at your option) any later version.
 | |
| 
 | |
| The DAO is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| GNU lesser General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU lesser General Public License
 | |
| along with the DAO.  If not, see <http://www.gnu.org/licenses/>.
 | |
| */
 | |
| 
 | |
| 
 | |
| /*
 | |
| Basic, standardized Token contract with no "premine". Defines the functions to
 | |
| check token balances, send tokens, send tokens on behalf of a 3rd party and the
 | |
| corresponding approval process. Tokens need to be created by a derived
 | |
| contract (e.g. TokenCreation.sol).
 | |
| 
 | |
| Thank you ConsenSys, this contract originated from:
 | |
| https://github.com/ConsenSys/Tokens/blob/master/Token_Contracts/contracts/Standard_Token.sol
 | |
| Which is itself based on the Ethereum standardized contract APIs:
 | |
| https://github.com/ethereum/wiki/wiki/Standardized_Contract_APIs
 | |
| */
 | |
| 
 | |
| /// @title Standard Token Contract.
 | |
| 
 | |
| abstract contract TokenInterface {
 | |
|     mapping (address => uint256) balances;
 | |
|     mapping (address => mapping (address => uint256)) allowed;
 | |
| 
 | |
|     /// Public variables of the token, all used for display
 | |
|     string public name;
 | |
|     string public symbol;
 | |
|     uint8 public decimals;
 | |
|     string public standard = 'Token 0.1';
 | |
| 
 | |
|     /// Total amount of tokens
 | |
|     uint256 public totalSupply;
 | |
| 
 | |
|     /// @param _owner The address from which the balance will be retrieved
 | |
|     /// @return balance The balance
 | |
|     function balanceOf(address _owner) public virtual view returns (uint256 balance);
 | |
| 
 | |
|     /// @notice Send `_amount` tokens to `_to` from `msg.sender`
 | |
|     /// @param _to The address of the recipient
 | |
|     /// @param _amount The amount of tokens to be transferred
 | |
|     /// @return success Whether the transfer was successful or not
 | |
|     function transfer(address _to, uint256 _amount) public virtual returns (bool success);
 | |
| 
 | |
|     /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it
 | |
|     /// is approved by `_from`
 | |
|     /// @param _from The address of the origin of the transfer
 | |
|     /// @param _to The address of the recipient
 | |
|     /// @param _amount The amount of tokens to be transferred
 | |
|     /// @return success Whether the transfer was successful or not
 | |
|     function transferFrom(address _from, address _to, uint256 _amount) public
 | |
| virtual returns (bool success);
 | |
| 
 | |
|     /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on
 | |
|     /// its behalf
 | |
|     /// @param _spender The address of the account able to transfer the tokens
 | |
|     /// @param _amount The amount of tokens to be approved for transfer
 | |
|     /// @return success Whether the approval was successful or not
 | |
|     function approve(address _spender, uint256 _amount) public virtual returns (bool success);
 | |
| 
 | |
|     /// @param _owner The address of the account owning tokens
 | |
|     /// @param _spender The address of the account able to transfer the tokens
 | |
|     /// @return remaining Amount of remaining tokens of _owner that _spender is allowed
 | |
|     /// to spend
 | |
|     function allowance(
 | |
|         address _owner,
 | |
|         address _spender
 | |
|     ) public virtual view returns (uint256 remaining);
 | |
| 
 | |
|     event Transfer(address indexed _from, address indexed _to, uint256 _amount);
 | |
|     event Approval(
 | |
|         address indexed _owner,
 | |
|         address indexed _spender,
 | |
|         uint256 _amount
 | |
|     );
 | |
| }
 | |
| 
 | |
| abstract contract tokenRecipient {
 | |
|     function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) public virtual;
 | |
| }
 | |
| 
 | |
| contract Token is TokenInterface {
 | |
|     // Protects users by preventing the execution of method calls that
 | |
|     // inadvertently also transferred ether
 | |
|     modifier noEther() {if (msg.value > 0) revert(); _; }
 | |
| 
 | |
|     function balanceOf(address _owner) public override view returns (uint256 balance) {
 | |
|         return balances[_owner];
 | |
|     }
 | |
| 
 | |
|     function transfer(address _to, uint256 _amount) public virtual override returns (bool success) {
 | |
|         if (balances[msg.sender] >= _amount && _amount > 0) {
 | |
|             balances[msg.sender] -= _amount;
 | |
|             balances[_to] += _amount;
 | |
|             emit Transfer(msg.sender, _to, _amount);
 | |
|             return true;
 | |
|         } else {
 | |
|            return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function transferFrom(
 | |
|         address _from,
 | |
|         address _to,
 | |
|         uint256 _amount
 | |
|     ) public virtual override returns (bool success) {
 | |
| 
 | |
|         if (balances[_from] >= _amount
 | |
|             && allowed[_from][msg.sender] >= _amount
 | |
|             && _amount > 0) {
 | |
| 
 | |
|             balances[_to] += _amount;
 | |
|             balances[_from] -= _amount;
 | |
|             allowed[_from][msg.sender] -= _amount;
 | |
|             emit Transfer(_from, _to, _amount);
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function approve(address _spender, uint256 _amount) public override returns (bool success) {
 | |
|         allowed[msg.sender][_spender] = _amount;
 | |
|         emit Approval(msg.sender, _spender, _amount);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /// Allow another contract to spend some tokens in your behalf
 | |
|     function approveAndCall(address _spender, uint256 _value, bytes memory _extraData)
 | |
|         public returns (bool success) {
 | |
|         allowed[msg.sender][_spender] = _value;
 | |
|         tokenRecipient spender = tokenRecipient(_spender);
 | |
|         spender.receiveApproval(msg.sender, _value, address(this), _extraData);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     function allowance(address _owner, address _spender) public override view returns (uint256 remaining) {
 | |
|         return allowed[_owner][_spender];
 | |
|     }
 | |
| }
 |