Spaces:
Runtime error
Runtime error
pragma solidity ^0.4.18; | |
library SafeMath { | |
function mul(uint256 a, uint256 b) internal pure returns (uint256) { | |
if (a == 0) { | |
return 0; | |
} | |
uint256 c = a * b; | |
assert(c / a == b); | |
return c; | |
} | |
function div(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a / b; | |
return c; | |
} | |
function sub(uint256 a, uint256 b) internal pure returns (uint256) { | |
assert(b <= a); | |
return a - b; | |
} | |
function add(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a + b; | |
assert(c >= a); | |
return c; | |
} | |
} | |
contract ERC20Basic { | |
uint256 public totalSupply; | |
function balanceOf(address who) public view returns (uint256); | |
function transfer(address to, uint256 value) public returns (bool); | |
event Transfer(address indexed from, address indexed to, uint256 value); | |
} | |
contract BasicToken is ERC20Basic { | |
using SafeMath for uint256; | |
mapping(address => uint256) balances; | |
function transfer(address _to, uint256 _value) public returns (bool) { | |
require(_to != address(0)); | |
require(_value <= balances[msg.sender]); | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
Transfer(msg.sender, _to, _value); | |
return true; | |
} | |
function balanceOf(address _owner) public view returns (uint256 balance) { | |
return balances[_owner]; | |
} | |
} | |
contract ERC20 is ERC20Basic { | |
function allowance(address owner, address spender) public view returns (uint256); | |
function transferFrom(address from, address to, uint256 value) public returns (bool); | |
function approve(address spender, uint256 value) public returns (bool); | |
event Approval(address indexed owner, address indexed spender, uint256 value); | |
} | |
contract StandardToken is ERC20, BasicToken { | |
mapping (address => mapping (address => uint256)) internal allowed; | |
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { | |
require(_to != address(0)); | |
require(_value <= balances[_from]); | |
require(_value <= allowed[_from][msg.sender]); | |
balances[_from] = balances[_from].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); | |
Transfer(_from, _to, _value); | |
return true; | |
} | |
function approve(address _spender, uint256 _value) public returns (bool) { | |
allowed[msg.sender][_spender] = _value; | |
Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
function allowance(address _owner, address _spender) public view returns (uint256) { | |
return allowed[_owner][_spender]; | |
} | |
function increaseApproval(address _spender, uint _addedValue) public returns (bool) { | |
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) public returns (bool) { | |
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; | |
} | |
} | |
contract MigrationAgent { | |
function migrateFrom(address _from, uint _value) public; | |
} | |
contract SPXToken is StandardToken { | |
string public constant name = "SP8DE Token"; | |
string public constant symbol = "SPX"; | |
uint8 public constant decimals = 18; | |
address public ico; | |
bool public isFrozen = true; | |
uint public constant TOKEN_LIMIT = 8888888888 * (1e18); | |
address public migrationMaster; | |
address public migrationAgent; | |
uint public totalMigrated; | |
event Migrate(address indexed _from, address indexed _to, uint _value); | |
function SPXToken(address _ico, address _migrationMaster) public { | |
require(_ico != 0); | |
ico = _ico; | |
migrationMaster = _migrationMaster; | |
} | |
function mint(address holder, uint value) public { | |
require(msg.sender == ico); | |
require(value > 0); | |
require(totalSupply + value <= TOKEN_LIMIT); | |
balances[holder] += value; | |
totalSupply += value; | |
Transfer(0x0, holder, value); | |
} | |
function unfreeze() public { | |
require(msg.sender == ico); | |
isFrozen = false; | |
} | |
function transfer(address _to, uint _value) public returns (bool) { | |
require(_to != address(0)); | |
require(!isFrozen); | |
return super.transfer(_to, _value); | |
} | |
function transferFrom(address _from, address _to, uint _value) public returns (bool) { | |
require(!isFrozen); | |
return super.transferFrom(_from, _to, _value); | |
} | |
function approve(address _spender, uint _value) public returns (bool) { | |
require(!isFrozen); | |
return super.approve(_spender, _value); | |
} | |
function migrate(uint value) external { | |
require(migrationAgent != 0); | |
require(value > 0); | |
require(value <= balances[msg.sender]); | |
balances[msg.sender] -= value; | |
totalSupply -= value; | |
totalMigrated += value; | |
MigrationAgent(migrationAgent).migrateFrom(msg.sender, value); | |
Migrate(msg.sender, migrationAgent, value); | |
} | |
function setMigrationAgent(address _agent) external { | |
require(migrationAgent == 0); | |
require(msg.sender == migrationMaster); | |
migrationAgent = _agent; | |
} | |
function setMigrationMaster(address _master) external { | |
require(msg.sender == migrationMaster); | |
require(_master != 0); | |
migrationMaster = _master; | |
} | |
} |