Spectre.ai D-Token
ERC20
This contract is an ERC20 token.
Name
Spectre.ai D-Token
Symbol
SXDT
Decimals
18
Total Supply
140,270,691 SXDT
About
Stats
Public Functions
23
Event Types
6
Code Size
33,151 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);
}
}