ETH Price: $3,420.59 (+3.78%)

Token

SILVER - CryptoMiner World (SLV)
 

Overview

Max Total Supply

2,158 SLV

Holders

24

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 3 Decimals)

Balance
4 SLV

Value
$0.00
0x778f7434956b899303708fa3c5fad85bf9d93e06
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SilverERC20

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-02-18
*/

pragma solidity 0.4.23;

/**
 * @title Access Control List (Lightweight version)
 *
 * @dev Access control smart contract provides an API to check
 *      if specific operation is permitted globally and
 *      if particular user has a permission to execute it.
 * @dev This smart contract is designed to be inherited by other
 *      smart contracts which require access control management capabilities.
 *
 * @author Basil Gorin
 */
contract AccessControlLight {
  /// @notice Role manager is responsible for assigning the roles
  /// @dev Role ROLE_ROLE_MANAGER allows modifying operator roles
  uint256 private constant ROLE_ROLE_MANAGER = 0x10000000;

  /// @notice Feature manager is responsible for enabling/disabling
  ///      global features of the smart contract
  /// @dev Role ROLE_FEATURE_MANAGER allows modifying global features
  uint256 private constant ROLE_FEATURE_MANAGER = 0x20000000;

  /// @dev Bitmask representing all the possible permissions (super admin role)
  uint256 private constant FULL_PRIVILEGES_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

  /// @dev A bitmask of globally enabled features
  uint256 public features;

  /// @notice Privileged addresses with defined roles/permissions
  /// @notice In the context of ERC20/ERC721 tokens these can be permissions to
  ///      allow minting tokens, transferring on behalf and so on
  /// @dev Maps an address to the permissions bitmask (role), where each bit
  ///      represents a permission
  /// @dev Bitmask 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  ///      represents all possible permissions
  mapping(address => uint256) public userRoles;

  /// @dev Fired in updateFeatures()
  event FeaturesUpdated(address indexed _by, uint256 _requested, uint256 _actual);

  /// @dev Fired in updateRole()
  event RoleUpdated(address indexed _by, address indexed _to, uint256 _requested, uint256 _actual);

  /**
   * @dev Creates an access control instance,
   *      setting contract creator to have full privileges
   */
  constructor() public {
    // contract creator has full privileges
    userRoles[msg.sender] = FULL_PRIVILEGES_MASK;
  }

  /**
   * @dev Updates set of the globally enabled features (`features`),
   *      taking into account sender's permissions.=
   * @dev Requires transaction sender to have `ROLE_FEATURE_MANAGER` permission.
   * @param mask bitmask representing a set of features to enable/disable
   */
  function updateFeatures(uint256 mask) public {
    // caller must have a permission to update global features
    require(isSenderInRole(ROLE_FEATURE_MANAGER));

    // evaluate new features set and assign them
    features = evaluateBy(msg.sender, features, mask);

    // fire an event
    emit FeaturesUpdated(msg.sender, mask, features);
  }

  /**
   * @dev Updates set of permissions (role) for a given operator,
   *      taking into account sender's permissions.
   * @dev Setting role to zero is equivalent to removing an operator.
   * @dev Setting role to `FULL_PRIVILEGES_MASK` is equivalent to
   *      copying senders permissions (role) to an operator.
   * @dev Requires transaction sender to have `ROLE_ROLE_MANAGER` permission.
   * @param operator address of an operator to alter permissions for
   * @param role bitmask representing a set of permissions to
   *      enable/disable for an operator specified
   */
  function updateRole(address operator, uint256 role) public {
    // caller must have a permission to update user roles
    require(isSenderInRole(ROLE_ROLE_MANAGER));

    // evaluate the role and reassign it
    userRoles[operator] = evaluateBy(msg.sender, userRoles[operator], role);

    // fire an event
    emit RoleUpdated(msg.sender, operator, role, userRoles[operator]);
  }

  /**
   * @dev Based on the actual role provided (set of permissions), operator address,
   *      and role required (set of permissions), calculate the resulting
   *      set of permissions (role).
   * @dev If operator is super admin and has full permissions (FULL_PRIVILEGES_MASK),
   *      the function will always return `required` regardless of the `actual`.
   * @dev In contrast, if operator has no permissions at all (zero mask),
   *      the function will always return `actual` regardless of the `required`.
   * @param operator address of the contract operator to use permissions of
   * @param actual input set of permissions to modify
   * @param required desired set of permissions operator would like to have
   * @return resulting set of permissions this operator can set
   */
  function evaluateBy(address operator, uint256 actual, uint256 required) public constant returns(uint256) {
    // read operator's permissions
    uint256 p = userRoles[operator];

    // taking into account operator's permissions,
    // 1) enable permissions requested on the `current`
    actual |= p & required;
    // 2) disable permissions requested on the `current`
    actual &= FULL_PRIVILEGES_MASK ^ (p & (FULL_PRIVILEGES_MASK ^ required));

    // return calculated result (actual is not modified)
    return actual;
  }

  /**
   * @dev Checks if requested set of features is enabled globally on the contract
   * @param required set of features to check
   * @return true if all the features requested are enabled, false otherwise
   */
  function isFeatureEnabled(uint256 required) public constant returns(bool) {
    // delegate call to `__hasRole`, passing `features` property
    return __hasRole(features, required);
  }

  /**
   * @dev Checks if transaction sender `msg.sender` has all the permissions (role) required
   * @param required set of permissions (role) to check
   * @return true if all the permissions requested are enabled, false otherwise
   */
  function isSenderInRole(uint256 required) public constant returns(bool) {
    // delegate call to `isOperatorInRole`, passing transaction sender
    return isOperatorInRole(msg.sender, required);
  }

  /**
   * @dev Checks if operator `operator` has all the permissions (role) required
   * @param required set of permissions (role) to check
   * @return true if all the permissions requested are enabled, false otherwise
   */
  function isOperatorInRole(address operator, uint256 required) public constant returns(bool) {
    // delegate call to `__hasRole`, passing operator's permissions (role)
    return __hasRole(userRoles[operator], required);
  }

  /// @dev Checks if role `actual` contains all the permissions required `required`
  function __hasRole(uint256 actual, uint256 required) internal pure returns(bool) {
    // check the bitmask for the role required and return the result
    return actual & required == required;
  }
}

/**
 * @title Address Utils
 *
 * @dev Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * @notice Checks if the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   *      as the code is not actually created until after the constructor finishes.
   * @param addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address addr) internal view returns (bool) {
    // a variable to load `extcodesize` to
    uint256 size = 0;

    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603 for more details about how this works.
    // TODO: Check this again before the Serenity release, because all addresses will be contracts.
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      // retrieve the size of the code at address `addr`
      size := extcodesize(addr)
    }

    // positive size indicates a smart contract address
    return size > 0;
  }

}

/**
 * @title ERC20 token receiver interface
 *
 * @dev Interface for any contract that wants to support safe transfers
 *      from ERC20 token smart contracts.
 * @dev Inspired by ERC721 and ERC223 token standards
 *
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 * @dev See https://github.com/ethereum/EIPs/issues/223
 *
 * @author Basil Gorin
 */
interface ERC20Receiver {
  /**
   * @notice Handle the receipt of a ERC20 token(s)
   * @dev The ERC20 smart contract calls this function on the recipient
   *      after a successful transfer (`safeTransferFrom`).
   *      This function MAY throw to revert and reject the transfer.
   *      Return of other than the magic value MUST result in the transaction being reverted.
   * @notice The contract address is always the message sender.
   *      A wallet/broker/auction application MUST implement the wallet interface
   *      if it will accept safe transfers.
   * @param _operator The address which called `safeTransferFrom` function
   * @param _from The address which previously owned the token
   * @param _value amount of tokens which is being transferred
   * @param _data additional data with no specified format
   * @return `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))` unless throwing
   */
  function onERC20Received(address _operator, address _from, uint256 _value, bytes _data) external returns(bytes4);
}

/**
 * @title Gold Smart Contract
 *
 * @notice Gold is a transferable fungible entity (ERC20 token)
 *      used to "pay" for in game services like gem upgrades, etc.
 * @notice Gold is a part of Gold/Silver system, which allows to
 *      upgrade gems (level, grade, etc.)
 *
 * @dev Gold is mintable and burnable entity,
 *      meaning it can be created or destroyed by the authorized addresses
 * @dev An address authorized can mint/burn its own tokens (own balance) as well
 *      as tokens owned by another address (additional permission level required)
 *
 * @author Basil Gorin
 */
contract GoldERC20 is AccessControlLight {
  /**
   * @dev Smart contract version
   * @dev Should be incremented manually in this source code
   *      each time smart contact source code is changed and deployed
   * @dev To distinguish from other tokens must be multiple of 0x100
   */
  uint32 public constant TOKEN_VERSION = 0x300;

  /**
   * @notice ERC20 symbol of that token (short name)
   */
  string public constant symbol = "GLD";

  /**
   * @notice ERC20 name of the token (long name)
   */
  string public constant name = "GOLD - CryptoMiner World";

  /**
   * @notice ERC20 decimals (number of digits to draw after the dot
   *    in the UI applications (like MetaMask, other wallets and so on)
   */
  uint8 public constant decimals = 3;

  /**
   * @notice Based on the value of decimals above, one token unit
   *      represents native number of tokens which is displayed
   *      in the UI applications as one (1 or 1.0, 1.00, etc.)
   */
  uint256 public constant ONE_UNIT = uint256(10) ** decimals;

  /**
   * @notice A record of all the players token balances
   * @dev This mapping keeps record of all token owners
   */
  mapping(address => uint256) private tokenBalances;

  /**
   * @notice Total amount of tokens tracked by this smart contract
   * @dev Equal to sum of all token balances `tokenBalances`
   */
  uint256 private tokensTotal;

  /**
   * @notice A record of all the allowances to spend tokens on behalf
   * @dev Maps token owner address to an address approved to spend
   *      some tokens on behalf, maps approved address to that amount
   */
  mapping(address => mapping(address => uint256)) private transferAllowances;

  /**
   * @notice Enables ERC20 transfers of the tokens
   *      (transfer by the token owner himself)
   * @dev Feature FEATURE_TRANSFERS must be enabled to
   *      call `transfer()` function
   */
  uint32 public constant FEATURE_TRANSFERS = 0x00000001;

  /**
   * @notice Enables ERC20 transfers on behalf
   *      (transfer by someone else on behalf of token owner)
   * @dev Feature FEATURE_TRANSFERS_ON_BEHALF must be enabled to
   *      call `transferFrom()` function
   * @dev Token owner must call `approve()` first to authorize
   *      the transfer on behalf
   */
  uint32 public constant FEATURE_TRANSFERS_ON_BEHALF = 0x00000002;

  /**
   * @notice Token creator is responsible for creating (minting)
   *      tokens to some player address
   * @dev Role ROLE_TOKEN_CREATOR allows minting tokens
   *      (calling `mint` and `mintTo` functions)
   */
  uint32 public constant ROLE_TOKEN_CREATOR = 0x00000001;

  /**
   * @notice Token destroyer is responsible for destroying (burning)
   *      tokens owned by some player address
   * @dev Role ROLE_TOKEN_DESTROYER allows burning tokens
   *      (calling `burn` and `burnFrom` functions)
   */
  uint32 public constant ROLE_TOKEN_DESTROYER = 0x00000002;

  /**
   * @dev Magic value to be returned by ERC20Receiver upon successful reception of token(s)
   * @dev Equal to `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))`,
   *      which can be also obtained as `ERC20Receiver(0).onERC20Received.selector`
   */
  bytes4 private constant ERC20_RECEIVED = 0x4fc35859;

  /**
   * @dev Fired in transfer() and transferFrom() functions
   * @param _from an address which performed the transfer
   * @param _to an address tokens were sent to
   * @param _value number of tokens transferred
   */
  event Transfer(address indexed _from, address indexed _to, uint256 _value);

  /**
   * @dev Fired in approve() function
   * @param _owner an address which granted a permission to transfer
   *      tokens on its behalf
   * @param _spender an address which received a permission to transfer
   *      tokens on behalf of the owner `_owner`
   */
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);

  /**
   * @dev Fired in mint() function
   * @param _by an address which minted some tokens (transaction sender)
   * @param _to an address the tokens were minted to
   * @param _value an amount of tokens minted
   */
  event Minted(address indexed _by, address indexed _to, uint256 _value);

  /**
   * @dev Fired in burn() function
   * @param _by an address which burned some tokens (transaction sender)
   * @param _from an address the tokens were burnt from
   * @param _value an amount of tokens burnt
   */
  event Burnt(address indexed _by, address indexed _from, uint256 _value);

  /**
   * @notice Total number of tokens tracked by this smart contract
   * @dev Equal to sum of all token balances
   * @return total number of tokens
   */
  function totalSupply() public constant returns (uint256) {
    // read total tokens value and return
    return tokensTotal;
  }

  /**
   * @notice Gets the balance of particular address
   * @dev Gets the balance of the specified address
   * @param _owner the address to query the the balance for
   * @return an amount of tokens owned by the address specified
   */
  function balanceOf(address _owner) public constant returns (uint256) {
    // read the balance from storage and return
    return tokenBalances[_owner];
  }

  /**
   * @dev A function to check an amount of tokens owner approved
   *      to transfer on its behalf by some other address called "spender"
   * @param _owner an address which approves transferring some tokens on its behalf
   * @param _spender an address approved to transfer some tokens on behalf
   * @return an amount of tokens approved address `_spender` can transfer on behalf
   *      of token owner `_owner`
   */
  function allowance(address _owner, address _spender) public constant returns (uint256) {
    // read the value from storage and return
    return transferAllowances[_owner][_spender];
  }

  /**
   * @notice Transfers some tokens to an address `_to`
   * @dev Called by token owner (an address which has a
   *      positive token balance tracked by this smart contract)
   * @dev Throws on any error like
   *      * incorrect `_value` (zero) or
   *      * insufficient token balance or
   *      * incorrect `_to` address:
   *          * zero address or
   *          * self address or
   *          * smart contract which doesn't support ERC20
   * @param _to an address to transfer tokens to,
   *      must be either an external address or a smart contract,
   *      compliant with the ERC20 standard
   * @param _value amount of tokens to be transferred, must
   *      be greater than zero
   * @return true on success, throws otherwise
   */
  function transfer(address _to, uint256 _value) public returns (bool) {
    // just delegate call to `transferFrom`,
    // `FEATURE_TRANSFERS` is verified inside it
    return transferFrom(msg.sender, _to, _value);
  }

  /**
   * @notice Transfers some tokens on behalf of address `_from' (token owner)
   *      to some other address `_to`
   * @dev Called by token owner on his own or approved address,
   *      an address approved earlier by token owner to
   *      transfer some amount of tokens on its behalf
   * @dev Throws on any error like
   *      * incorrect `_value` (zero) or
   *      * insufficient token balance or
   *      * incorrect `_to` address:
   *          * zero address or
   *          * same as `_from` address (self transfer)
   *          * smart contract which doesn't support ERC20
   * @param _from token owner which approved caller (transaction sender)
   *      to transfer `_value` of tokens on its behalf
   * @param _to an address to transfer tokens to,
   *      must be either an external address or a smart contract,
   *      compliant with the ERC20 standard
   * @param _value amount of tokens to be transferred, must
   *      be greater than zero
   * @return true on success, throws otherwise
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    // just delegate call to `safeTransferFrom`, passing empty `_data`,
    // `FEATURE_TRANSFERS` is verified inside it
    safeTransferFrom(_from, _to, _value, "");

    // `safeTransferFrom` throws of any error, so
    // if we're here - it means operation successful,
    // just return true
    return true;
  }

  /**
   * @notice Transfers some tokens on behalf of address `_from' (token owner)
   *      to some other address `_to`
   * @dev Inspired by ERC721 safeTransferFrom, this function allows to
   *      send arbitrary data to the receiver on successful token transfer
   * @dev Called by token owner on his own or approved address,
   *      an address approved earlier by token owner to
   *      transfer some amount of tokens on its behalf
   * @dev Throws on any error like
   *      * incorrect `_value` (zero) or
   *      * insufficient token balance or
   *      * incorrect `_to` address:
   *          * zero address or
   *          * same as `_from` address (self transfer)
   *          * smart contract which doesn't support ERC20Receiver interface
   * @param _from token owner which approved caller (transaction sender)
   *      to transfer `_value` of tokens on its behalf
   * @param _to an address to transfer tokens to,
   *      must be either an external address or a smart contract,
   *      compliant with the ERC20 standard
   * @param _value amount of tokens to be transferred, must
   *      be greater than zero
   * @param _data [optional] additional data with no specified format,
   *      sent in onERC20Received call to `_to` in case if its a smart contract
   * @return true on success, throws otherwise
   */
  function safeTransferFrom(address _from, address _to, uint256 _value, bytes _data) public {
    // first delegate call to `unsafeTransferFrom`
    // to perform the unsafe token(s) transfer
    unsafeTransferFrom(_from, _to, _value);

    // after the successful transfer – check if receiver supports
    // ERC20Receiver and execute a callback handler `onERC20Received`,
    // reverting whole transaction on any error:
    // check if receiver `_to` supports ERC20Receiver interface
    if (AddressUtils.isContract(_to)) {
      // if `_to` is a contract – execute onERC20Received
      bytes4 response = ERC20Receiver(_to).onERC20Received(msg.sender, _from, _value, _data);

      // expected response is ERC20_RECEIVED
      require(response == ERC20_RECEIVED);
    }
  }

  /**
   * @notice Transfers some tokens on behalf of address `_from' (token owner)
   *      to some other address `_to`
   * @dev In contrast to `safeTransferFrom` doesn't check recipient
   *      smart contract to support ERC20 tokens (ERC20Receiver)
   * @dev Designed to be used by developers when the receiver is known
   *      to support ERC20 tokens but doesn't implement ERC20Receiver interface
   * @dev Called by token owner on his own or approved address,
   *      an address approved earlier by token owner to
   *      transfer some amount of tokens on its behalf
   * @dev Throws on any error like
   *      * incorrect `_value` (zero) or
   *      * insufficient token balance or
   *      * incorrect `_to` address:
   *          * zero address or
   *          * same as `_from` address (self transfer)
   * @param _from token owner which approved caller (transaction sender)
   *      to transfer `_value` of tokens on its behalf
   * @param _to an address to transfer tokens to,
   *      must be either an external address or a smart contract,
   *      compliant with the ERC20 standard
   * @param _value amount of tokens to be transferred, must
   *      be greater than zero
   * @return true on success, throws otherwise
   */
  function unsafeTransferFrom(address _from, address _to, uint256 _value) public {
    // if `_from` is equal to sender, require transfers feature to be enabled
    // otherwise require transfers on behalf feature to be enabled
    require(_from == msg.sender && isFeatureEnabled(FEATURE_TRANSFERS)
         || _from != msg.sender && isFeatureEnabled(FEATURE_TRANSFERS_ON_BEHALF));

    // non-zero to address check
    require(_to != address(0));

    // sender and recipient cannot be the same
    require(_from != _to);

    // zero value transfer check
    require(_value != 0);

    // by design of mint() -
    // - no need to make arithmetic overflow check on the _value

    // in case of transfer on behalf
    if(_from != msg.sender) {
      // verify sender has an allowance to transfer amount of tokens requested
      require(transferAllowances[_from][msg.sender] >= _value);

      // decrease the amount of tokens allowed to transfer
      transferAllowances[_from][msg.sender] -= _value;
    }

    // verify sender has enough tokens to transfer on behalf
    require(tokenBalances[_from] >= _value);

    // perform the transfer:
    // decrease token owner (sender) balance
    tokenBalances[_from] -= _value;

    // increase `_to` address (receiver) balance
    tokenBalances[_to] += _value;

    // emit an ERC20 transfer event
    emit Transfer(_from, _to, _value);
  }

  /**
   * @notice Approves address called "spender" to transfer some amount
   *      of tokens on behalf of the owner
   * @dev Caller must not necessarily own any tokens to grant the permission
   * @param _spender an address approved by the caller (token owner)
   *      to spend some tokens on its behalf
   * @param _value an amount of tokens spender `_spender` is allowed to
   *      transfer on behalf of the token owner
   * @return true on success, throws otherwise
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    // perform an operation: write value requested into the storage
    transferAllowances[msg.sender][_spender] = _value;

    // emit an event
    emit Approval(msg.sender, _spender, _value);

    // operation successful, return true
    return true;
  }

  /**
   * @dev Mints (creates) some tokens to address specified
   * @dev The value passed is treated as number of units (see `ONE_UNIT`)
   *      to achieve natural impression on token quantity
   * @dev Requires sender to have `ROLE_TOKEN_CREATOR` permission
   * @param _to an address to mint tokens to
   * @param _value an amount of tokens to mint (create)
   */
  function mint(address _to, uint256 _value) public {
    // calculate native value, taking into account `decimals`
    uint256 value = _value * ONE_UNIT;

    // arithmetic overflow and non-zero value check
    require(value > _value);

    // delegate call to native `mintNative`
    mintNative(_to, value);
  }

  /**
   * @dev Mints (creates) some tokens to address specified
   * @dev The value specified is treated as is without taking
   *      into account what `decimals` value is
   * @dev Requires sender to have `ROLE_TOKEN_CREATOR` permission
   * @param _to an address to mint tokens to
   * @param _value an amount of tokens to mint (create)
   */
  function mintNative(address _to, uint256 _value) public {
    // check if caller has sufficient permissions to mint tokens
    require(isSenderInRole(ROLE_TOKEN_CREATOR));

    // non-zero recipient address check
    require(_to != address(0));

    // non-zero _value and arithmetic overflow check on the total supply
    // this check automatically secures arithmetic overflow on the individual balance
    require(tokensTotal + _value > tokensTotal);

    // increase `_to` address balance
    tokenBalances[_to] += _value;

    // increase total amount of tokens value
    tokensTotal += _value;

    // fire ERC20 compliant transfer event
    emit Transfer(address(0), _to, _value);

    // fire a mint event
    emit Minted(msg.sender, _to, _value);
  }

  /**
   * @dev Burns (destroys) some tokens from the address specified
   * @dev The value passed is treated as number of units (see `ONE_UNIT`)
   *      to achieve natural impression on token quantity
   * @dev Requires sender to have `ROLE_TOKEN_DESTROYER` permission
   * @param _from an address to burn some tokens from
   * @param _value an amount of tokens to burn (destroy)
   */
  function burn(address _from, uint256 _value) public {
    // calculate native value, taking into account `decimals`
    uint256 value = _value * ONE_UNIT;

    // arithmetic overflow and non-zero value check
    require(value > _value);

    // delegate call to native `burnNative`
    burnNative(_from, value);
  }

  /**
   * @dev Burns (destroys) some tokens from the address specified
   * @dev The value specified is treated as is without taking
   *      into account what `decimals` value is
   * @dev Requires sender to have `ROLE_TOKEN_DESTROYER` permission
   * @param _from an address to burn some tokens from
   * @param _value an amount of tokens to burn (destroy)
   */
  function burnNative(address _from, uint256 _value) public {
    // check if caller has sufficient permissions to burn tokens
    require(isSenderInRole(ROLE_TOKEN_DESTROYER));

    // non-zero burn value check
    require(_value != 0);

    // verify `_from` address has enough tokens to destroy
    // (basically this is a arithmetic overflow check)
    require(tokenBalances[_from] >= _value);

    // decrease `_from` address balance
    tokenBalances[_from] -= _value;

    // decrease total amount of tokens value
    tokensTotal -= _value;

    // fire ERC20 compliant transfer event
    emit Transfer(_from, address(0), _value);

    // fire a burn event
    emit Burnt(msg.sender, _from, _value);
  }

}


