Blockwell

Aragon Network Token

ERC20

This contract is an ERC20 token.

Name Aragon Network Token
Symbol ANT
Decimals 18
Total Supply 39,609,524 ANT

About

Stats

Public Functions 27
Event Types 4
Code Size 35,174 bytes

Events (4) keyboard_arrow_up

Approval Event

Parameters help
owner
address help
spender
address help
value
uint help

NewCloneToken Event

Parameters help
_cloneToken
address help
_snapshotBlock
uint help

NewTokenGrant Event

Parameters help
from
address help
to
address help
value
uint256 help
start
uint64 help
cliff
uint64 help
vesting
uint64 help

Transfer Event

Parameters help
from
address help
to
address help
value
uint help

name Variable

string help

decimals Variable

uint8 help

symbol Variable

string help

version Variable

string help

parentToken Variable

address help

parentSnapShotBlock Variable

uint help

creationBlock Variable

uint help

transfersEnabled Variable

bool help

tokenFactory Variable

address help

controller Variable

address help

grants Variable

mapping(address => TokenGrant[]) help
Internal Variable

canCreateGrants Variable

mapping(address => bool) help
Internal Variable

vestingWhitelister Variable

address help
Internal Variable

balances Variable

mapping(address => Checkpoint[]) help
Internal Variable

allowed Variable

mapping(address => mapping(address => uint256)) help
Internal Variable

totalSupplyHistory Variable

Checkpoint[] help
Internal Variable

Functions Expand All Collapse All

changeController keyboard_arrow_up

Parameters help

Name Type
_newController
address help

Properties

Visibility help public
Mutability help transaction
Source Code
function changeController(address _newController) onlyController {
  controller = _newController;
}

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help constant
Source Code
function totalSupply() constant returns (uint256) {
  return totalSupplyAt(block.number);
}

Parameters help

Name Type
_owner
address help

Properties

Visibility help public
Mutability help constant
Source Code
function balanceOf(address _owner) constant returns (uint256 balance) {
  return balanceOfAt(_owner, block.number);
}

Parameters help

Name Type
_owner
address help
_spender
address help

Properties

Visibility help public
Mutability help constant
Source Code
function allowance(address _owner, address _spender)
  constant
  returns (uint256 remaining)
{
  return allowed[_owner][_spender];
}

Parameters help

Name Type
_to
address help
_value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function transfer(address _to, uint256 _value)
  public
  canTransfer(msg.sender, _value)
  returns (bool success)
{
  return super.transfer(_to, _value);
}

Parameters help

Name Type
_from
address help
_to
address help
_value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function transferFrom(
  address _from,
  address _to,
  uint256 _value
) public canTransfer(_from, _value) returns (bool success) {
  return super.transferFrom(_from, _to, _value);
}

Parameters help

Name Type
spender
address help
value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function approve(address spender, uint256 value) returns (bool ok);

Parameters help

Name Type
_to
address help
_amount
uint256 help

Properties

Visibility help public
Mutability help transaction
Source Code
function transfer(address _to, uint256 _amount) returns (bool success) {
  if (!transfersEnabled) throw;
  return doTransfer(msg.sender, _to, _amount);
}

Parameters help

Name Type
_from
address help
_to
address help
_amount
uint256 help

Properties

Visibility help public
Mutability help transaction
Source Code
function transferFrom(
  address _from,
  address _to,
  uint256 _amount
) returns (bool success) {
  // The controller of this contract can move tokens around at will,
  //  this is important to recognize! Confirm that you trust the
  //  controller of this contract, which in most situations should be
  //  another open source smart contract or 0x0
  if (msg.sender != controller) {
    if (!transfersEnabled) throw;

    // The standard ERC 20 transferFrom functionality
    if (allowed[_from][msg.sender] < _amount) throw;
    allowed[_from][msg.sender] -= _amount;
  }
  return doTransfer(_from, _to, _amount);
}

