Spectre.ai U-Token
ERC20
This contract is an ERC20 token.
Name
Spectre.ai U-Token
Symbol
SXUT
Decimals
18
Total Supply
42,980,365 SXUT
About link
Spectre.ai Utility Token (SXUT) is a cryptocurrency and operates on the Ethereum platform. Spectre.ai Utility Token has a current supply of 42,980,365.02611043 with 24,529,557.51305521 in circulation. The last known price of Spectre.ai Utility Token is 0.02302037 USD and is up 1.79 over the last 24 hours. It is currently trading on 1 active market(s) with $0.00 traded over the last 24 hours. More information can be found at http://www.spectre.ai/.
Stats
Public Functions
23
Event Types
6
Code Size
33,149 bytes
Events (6) keyboard_arrow_up
State Variables (26) keyboard_arrow_up
Functions
tokenFallback keyboard_arrow_up
Requirements help
walletAddressesSet must be true
Source Code
function tokenFallback(
address _from,
uint256 _value,
bytes _data
) public {
require(walletAddressesSet);
//First we generate tokens for user that is transferring
generateTokens(_from, _value);
//Then we generate Spectre team tokens
generateSpectreTokens(_value);
}
transferOwnership keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
Source Code
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
changeController keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Source Code
function changeController(address _newController) onlyController {
controller = _newController;
}
transfer keyboard_arrow_up
Requirements help
transfersEnabled must be true
Source Code
function transfer(address _to, uint256 _amount) returns (bool success) {
require(transfersEnabled);
return doTransfer(msg.sender, _to, _amount);
}
transferFrom keyboard_arrow_up
Requirements help
null
Source Code
function transferFrom(
address _from,
address _to,
uint256 _value
) returns (bool success) {
require(checkLockedBalance(_from, _value));
require(super.transferFrom(_from, _to, _value));
return true;
}
balanceOf keyboard_arrow_up
approve keyboard_arrow_up
Requirements help
transfersEnabled must be true
One or more of the following:
Source Code
function approve(address _spender, uint256 _amount) returns (bool success) {
require(transfersEnabled);
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender,0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
require((_amount == 0) || (allowed[msg.sender][_spender] == 0));
// Alerts the token controller of the approve function call
if (isContract(controller)) {
require(
TokenController(controller).onApprove(msg.sender, _spender, _amount)
);
}
allowed[msg.sender][_spender] = _amount;
Approval(msg.sender, _spender, _amount);
return true;
}
allowance keyboard_arrow_up
approveAndCall keyboard_arrow_up
Requirements help
null
Source Code
function approveAndCall(
address _spender,
uint256 _amount,
bytes _extraData
) returns (bool success) {
require(approve(_spender, _amount));
ApproveAndCallFallBack(_spender).receiveApproval(
msg.sender,
_amount,
this,
_extraData
);
return true;
}
totalSupply keyboard_arrow_up
balanceOfAt keyboard_arrow_up
Source Code
function balanceOfAt(address _owner, uint256 _blockNumber)
constant
returns (uint256)
{
// These next few lines are used when the balance of the token is
// requested before a check point was ever created for this token, it
// requires that the `parentToken.balanceOfAt` be queried at the
// genesis block for that token as this contains initial balance of
// this token
if (
(balances[_owner].length == 0) ||
(balances[_owner][0].fromBlock > _blockNumber)
) {
if (address(parentToken) != 0) {
return
parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock));
} else {
// Has no parent
return 0;
}
// This will return the expected balance during normal situations
} else {
return getValueAt(balances[_owner], _blockNumber);
}
}
totalSupplyAt keyboard_arrow_up
Source Code
function totalSupplyAt(uint256 _blockNumber) constant returns (uint256) {
// These next few lines are used when the totalSupply of the token is
// requested before a check point was ever created for this token, it
// requires that the `parentToken.totalSupplyAt` be queried at the
// genesis block for this token as that contains totalSupply of this
// token at this block number.
if (
(totalSupplyHistory.length == 0) ||
(totalSupplyHistory[0].fromBlock > _blockNumber)
) {
if (address(parentToken) != 0) {
return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock));
} else {
return 0;
}
// This will return the expected totalSupply during normal situations
} else {
return getValueAt(totalSupplyHistory, _blockNumber);
}
}
createCloneToken keyboard_arrow_up
Parameters help
Source Code
function createCloneToken(
string _cloneTokenName,
uint8 _cloneDecimalUnits,
string _cloneTokenSymbol,
uint256 _snapshotBlock,
bool _transfersEnabled
) returns (address) {
if (_snapshotBlock == 0) _snapshotBlock = block.number;
MiniMeToken cloneToken = tokenFactory.createCloneToken(
this,
_snapshotBlock,
_cloneTokenName,
_cloneDecimalUnits,
_cloneTokenSymbol,
_transfersEnabled
);
cloneToken.changeController(msg.sender);
// An event to make the token easy to find on the blockchain
NewCloneToken(address(cloneToken), _snapshotBlock);
return address(cloneToken);
}
generateTokens keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Requirements help
Source Code
function generateTokens(address _owner, uint256 _amount)
onlyController
returns (bool)
{
uint256 curTotalSupply = totalSupply();
require(curTotalSupply + _amount >= curTotalSupply); // Check for overflow
uint256 previousBalanceTo = balanceOf(_owner);
require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow
updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount);
updateValueAtNow(balances[_owner], previousBalanceTo + _amount);
Transfer(0, _owner, _amount);
return true;
}
destroyTokens keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Requirements help
Source Code
function destroyTokens(address _owner, uint256 _amount)
onlyController
returns (bool)
{
uint256 curTotalSupply = totalSupply();
require(curTotalSupply >= _amount);
uint256 previousBalanceFrom = balanceOf(_owner);
require(previousBalanceFrom >= _amount);
updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount);
updateValueAtNow(balances[_owner], previousBalanceFrom - _amount);
Transfer(_owner, 0, _amount);
return true;
}
enableTransfers keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Source Code
function enableTransfers(bool _transfersEnabled) onlyController {
transfersEnabled = _transfersEnabled;
}
constructor keyboard_arrow_up
claimTokens keyboard_arrow_up
Modifiers help
onlyController checks for the following:
Source Code
function claimTokens(address _token) onlyController {
if (_token == 0x0) {
controller.transfer(this.balance);
return;
}
MiniMeToken token = MiniMeToken(_token);
uint256 balance = token.balanceOf(this);
token.transfer(controller, balance);
ClaimedTokens(_token, controller, balance);
}
setTokenBurner keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
Source Code
function setTokenBurner(address _tokenBurner) public onlyOwner {
tokenBurner = TokenBurner(_tokenBurner);
}
setWalletAddresses keyboard_arrow_up
Parameters help
Modifiers help
onlyOwner checks for the following:
Requirements help
Source Code
function setWalletAddresses(
address _spectreTeam,
address _managementLocked,
address _optionPool
) public onlyOwner {
require(!walletAddressesSet);
require(_spectreTeam != address(0));
require(_managementLocked != address(0));
require(_optionPool != address(0));
spectreTeam = _spectreTeam;
managementLocked = _managementLocked;
optionPool = _optionPool;
walletAddressesSet = true;
WalletAddressesSet(spectreTeam, managementLocked, optionPool);
}
burn keyboard_arrow_up
Requirements help
Source Code
function burn(uint256 _amount) public {
uint256 curTotalSupply = totalSupply();
require(curTotalSupply >= _amount);
uint256 previousBalanceFrom = balanceOf(msg.sender);
require(previousBalanceFrom >= _amount);
updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount);
updateValueAtNow(balances[msg.sender], previousBalanceFrom - _amount);
assert(tokenBurner.burn(msg.sender, _amount));
Transfer(msg.sender, 0, _amount);
}
transfer keyboard_arrow_up
Requirements help
null
Source Code
function transfer(address _to, uint256 _value) returns (bool success) {
require(checkLockedBalance(msg.sender, _value));
require(super.transfer(_to, _value));
return true;
}
checkLockedBalance keyboard_arrow_up
Source Code
function checkLockedBalance(address _holder, uint256 _value)
public
constant
returns (bool success)
{
if ((_holder != managementLocked) && (_holder != optionPool)) {
return true;
}
if ((_holder == managementLocked) && (getNow() > MANAGEMENT_LOCKED_PERIOD)) {
return true;
}
if ((_holder == optionPool) && (getNow() > OPTION_POOL_PERIOD)) {
return true;
}
return (SafeMath.sub(balanceOf(_holder), _value) >= lockedBalances[_holder]);
}
Internal Functions
Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.
internal SpectreToken.generateSpectreTokens keyboard_arrow_up
Requirements help
Source Code
function generateSpectreTokens(uint256 _value) internal {
//Calculate amounts for each Spectre Wallet
uint256 managementLockedAlloc = SafeMath.div(
SafeMath.mul(_value, percent(MANAGEMENT_LOCKED_ALLOC)),
percent(100)
);
uint256 optionPoolAlloc = SafeMath.div(
SafeMath.mul(_value, percent(OPTION_POOL_ALLOC)),
percent(100)
);
//Account for any rounding errors by using subtraction rather than allocation
//spectreTeam allocation is for bounty, dev, and advisory allocations
//quantity should correspond to SPECTRE_BOUNTY_ADVISORY_DEV_TEAM_ALLOC percentage
uint256 spectreTeamAlloc = SafeMath.sub(
_value,
SafeMath.add(managementLockedAlloc, optionPoolAlloc)
);
//Assert invariant
assert(
SafeMath.add(
SafeMath.add(managementLockedAlloc, optionPoolAlloc),
spectreTeamAlloc
) == _value
);
//Generate team tokens
generateTokens(spectreTeam, spectreTeamAlloc);
generateTokens(managementLocked, managementLockedAlloc);
generateTokens(optionPool, optionPoolAlloc);
//Lock balances - no locks for spectreTeam
lockedBalances[managementLocked] = SafeMath.add(
managementLockedAlloc,
lockedBalances[managementLocked]
);
lockedBalances[optionPool] = SafeMath.add(
optionPoolAlloc,
lockedBalances[optionPool]
);
}
internal SpectreToken.percent keyboard_arrow_up
internal SpectreToken.getNow keyboard_arrow_up
internal MiniMeToken.doTransfer keyboard_arrow_up
Requirements help
Source Code
function doTransfer(
address _from,
address _to,
uint256 _amount
) internal returns (bool) {
if (_amount == 0) {
return true;
}
require(parentSnapShotBlock < block.number);
// Do not allow transfer to 0x0 or the token contract itself
require((_to != 0) && (_to != address(this)));
// If the amount being transfered is more than the balance of the
// account the transfer returns false
var previousBalanceFrom = balanceOfAt(_from, block.number);
if (previousBalanceFrom < _amount) {
return false;
}
// Alerts the token controller of the transfer
if (isContract(controller)) {
require(TokenController(controller).onTransfer(_from, _to, _amount));
}
// First update the balance array with the new value for the address
// sending the tokens
updateValueAtNow(balances[_from], previousBalanceFrom - _amount);
// Then update the balance array with the new value for the address
// receiving the tokens
var previousBalanceTo = balanceOfAt(_to, block.number);
require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow
updateValueAtNow(balances[_to], previousBalanceTo + _amount);
// An event to make the transfer easy to find on the blockchain
Transfer(_from, _to, _amount);
return true;
}
internal MiniMeToken.getValueAt keyboard_arrow_up
Source Code
function getValueAt(Checkpoint[] storage checkpoints, uint256 _block)
internal
constant
returns (uint256)
{
if (checkpoints.length == 0) return 0;
// Shortcut for the actual value
if (_block >= checkpoints[checkpoints.length - 1].fromBlock)
return checkpoints[checkpoints.length - 1].value;
if (_block < checkpoints[0].fromBlock) return 0;
// Binary search of the value in the array
uint256 min = 0;
uint256 max = checkpoints.length - 1;
while (max > min) {
uint256 mid = (max + min + 1) / 2;
if (checkpoints[mid].fromBlock <= _block) {
min = mid;
} else {
max = mid - 1;
}
}
return checkpoints[min].value;
}
internal MiniMeToken.updateValueAtNow keyboard_arrow_up
Source Code
function updateValueAtNow(Checkpoint[] storage checkpoints, uint256 _value)
internal
{
if (
(checkpoints.length == 0) ||
(checkpoints[checkpoints.length - 1].fromBlock < block.number)
) {
Checkpoint storage newCheckPoint = checkpoints[checkpoints.length++];
newCheckPoint.fromBlock = uint128(block.number);
newCheckPoint.value = uint128(_value);
} else {
Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length - 1];
oldCheckPoint.value = uint128(_value);
}
}