/**
 * @title Silver Smart Contract
 *
 * @notice Silver is a transferable fungible entity (ERC20 token)
 *      used to "pay" for in game services like gem upgrades, etc.
 * @notice Silver is a part of Gold/Silver system, which allows to
 *      upgrade gems (level, grade, etc.)
 *
 * @dev Silver is mintable and burnable entity,
 *      meaning it can be created or destroyed by the authorized addresses
 * @dev An address authorized can mint/burn its own tokens (own balance) as well
 *      as tokens owned by another address (additional permission level required)
 *
 * @author Basil Gorin
 */
contract SilverERC20 is GoldERC20 {
  /**
   * @dev Smart contract version
   * @dev Should be incremented manually in this source code
   *      each time smart contact source code is changed
   * @dev To distinguish from other tokens must be multiple of 0x10
   */
  uint32 public constant TOKEN_VERSION = 0x30;

  /**
   * @notice ERC20 symbol of that token (short name)
   */
  string public constant symbol = "SLV";

  /**
   * @notice ERC20 name of the token (long name)
   */
  string public constant name = "SILVER - CryptoMiner World";

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"features","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_VERSION","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnNative","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"unsafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"mintNative","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"required","type":"uint256"}],"name":"isFeatureEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userRoles","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_TOKEN_CREATOR","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FEATURE_TRANSFERS_ON_BEHALF","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"role","type":"uint256"}],"name":"updateRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FEATURE_TRANSFERS","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"required","type":"uint256"}],"name":"isOperatorInRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"mask","type":"uint256"}],"name":"updateFeatures","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_TOKEN_DESTROYER","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_UNIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"actual","type":"uint256"},{"name":"required","type":"uint256"}],"name":"evaluateBy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"required","type":"uint256"}],"name":"isSenderInRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Burnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":false,"name":"_requested","type":"uint256"},{"indexed":false,"name":"_actual","type":"uint256"}],"name":"FeaturesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_requested","type":"uint256"},{"indexed":false,"name":"_actual","type":"uint256"}],"name":"RoleUpdated","type":"event"}]

