mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| pragma solidity ^0.4.11;
 | |
| 
 | |
| import "./ERC20.sol";
 | |
| 
 | |
| /**
 | |
|  * @title LimitedTransferToken
 | |
|  * @dev LimitedTransferToken defines the generic interface and the implementation to limit token 
 | |
|  * transferability for different events. It is intended to be used as a base class for other token 
 | |
|  * contracts. 
 | |
|  * LimitedTransferToken has been designed to allow for different limiting factors,
 | |
|  * this can be achieved by recursively calling super.transferableTokens() until the base class is 
 | |
|  * hit. For example:
 | |
|  *     function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
 | |
|  *       return min256(unlockedTokens, super.transferableTokens(holder, time));
 | |
|  *     }
 | |
|  * A working example is VestedToken.sol:
 | |
|  * https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol
 | |
|  */
 | |
| 
 | |
| contract LimitedTransferToken is ERC20 {
 | |
| 
 | |
|   /**
 | |
|    * @dev Checks whether it can transfer or otherwise throws.
 | |
|    */
 | |
|   modifier canTransfer(address _sender, uint256 _value) {
 | |
|    if (_value > transferableTokens(_sender, uint64(now))) throw;
 | |
|    _;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @dev Checks modifier and allows transfer if tokens are not locked.
 | |
|    * @param _to The address that will recieve the tokens.
 | |
|    * @param _value The amount of tokens to be transferred.
 | |
|    */
 | |
|   function transfer(address _to, uint256 _value) canTransfer(msg.sender, _value) {
 | |
|     super.transfer(_to, _value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|   * @dev Checks modifier and allows transfer if tokens are not locked.
 | |
|   * @param _from The address that will send the tokens.
 | |
|   * @param _to The address that will recieve the tokens.
 | |
|   * @param _value The amount of tokens to be transferred.
 | |
|   */
 | |
|   function transferFrom(address _from, address _to, uint256 _value) canTransfer(_from, _value) {
 | |
|     super.transferFrom(_from, _to, _value);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @dev Default transferable tokens function returns all tokens for a holder (no limit).
 | |
|    * @dev Overwriting transferableTokens(address holder, uint64 time) is the way to provide the 
 | |
|    * specific logic for limiting token transferability for a holder over time.
 | |
|    */
 | |
|   function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
 | |
|     return balanceOf(holder);
 | |
|   }
 | |
| }
 |