Parameters help

Name Type
_spender
address help
_amount
uint256 help

Properties

Visibility help public
Mutability help transaction

Requirements help

Source Code
function approve(address _spender, uint256 _amount) returns (bool success) {
  if (!transfersEnabled) throw;

  // 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
  if ((_amount != 0) && (allowed[msg.sender][_spender] != 0)) throw;

  // Alerts the token controller of the approve function call
  if (isContract(controller)) {
    if (!Controller(controller).onApprove(msg.sender, _spender, _amount)) throw;
  }

  allowed[msg.sender][_spender] = _amount;
  Approval(msg.sender, _spender, _amount);
  return true;
}

approveAndCall keyboard_arrow_up

Parameters help

Name Type
_spender
address help
_amount
uint256 help
_extraData
bytes help

Properties

Visibility help public
Mutability help transaction

Requirements help

Source Code
function approveAndCall(
  address _spender,
  uint256 _amount,
  bytes _extraData
) returns (bool success) {
  approve(_spender, _amount);

  // This portion is copied from ConsenSys's Standard Token Contract. It
  //  calls the receiveApproval function that is part of the contract that
  //  is being approved (`_spender`). The function should look like:
  //  `receiveApproval(address _from, uint256 _amount, address
  //  _tokenContract, bytes _extraData)` It is assumed that the call
  //  *should* succeed, otherwise the plain vanilla approve would be used
  ApproveAndCallReceiver(_spender).receiveApproval(
    msg.sender,
    _amount,
    this,
    _extraData
  );
  return true;
}

balanceOfAt keyboard_arrow_up

Parameters help

Name Type
_owner
address help
_blockNumber
uint help

Properties

Visibility help public
Mutability help constant
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

Parameters help

Name Type
_blockNumber
uint help

Properties

Visibility help public
Mutability help constant
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

Name Type
_cloneTokenName
string help
_cloneDecimalUnits
uint8 help
_cloneTokenSymbol
string help
_snapshotBlock
uint help
_transfersEnabled
bool help

Properties

Visibility help public
Mutability help transaction
Source Code
function createCloneToken(
  string _cloneTokenName,
  uint8 _cloneDecimalUnits,
  string _cloneTokenSymbol,
  uint256 _snapshotBlock,
  bool _transfersEnabled
) returns (address) {
  if (_snapshotBlock > block.number) _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

Parameters help

Name Type
_owner
address help
_amount
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function generateTokens(address _owner, uint256 _amount)
  onlyController
  returns (bool)
{
  uint256 curTotalSupply = getValueAt(totalSupplyHistory, block.number);
  if (curTotalSupply + _amount < curTotalSupply) throw; // Check for overflow
  updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount);
  var previousBalanceTo = balanceOf(_owner);
  if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow
  updateValueAtNow(balances[_owner], previousBalanceTo + _amount);
  Transfer(0, _owner, _amount);
  return true;
}

destroyTokens keyboard_arrow_up

Parameters help

Name Type
_owner
address help
_amount
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function destroyTokens(address _owner, uint256 _amount)
  onlyController
  returns (bool)
{
  uint256 curTotalSupply = getValueAt(totalSupplyHistory, block.number);
  if (curTotalSupply < _amount) throw;
  updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount);
  var previousBalanceFrom = balanceOf(_owner);
  if (previousBalanceFrom < _amount) throw;
  updateValueAtNow(balances[_owner], previousBalanceFrom - _amount);
  Transfer(_owner, 0, _amount);
  return true;
}

enableTransfers keyboard_arrow_up

Parameters help

Name Type
_transfersEnabled
bool help

Properties

Visibility help public
Mutability help transaction
Source Code
function enableTransfers(bool _transfersEnabled) onlyController {
  transfersEnabled = _transfersEnabled;
}

constructor keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help payable
Source Code
function() payable {
  if (isContract(controller)) {
    if (!Controller(controller).proxyPayment.value(msg.value)(msg.sender))
      throw;
  } else {
    throw;
  }
}

spendableBalanceOf keyboard_arrow_up

Parameters help

Name Type
_holder
address help

Properties

Visibility help public
Mutability help constant
Source Code
function spendableBalanceOf(address _holder) public constant returns (uint256) {
  return transferableTokens(_holder, uint64(now));
}

grantVestedTokens keyboard_arrow_up

Parameters help

Name Type
_to
address help
_value
uint256 help
_start
uint64 help
_cliff
uint64 help
_vesting
uint64 help

Properties

Visibility help public
Mutability help transaction

Requirements help

Source Code
function grantVestedTokens(
  address _to,
  uint256 _value,
  uint64 _start,
  uint64 _cliff,
  uint64 _vesting
) public {
  // Check start, cliff and vesting are properly order to ensure correct functionality of the formula.
  if (_cliff < _start) throw;
  if (_vesting < _start) throw;
  if (_vesting < _cliff) throw;

  if (!canCreateGrants[msg.sender]) throw;
  if (tokenGrantsCount(_to) > 20) throw; // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).

  TokenGrant memory grant = TokenGrant(
    msg.sender,
    _value,
    _cliff,
    _vesting,
    _start
  );
  grants[_to].push(grant);

  if (!transfer(_to, _value)) throw;

  NewTokenGrant(msg.sender, _to, _value, _cliff, _vesting, _start);
}

setCanCreateGrants keyboard_arrow_up

Parameters help

Name Type
_addr
address help
_allowed
bool help

Properties

Visibility help public
Mutability help transaction
Source Code
function setCanCreateGrants(address _addr, bool _allowed)
  public
  onlyVestingWhitelister
{
  doSetCanCreateGrants(_addr, _allowed);
}

changeVestingWhitelister keyboard_arrow_up

Parameters help

Name Type
_newWhitelister
address help

Properties

Visibility help public
Mutability help transaction
Source Code
function changeVestingWhitelister(address _newWhitelister)
  public
  onlyVestingWhitelister
{
  doSetCanCreateGrants(vestingWhitelister, false);
  vestingWhitelister = _newWhitelister;
  doSetCanCreateGrants(vestingWhitelister, true);
}

revokeTokenGrant keyboard_arrow_up

Parameters help

Name Type
_holder
address help
_grantId
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function revokeTokenGrant(address _holder, uint256 _grantId) public {
  throw;
}

tokenGrantsCount keyboard_arrow_up

Parameters help

Name Type
_holder
address help

Properties

Visibility help public
Mutability help constant
Source Code
function tokenGrantsCount(address _holder)
  public
  constant
  returns (uint256 index)
{
  return grants[_holder].length;
}

tokenGrant keyboard_arrow_up

Parameters help

Name Type
_holder
address help
_grantId
uint help

Properties

Visibility help public
Mutability help constant
Source Code
function tokenGrant(address _holder, uint256 _grantId)
  public
  constant
  returns (
    address granter,
    uint256 value,
    uint256 vested,
    uint64 start,
    uint64 cliff,
    uint64 vesting
  )
{
  TokenGrant grant = grants[_holder][_grantId];

  granter = grant.granter;
  value = grant.value;
  start = grant.start;
  cliff = grant.cliff;
  vesting = grant.vesting;

  vested = vestedTokens(grant, uint64(now));
}

lastTokenIsTransferableDate keyboard_arrow_up

Parameters help

Name Type
holder
address help

Properties

Visibility help public
Mutability help constant
Source Code
function lastTokenIsTransferableDate(address holder)
  public
  constant
  returns (uint64 date)
{
  date = uint64(now);
  uint256 grantIndex = tokenGrantsCount(holder);
  for (uint256 i = 0; i < grantIndex; i++) {
    date = max64(grants[holder][i].vesting, date);
  }
  return date;
}