60806040908152600160a060020a03331660009081526001602052206000199055610e628061002f6000396000f3006080604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610179578063095ea7b31461020357806318160ddd1461023b57806323b872dd146102625780632b5214161461028c578063313ce567146102a157806332892177146102cc5780633a9e0e13146102fa57806340c10f191461032057806359b961ef1461034457806362aaa1601461036e57806370a0823114610392578063725f3626146103b357806374d5e100146103cb5780638d4e57e6146103ec5780638f6fba8c1461040157806395d89b41146104165780639dc29fac1461042b578063a9059cbb1461044f578063ae5b102e14610473578063b88d4fde14610497578063c0d6568d146103ec578063c688d69314610506578063d5bb7f671461052a578063dd62ed3e14610542578063e62cac7614610401578063eb43af0014610569578063f822d5aa1461057e578063fcc2c078146105a5575b600080fd5b34801561018557600080fd5b5061018e6105bd565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c85781810151838201526020016101b0565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020f57600080fd5b50610227600160a060020a03600435166024356105f4565b604080519115158252519081900360200190f35b34801561024757600080fd5b5061025061065e565b60408051918252519081900360200190f35b34801561026e57600080fd5b50610227600160a060020a0360043581169060243516604435610664565b34801561029857600080fd5b5061025061068c565b3480156102ad57600080fd5b506102b6610692565b6040805160ff9092168252519081900360200190f35b3480156102d857600080fd5b506102e1610697565b6040805163ffffffff9092168252519081900360200190f35b34801561030657600080fd5b5061031e600160a060020a036004351660243561069c565b005b34801561032c57600080fd5b5061031e600160a060020a0360043516602435610791565b34801561035057600080fd5b5061031e600160a060020a03600435811690602435166044356107b1565b34801561037a57600080fd5b5061031e600160a060020a0360043516602435610956565b34801561039e57600080fd5b50610250600160a060020a0360043516610a3a565b3480156103bf57600080fd5b50610227600435610a55565b3480156103d757600080fd5b50610250600160a060020a0360043516610a69565b3480156103f857600080fd5b506102e1610a7b565b34801561040d57600080fd5b506102e1610a80565b34801561042257600080fd5b5061018e610a85565b34801561043757600080fd5b5061031e600160a060020a0360043516602435610abc565b34801561045b57600080fd5b50610227600160a060020a0360043516602435610ad7565b34801561047f57600080fd5b5061031e600160a060020a0360043516602435610aeb565b3480156104a357600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261031e94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610b8c9650505050505050565b34801561051257600080fd5b50610227600160a060020a0360043516602435610d2a565b34801561053657600080fd5b5061031e600435610d4d565b34801561054e57600080fd5b50610250600160a060020a0360043581169060243516610dbf565b34801561057557600080fd5b50610250610dea565b34801561058a57600080fd5b50610250600160a060020a0360043516602435604435610df0565b3480156105b157600080fd5b50610227600435610e1b565b60408051808201909152601a81527f53494c564552202d2043727970746f4d696e657220576f726c64000000000000602082015281565b600160a060020a03338116600081815260046020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60035490565b60006106828484846020604051908101604052806000815250610b8c565b5060019392505050565b60005481565b600381565b603081565b6106a66002610e1b565b15156106b157600080fd5b8015156106bd57600080fd5b600160a060020a0382166000908152600260205260409020548111156106e257600080fd5b600160a060020a038216600081815260026020908152604080832080548690039055600380548690039055805185815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a381600160a060020a031633600160a060020a03167fe8a89cc6e5096f9d9f43de82c077c1f4cfe707c0e0c2032176c68813b9ae6a5c836040518082815260200191505060405180910390a35050565b6103e881028181116107a257600080fd5b6107ac8382610956565b505050565b33600160a060020a031683600160a060020a03161480156107d757506107d76001610a55565b80610804575033600160a060020a031683600160a060020a03161415801561080457506108046002610a55565b151561080f57600080fd5b600160a060020a038216151561082457600080fd5b600160a060020a03838116908316141561083d57600080fd5b80151561084957600080fd5b33600160a060020a031683600160a060020a03161415156108c557600160a060020a038084166000908152600460209081526040808320339094168352929052205481111561089757600080fd5b600160a060020a03808416600090815260046020908152604080832033909416835292905220805482900390555b600160a060020a0383166000908152600260205260409020548111156108ea57600080fd5b600160a060020a03808416600081815260026020908152604080832080548790039055938616808352918490208054860190558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b6109606001610e1b565b151561096b57600080fd5b600160a060020a038216151561098057600080fd5b6003548181011161099057600080fd5b600160a060020a03821660008181526002602090815260408083208054860190556003805486019055805185815290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a381600160a060020a031633600160a060020a03167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0836040518082815260200191505060405180910390a35050565b600160a060020a031660009081526002602052604090205490565b6000610a6360005483610e27565b92915050565b60016020526000908152604090205481565b600181565b600281565b60408051808201909152600381527f534c560000000000000000000000000000000000000000000000000000000000602082015281565b6103e88102818111610acd57600080fd5b6107ac838261069c565b6000610ae4338484610664565b9392505050565b610af86310000000610e1b565b1515610b0357600080fd5b600160a060020a038216600090815260016020526040902054610b2890339083610df0565b600160a060020a038084166000818152600160209081526040918290208590558151868152908101949094528051919333909316927f5a10526456f5116c0b7b80582c217d666243fd51b6a2d92c8011e601c2462e5f929081900390910190a35050565b6000610b998585856107b1565b610ba284610e2e565b15610d235783600160a060020a0316634fc35859338786866040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c58578181015183820152602001610c40565b50505050905090810190601f168015610c855780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167f4fc358590000000000000000000000000000000000000000000000000000000014610d2357600080fd5b5050505050565b600160a060020a038216600090815260016020526040812054610ae49083610e27565b610d5a6320000000610e1b565b1515610d6557600080fd5b610d723360005483610df0565b60008190556040805183815260208101929092528051600160a060020a033316927fd7561eaef77f105dc0c307bfb23c571f603f07bb7db5766a68840742fde80b8992908290030190a250565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205490565b6103e881565b600160a060020a03929092166000908152600160205260409020546000198084188216189216171690565b6000610a633383610d2a565b9081161490565b6000903b11905600a165627a7a72305820424cd2cfceadcaea76998551c19a706208c4b7045a0330f928f447e58382b2340029

