ETH Price: $2,515.28 (+1.51%)

Contract

0xE9Fefb9e69c5E825415b5346f6d7951272E905Ae
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer60498012018-07-29 6:40:172283 days ago1532846417IN
0xE9Fefb9e...272E905Ae
0 ETH0.00003751
Transfer60494442018-07-29 5:18:482283 days ago1532841528IN
0xE9Fefb9e...272E905Ae
0 ETH0.000052061
0x6080604060446822018-07-28 10:23:592283 days ago1532773439IN
 Create: Scale
0 ETH0.001967781

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Scale

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-29
*/

pragma solidity ^0.4.24;

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

/**************************************************************
 * @title Scale Token Contract
 * @file Scale.sol
 * @author Jared Downing and Kane Thomas of the Scale Network
 * @version 1.0
 *
 * @section DESCRIPTION
 *
 * This is an ERC20-based token with staking and inflationary functionality.
 *
 *************************************************************/

//////////////////////////////////
/// OpenZeppelin library imports
//////////////////////////////////

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return balances[_owner];
  }

}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;

  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(address _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 * Modified to allow minting for non-owner addresses
 */

contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(address _to, uint256 _amount) internal returns (bool) {
    totalSupply = totalSupply.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

}

/**
 * @title Contracts that should not own Ether
 * @author Remco Bloemen <remco@2π.com>
 * @dev This tries to block incoming ether to prevent accidental loss of Ether. Should Ether end up
 * in the contract, it will allow the owner to reclaim this ether.
 * @notice Ether can still be send to this contract by:
 * calling functions labeled `payable`
 * `selfdestruct(contract_address)`
 * mining directly to the contract address
*/
contract HasNoEther is Ownable {

  /**
  * @dev Constructor that rejects incoming Ether
  * @dev The `payable` flag is added so we can access `msg.value` without compiler warning. If we
  * leave out payable, then Solidity will allow inheriting contracts to implement a payable
  * constructor. By doing it this way we prevent a payable constructor from working. Alternatively
  * we could use assembly to access msg.value.
  */
  constructor() public payable {
    require(msg.value == 0);
  }

  /**
   * @dev Disallows direct send by settings a default function without the `payable` flag.
   */
  function() external {
  }

  /**
   * @dev Transfer all Ether held by the contract to the owner.
   */
  function reclaimEther() external onlyOwner {
    assert(owner.send(address(this).balance));
  }
}

//////////////////////////////////
/// Scale Token
//////////////////////////////////

contract Scale is MintableToken, HasNoEther {

    // Libraries
    using SafeMath for uint;

    //////////////////////
    // Token Information
    //////////////////////
    string public constant name = "SCALE";
    string public constant symbol = "SCALE";
    uint8 public constant  decimals = 18;

    ///////////////////////////////////////////////////////////
    // Variables For Staking and Pooling
    ///////////////////////////////////////////////////////////

    // -- Pool Minting Rates and Percentages -- //
    // Pool for Scale distribution to rewards pool
    // Set to 0 to prohibit issuing to the pool before it is assigned
    address public pool = address(0);

    // Pool and Owner minted tokens per second
    uint public poolMintRate;
    uint public ownerMintRate;

    // Amount of Scale to be staked to the pool, staking, and mint, as calculated through their percentages
    uint public poolMintAmount;
    uint public stakingMintAmount;
    uint public ownerMintAmount;

    // Scale distribution percentages
    uint public poolPercentage = 70;
    uint public ownerPercentage = 5;
    uint public stakingPercentage = 25;

    // Last time minted for owner and pool
    uint public ownerTimeLastMinted;
    uint public poolTimeLastMinted;

    // -- Staking -- //
    // Minted tokens per second
    uint public stakingMintRate;

    // Total Scale currently staked
    uint public totalScaleStaked;

    // Mapping of the timestamp => totalStaking that is created each time an address stakes or unstakes
    mapping (uint => uint) totalStakingHistory;

    // Variable for staking accuracy. Set to 86400 for seconds in a day so that staking gains are based on the day an account begins staking.
    uint timingVariable = 86400;

    // Address staking information
    struct AddressStakeData {
        uint stakeBalance;
        uint initialStakeTime;
    }

    // Track all tokens staked
    mapping (address => AddressStakeData) public stakeBalances;

    // -- Inflation -- //
    // Inflation rate begins at 100% per year and decreases by 15% per year until it reaches 10% where it decreases by 0.5% per year
    uint256 inflationRate = 1000;

    // Used to manage when to inflate. Allowed to inflate once per year until the rate reaches 1%.
    uint256 public lastInflationUpdate;

    // -- Events -- //
    // Fired when tokens are staked
    event Stake(address indexed staker, uint256 value);
    // Fired when tokens are unstaked
    event Unstake(address indexed unstaker, uint256 stakedAmount, uint256 stakingGains);

    //////////////////////////////////////////////////
    /// Scale Token Functionality
    //////////////////////////////////////////////////

    /// @dev Scale token constructor
    constructor() public {
        // Assign owner
        owner = msg.sender;

        // Assign initial owner supply
        uint _initOwnerSupply = 10000000 ether;
        // Mint given to owner only one-time
        bool _success = mint(msg.sender, _initOwnerSupply);
        // Require minting success
        require(_success);

        // Set pool and owner last minted to ensure extra coins are not minted by either
        ownerTimeLastMinted = now;
        poolTimeLastMinted = now;

        // Set minting amount for pool, staking, and owner over the course of 1 year
        poolMintAmount = _initOwnerSupply.mul(poolPercentage).div(100);
        ownerMintAmount = _initOwnerSupply.mul(ownerPercentage).div(100);
        stakingMintAmount = _initOwnerSupply.mul(stakingPercentage).div(100);

        // One year in seconds
        uint _oneYearInSeconds = 31536000 ether;

        // Set the rate of coins minted per second for the pool, owner, and global staking
        poolMintRate = calculateFraction(poolMintAmount, _oneYearInSeconds, decimals);
        ownerMintRate = calculateFraction(ownerMintAmount, _oneYearInSeconds, decimals);
        stakingMintRate = calculateFraction(stakingMintAmount, _oneYearInSeconds, decimals);

        // Set the last time inflation was update to now so that the next time it can be updated is 1 year from now
        lastInflationUpdate = now;
    }

    /////////////
    // Inflation
    /////////////

    /// @dev the inflation rate begins at 100% and decreases by 15% every year until it reaches 10%
    /// at 10% the rate begins to decrease by 0.5% until it reaches 1%
    function adjustInflationRate() private {


      // Make sure adjustInflationRate cannot be called for at least another year
      lastInflationUpdate = now;

      // Decrease inflation rate by 15% each year
      if (inflationRate > 100) {

        inflationRate = inflationRate.sub(300);
      }
      // Inflation rate reaches 10%. Decrease inflation rate by 0.5% from here on out until it reaches 1%.
      else if (inflationRate > 10) {

        inflationRate = inflationRate.sub(5);
      }

      // Calculate new mint amount of Scale that should be created per year.
      // Example Inflation Past Year 1 for the poolMintAmount: 16M * 0.85 * 0.7 = 9,520,000
      poolMintAmount = totalSupply.mul(inflationRate).div(1000).mul(poolPercentage).div(100);
      ownerMintAmount = totalSupply.mul(inflationRate).div(1000).mul(ownerPercentage).div(100);
      stakingMintAmount = totalSupply.mul(inflationRate).div(1000).mul(stakingPercentage).div(100);

        // Adjust Scale created per-second for each rate
        poolMintRate = calculateFraction(poolMintAmount, 31536000 ether, decimals);
        ownerMintRate = calculateFraction(ownerMintAmount, 31536000 ether, decimals);
        stakingMintRate = calculateFraction(stakingMintAmount, 31536000 ether, decimals);
    }

    /// @dev anyone can call this function to update the inflation rate yearly
    function updateInflationRate() public {

      // Require 1 year to have passed for every inflation adjustment
      require(now.sub(lastInflationUpdate) >= 31536000);

      adjustInflationRate();

    }

    /////////////
    // Staking
    /////////////

    /// @dev staking function which allows users to stake an amount of tokens to gain interest for up to 30 days
    /// @param _stakeAmount how many tokens a user wants to stake
    function stakeScale(uint _stakeAmount) external {

        // Require that tokens are staked successfully
        require(stake(msg.sender, _stakeAmount));
    }

    /// @dev stake for a seperate address
    /// @param _stakeAmount how many tokens a user wants to stake
    function stakeFor(address _user, uint _stakeAmount) external {

      // You can only stake tokens for another user if they have not already staked tokens
      require(stakeBalances[_user].stakeBalance == 0);

      // Transfer Scale from to the user
      transfer( _user, _stakeAmount);

      // Stake for the user
      stake(_user, _stakeAmount);
    }

    /// @dev stake function reduces the user's total available balance and adds it to their staking balance
    /// @param _value how many tokens a user wants to stake
    function stake(address _user, uint256 _value) private returns (bool success) {

        // You can only stake as many tokens as you have
        require(_value <= balances[_user]);
        // You can only stake tokens if you have not already staked tokens
        require(stakeBalances[_user].stakeBalance == 0);

        // Subtract stake amount from regular token balance
        balances[_user] = balances[_user].sub(_value);

        // Add stake amount to staked balance
        stakeBalances[_user].stakeBalance = _value;

        // Increment the staking staked tokens value
        totalScaleStaked = totalScaleStaked.add(_value);

        // Save the time that the stake started
        stakeBalances[_user].initialStakeTime = now.div(timingVariable);

        // Set the new staking history
        setTotalStakingHistory();

        // Fire an event to tell the world of the newly staked tokens
        emit Stake(_user, _value);

        return true;
    }

    /// @dev returns how much Scale a user has earned so far
    /// @param _now is passed in to allow for a gas-free analysis
    /// @return staking gains based on the amount of time passed since staking began
    function getStakingGains(uint _now) view public returns (uint) {

        if (stakeBalances[msg.sender].stakeBalance == 0) {

          return 0;
        }

        return calculateStakeGains(_now);
    }

    /// @dev allows users to reclaim any staked tokens
    /// @return bool on success
    function unstake() external returns (bool) {

        // Require that there was some amount vested
        require(stakeBalances[msg.sender].stakeBalance > 0);

        // Require that at least 7 timing variables have passed (days)
        require(now.div(timingVariable).sub(stakeBalances[msg.sender].initialStakeTime) >= 7);

        // Calculate tokens to mint
        uint _tokensToMint = calculateStakeGains(now);

        balances[msg.sender] = balances[msg.sender].add(stakeBalances[msg.sender].stakeBalance);

        // Subtract stake balance from totalScaleStaked
        totalScaleStaked = totalScaleStaked.sub(stakeBalances[msg.sender].stakeBalance);

        // Mint the new tokens to the sender
        mint(msg.sender, _tokensToMint);

        // Scale unstaked event
        emit Unstake(msg.sender, stakeBalances[msg.sender].stakeBalance, _tokensToMint);

        // Clear out stored data from mapping
        stakeBalances[msg.sender].stakeBalance = 0;
        stakeBalances[msg.sender].initialStakeTime = 0;

        // Set this every time someone adjusts the totalScaleStaking amount
        setTotalStakingHistory();

        return true;
    }

    /// @dev Helper function to claimStake that modularizes the minting via staking calculation
    /// @param _now when the user stopped staking. Passed in as a variable to allow for checking without using gas from the getStakingGains function.
    /// @return uint for total coins to be minted
    function calculateStakeGains(uint _now) view private returns (uint mintTotal)  {

      uint _nowAsTimingVariable = _now.div(timingVariable);    // Today as a unique value in unix time
      uint _initialStakeTimeInVariable = stakeBalances[msg.sender].initialStakeTime; // When the user started staking as a unique day in unix time
      uint _timePassedSinceStakeInVariable = _nowAsTimingVariable.sub(_initialStakeTimeInVariable); // How much time has passed, in days, since the user started staking.
      uint _stakePercentages = 0; // Keeps an additive track of the user's staking percentages over time
      uint _tokensToMint = 0; // How many new Scale tokens to create
      uint _lastUsedVariable;  // Last day the totalScaleStaked was updated

      // Average this msg.sender's relative percentage ownership of totalScaleStaked throughout each day since they started staking
      for (uint i = _initialStakeTimeInVariable; i < _nowAsTimingVariable; i++) {

        // If the day exists add it to the percentages
        if (totalStakingHistory[i] != 0) {

           // If the day does exist add it to the number to be later averaged as a total average percentage of total staking
          _stakePercentages = _stakePercentages.add(calculateFraction(stakeBalances[msg.sender].stakeBalance, totalStakingHistory[i], decimals));

          // Set this as the last day someone staked
          _lastUsedVariable = totalStakingHistory[i];
        }
        else {

          // Use the last day found in the totalStakingHistory mapping
          _stakePercentages = _stakePercentages.add(calculateFraction(stakeBalances[msg.sender].stakeBalance, _lastUsedVariable, decimals));
        }

      }

        // Get the account's average percentage staked of the total stake over the course of all days they have been staking
        uint _stakePercentageAverage = calculateFraction(_stakePercentages, _timePassedSinceStakeInVariable, 0);

        // Calculate this account's mint rate per second while staking
        uint _finalMintRate = stakingMintRate.mul(_stakePercentageAverage);

        // Account for 18 decimals when calculating the amount of tokens to mint
        _finalMintRate = _finalMintRate.div(1 ether);

        // Calculate total tokens to be minted. Multiply by timingVariable to convert back to seconds.
        if (_timePassedSinceStakeInVariable >= 365) {

          // Tokens were staked for the maximum amount of time, one year. Give them one year's worth of tokens. ( this limit is placed to avoid gas limits)
          _tokensToMint = calculateMintTotal(timingVariable.mul(365), _finalMintRate);
        }
        else {

          // Tokens were staked for less than the maximum amount of time
          _tokensToMint = calculateMintTotal(_timePassedSinceStakeInVariable.mul(timingVariable), _finalMintRate);
        }

        return  _tokensToMint;
    }

    /// @dev set the new totalStakingHistory mapping to the current timestamp and totalScaleStaked
    function setTotalStakingHistory() private {

      // Get now in terms of the variable staking accuracy (days in Scale's case)
      uint _nowAsTimingVariable = now.div(timingVariable);

      // Set the totalStakingHistory as a timestamp of the totalScaleStaked today
      totalStakingHistory[_nowAsTimingVariable] = totalScaleStaked;
    }

    /// @dev Allows user to check their staked balance
    /// @return staked balance
    function getStakedBalance() view external returns (uint stakedBalance) {

        return stakeBalances[msg.sender].stakeBalance;
    }

    /////////////
    // Scale Owner Claiming
    /////////////

    /// @dev allows contract owner to claim their mint
    function ownerClaim() external onlyOwner {

        require(now > ownerTimeLastMinted);

        uint _timePassedSinceLastMint; // The amount of time passed since the owner claimed in seconds
        uint _tokenMintCount; // The amount of new tokens to mint
        bool _mintingSuccess; // The success of minting the new Scale tokens

        // Calculate the number of seconds that have passed since the owner last took a claim
        _timePassedSinceLastMint = now.sub(ownerTimeLastMinted);

        assert(_timePassedSinceLastMint > 0);

        // Determine the token mint amount, determined from the number of seconds passed and the ownerMintRate
        _tokenMintCount = calculateMintTotal(_timePassedSinceLastMint, ownerMintRate);

        // Mint the owner's tokens; this also increases totalSupply
        _mintingSuccess = mint(msg.sender, _tokenMintCount);

        require(_mintingSuccess);

        // New minting was a success. Set last time minted to current block.timestamp (now)
        ownerTimeLastMinted = now;
    }

    ////////////////////////////////
    // Scale Pool Distribution
    ////////////////////////////////

    /// @dev anyone can call this function that mints Scale to the pool dedicated to Scale distribution to rewards pool
    function poolIssue() public {

        // Do not allow tokens to be minted to the pool until the pool is set
        require(pool != address(0));

        // Make sure time has passed since last minted to pool
        require(now > poolTimeLastMinted);
        require(pool != address(0));

        uint _timePassedSinceLastMint; // The amount of time passed since the pool claimed in seconds
        uint _tokenMintCount; // The amount of new tokens to mint
        bool _mintingSuccess; // The success of minting the new Scale tokens

        // Calculate the number of seconds that have passed since the owner last took a claim
        _timePassedSinceLastMint = now.sub(poolTimeLastMinted);

        assert(_timePassedSinceLastMint > 0);

        // Determine the token mint amount, determined from the number of seconds passed and the ownerMintRate
        _tokenMintCount = calculateMintTotal(_timePassedSinceLastMint, poolMintRate);

        // Mint the owner's tokens; this also increases totalSupply
        _mintingSuccess = mint(pool, _tokenMintCount);

        require(_mintingSuccess);

        // New minting was a success! Set last time minted to current block.timestamp (now)
        poolTimeLastMinted = now;
    }

    /// @dev sets the address for the rewards pool
    /// @param _newAddress pool Address
    function setPool(address _newAddress) public onlyOwner {

        pool = _newAddress;
    }

    ////////////////////////////////
    // Helper Functions
    ////////////////////////////////

    /// @dev calculateFraction allows us to better handle the Solidity ugliness of not having decimals as a native type
    /// @param _numerator is the top part of the fraction we are calculating
    /// @param _denominator is the bottom part of the fraction we are calculating
    /// @param _precision tells the function how many significant digits to calculate out to
    /// @return quotient returns the result of our fraction calculation
    function calculateFraction(uint _numerator, uint _denominator, uint _precision) pure private returns(uint quotient) {
        // Take passed value and expand it to the required precision
        _numerator = _numerator.mul(10 ** (_precision + 1));
        // Handle last-digit rounding
        uint _quotient = ((_numerator.div(_denominator)) + 5) / 10;
        return (_quotient);
    }

    /// @dev Determines the amount of Scale to create based on the number of seconds that have passed
    /// @param _timeInSeconds is the time passed in seconds to mint for
    /// @return uint with the calculated number of new tokens to mint
    function calculateMintTotal(uint _timeInSeconds, uint _mintRate) pure private returns(uint mintAmount) {
        // Calculates the amount of tokens to mint based upon the number of seconds passed
        return(_timeInSeconds.mul(_mintRate));
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"stakingMintAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"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":"pool","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stakeAmount","type":"uint256"}],"name":"stakeScale","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[],"name":"unstake","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_stakeAmount","type":"uint256"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"stakeBalances","outputs":[{"name":"stakeBalance","type":"uint256"},{"name":"initialStakeTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ownerClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"poolTimeLastMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateInflationRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingMintRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_now","type":"uint256"}],"name":"getStakingGains","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"poolIssue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastInflationUpdate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakedBalance","outputs":[{"name":"stakedBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolMintAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolMintRate","outputs":[{"name":"","type":"uint256"}],"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":"reclaimEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownerMintRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"ownerTimeLastMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerMintAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"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":"totalScaleStaked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"unstaker","type":"address"},{"indexed":false,"name":"stakedAmount","type":"uint256"},{"indexed":false,"name":"stakingGains","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

608060405260048054600160a060020a03191690556046600a556005600b556019600c55620151806012556103e86014553480156200003d57600080fd5b5060038054600160a060020a031916331790556000808034156200006057600080fd5b60038054600160a060020a031916339081179091556a084595161401484a0000009350620000989084640100000000620001b2810204565b9150811515620000a757600080fd5b42600d819055600e55600a54620000eb90606490620000d6908690640100000000620015c4620002a182021704565b906401000000006200117a620002db82021704565b600755600b546200011490606490620000d6908690640100000000620015c4620002a182021704565b600955600c546200013d90606490620000d6908690640100000000620015c4620002a182021704565b600855506007546a1a1601fc4ea7109e000000906200016890826012640100000000620002f3810204565b6005556009546200018590826012640100000000620002f3810204565b600655600854620001a290826012640100000000620002f3810204565b600f55505042601555506200035b565b60008054620001d09083640100000000620011646200034b82021704565b6000908155600160a060020a038416815260016020526040902054620002059083640100000000620011646200034b82021704565b600160a060020a038416600081815260016020908152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600192915050565b600080831515620002b65760009150620002d4565b50828202828482811515620002c757fe5b0414620002d057fe5b8091505b5092915050565b6000808284811515620002ea57fe5b04949350505050565b600080620003168560018501600a0a640100000000620015c4620002a182021704565b9450600a6200033486866401000000006200117a620002db82021704565b6005018115156200034157fe5b0495945050505050565b600082820183811015620002d057fe5b61161b806200036b6000396000f3006080604052600436106101d75763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304e78a3081146101e657806306fdde031461020d578063095ea7b31461029757806316f0115b146102cf57806318160ddd146103005780631d60993b1461031557806323b872dd1461032f5780632def6620146103595780632ee409081461036e578063313ce567146103925780633b317dab146103bd5780633e7e30ba146103f757806341da75551461040c5780634437152a146104215780634dbe588914610442578063531e48271461045757806361c083b91461046c578063628a01ce14610481578063661884631461049657806366e1cebd146104ba5780636b178f47146104d25780636b4e8bb0146104e757806370a08231146104fc578063769658671461051d5780637e5755241461053257806381e1ccba146105475780638da5cb5b1461055c57806390cad5371461057157806395d89b411461020d5780639f727c2714610586578063a0d8b4e91461059b578063a9059cbb146105b0578063ac185644146105d4578063bb00c8f9146105e9578063d73dd623146105fe578063dd62ed3e14610622578063f162c5a114610649578063f2fde38b1461065e575b3480156101e357600080fd5b50005b3480156101f257600080fd5b506101fb61067f565b60408051918252519081900360200190f35b34801561021957600080fd5b50610222610685565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102a357600080fd5b506102bb600160a060020a03600435166024356106bc565b604080519115158252519081900360200190f35b3480156102db57600080fd5b506102e4610722565b60408051600160a060020a039092168252519081900360200190f35b34801561030c57600080fd5b506101fb610731565b34801561032157600080fd5b5061032d600435610737565b005b34801561033b57600080fd5b506102bb600160a060020a036004358116906024351660443561074f565b34801561036557600080fd5b506102bb6108c8565b34801561037a57600080fd5b5061032d600160a060020a0360043516602435610a10565b34801561039e57600080fd5b506103a7610a4d565b6040805160ff9092168252519081900360200190f35b3480156103c957600080fd5b506103de600160a060020a0360043516610a52565b6040805192835260208301919091528051918290030190f35b34801561040357600080fd5b506101fb610a6b565b34801561041857600080fd5b506101fb610a71565b34801561042d57600080fd5b5061032d600160a060020a0360043516610a77565b34801561044e57600080fd5b5061032d610abd565b34801561046357600080fd5b506101fb610b38565b34801561047857600080fd5b5061032d610b3e565b34801561048d57600080fd5b506101fb610b6d565b3480156104a257600080fd5b506102bb600160a060020a0360043516602435610b73565b3480156104c657600080fd5b506101fb600435610c65565b3480156104de57600080fd5b5061032d610c94565b3480156104f357600080fd5b506101fb610d33565b34801561050857600080fd5b506101fb600160a060020a0360043516610d39565b34801561052957600080fd5b506101fb610d54565b34801561053e57600080fd5b506101fb610d67565b34801561055357600080fd5b506101fb610d6d565b34801561056857600080fd5b506102e4610d73565b34801561057d57600080fd5b506101fb610d82565b34801561059257600080fd5b5061032d610d88565b3480156105a757600080fd5b506101fb610dd0565b3480156105bc57600080fd5b506102bb600160a060020a0360043516602435610dd6565b3480156105e057600080fd5b506101fb610eb9565b3480156105f557600080fd5b506101fb610ebf565b34801561060a57600080fd5b506102bb600160a060020a0360043516602435610ec5565b34801561062e57600080fd5b506101fb600160a060020a0360043581169060243516610f5e565b34801561065557600080fd5b506101fb610f89565b34801561066a57600080fd5b5061032d600160a060020a0360043516610f8f565b60085481565b60408051808201909152600581527f5343414c45000000000000000000000000000000000000000000000000000000602082015281565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b600454600160a060020a031681565b60005481565b6107413382611024565b151561074c57600080fd5b50565b6000600160a060020a038316151561076657600080fd5b600160a060020a03841660009081526001602052604090205482111561078b57600080fd5b600160a060020a03841660009081526002602090815260408083203384529091529020548211156107bb57600080fd5b600160a060020a0384166000908152600160205260409020546107e4908363ffffffff61115216565b600160a060020a038086166000908152600160205260408082209390935590851681522054610819908363ffffffff61116416565b600160a060020a03808516600090815260016020908152604080832094909455918716815260028252828120338252909152205461085d908363ffffffff61115216565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b33600090815260136020526040812054819081106108e557600080fd5b3360009081526013602052604090206001015460125460079161091f9161091390429063ffffffff61117a16565b9063ffffffff61115216565b101561092a57600080fd5b61093342611191565b33600090815260136020908152604080832054600190925290912054919250610962919063ffffffff61116416565b336000908152600160209081526040808320939093556013905220546010546109909163ffffffff61115216565b60105561099d3382611320565b503360008181526013602090815260409182902054825190815290810184905281517ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280929181900390910190a233600090815260136020526040812081815560010155610a086113fb565b600191505090565b600160a060020a03821660009081526013602052604090205415610a3357600080fd5b610a3d8282610dd6565b50610a488282611024565b505050565b601281565b6013602052600090815260409020805460019091015482565b600a5481565b600b5481565b600354600160a060020a03163314610a8e57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009081908190600160a060020a03163314610adb57600080fd5b600d544211610ae957600080fd5b600d54610afd90429063ffffffff61115216565b925060008311610b0957fe5b610b1583600654611428565b9150610b213383611320565b9050801515610b2f57600080fd5b505042600d5550565b600e5481565b6301e13380610b586015544261115290919063ffffffff16565b1015610b6357600080fd5b610b6b61143a565b565b600f5481565b336000908152600260209081526040808320600160a060020a038616845290915281205480831115610bc857336000908152600260209081526040808320600160a060020a0388168452909152812055610bfd565b610bd8818463ffffffff61115216565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b336000908152601360205260408120541515610c8357506000610c8f565b610c8c82611191565b90505b919050565b60045460009081908190600160a060020a03161515610cb257600080fd5b600e544211610cc057600080fd5b600454600160a060020a03161515610cd757600080fd5b600e54610ceb90429063ffffffff61115216565b925060008311610cf757fe5b610d0383600554611428565b600454909250610d1c90600160a060020a031683611320565b9050801515610d2a57600080fd5b505042600e5550565b60155481565b600160a060020a031660009081526001602052604090205490565b3360009081526013602052604090205490565b60075481565b600c5481565b600354600160a060020a031681565b60055481565b600354600160a060020a03163314610d9f57600080fd5b600354604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501515610b6b57fe5b60065481565b6000600160a060020a0383161515610ded57600080fd5b33600090815260016020526040902054821115610e0957600080fd5b33600090815260016020526040902054610e29908363ffffffff61115216565b3360009081526001602052604080822092909255600160a060020a03851681522054610e5b908363ffffffff61116416565b600160a060020a0384166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600d5481565b60095481565b336000908152600260209081526040808320600160a060020a0386168452909152812054610ef9908363ffffffff61116416565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60105481565b600354600160a060020a03163314610fa657600080fd5b600160a060020a0381161515610fbb57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03821660009081526001602052604081205482111561104957600080fd5b600160a060020a0383166000908152601360205260409020541561106c57600080fd5b600160a060020a038316600090815260016020526040902054611095908363ffffffff61115216565b600160a060020a03841660009081526001602090815260408083209390935560139052208290556010546110cf908363ffffffff61116416565b6010556012546110e690429063ffffffff61117a16565b600160a060020a03841660009081526013602052604090206001015561110a6113fb565b604080518381529051600160a060020a038516917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b60008282111561115e57fe5b50900390565b60008282018381101561117357fe5b9392505050565b600080828481151561118857fe5b04949350505050565b6000806000806000806000806000806111b56012548c61117a90919063ffffffff16565b3360009081526013602052604090206001015490995097506111dd898963ffffffff61115216565b965060009550600094508792505b88831015611289576000838152601160205260409020541561125b573360009081526013602090815260408083205486845260119092529091205461124291611235916012611581565b879063ffffffff61116416565b600084815260116020526040902054909650935061127e565b3360009081526013602052604090205461127b9061123590866012611581565b95505b6001909201916111eb565b61129586886000611581565b600f549092506112ab908363ffffffff6115c416565b90506112c581670de0b6b3a764000063ffffffff61117a16565b905061016d87106112f6576012546112ef906112e99061016d63ffffffff6115c416565b82611428565b9450611311565b61130e6112e9601254896115c490919063ffffffff16565b94505b50929998505050505050505050565b60008054611334908363ffffffff61116416565b6000908155600160a060020a03841681526001602052604090205461135f908363ffffffff61116416565b600160a060020a038416600081815260016020908152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600192915050565b60006114126012544261117a90919063ffffffff16565b6010546000918252601160205260409091205550565b6000611173838363ffffffff6115c416565b42601555601454606410156114665760145461145e9061012c63ffffffff61115216565b601455611489565b600a60145411156114895760145461148590600563ffffffff61115216565b6014555b6114c960646114b1600a546114bd6103e86114b16014546000546115c490919063ffffffff16565b9063ffffffff61117a16565b9063ffffffff6115c416565b6007819055506114f760646114b1600b546114bd6103e86114b16014546000546115c490919063ffffffff16565b60098190555061152560646114b1600c546114bd6103e86114b16014546000546115c490919063ffffffff16565b600855600754611542906a1a1601fc4ea7109e0000006012611581565b60055560095461155f906a1a1601fc4ea7109e0000006012611581565b60065560085461157c906a1a1601fc4ea7109e0000006012611581565b600f55565b60008061159a8560018501600a0a63ffffffff6115c416565b9450600a6115ae868663ffffffff61117a16565b6005018115156115ba57fe5b0495945050505050565b6000808315156115d75760009150610c5e565b508282028284828115156115e757fe5b041461117357fe00a165627a7a7230582063ca74021b19bc63ba944ea970b189efacfa43fc38bcd4f517f4ea998858b6b30029

Deployed Bytecode

0x6080604052600436106101d75763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166304e78a3081146101e657806306fdde031461020d578063095ea7b31461029757806316f0115b146102cf57806318160ddd146103005780631d60993b1461031557806323b872dd1461032f5780632def6620146103595780632ee409081461036e578063313ce567146103925780633b317dab146103bd5780633e7e30ba146103f757806341da75551461040c5780634437152a146104215780634dbe588914610442578063531e48271461045757806361c083b91461046c578063628a01ce14610481578063661884631461049657806366e1cebd146104ba5780636b178f47146104d25780636b4e8bb0146104e757806370a08231146104fc578063769658671461051d5780637e5755241461053257806381e1ccba146105475780638da5cb5b1461055c57806390cad5371461057157806395d89b411461020d5780639f727c2714610586578063a0d8b4e91461059b578063a9059cbb146105b0578063ac185644146105d4578063bb00c8f9146105e9578063d73dd623146105fe578063dd62ed3e14610622578063f162c5a114610649578063f2fde38b1461065e575b3480156101e357600080fd5b50005b3480156101f257600080fd5b506101fb61067f565b60408051918252519081900360200190f35b34801561021957600080fd5b50610222610685565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102a357600080fd5b506102bb600160a060020a03600435166024356106bc565b604080519115158252519081900360200190f35b3480156102db57600080fd5b506102e4610722565b60408051600160a060020a039092168252519081900360200190f35b34801561030c57600080fd5b506101fb610731565b34801561032157600080fd5b5061032d600435610737565b005b34801561033b57600080fd5b506102bb600160a060020a036004358116906024351660443561074f565b34801561036557600080fd5b506102bb6108c8565b34801561037a57600080fd5b5061032d600160a060020a0360043516602435610a10565b34801561039e57600080fd5b506103a7610a4d565b6040805160ff9092168252519081900360200190f35b3480156103c957600080fd5b506103de600160a060020a0360043516610a52565b6040805192835260208301919091528051918290030190f35b34801561040357600080fd5b506101fb610a6b565b34801561041857600080fd5b506101fb610a71565b34801561042d57600080fd5b5061032d600160a060020a0360043516610a77565b34801561044e57600080fd5b5061032d610abd565b34801561046357600080fd5b506101fb610b38565b34801561047857600080fd5b5061032d610b3e565b34801561048d57600080fd5b506101fb610b6d565b3480156104a257600080fd5b506102bb600160a060020a0360043516602435610b73565b3480156104c657600080fd5b506101fb600435610c65565b3480156104de57600080fd5b5061032d610c94565b3480156104f357600080fd5b506101fb610d33565b34801561050857600080fd5b506101fb600160a060020a0360043516610d39565b34801561052957600080fd5b506101fb610d54565b34801561053e57600080fd5b506101fb610d67565b34801561055357600080fd5b506101fb610d6d565b34801561056857600080fd5b506102e4610d73565b34801561057d57600080fd5b506101fb610d82565b34801561059257600080fd5b5061032d610d88565b3480156105a757600080fd5b506101fb610dd0565b3480156105bc57600080fd5b506102bb600160a060020a0360043516602435610dd6565b3480156105e057600080fd5b506101fb610eb9565b3480156105f557600080fd5b506101fb610ebf565b34801561060a57600080fd5b506102bb600160a060020a0360043516602435610ec5565b34801561062e57600080fd5b506101fb600160a060020a0360043581169060243516610f5e565b34801561065557600080fd5b506101fb610f89565b34801561066a57600080fd5b5061032d600160a060020a0360043516610f8f565b60085481565b60408051808201909152600581527f5343414c45000000000000000000000000000000000000000000000000000000602082015281565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b600454600160a060020a031681565b60005481565b6107413382611024565b151561074c57600080fd5b50565b6000600160a060020a038316151561076657600080fd5b600160a060020a03841660009081526001602052604090205482111561078b57600080fd5b600160a060020a03841660009081526002602090815260408083203384529091529020548211156107bb57600080fd5b600160a060020a0384166000908152600160205260409020546107e4908363ffffffff61115216565b600160a060020a038086166000908152600160205260408082209390935590851681522054610819908363ffffffff61116416565b600160a060020a03808516600090815260016020908152604080832094909455918716815260028252828120338252909152205461085d908363ffffffff61115216565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35060019392505050565b33600090815260136020526040812054819081106108e557600080fd5b3360009081526013602052604090206001015460125460079161091f9161091390429063ffffffff61117a16565b9063ffffffff61115216565b101561092a57600080fd5b61093342611191565b33600090815260136020908152604080832054600190925290912054919250610962919063ffffffff61116416565b336000908152600160209081526040808320939093556013905220546010546109909163ffffffff61115216565b60105561099d3382611320565b503360008181526013602090815260409182902054825190815290810184905281517ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280929181900390910190a233600090815260136020526040812081815560010155610a086113fb565b600191505090565b600160a060020a03821660009081526013602052604090205415610a3357600080fd5b610a3d8282610dd6565b50610a488282611024565b505050565b601281565b6013602052600090815260409020805460019091015482565b600a5481565b600b5481565b600354600160a060020a03163314610a8e57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009081908190600160a060020a03163314610adb57600080fd5b600d544211610ae957600080fd5b600d54610afd90429063ffffffff61115216565b925060008311610b0957fe5b610b1583600654611428565b9150610b213383611320565b9050801515610b2f57600080fd5b505042600d5550565b600e5481565b6301e13380610b586015544261115290919063ffffffff16565b1015610b6357600080fd5b610b6b61143a565b565b600f5481565b336000908152600260209081526040808320600160a060020a038616845290915281205480831115610bc857336000908152600260209081526040808320600160a060020a0388168452909152812055610bfd565b610bd8818463ffffffff61115216565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b336000908152601360205260408120541515610c8357506000610c8f565b610c8c82611191565b90505b919050565b60045460009081908190600160a060020a03161515610cb257600080fd5b600e544211610cc057600080fd5b600454600160a060020a03161515610cd757600080fd5b600e54610ceb90429063ffffffff61115216565b925060008311610cf757fe5b610d0383600554611428565b600454909250610d1c90600160a060020a031683611320565b9050801515610d2a57600080fd5b505042600e5550565b60155481565b600160a060020a031660009081526001602052604090205490565b3360009081526013602052604090205490565b60075481565b600c5481565b600354600160a060020a031681565b60055481565b600354600160a060020a03163314610d9f57600080fd5b600354604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501515610b6b57fe5b60065481565b6000600160a060020a0383161515610ded57600080fd5b33600090815260016020526040902054821115610e0957600080fd5b33600090815260016020526040902054610e29908363ffffffff61115216565b3360009081526001602052604080822092909255600160a060020a03851681522054610e5b908363ffffffff61116416565b600160a060020a0384166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600d5481565b60095481565b336000908152600260209081526040808320600160a060020a0386168452909152812054610ef9908363ffffffff61116416565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60105481565b600354600160a060020a03163314610fa657600080fd5b600160a060020a0381161515610fbb57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03821660009081526001602052604081205482111561104957600080fd5b600160a060020a0383166000908152601360205260409020541561106c57600080fd5b600160a060020a038316600090815260016020526040902054611095908363ffffffff61115216565b600160a060020a03841660009081526001602090815260408083209390935560139052208290556010546110cf908363ffffffff61116416565b6010556012546110e690429063ffffffff61117a16565b600160a060020a03841660009081526013602052604090206001015561110a6113fb565b604080518381529051600160a060020a038516917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b60008282111561115e57fe5b50900390565b60008282018381101561117357fe5b9392505050565b600080828481151561118857fe5b04949350505050565b6000806000806000806000806000806111b56012548c61117a90919063ffffffff16565b3360009081526013602052604090206001015490995097506111dd898963ffffffff61115216565b965060009550600094508792505b88831015611289576000838152601160205260409020541561125b573360009081526013602090815260408083205486845260119092529091205461124291611235916012611581565b879063ffffffff61116416565b600084815260116020526040902054909650935061127e565b3360009081526013602052604090205461127b9061123590866012611581565b95505b6001909201916111eb565b61129586886000611581565b600f549092506112ab908363ffffffff6115c416565b90506112c581670de0b6b3a764000063ffffffff61117a16565b905061016d87106112f6576012546112ef906112e99061016d63ffffffff6115c416565b82611428565b9450611311565b61130e6112e9601254896115c490919063ffffffff16565b94505b50929998505050505050505050565b60008054611334908363ffffffff61116416565b6000908155600160a060020a03841681526001602052604090205461135f908363ffffffff61116416565b600160a060020a038416600081815260016020908152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600192915050565b60006114126012544261117a90919063ffffffff16565b6010546000918252601160205260409091205550565b6000611173838363ffffffff6115c416565b42601555601454606410156114665760145461145e9061012c63ffffffff61115216565b601455611489565b600a60145411156114895760145461148590600563ffffffff61115216565b6014555b6114c960646114b1600a546114bd6103e86114b16014546000546115c490919063ffffffff16565b9063ffffffff61117a16565b9063ffffffff6115c416565b6007819055506114f760646114b1600b546114bd6103e86114b16014546000546115c490919063ffffffff16565b60098190555061152560646114b1600c546114bd6103e86114b16014546000546115c490919063ffffffff16565b600855600754611542906a1a1601fc4ea7109e0000006012611581565b60055560095461155f906a1a1601fc4ea7109e0000006012611581565b60065560085461157c906a1a1601fc4ea7109e0000006012611581565b600f55565b60008061159a8560018501600a0a63ffffffff6115c416565b9450600a6115ae868663ffffffff61117a16565b6005018115156115ba57fe5b0495945050505050565b6000808315156115d75760009150610c5e565b508282028284828115156115e757fe5b041461117357fe00a165627a7a7230582063ca74021b19bc63ba944ea970b189efacfa43fc38bcd4f517f4ea998858b6b30029

Swarm Source

bzzr://63ca74021b19bc63ba944ea970b189efacfa43fc38bcd4f517f4ea998858b6b3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.