transferableTokens keyboard_arrow_up

Parameters help

Name Type
holder
address help
time
uint64 help

Properties

Visibility help public
Mutability help constant
Source Code
function transferableTokens(address holder, uint64 time)
  public
  constant
  returns (uint256)
{
  uint256 grantIndex = tokenGrantsCount(holder);

  if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants

  // Iterate through all the grants the holder has, and add all non-vested tokens
  uint256 nonVested = 0;
  for (uint256 i = 0; i < grantIndex; i++) {
    nonVested = safeAdd(nonVested, nonVestedTokens(grants[holder][i], time));
  }

  // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time
  return safeSub(balanceOf(holder), nonVested);
}

Internal Functions Expand All Collapse All

Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.

internal MiniMeIrrevocableVestedToken.doSetCanCreateGrants keyboard_arrow_up

Parameters help

Name Type
_addr
address help
_allowed
bool help

Properties

Visibility help internal
Mutability help transaction
Source Code
function doSetCanCreateGrants(address _addr, bool _allowed) internal {
  canCreateGrants[_addr] = _allowed;
}

internal MiniMeIrrevocableVestedToken.vestedTokens keyboard_arrow_up

Parameters help

Name Type
grant
TokenGrant help
time
uint64 help

Properties

Visibility help internal
Mutability help constant
Source Code
function vestedTokens(TokenGrant grant, uint64 time)
  internal
  constant
  returns (uint256)
{
  return
    calculateVestedTokens(
      grant.value,
      uint256(time),
      uint256(grant.start),
      uint256(grant.cliff),
      uint256(grant.vesting)
    );
}

internal MiniMeIrrevocableVestedToken.calculateVestedTokens keyboard_arrow_up

Parameters help

Name Type
tokens
uint256 help
time
uint256 help
start
uint256 help
cliff
uint256 help
vesting
uint256 help

Properties

Visibility help internal
Mutability help constant
Source Code
function calculateVestedTokens(
  uint256 tokens,
  uint256 time,
  uint256 start,
  uint256 cliff,
  uint256 vesting
) internal constant returns (uint256) {
  // Shortcuts for before cliff and after vesting cases.
  if (time < cliff) return 0;
  if (time >= vesting) return tokens;

  // Interpolate all vested tokens.
  // As before cliff the shortcut returns 0, we can use just this function to
  // calculate it.

  // vestedTokens = tokens * (time - start) / (vesting - start)
  uint256 vestedTokens = safeDiv(
    safeMul(tokens, safeSub(time, start)),
    safeSub(vesting, start)
  );

  return vestedTokens;
}

internal MiniMeIrrevocableVestedToken.nonVestedTokens keyboard_arrow_up

Parameters help

Name Type
grant
TokenGrant help
time
uint64 help

Properties

Visibility help internal
Mutability help constant
Source Code
function nonVestedTokens(TokenGrant grant, uint64 time)
  internal
  constant
  returns (uint256)
{
  // Of all the tokens of the grant, how many of them are not vested?
  // grantValue - vestedTokens
  return safeSub(grant.value, vestedTokens(grant, time));
}

internal MiniMeToken.doTransfer keyboard_arrow_up

Parameters help

Name Type
_from
address help
_to
address help
_amount
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function doTransfer(
  address _from,
  address _to,
  uint256 _amount
) internal returns (bool) {
  if (_amount == 0) {
    return true;
  }

  // Do not allow transfer to 0x0 or the token contract itself
  if ((_to == 0) || (_to == address(this))) throw;

  // 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) {
    throw;
  }

  // Alerts the token controller of the transfer
  if (isContract(controller)) {
    if (!Controller(controller).onTransfer(_from, _to, _amount)) throw;
  }

  // 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);
  if (previousBalanceTo + _amount < previousBalanceTo) throw; // 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.min keyboard_arrow_up

Parameters help

Name Type
a
uint help
b
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function min(uint256 a, uint256 b) internal returns (uint256) {
  return a < b ? a : b;
}

internal MiniMeToken.getValueAt keyboard_arrow_up

Parameters help

Name Type
checkpoints
Checkpoint[] help
_block
uint help

Properties

Visibility help internal
Mutability help constant
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

Parameters help

Name Type
checkpoints
Checkpoint[] help
_value
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function updateValueAtNow(Checkpoint[] storage checkpoints, uint256 _value)
  internal
{
  if (
    (checkpoints.length == 0) ||
    (checkpoints[checkpoints.length - 1].fromBlock < block.number)
  ) {
    Checkpoint newCheckPoint = checkpoints[checkpoints.length++];
    newCheckPoint.fromBlock = uint128(block.number);
    newCheckPoint.value = uint128(_value);
  } else {
    Checkpoint oldCheckPoint = checkpoints[checkpoints.length - 1];
    oldCheckPoint.value = uint128(_value);
  }
}

internal MiniMeToken.isContract keyboard_arrow_up

Parameters help

Name Type
_addr
address help

Properties

Visibility help internal
Mutability help constant
Source Code
function isContract(address _addr) internal constant returns (bool) {
  uint256 size;
  if (_addr == 0) return false;
  assembly {
    size := extcodesize(_addr)
  }
  return size > 0;
}

internal SafeMath.safeMul keyboard_arrow_up

Parameters help

Name Type
a
uint help
b
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function safeMul(uint256 a, uint256 b) internal returns (uint256) {
  uint256 c = a * b;
  assert(a == 0 || c / a == b);
  return c;
}

internal SafeMath.safeDiv keyboard_arrow_up

Parameters help

Name Type
a
uint help
b
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function safeDiv(uint256 a, uint256 b) internal returns (uint256) {
  assert(b > 0);
  uint256 c = a / b;
  assert(a == b * c + (a % b));
  return c;
}

internal SafeMath.safeSub keyboard_arrow_up

Parameters help

Name Type
a
uint help
b
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function safeSub(uint256 a, uint256 b) internal returns (uint256) {
  assert(b <= a);
  return a - b;
}

internal SafeMath.safeAdd keyboard_arrow_up

Parameters help

Name Type
a
uint help
b
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function safeAdd(uint256 a, uint256 b) internal returns (uint256) {
  uint256 c = a + b;
  assert(c >= a && c >= b);
  return c;
}

internal SafeMath.max64 keyboard_arrow_up

Parameters help

Name Type
a
uint64 help
b
uint64 help

Properties

Visibility help internal
Mutability help constant
Source Code
function max64(uint64 a, uint64 b) internal constant returns (uint64) {
  return a >= b ? a : b;
}

internal SafeMath.min64 keyboard_arrow_up

Parameters help

Name Type
a
uint64 help
b
uint64 help

Properties

Visibility help internal
Mutability help constant
Source Code
function min64(uint64 a, uint64 b) internal constant returns (uint64) {
  return a < b ? a : b;
}

internal SafeMath.max256 keyboard_arrow_up

Parameters help

Name Type
a
uint256 help
b
uint256 help

Properties

Visibility help internal
Mutability help constant
Source Code
function max256(uint256 a, uint256 b) internal constant returns (uint256) {
  return a >= b ? a : b;
}

internal SafeMath.min256 keyboard_arrow_up

Parameters help

Name Type
a
uint256 help
b
uint256 help

Properties

Visibility help internal
Mutability help constant
Source Code
function min256(uint256 a, uint256 b) internal constant returns (uint256) {
  return a < b ? a : b;
}

internal SafeMath.assert keyboard_arrow_up

Parameters help

Name Type
assertion
bool help

Properties

Visibility help internal
Mutability help transaction

Requirements help

Source Code
function assert(bool assertion) internal {
  if (!assertion) {
    throw;
  }
}