Deployed Bytecode

0x6080604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610179578063095ea7b31461020357806318160ddd1461023b57806323b872dd146102625780632b5214161461028c578063313ce567146102a157806332892177146102cc5780633a9e0e13146102fa57806340c10f191461032057806359b961ef1461034457806362aaa1601461036e57806370a0823114610392578063725f3626146103b357806374d5e100146103cb5780638d4e57e6146103ec5780638f6fba8c1461040157806395d89b41146104165780639dc29fac1461042b578063a9059cbb1461044f578063ae5b102e14610473578063b88d4fde14610497578063c0d6568d146103ec578063c688d69314610506578063d5bb7f671461052a578063dd62ed3e14610542578063e62cac7614610401578063eb43af0014610569578063f822d5aa1461057e578063fcc2c078146105a5575b600080fd5b34801561018557600080fd5b5061018e6105bd565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c85781810151838201526020016101b0565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020f57600080fd5b50610227600160a060020a03600435166024356105f4565b604080519115158252519081900360200190f35b34801561024757600080fd5b5061025061065e565b60408051918252519081900360200190f35b34801561026e57600080fd5b50610227600160a060020a0360043581169060243516604435610664565b34801561029857600080fd5b5061025061068c565b3480156102ad57600080fd5b506102b6610692565b6040805160ff9092168252519081900360200190f35b3480156102d857600080fd5b506102e1610697565b6040805163ffffffff9092168252519081900360200190f35b34801561030657600080fd5b5061031e600160a060020a036004351660243561069c565b005b34801561032c57600080fd5b5061031e600160a060020a0360043516602435610791565b34801561035057600080fd5b5061031e600160a060020a03600435811690602435166044356107b1565b34801561037a57600080fd5b5061031e600160a060020a0360043516602435610956565b34801561039e57600080fd5b50610250600160a060020a0360043516610a3a565b3480156103bf57600080fd5b50610227600435610a55565b3480156103d757600080fd5b50610250600160a060020a0360043516610a69565b3480156103f857600080fd5b506102e1610a7b565b34801561040d57600080fd5b506102e1610a80565b34801561042257600080fd5b5061018e610a85565b34801561043757600080fd5b5061031e600160a060020a0360043516602435610abc565b34801561045b57600080fd5b50610227600160a060020a0360043516602435610ad7565b34801561047f57600080fd5b5061031e600160a060020a0360043516602435610aeb565b3480156104a357600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261031e94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610b8c9650505050505050565b34801561051257600080fd5b50610227600160a060020a0360043516602435610d2a565b34801561053657600080fd5b5061031e600435610d4d565b34801561054e57600080fd5b50610250600160a060020a0360043581169060243516610dbf565b34801561057557600080fd5b50610250610dea565b34801561058a57600080fd5b50610250600160a060020a0360043516602435604435610df0565b3480156105b157600080fd5b50610227600435610e1b565b60408051808201909152601a81527f53494c564552202d2043727970746f4d696e657220576f726c64000000000000602082015281565b600160a060020a03338116600081815260046020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60035490565b60006106828484846020604051908101604052806000815250610b8c565b5060019392505050565b60005481565b600381565b603081565b6106a66002610e1b565b15156106b157600080fd5b8015156106bd57600080fd5b600160a060020a0382166000908152600260205260409020548111156106e257600080fd5b600160a060020a038216600081815260026020908152604080832080548690039055600380548690039055805185815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a381600160a060020a031633600160a060020a03167fe8a89cc6e5096f9d9f43de82c077c1f4cfe707c0e0c2032176c68813b9ae6a5c836040518082815260200191505060405180910390a35050565b6103e881028181116107a257600080fd5b6107ac8382610956565b505050565b33600160a060020a031683600160a060020a03161480156107d757506107d76001610a55565b80610804575033600160a060020a031683600160a060020a03161415801561080457506108046002610a55565b151561080f57600080fd5b600160a060020a038216151561082457600080fd5b600160a060020a03838116908316141561083d57600080fd5b80151561084957600080fd5b33600160a060020a031683600160a060020a03161415156108c557600160a060020a038084166000908152600460209081526040808320339094168352929052205481111561089757600080fd5b600160a060020a03808416600090815260046020908152604080832033909416835292905220805482900390555b600160a060020a0383166000908152600260205260409020548111156108ea57600080fd5b600160a060020a03808416600081815260026020908152604080832080548790039055938616808352918490208054860190558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b6109606001610e1b565b151561096b57600080fd5b600160a060020a038216151561098057600080fd5b6003548181011161099057600080fd5b600160a060020a03821660008181526002602090815260408083208054860190556003805486019055805185815290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a381600160a060020a031633600160a060020a03167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0836040518082815260200191505060405180910390a35050565b600160a060020a031660009081526002602052604090205490565b6000610a6360005483610e27565b92915050565b60016020526000908152604090205481565b600181565b600281565b60408051808201909152600381527f534c560000000000000000000000000000000000000000000000000000000000602082015281565b6103e88102818111610acd57600080fd5b6107ac838261069c565b6000610ae4338484610664565b9392505050565b610af86310000000610e1b565b1515610b0357600080fd5b600160a060020a038216600090815260016020526040902054610b2890339083610df0565b600160a060020a038084166000818152600160209081526040918290208590558151868152908101949094528051919333909316927f5a10526456f5116c0b7b80582c217d666243fd51b6a2d92c8011e601c2462e5f929081900390910190a35050565b6000610b998585856107b1565b610ba284610e2e565b15610d235783600160a060020a0316634fc35859338786866040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c58578181015183820152602001610c40565b50505050905090810190601f168015610c855780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167f4fc358590000000000000000000000000000000000000000000000000000000014610d2357600080fd5b5050505050565b600160a060020a038216600090815260016020526040812054610ae49083610e27565b610d5a6320000000610e1b565b1515610d6557600080fd5b610d723360005483610df0565b60008190556040805183815260208101929092528051600160a060020a033316927fd7561eaef77f105dc0c307bfb23c571f603f07bb7db5766a68840742fde80b8992908290030190a250565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205490565b6103e881565b600160a060020a03929092166000908152600160205260409020546000198084188216189216171690565b6000610a633383610d2a565b9081161490565b6000903b11905600a165627a7a72305820424cd2cfceadcaea76998551c19a706208c4b7045a0330f928f447e58382b2340029

Swarm Source

bzzr://424cd2cfceadcaea76998551c19a706208c4b7045a0330f928f447e58382b234
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.