Last active
October 2, 2017 16:41
-
-
Save furusiyya/9d5a7c4dd16949a14225a82d13f9e2e4 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
/** | |
* NotaryPlatformToken.sol v1.0.0 | |
* | |
* Bilal Arif - https://twitter.com/furusiyya_ | |
* Notary Platform | |
*/ | |
pragma solidity ^0.4.16; | |
library SafeMath { | |
function mul(uint256 a, uint256 b) internal constant returns (uint256) { | |
uint256 c = a * b; | |
assert(a == 0 || c / a == b); | |
return c; | |
} | |
function div(uint256 a, uint256 b) internal constant returns (uint256) { | |
uint256 c = a / b; | |
return c; | |
} | |
function sub(uint256 a, uint256 b) internal constant returns (uint256) { | |
assert(b <= a); | |
return a - b; | |
} | |
function add(uint256 a, uint256 b) internal constant returns (uint256) { | |
uint256 c = a + b; | |
assert(c >= a); | |
return c; | |
} | |
} | |
contract Ownable { | |
/* | |
@title Ownable | |
@dev The Ownable contract has an owner address, and provides basic authorization control | |
functions, this simplifies the implementation of "user permissions". | |
*/ | |
address public owner; | |
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); | |
/** | |
* @dev The Ownable constructor sets the original `owner` of the contract to the sender | |
* account. | |
*/ | |
function Ownable(address _owner){ | |
owner = _owner; | |
} | |
/** | |
* @dev Allows the current owner to transfer control of the contract to a newOwner. | |
* @param newOwner The address to transfer ownership to. | |
*/ | |
function transferOwnership(address newOwner) onlyOwner public { | |
require(newOwner != address(0)); | |
OwnershipTransferred(owner, newOwner); | |
owner = newOwner; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(msg.sender == owner); | |
_; | |
} | |
} | |
contract Pausable is Ownable { | |
event Pause(bool indexed state); | |
bool private paused = false; | |
/** | |
* @dev Modifier to make a function callable only when the contract is not paused. | |
*/ | |
modifier whenNotPaused() { | |
require(!paused); | |
_; | |
} | |
/** | |
* @dev Modifier to make a function callable only when the contract is paused. | |
*/ | |
modifier whenPaused() { | |
require(paused); | |
_; | |
} | |
/** | |
* @dev return the current state of contract | |
*/ | |
function Paused() external constant returns(bool){ return paused; } | |
/** | |
* @dev called by the owner to pause or unpause, triggers stopped state | |
* on first call and returns to normal state on second call | |
*/ | |
function tweakState() external onlyOwner { | |
paused = !paused; | |
Pause(paused); | |
} | |
} | |
contract Allocations{ | |
// timestamp when token release is enabled | |
uint256 private releaseTime; | |
mapping (address => uint256) private allocations; | |
function Allocations(){ | |
releaseTime = now + 245 * 1 days; | |
allocate(); | |
} | |
/** | |
* @notice NTRY Token distribution between team members. | |
*/ | |
function allocate() private { | |
allocations[0xab1cb1740344A9280dC502F3B8545248Dc3045eA] = 4000000 * 1 ether; | |
allocations[0x330709A59Ab2D1E1105683F92c1EE8143955a357] = 4000000 * 1 ether; | |
allocations[0xAa0887fc6e8896C4A80Ca3368CFd56D203dB39db] = 3000000 * 1 ether; | |
allocations[0x1fbA1d22435DD3E7Fa5ba4b449CC550a933E72b3] = 200000 * 1 ether; | |
allocations[0xC9d5E2c7e40373ae576a38cD7e62E223C95aBFD4] = 200000 * 1 ether; | |
allocations[0xabc0B64a38DE4b767313268F0db54F4cf8816D9C] = 220000 * 1 ether; | |
allocations[0x5d85bCDe5060C5Bd00DBeDF5E07F43CE3Ccade6f] = 50000 * 1 ether; | |
allocations[0xecb1b0231CBC0B04015F9e5132C62465C128B578] = 500000 * 1 ether; | |
allocations[0xFF22FA2B3e5E21817b02a45Ba693B7aC01485a9C] = 2955000 * 1 ether; | |
} | |
/** | |
* @notice Transfers tokens held by timelock to beneficiary. | |
*/ | |
function release() internal returns (uint256 amount){ | |
amount = allocations[msg.sender]; | |
allocations[msg.sender] = 0; | |
return amount; | |
} | |
/** | |
* @dev returns releaseTime | |
*/ | |
function RealeaseTime() external constant returns(uint256){ return releaseTime; } | |
modifier timeLock() { | |
require(now >= releaseTime); | |
_; | |
} | |
modifier isTeamMember() { | |
require(allocations[msg.sender] >= 10000 * 1 ether); | |
_; | |
} | |
} | |
contract ReentrancyGuard { | |
/** | |
* @dev We use a single lock for the whole contract. | |
*/ | |
bool private rentrancy_lock = false; | |
/** | |
* @dev Prevents a contract from calling itself, directly or indirectly. | |
* @notice If you mark a function `nonReentrant`, you should also | |
* mark it `external`. Calling one nonReentrant function from | |
* another is not supported. Instead, you can implement a | |
* `private` function doing the actual work, and a `external` | |
* wrapper marked as `nonReentrant`. | |
*/ | |
modifier nonReentrant() { | |
require(!rentrancy_lock); | |
rentrancy_lock = true; | |
_; | |
rentrancy_lock = false; | |
} | |
} | |
contract NotaryPlatformToken is Pausable, Allocations, ReentrancyGuard{ | |
using SafeMath for uint256; | |
string constant name = "Notary Platform Token"; | |
string constant symbol = "NTRY"; | |
uint8 constant decimals = 18; | |
uint256 totalSupply = 150000000 * 1 ether; | |
mapping(address => uint256) private balances; | |
mapping (address => mapping (address => uint256)) private allowed; | |
event Approval(address indexed owner, address indexed spender, uint256 value); | |
event Transfer(address indexed from, address indexed to, uint256 value); | |
function NotaryPlatformToken() Ownable(msg.sender){ | |
// Allocate initial balance to the owner // | |
balances[owner] = 130000000 * 1 ether; | |
} | |
/** Externals **/ | |
/** | |
* @dev transfer token for a specified address | |
* @param _to The address to transfer to. | |
* @param _value The amount to be transferred. | |
*/ | |
function transfer(address _to, uint256 _value) external whenNotPaused onlyPayloadSize(2 * 32) returns (bool) { | |
require(_to != address(0)); | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
Transfer(msg.sender, _to, _value); | |
return true; | |
} | |
/** | |
* @dev Gets the balance of the specified address. | |
* @param _owner The address to query the the balance of. | |
* @return An uint256 representing the amount owned by the passed address. | |
*/ | |
function balanceOf(address _owner) external constant returns (uint256 balance) { | |
return balances[_owner]; | |
} | |
/** | |
* @dev Transfer tokens from one address to another | |
* @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) external whenNotPaused returns (bool) { | |
require(_to != address(0)); | |
uint256 _allowance = allowed[_from][msg.sender]; | |
balances[_from] = balances[_from].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
allowed[_from][msg.sender] = _allowance.sub(_value); | |
Transfer(_from, _to, _value); | |
return true; | |
} | |
/** | |
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. | |
* | |
* Beware that changing an allowance with this method brings the risk that someone may use both the old | |
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this | |
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: | |
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 | |
* @param _spender The address which will spend the funds. | |
* @param _value The amount of tokens to be spent. | |
*/ | |
function approve(address _spender, uint256 _value) external whenNotPaused returns (bool) { | |
allowed[msg.sender][_spender] = _value; | |
Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
/** | |
* @dev Function to check the amount of tokens that an owner allowed to a spender. | |
* @param _owner address The address which owns the funds. | |
* @param _spender address The address which will spend the funds. | |
* @return A uint256 specifying the amount of tokens still available for the spender. | |
*/ | |
function allowance(address _owner, address _spender) external constant returns (uint256 remaining) { | |
return allowed[_owner][_spender]; | |
} | |
/** | |
* approve should be called when allowed[_spender] == 0. To increment | |
* allowed value is better to use this function to avoid 2 calls (and wait until | |
* the first transaction is mined) | |
* From MonolithDAO Token.sol | |
*/ | |
function increaseApproval (address _spender, uint _addedValue) external whenNotPaused returns (bool success) { | |
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
function decreaseApproval (address _spender, uint _subtractedValue) external whenNotPaused 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; | |
} | |
/** | |
* @notice Transfers tokens held by timelock to beneficiary. | |
*/ | |
function claim() external whenNotPaused nonReentrant timeLock isTeamMember { | |
balances[msg.sender] = balances[msg.sender].add(release()); | |
} | |
/** | |
* ========== Token migration support ======== | |
*/ | |
uint256 public totalMigrated; | |
bool private upgrading = false; | |
MigrationAgent private agent; | |
event Migrate(address indexed _from, address indexed _to, uint256 _value); | |
event Upgrading(bool status); | |
function migrationAgent() external constant returns(address){ return agent; } | |
function upgradingEnabled() external constant returns(bool){ return upgrading; } | |
/** | |
* @notice Migrate tokens to the new token contract. | |
* @dev Required state: Operational Migration | |
* @param _value The amount of token to be migrated | |
*/ | |
function migrate(uint256 _value) external nonReentrant isUpgrading { | |
require(_value > 0); | |
require(_value <= balances[msg.sender]); | |
require(agent.isMigrationAgent()); | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
totalSupply = totalSupply.sub(_value); | |
totalMigrated = totalMigrated.add(_value); | |
if(!agent.migrateFrom(msg.sender, _value)){ | |
revert(); | |
} | |
Migrate(msg.sender, agent, _value); | |
} | |
/** | |
* @notice Set address of migration target contract and enable migration | |
* process. | |
* @param _agent The address of the MigrationAgent contract | |
*/ | |
function setMigrationAgent(address _agent) external isUpgrading onlyOwner { | |
require(_agent != 0x00); | |
agent = MigrationAgent(_agent); | |
if(!agent.isMigrationAgent()){ | |
revert(); | |
} | |
if(agent.originalSupply() != totalSupply){ | |
revert(); | |
} | |
} | |
/** | |
* @notice Enable upgrading to allow tokens migration to new contract | |
* process. | |
*/ | |
function tweakUpgrading() external onlyOwner{ | |
upgrading = !upgrading; | |
Upgrading(upgrading); | |
} | |
/** Interface marker */ | |
function isTokenContract() external constant returns (bool) { | |
return true; | |
} | |
modifier isUpgrading() { | |
require(upgrading); | |
_; | |
} | |
/** | |
* Fix for the ERC20 short address attack | |
* | |
* http://vessenes.com/the-erc20-short-address-attack-explained/ | |
*/ | |
modifier onlyPayloadSize(uint size) { | |
require(msg.data.length > size + 4); | |
_; | |
} | |
function () { | |
//if ether is sent to this address, send it back. | |
revert(); | |
} | |
//*********** Only for Test App**************// | |
address public mapperContract; | |
address public carContract; | |
function setmappernAddress(address _newAddress) external onlyOwner{ | |
mapperContract = _newAddress; | |
} | |
function setCarConAddress(address _newAddress) external onlyOwner{ | |
carContract = _newAddress; | |
} | |
function faucet(address _to) external returns(bool){ | |
require(msg.sender == mapperContract); | |
balances[owner] = balances[owner].sub(100 * 1 ether); | |
balances[_to] = 100 * 1 ether; | |
allowed[_to][carContract] = 100 * 1 ether; | |
return true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment