-
-
Save AlexRule7/a992d16bec91ed66c20795f07601eb6a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ACE Token is a first token of Token Stars platform | |
// Copyright (c) 2017 Aler Denisov <aler.zampillo@gmail.com> | |
// Permission is hereby granted, free of charge, to any person obtaining a copy | |
// of this software and associated documentation files (the "Software"), to deal | |
// in the Software without restriction, including without limitation the rights | |
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
// copies of the Software, and to permit persons to whom the Software is | |
// furnished to do so, subject to the following conditions: | |
// The above copyright notice and this permission notice shall be included in all | |
// copies or substantial portions of the Software. | |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
// SOFTWARE. | |
pragma solidity ^0.4.11; | |
import 'zeppelin-solidity/contracts/math/SafeMath.sol'; | |
import './StarTokenInterface.sol'; | |
contract AceToken is StarTokenInterface { | |
using SafeMath for uint256; | |
// ERC20 constants | |
string public constant name = "ACE Token"; | |
string public constant symbol = "ACE"; | |
uint public constant decimals = 0; | |
// Minting constants | |
uint256 public constant MAXSOLD_SUPPLY = 99000000; | |
uint256 public constant HARDCAPPED_SUPPLY = 165000000; | |
// Transfer rules | |
bool public transferAllowed = false; | |
mapping (address=>bool) public specialAllowed; | |
// Transfer rules events | |
event ToggleTransferAllowance(bool state); | |
event ToggleTransferAllowanceFor(address indexed who, bool state); | |
/** | |
* @dev check transfer is allowed | |
*/ | |
modifier allowTransfer() { | |
require(transferAllowed || specialAllowed[msg.sender]); | |
_; | |
} | |
/** | |
* @dev Doesn't allow to send funds on contract! | |
*/ | |
function () payable { | |
require(false); | |
} | |
/** | |
* @dev transfer token for a specified address if transfer is open | |
* @param _to The address to transfer to. | |
* @param _value The amount to be transferred. | |
*/ | |
function transfer(address _to, uint256 _value) allowTransfer returns (bool) { | |
return super.transfer(_to, _value); | |
} | |
/** | |
* @dev Transfer tokens from one address to another if transfer is open | |
* @param _from address The address which you want to send tokens from | |
* @param _to address The address which you want to transfer to | |
* @param _value uint256 the amount of tokens to be transferred | |
*/ | |
function transferFrom(address _from, address _to, uint256 _value) allowTransfer returns (bool) { | |
return super.transferFrom(_from, _to, _value); | |
} | |
/** | |
* @dev Change current state of transfer allowence to opposite | |
*/ | |
function toggleTransfer() onlyOwner returns (bool) { | |
transferAllowed = !transferAllowed; | |
ToggleTransferAllowance(transferAllowed); | |
return transferAllowed; | |
} | |
/** | |
* @dev allow transfer for the given address against global rules | |
* @param _for addres The address of special allowed transfer (required for smart contracts) | |
*/ | |
function toggleTransferFor(address _for) onlyOwner returns (bool) { | |
specialAllowed[_for] = !specialAllowed[_for]; | |
ToggleTransferAllowanceFor(_for, specialAllowed[_for]); | |
return specialAllowed[_for]; | |
} | |
/** | |
* @dev Function to mint tokens for investor | |
* @param _to The address that will receive the minted tokens. | |
* @param _amount The amount of tokens to emit. | |
* @return A boolean that indicates if the operation was successful. | |
*/ | |
function mint(address _to, uint256 _amount) onlyOwner canMint returns (bool) { | |
require(_amount > 0); | |
// create 2 extra token for each 3 sold | |
uint256 extra = _amount.div(3).mul(2); | |
uint256 total = _amount.add(extra); | |
totalSupply = totalSupply.add(total); | |
// Prevent to emit more than handcap! | |
assert(totalSupply <= HARDCAPPED_SUPPLY); | |
balances[_to] = balances[_to].add(_amount); | |
balances[owner] = balances[owner].add(extra); | |
Mint(_to, _amount); | |
Mint(owner, extra); | |
Transfer(0x0, _to, _amount); | |
Transfer(0x0, owner, extra); | |
return true; | |
} | |
/** | |
* @dev Increase approved amount to spend | |
* @param _spender The address which will spend the funds. | |
* @param _addedValue The amount of tokens to increase already approved amount. | |
*/ | |
function increaseApproval (address _spender, uint _addedValue) returns (bool success) { | |
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
/** | |
* @dev Decrease approved amount to spend | |
* @param _spender The address which will spend the funds. | |
* @param _subtractedValue The amount of tokens to decrease already approved amount. | |
*/ | |
function decreaseApproval (address _spender, uint _subtractedValue) 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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment