ETH Price: $3,613.81 (+0.98%)

Token

Bitcoineum (BTE)
 

Overview

Max Total Supply

848,788.16943 BTE

Holders

706 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
33.40578644 BTE

Value
$0.00
0x6f4a1ab8d63e08d0c09ce4b2851f02a1768235da
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:
Bitcoineum

Compiler Version
v0.4.13+commit.fb4cb1a

Optimization Enabled:
Yes with 0 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-08-02
*/

pragma solidity ^0.4.13;

library SafeMath {
  function mul(uint256 a, uint256 b) internal returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal 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 returns (uint256) {
    assert(b <= a);
    return a - b;
  }

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

contract ReentrancyGuard {

  /**
   * @dev We use a single lock for the whole contract. 
   */
  bool private rentrancy_lock = false;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * @notice If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one nonReentrant function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and a `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    require(!rentrancy_lock);
    rentrancy_lock = true;
    _;
    rentrancy_lock = false;
  }

}


contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) constant returns (uint256);
  function transfer(address to, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);
}


contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) constant returns (uint256);
  function transferFrom(address from, address to, uint256 value);
  function approve(address spender, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

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) {
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
  }

  /**
  * @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) constant returns (uint256 balance) {
    return balances[_owner];
  }

}


contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) 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 amout of tokens to be transfered
   */
  function transferFrom(address _from, address _to, uint256 _value) {
    var _allowance = allowed[_from][msg.sender];

    // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
    // if (_value > _allowance) throw;

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

  /**
   * @dev Aprove the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    if (_value != 0) require(allowed[msg.sender][_spender] == 0);

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
  }

  /**
   * @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 specifing the amount of tokens still avaible for the spender.
   */
  function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
    return allowed[_owner][_spender];
  }

}

contract Transmutable {
  function transmute(address to, uint256 value) returns (bool, uint256);
  event Transmuted(address indexed who, address baseContract, address transmutedContract, uint256 sourceQuantity, uint256 destQuantity);
}

// Contracts that can be transmuted to should implement this
contract TransmutableInterface {
  function transmuted(uint256 _value) returns (bool, uint256);
}



contract ERC20Mineable is StandardToken, ReentrancyGuard  {

   uint256 public constant divisible_units = 10000000;
   uint256 public constant decimals = 8;

   uint256 public constant initial_reward = 100;

   /** totalSupply in StandardToken refers to currently available supply
   * maximumSupply refers to the cap on mining.
   * When mining is finished totalSupply == maximumSupply
   */
   uint256 public maximumSupply;

   // Current mining difficulty in Wei
   uint256 public currentDifficultyWei;

   // Minimum difficulty
   uint256 public minimumDifficultyThresholdWei;

   /** Block creation rate as number of Ethereum blocks per mining cycle
   * 10 minutes at 12 seconds a block would be an internal block
   * generated every 50 Ethereum blocks
   */
   uint256 public blockCreationRate;

   /* difficultyAdjustmentPeriod should be every two weeks, or
   * 2016 internal blocks.
   */
   uint256 public difficultyAdjustmentPeriod;

   /* When was the last time we did a difficulty adjustment.
   * In case mining ceases for indeterminate duration
   */
   uint256 public lastDifficultyAdjustmentEthereumBlock;

   // Scale multiplier limit for difficulty adjustment
   uint256 public constant difficultyScaleMultiplierLimit = 4;

   // Total blocks mined helps us calculate the current reward
   uint256 public totalBlocksMined;

   // Reward adjustment period in Bitcoineum native blocks

   uint256 public rewardAdjustmentPeriod; 

   // Total amount of Wei put into mining during current period
   uint256 public totalWeiCommitted;
   // Total amount of Wei expected for this mining period
   uint256 public totalWeiExpected;

   // Where to burn Ether
   address public burnAddress;

   /** Each block is created on a mining attempt if
   * it does not already exist.
   * this keeps track of the target difficulty at the time of creation
   */

   struct InternalBlock {
      uint256 targetDifficultyWei;
      uint256 blockNumber;
      uint256 totalMiningWei;
      uint256 totalMiningAttempts;
      uint256 currentAttemptOffset;
      bool payed;
      address payee;
      bool isCreated;
   }

   /** Mining attempts are given a projected offset to minimize
   * keyspace overlap to increase fairness by reducing the redemption
   * race condition
   * This does not remove the possibility that two or more miners will
   * be competing for the same award, especially if subsequent increases in
   * wei from a single miner increase overlap
   */
   struct MiningAttempt {
      uint256 projectedOffset;
      uint256 value;
      bool isCreated;
   }

   // Each guess gets assigned to a block
   mapping (uint256 => InternalBlock) public blockData;
   mapping (uint256 => mapping (address => MiningAttempt)) public miningAttempts;

   // Utility related

   function resolve_block_hash(uint256 _blockNum) public constant returns (bytes32) {
       return block.blockhash(_blockNum);
   }

   function current_external_block() public constant returns (uint256) {
       return block.number;
   }

   function external_to_internal_block_number(uint256 _externalBlockNum) public constant returns (uint256) {
      // blockCreationRate is > 0
      return _externalBlockNum / blockCreationRate;
   }

   // For the test harness verification
   function get_internal_block_number() public constant returns (uint256) {
     return external_to_internal_block_number(current_external_block());
   }

   // Initial state related
   /** Dapps need to grab the initial state of the contract
   * in order to properly initialize mining or tracking
   * this is a single atomic function for getting state
   * rather than scattering it across multiple public calls
   * also returns the current blocks parameters
   * or default params if it hasn't been created yet
   * This is only called externally
   */

   function getContractState() external constant
     returns (uint256,  // currentDifficultyWei
              uint256,  // minimumDifficultyThresholdWei
              uint256,  // blockNumber
              uint256,  // blockCreationRate
              uint256,  // difficultyAdjustmentPeriod
              uint256,  // rewardAdjustmentPeriod
              uint256,  // lastDifficultyAdustmentEthereumBlock
              uint256,  // totalBlocksMined
              uint256,  // totalWeiCommitted
              uint256,  // totalWeiExpected
              uint256,  // b.targetDifficultyWei
              uint256,  // b.totalMiningWei
              uint256  // b.currentAttemptOffset
              ) {
    InternalBlock memory b;
    uint256 _blockNumber = external_to_internal_block_number(current_external_block());
    if (!blockData[_blockNumber].isCreated) {
        b = InternalBlock(
                       {targetDifficultyWei: currentDifficultyWei,
                       blockNumber: _blockNumber,
                       totalMiningWei: 0,
                       totalMiningAttempts: 0,
                       currentAttemptOffset: 0,
                       payed: false,
                       payee: 0,
                       isCreated: true
                       });
    } else {
         b = blockData[_blockNumber];
    }
    return (currentDifficultyWei,
            minimumDifficultyThresholdWei,
            _blockNumber,
            blockCreationRate,
            difficultyAdjustmentPeriod,
            rewardAdjustmentPeriod,
            lastDifficultyAdjustmentEthereumBlock,
            totalBlocksMined,
            totalWeiCommitted,
            totalWeiExpected,
            b.targetDifficultyWei,
            b.totalMiningWei,
            b.currentAttemptOffset);
   }

   function getBlockData(uint256 _blockNum) public constant returns (uint256, uint256, uint256, uint256, uint256, bool, address, bool) {
    InternalBlock memory iBlock = blockData[_blockNum];
    return (iBlock.targetDifficultyWei,
    iBlock.blockNumber,
    iBlock.totalMiningWei,
    iBlock.totalMiningAttempts,
    iBlock.currentAttemptOffset,
    iBlock.payed,
    iBlock.payee,
    iBlock.isCreated);
   }

   function getMiningAttempt(uint256 _blockNum, address _who) public constant returns (uint256, uint256, bool) {
     if (miningAttempts[_blockNum][_who].isCreated) {
        return (miningAttempts[_blockNum][_who].projectedOffset,
        miningAttempts[_blockNum][_who].value,
        miningAttempts[_blockNum][_who].isCreated);
     } else {
        return (0, 0, false);
     }
   }

   // Mining Related

   modifier blockCreated(uint256 _blockNum) {
     require(blockData[_blockNum].isCreated);
     _;
   }

   modifier blockRedeemed(uint256 _blockNum) {
     require(_blockNum != current_external_block());
     /* Should capture if the blockdata is payed
     *  or if it does not exist in the blockData mapping
     */
     require(blockData[_blockNum].isCreated);
     require(!blockData[_blockNum].payed);
     _;
   }

   modifier initBlock(uint256 _blockNum) {
     require(_blockNum != current_external_block());

     if (!blockData[_blockNum].isCreated) {
       // This is a new block, adjust difficulty
       adjust_difficulty();

       // Create new block for tracking
       blockData[_blockNum] = InternalBlock(
                                     {targetDifficultyWei: currentDifficultyWei,
                                      blockNumber: _blockNum,
                                      totalMiningWei: 0,
                                      totalMiningAttempts: 0,
                                      currentAttemptOffset: 0,
                                      payed: false,
                                      payee: 0,
                                      isCreated: true
                                      });
     }
     _;
   }

   modifier isValidAttempt() {
     /* If the Ether for this mining attempt is less than minimum
     * 0.0000001 % of total difficulty
     */
     uint256 minimum_wei = currentDifficultyWei / divisible_units; 
     require (msg.value >= minimum_wei);

     /* Let's bound the value to guard against potential overflow
     * i.e max int, or an underflow bug
     * This is a single attempt
     */
     require(msg.value <= (1000000 ether));
     _;
   }

   modifier alreadyMined(uint256 blockNumber, address sender) {
     require(blockNumber != current_external_block()); 
    /* We are only going to allow one mining attempt per block per account
    *  This prevents stuffing and make it easier for us to track boundaries
    */
    
    // This user already made a mining attempt for this block
    require(!checkMiningAttempt(blockNumber, sender));
    _;
   }

   function checkMiningActive() public constant returns (bool) {
      return (totalSupply < maximumSupply);
   }

   modifier isMiningActive() {
      require(checkMiningActive());
      _;
   }

   function burn(uint256 value) internal {
      /* We don't really care if the burn fails for some
      *  weird reason.
      */
      bool ret = burnAddress.send(value);
      /* If we cannot burn this ether, than the contract might
      *  be under some kind of stack attack.
      *  Even though it shouldn't matter, let's err on the side of
      *  caution and throw in case there is some invalid state.
      */
      require (ret);
   }

   event MiningAttemptEvent(
       address indexed _from,
       uint256 _value,
       uint256 indexed _blockNumber,
       uint256 _totalMinedWei,
       uint256 _targetDifficultyWei
   );

   event LogEvent(
       string _info
   );

   /**
   * @dev Add a mining attempt for the current internal block
   * Initialize an empty block if not created
   * Invalidate this mining attempt if the block has been paid out
   */

   function mine() external payable 
                           nonReentrant
                           isValidAttempt
                           isMiningActive
                           initBlock(external_to_internal_block_number(current_external_block()))
                           blockRedeemed(external_to_internal_block_number(current_external_block()))
                           alreadyMined(external_to_internal_block_number(current_external_block()), msg.sender) returns (bool) {
      /* Let's immediately adjust the difficulty
      *  In case an abnormal period of time has elapsed
      *  nobody has been mining etc.
      *  Will let us recover the network even if the
      * difficulty spikes to some absurd amount
      * this should only happen on the first attempt on a block
      */
      uint256 internalBlockNum = external_to_internal_block_number(current_external_block());
      miningAttempts[internalBlockNum][msg.sender] =
                     MiningAttempt({projectedOffset: blockData[internalBlockNum].currentAttemptOffset,
                                    value: msg.value,
                                    isCreated: true});

      // Increment the mining attempts for this block
      blockData[internalBlockNum].totalMiningAttempts += 1;
      blockData[internalBlockNum].totalMiningWei += msg.value;
      totalWeiCommitted += msg.value;

      /* We are trying to stack mining attempts into their relative
      *  positions in the key space.
      */
      blockData[internalBlockNum].currentAttemptOffset += msg.value;
      MiningAttemptEvent(msg.sender,
                         msg.value,
                         internalBlockNum,
                         blockData[internalBlockNum].totalMiningWei,
                         blockData[internalBlockNum].targetDifficultyWei
                         );
      // All mining attempt Ether is burned
      burn(msg.value);
      return true;
   }

   // Redemption Related

   modifier userMineAttempted(uint256 _blockNum, address _user) {
      require(checkMiningAttempt(_blockNum, _user));
      _;
   }
   
   modifier isBlockMature(uint256 _blockNumber) {
      require(_blockNumber != current_external_block());
      require(checkBlockMature(_blockNumber, current_external_block()));
      require(checkRedemptionWindow(_blockNumber, current_external_block()));
      _;
   }

   // Just in case this block falls outside of the available
   // block range, possibly because of a change in network params
   modifier isBlockReadable(uint256 _blockNumber) {
      InternalBlock memory iBlock = blockData[_blockNumber];
      uint256 targetBlockNum = targetBlockNumber(_blockNumber);
      require(resolve_block_hash(targetBlockNum) != 0);
      _;
   }

   function calculate_difficulty_attempt(uint256 targetDifficultyWei,
                                         uint256 totalMiningWei,
                                         uint256 value) public constant returns (uint256) {
      // The total amount of Wei sent for this mining attempt exceeds the difficulty level
      // So the calculation of percentage keyspace should be done on the total wei.
      uint256 selectedDifficultyWei = 0;
      if (totalMiningWei > targetDifficultyWei) {
         selectedDifficultyWei = totalMiningWei;
      } else {
         selectedDifficultyWei = targetDifficultyWei; 
      }

      /* normalize the value against the entire key space
       * Multiply it out because we do not have floating point
       * 10000000 is .0000001 % increments
      */

      uint256 intermediate = ((value * divisible_units) / selectedDifficultyWei);
      uint256 max_int = 0;
      // Underflow to maxint
      max_int = max_int - 1;

      if (intermediate >= divisible_units) {
         return max_int;
      } else {
         return intermediate * (max_int / divisible_units);
      }
   }

   function calculate_range_attempt(uint256 difficulty, uint256 offset) public constant returns (uint256, uint256) {
       /* Both the difficulty and offset should be normalized
       * against the difficulty scale.
       * If they are not we might have an integer overflow
       */
       require(offset + difficulty >= offset);
       return (offset, offset+difficulty);
   }

   // Total allocated reward is proportional to burn contribution to limit incentive for
   // hash grinding attacks
   function calculate_proportional_reward(uint256 _baseReward, uint256 _userContributionWei, uint256 _totalCommittedWei) public constant returns (uint256) {
   require(_userContributionWei <= _totalCommittedWei);
   require(_userContributionWei > 0);
   require(_totalCommittedWei > 0);
      uint256 intermediate = ((_userContributionWei * divisible_units) / _totalCommittedWei);

      if (intermediate >= divisible_units) {
         return _baseReward;
      } else {
         return intermediate * (_baseReward / divisible_units);
      }
   }

   function calculate_base_mining_reward(uint256 _totalBlocksMined) public constant returns (uint256) {
      /* Block rewards starts at initial_reward
      *  Every 10 minutes
      *  Block reward decreases by 50% every 210000 blocks
      */
      uint256 mined_block_period = 0;
      if (_totalBlocksMined < 210000) {
           mined_block_period = 210000;
      } else {
           mined_block_period = _totalBlocksMined;
      }

      // Again we have to do this iteratively because of floating
      // point limitations in solidity.
      uint256 total_reward = initial_reward * (10 ** decimals); 
      uint256 i = 1;
      uint256 rewardperiods = mined_block_period / 210000;
      if (mined_block_period % 210000 > 0) {
         rewardperiods += 1;
      }
      for (i=1; i < rewardperiods; i++) {
          total_reward = total_reward / 2;
      }
      return total_reward;
   }

   // Break out the expected wei calculation
   // for easy external testing
   function calculate_next_expected_wei(uint256 _totalWeiCommitted,
                                        uint256 _totalWeiExpected,
                                        uint256 _minimumDifficultyThresholdWei,
                                        uint256 _difficultyScaleMultiplierLimit) public constant
                                        returns (uint256) {
          
          /* The adjustment window has been fulfilled
          *  The new difficulty should be bounded by the total wei actually spent
          * capped at difficultyScaleMultiplierLimit times
          */
          uint256 lowerBound = _totalWeiExpected / _difficultyScaleMultiplierLimit;
          uint256 upperBound = _totalWeiExpected * _difficultyScaleMultiplierLimit;

          if (_totalWeiCommitted < lowerBound) {
              _totalWeiExpected = lowerBound;
          } else if (_totalWeiCommitted > upperBound) {
              _totalWeiExpected = upperBound;
          } else {
              _totalWeiExpected = _totalWeiCommitted;
          }

          /* If difficulty drops too low lets set it to our minimum.
          *  This may halt coin creation, but obviously does not affect
          *  token transactions.
          */
          if (_totalWeiExpected < _minimumDifficultyThresholdWei) {
              _totalWeiExpected = _minimumDifficultyThresholdWei;
          }

          return _totalWeiExpected;
    }

   function adjust_difficulty() internal {
      /* Total blocks mined might not be increasing if the 
      *  difficulty is too high. So we should instead base the adjustment
      * on the progression of the Ethereum network.
      * So that the difficulty can increase/deflate regardless of sparse
      * mining attempts
      */

      if ((current_external_block() - lastDifficultyAdjustmentEthereumBlock) > (difficultyAdjustmentPeriod * blockCreationRate)) {

          // Get the new total wei expected via static function
          totalWeiExpected = calculate_next_expected_wei(totalWeiCommitted, totalWeiExpected, minimumDifficultyThresholdWei * difficultyAdjustmentPeriod, difficultyScaleMultiplierLimit);

          currentDifficultyWei = totalWeiExpected / difficultyAdjustmentPeriod;

          // Regardless of difficulty adjustment, let us zero totalWeiCommited
          totalWeiCommitted = 0;

          // Lets reset the difficulty adjustment block target
          lastDifficultyAdjustmentEthereumBlock = current_external_block();

      }
   }

   event BlockClaimedEvent(
       address indexed _from,
       address indexed _forCreditTo,
       uint256 _reward,
       uint256 indexed _blockNumber
   );

   modifier onlyWinner(uint256 _blockNumber) {
      require(checkWinning(_blockNumber));
      _;
   }


   // Helper function to avoid stack issues
   function calculate_reward(uint256 _totalBlocksMined, address _sender, uint256 _blockNumber) public constant returns (uint256) {
      return calculate_proportional_reward(calculate_base_mining_reward(_totalBlocksMined), miningAttempts[_blockNumber][_sender].value, blockData[_blockNumber].totalMiningWei); 
   }

   /** 
   * @dev Claim the mining reward for a given block
   * @param _blockNumber The internal block that the user is trying to claim
   * @param forCreditTo When the miner account is different from the account
   * where we want to deliver the redeemed Bitcoineum. I.e Hard wallet.
   */
   function claim(uint256 _blockNumber, address forCreditTo)
                  nonReentrant
                  blockRedeemed(_blockNumber)
                  isBlockMature(_blockNumber)
                  isBlockReadable(_blockNumber)
                  userMineAttempted(_blockNumber, msg.sender)
                  onlyWinner(_blockNumber)
                  external returns (bool) {
      /* If attempt is valid, invalidate redemption
      *  Difficulty is adjusted here
      *  and on bidding, in case bidding stalls out for some
      *  unusual period of time.
      *  Do everything, then adjust supply and balance
      */
      blockData[_blockNumber].payed = true;
      blockData[_blockNumber].payee = msg.sender;
      totalBlocksMined = totalBlocksMined + 1;

      uint256 proportional_reward = calculate_reward(totalBlocksMined, msg.sender, _blockNumber);
      balances[forCreditTo] = balances[forCreditTo].add(proportional_reward);
      totalSupply += proportional_reward;
      BlockClaimedEvent(msg.sender, forCreditTo,
                        proportional_reward,
                        _blockNumber);
      // Mining rewards should show up as ERC20 transfer events
      // So that ERC20 scanners will see token creation.
      Transfer(this, forCreditTo, proportional_reward);
      return true;
   }

   /** 
   * @dev Claim the mining reward for a given block
   * @param _blockNum The internal block that the user is trying to claim
   */
   function isBlockRedeemed(uint256 _blockNum) constant public returns (bool) {
     if (!blockData[_blockNum].isCreated) {
         return false;
     } else {
         return blockData[_blockNum].payed;
     }
   }

   /** 
   * @dev Get the target block in the winning equation 
   * @param _blockNum is the internal block number to get the target block for
   */
   function targetBlockNumber(uint256 _blockNum) constant public returns (uint256) {
      return ((_blockNum + 1) * blockCreationRate);
   }

   /** 
   * @dev Check whether a given block is mature 
   * @param _blockNum is the internal block number to check 
   */
   function checkBlockMature(uint256 _blockNum, uint256 _externalblock) constant public returns (bool) {
     return (_externalblock >= targetBlockNumber(_blockNum));
   }

   /**
   * @dev Check the redemption window for a given block
   * @param _blockNum is the internal block number to check
   */

   function checkRedemptionWindow(uint256 _blockNum, uint256 _externalblock) constant public returns (bool) {
       uint256 _targetblock = targetBlockNumber(_blockNum);
       return _externalblock >= _targetblock && _externalblock < (_targetblock + 256);
   }

   /** 
   * @dev Check whether a mining attempt was made by sender for this block
   * @param _blockNum is the internal block number to check
   */
   function checkMiningAttempt(uint256 _blockNum, address _sender) constant public returns (bool) {
       return miningAttempts[_blockNum][_sender].isCreated;
   }

   /** 
   * @dev Did the user win a specific block and can claim it?
   * @param _blockNum is the internal block number to check
   */
   function checkWinning(uint256 _blockNum) constant public returns (bool) {
     if (checkMiningAttempt(_blockNum, msg.sender) && checkBlockMature(_blockNum, current_external_block())) {

      InternalBlock memory iBlock = blockData[_blockNum];
      uint256 targetBlockNum = targetBlockNumber(iBlock.blockNumber);
      MiningAttempt memory attempt = miningAttempts[_blockNum][msg.sender];

      uint256 difficultyAttempt = calculate_difficulty_attempt(iBlock.targetDifficultyWei, iBlock.totalMiningWei, attempt.value);
      uint256 beginRange;
      uint256 endRange;
      uint256 targetBlockHashInt;

      (beginRange, endRange) = calculate_range_attempt(difficultyAttempt,
          calculate_difficulty_attempt(iBlock.targetDifficultyWei, iBlock.totalMiningWei, attempt.projectedOffset)); 
      targetBlockHashInt = uint256(keccak256(resolve_block_hash(targetBlockNum)));
   
      // This is the winning condition
      if ((beginRange < targetBlockHashInt) && (endRange >= targetBlockHashInt))
      {
        return true;
      }
     
     }

     return false;
     
   }

}



contract Bitcoineum is ERC20Mineable, Transmutable {

 string public constant name = "Bitcoineum";
 string public constant symbol = "BTE";
 uint256 public constant decimals = 8;
 uint256 public constant INITIAL_SUPPLY = 0;

 // 21 Million coins at 8 decimal places
 uint256 public constant MAX_SUPPLY = 21000000 * (10**8);
 
 function Bitcoineum() {

    totalSupply = INITIAL_SUPPLY;
    maximumSupply = MAX_SUPPLY;

    // 0.0001 Ether per block
    // Difficulty is so low because it doesn't include
    // gas prices for execution
    currentDifficultyWei = 100 szabo;
    minimumDifficultyThresholdWei = 100 szabo;
    
    // Ethereum blocks to internal blocks
    // Roughly 10 minute windows
    blockCreationRate = 50;

    // Adjust difficulty x claimed internal blocks
    difficultyAdjustmentPeriod = 2016;

    // Reward adjustment

    rewardAdjustmentPeriod = 210000;

    // This is the effective block counter, since block windows are discontinuous
    totalBlocksMined = 0;

    totalWeiExpected = difficultyAdjustmentPeriod * currentDifficultyWei;

    // Balance of this address can be used to determine total burned value
    // not including fees spent.
    burnAddress = 0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD;

    lastDifficultyAdjustmentEthereumBlock = block.number; 
 }


   /**
   * @dev Bitcoineum can extend proof of burn into convertable units
   * that have token specific properties
   * @param to is the address of the contract that Bitcoineum is converting into
   * @param value is the quantity of Bitcoineum to attempt to convert
   */

  function transmute(address to, uint256 value) nonReentrant returns (bool, uint256) {
    require(value > 0);
    require(balances[msg.sender] >= value);
    require(totalSupply >= value);
    balances[msg.sender] = balances[msg.sender].sub(value);
    totalSupply = totalSupply.sub(value);
    TransmutableInterface target = TransmutableInterface(to);
    bool _result = false;
    uint256 _total = 0;
    (_result, _total) = target.transmuted(value);
    require (_result);
    Transmuted(msg.sender, this, to, value, _total);
    return (_result, _total);
  }

 }

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"current_external_block","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maximumSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalWeiCommitted","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_totalBlocksMined","type":"uint256"}],"name":"calculate_base_mining_reward","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"}],"name":"getBlockData","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"},{"name":"","type":"address"},{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"lastDifficultyAdjustmentEthereumBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumDifficultyThresholdWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_totalWeiCommitted","type":"uint256"},{"name":"_totalWeiExpected","type":"uint256"},{"name":"_minimumDifficultyThresholdWei","type":"uint256"},{"name":"_difficultyScaleMultiplierLimit","type":"uint256"}],"name":"calculate_next_expected_wei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"},{"name":"_externalblock","type":"uint256"}],"name":"checkBlockMature","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"}],"name":"targetBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalBlocksMined","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"difficulty","type":"uint256"},{"name":"offset","type":"uint256"}],"name":"calculate_range_attempt","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"divisible_units","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"checkMiningActive","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"}],"name":"resolve_block_hash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_totalBlocksMined","type":"uint256"},{"name":"_sender","type":"address"},{"name":"_blockNumber","type":"uint256"}],"name":"calculate_reward","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"burnAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"blockData","outputs":[{"name":"targetDifficultyWei","type":"uint256"},{"name":"blockNumber","type":"uint256"},{"name":"totalMiningWei","type":"uint256"},{"name":"totalMiningAttempts","type":"uint256"},{"name":"currentAttemptOffset","type":"uint256"},{"name":"payed","type":"bool"},{"name":"payee","type":"address"},{"name":"isCreated","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getContractState","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"initial_reward","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"},{"name":"_sender","type":"address"}],"name":"checkMiningAttempt","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"targetDifficultyWei","type":"uint256"},{"name":"totalMiningWei","type":"uint256"},{"name":"value","type":"uint256"}],"name":"calculate_difficulty_attempt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"mine","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"},{"name":"_who","type":"address"}],"name":"getMiningAttempt","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"address"}],"name":"miningAttempts","outputs":[{"name":"projectedOffset","type":"uint256"},{"name":"value","type":"uint256"},{"name":"isCreated","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"difficultyScaleMultiplierLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"blockCreationRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"currentDifficultyWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_baseReward","type":"uint256"},{"name":"_userContributionWei","type":"uint256"},{"name":"_totalCommittedWei","type":"uint256"}],"name":"calculate_proportional_reward","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"},{"name":"_externalblock","type":"uint256"}],"name":"checkRedemptionWindow","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalWeiExpected","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get_internal_block_number","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"}],"name":"checkWinning","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_blockNumber","type":"uint256"},{"name":"forCreditTo","type":"address"}],"name":"claim","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"difficultyAdjustmentPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transmute","outputs":[{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNum","type":"uint256"}],"name":"isBlockRedeemed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_externalBlockNum","type":"uint256"}],"name":"external_to_internal_block_number","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"rewardAdjustmentPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"},{"indexed":false,"name":"baseContract","type":"address"},{"indexed":false,"name":"transmutedContract","type":"address"},{"indexed":false,"name":"sourceQuantity","type":"uint256"},{"indexed":false,"name":"destQuantity","type":"uint256"}],"name":"Transmuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"},{"indexed":true,"name":"_blockNumber","type":"uint256"},{"indexed":false,"name":"_totalMinedWei","type":"uint256"},{"indexed":false,"name":"_targetDifficultyWei","type":"uint256"}],"name":"MiningAttemptEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_info","type":"string"}],"name":"LogEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_forCreditTo","type":"address"},{"indexed":false,"name":"_reward","type":"uint256"},{"indexed":true,"name":"_blockNumber","type":"uint256"}],"name":"BlockClaimedEvent","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"}]

60606040526003805460ff19169055341561001957600080fd5b5b6000808055660775f05a074000600455655af3107a4000600581905560065560326007556107e060085562033450600b55600a556702cc3a21c2b80000600d55600e8054600160a060020a03191673deaddeaddeaddeaddeaddeaddeaddeaddeaddead179055436009555b5b61211f806100956000396000f300606060405236156102405763ffffffff60e060020a600035041663014c3dbc81146102455780630480e58b1461026a57806306fdde031461028f578063095ea7b31461031a5780630f59a6381461033e57806312a00b211461036357806318160ddd1461038b5780631c9ab3ad146103b05780631f6a1bf71461041857806322b2f1781461043d57806323b872dd146104625780632b000f001461048c5780632ff2e9dc146104bd578063313ce567146104e257806332cb6b0c14610507578063333cfa141461052c57806334805e7c1461055957806350c8dbd214610581578063555aaff6146105a65780635f623e15146105d7578063608d031a146105fc5780636eadeba0146106235780636f4ebb701461064b57806370a082311461068257806370d5ae05146106b35780637e21c28b146106e25780637f4e48491461074a578063808cf58e146107c857806388537daf146107ed57806390c469851461082357806395d89b411461085157806399f4b251146108dc5780639a2457c1146108f85780639d8abff314610940578063a6ad57e614610988578063a9059cbb146109ad578063aee1d4d3146109d1578063b0c2a163146109f6578063baa3fc4814610a1b578063c3de7cbf14610a49578063c52e40d014610a76578063c539607c14610a9b578063dd62ed3e14610ac0578063dda6c3ce14610af7578063ddd5e1b214610b21578063f01551f614610b57578063f52ae24b14610b7c578063fa90693b14610bb8578063fab425e714610be2578063ff62d2cf14610c0a575b600080fd5b341561025057600080fd5b610258610c2f565b60405190815260200160405180910390f35b341561027557600080fd5b610258610c34565b60405190815260200160405180910390f35b341561029a57600080fd5b6102a2610c3a565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102df5780820151818401525b6020016102c6565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561032557600080fd5b61033c600160a060020a0360043516602435610c61565b005b341561034957600080fd5b610258610cfd565b60405190815260200160405180910390f35b341561036e57600080fd5b610258600435610d03565b60405190815260200160405180910390f35b341561039657600080fd5b610258610d78565b60405190815260200160405180910390f35b34156103bb57600080fd5b6103c6600435610d7e565b604051978852602088019690965260408088019590955260608701939093526080860191909152151560a0850152600160a060020a031660c084015290151560e0830152610100909101905180910390f35b341561042357600080fd5b610258610e54565b60405190815260200160405180910390f35b341561044857600080fd5b610258610e5a565b60405190815260200160405180910390f35b341561046d57600080fd5b61033c600160a060020a0360043581169060243516604435610e60565b005b341561049757600080fd5b610258600435602435604435606435610f5a565b60405190815260200160405180910390f35b34156104c857600080fd5b610258610fb0565b60405190815260200160405180910390f35b34156104ed57600080fd5b610258610fb5565b60405190815260200160405180910390f35b341561051257600080fd5b610258610fba565b60405190815260200160405180910390f35b341561053757600080fd5b610545600435602435610fc5565b604051901515815260200160405180910390f35b341561056457600080fd5b610258600435610fdc565b60405190815260200160405180910390f35b341561058c57600080fd5b610258610fea565b60405190815260200160405180910390f35b34156105b157600080fd5b6105bf600435602435610ff0565b60405191825260208201526040908101905180910390f35b34156105e257600080fd5b610258611012565b60405190815260200160405180910390f35b341561060757600080fd5b610545611019565b604051901515815260200160405180910390f35b341561062e57600080fd5b610258600435611024565b60405190815260200160405180910390f35b341561065657600080fd5b610258600435600160a060020a036024351660443561102c565b60405190815260200160405180910390f35b341561068d57600080fd5b610258600160a060020a036004351661107e565b60405190815260200160405180910390f35b34156106be57600080fd5b6106c661109d565b604051600160a060020a03909116815260200160405180910390f35b34156106ed57600080fd5b6103c66004356110ac565b604051978852602088019690965260408088019590955260608701939093526080860191909152151560a0850152600160a060020a031660c084015290151560e0830152610100909101905180910390f35b341561075557600080fd5b61075d6110ff565b6040519c8d5260208d019b909b526040808d019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a0909101905180910390f35b34156107d357600080fd5b610258611274565b60405190815260200160405180910390f35b34156107f857600080fd5b610545600435600160a060020a0360243516611279565b604051901515815260200160405180910390f35b341561082e57600080fd5b6102586004356024356044356112a9565b60405190815260200160405180910390f35b341561085c57600080fd5b6102a2611303565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102df5780820151818401525b6020016102c6565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610545611323565b604051901515815260200160405180910390f35b341561090357600080fd5b61091a600435600160a060020a036024351661169c565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561094b57600080fd5b61091a600435600160a060020a036024351661171d565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561099357600080fd5b61025861174c565b60405190815260200160405180910390f35b34156109b857600080fd5b61033c600160a060020a0360043516602435611751565b005b34156109dc57600080fd5b6102586117fa565b60405190815260200160405180910390f35b3415610a0157600080fd5b610258611800565b60405190815260200160405180910390f35b3415610a2657600080fd5b610258600435602435604435611806565b60405190815260200160405180910390f35b3415610a5457600080fd5b61054560043560243561186a565b604051901515815260200160405180910390f35b3415610a8157600080fd5b610258611895565b60405190815260200160405180910390f35b3415610aa657600080fd5b61025861189b565b60405190815260200160405180910390f35b3415610acb57600080fd5b610258600160a060020a03600435811690602435166118b3565b60405190815260200160405180910390f35b3415610b0257600080fd5b6105456004356118e0565b604051901515815260200160405180910390f35b3415610b2c57600080fd5b610545600435600160a060020a0360243516611a87565b604051901515815260200160405180910390f35b3415610b6257600080fd5b610258611d5c565b60405190815260200160405180910390f35b3415610b8757600080fd5b610b9e600160a060020a0360043516602435611d62565b604051911515825260208201526040908101905180910390f35b3415610bc357600080fd5b610545600435611f2e565b604051901515815260200160405180910390f35b3415610bed57600080fd5b610258600435611f79565b60405190815260200160405180910390f35b3415610c1557600080fd5b610258611f91565b60405190815260200160405180910390f35b435b90565b60045481565b60408051908101604052600a815260b060020a69426974636f696e65756d02602082015281565b8015610c9757600160a060020a0333811660009081526002602090815260408083209386168352929052205415610c9757600080fd5b5b600160a060020a03338116600081815260026020908152604080832094871680845294909152908190208490557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35b5050565b600c5481565b60008080808062033450861015610d1f57620334509350610d23565b8593505b6402540be40092506001915062033450845b049050600062033450855b061115610d4b576001015b600191505b80821015610d6b576002835b0492505b600190910190610d50565b8294505b50505050919050565b60005481565b600080600080600080600080610d92612060565b60008a8152600f60205260409081902090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e08201529050805181602001518260400151836060015184608001518560a001518660c001518760e00151985098509850985098509850985098505b50919395975091939597565b60095481565b60065481565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152902054610ea4908363ffffffff611f9716565b600160a060020a038085166000908152600160205260408082209390935590861681522054610ed9908363ffffffff611fb116565b600160a060020a038516600090815260016020526040902055610f02818363ffffffff611fb116565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206120d48339815191529085905190815260200160405180910390a35b50505050565b60008060008386811515610f6a57fe5b0491505084830281871015610f8157819550610f95565b80871115610f9157809550610f95565b8695505b5b84861015610fa2578495505b8592505b5050949350505050565b600081565b600881565b660775f05a07400081565b6000610fd083610fdc565b82101590505b92915050565b60075460018201025b919050565b600a5481565b6000808383018390101561100357600080fd5b508190508281015b9250929050565b6298968081565b600454600054105b90565b80405b919050565b600061107461103a85610d03565b6000848152601060209081526040808320600160a060020a0389168452825280832060010154878452600f90925290912060020154611806565b90505b9392505050565b600160a060020a0381166000908152600160205260409020545b919050565b600e54600160a060020a031681565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff80821691600160a060020a036101008204169160a860020a9091041688565b600080600080600080600080600080600080600061111b612060565b600061112d611128610c2f565b611f79565b6000818152600f602052604090206005015490915060a860020a900460ff16151561119c5761010060405190810160409081526005548252602082018390526000908201819052606082018190526080820181905260a0820181905260c0820152600160e0820152915061121d565b6000818152600f60205260409081902090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e082015291505b60055460065482600754600854600b54600954600a54600c54600d548b600001518c604001518d608001519e509e509e509e509e509e509e509e509e509e509e509e509e505b5050909192939495969798999a9b9c565b606481565b6000828152601060209081526040808320600160a060020a038516845290915290206002015460ff165b92915050565b6000808080868611156112be578592506112c2565b8692505b826298968086028115156112d257fe5b04915060001990506298968082106112ec578093506112f8565b62989680815b04820293505b5b5050509392505050565b604080519081016040526003815260e860020a6242544502602082015281565b600354600090819060ff161561133857600080fd5b6003805460ff1916600117905560055460009062989680905b049050348190101561136257600080fd5b69d3c21bcecceda100000034111561137957600080fd5b611381611019565b151561138c57600080fd5b61139c611128610c2f565b611f79565b6113a4610c2f565b8114156113b057600080fd5b6000818152600f602052604090206005015460a860020a900460ff1615156114c3576113da611fc8565b6101006040519081016040908152600554825260208083018490526000828401819052606084018190526080840181905260a0840181905260c08401819052600160e0850152848152600f90915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015160058201805460ff191691151591909117905560c08201518160050160016101000a815481600160a060020a030219169083600160a060020a0316021790555060e08201516005909101805491151560a860020a0260a860020a60ff0219909216919091179055505b6114d3611128610c2f565b611f79565b6114db610c2f565b8114156114e757600080fd5b6000818152600f602052604090206005015460a860020a900460ff16151561150e57600080fd5b6000818152600f602052604090206005015460ff161561152d57600080fd5b61153d611128610c2f565b611f79565b33611546610c2f565b82141561155257600080fd5b61155c8282611279565b1561156657600080fd5b611576611128610c2f565b611f79565b9550606060405190810160409081526000888152600f6020908152828220600401548452348185015260018385015289825260108152828220600160a060020a0333168352905220815181556020820151816001015560408201516002918201805460ff19169115159190911790556000888152600f60205260409081902060038101805460010190559182018054349081018255600c80548201905560048401805482019055905492548a945033600160a060020a0316937f79974ce89535ebe44946f7f7d2814356530f301d744391e2da3cb544e8415bac939091905180848152602001838152602001828152602001935050505060405180910390a361167e34612022565b600196505b5b50505b505b505b5b506003805460ff191690555b5090565b6000828152601060209081526040808320600160a060020a03851684529091528120600201548190819060ff161561170b575050506000828152601060209081526040808320600160a060020a038516845290915290208054600182015460029092015490919060ff16611715565b5060009150819050805b5b9250925092565b601060209081526000928352604080842090915290825290208054600182015460029092015490919060ff1683565b600481565b600160a060020a03331660009081526001602052604090205461177a908263ffffffff611fb116565b600160a060020a0333811660009081526001602052604080822093909355908416815220546117af908263ffffffff611f9716565b600160a060020a0380841660008181526001602052604090819020939093559133909116906000805160206120d48339815191529084905190815260200160405180910390a35b5050565b60075481565b60055481565b6000808284111561181657600080fd5b6000841161182357600080fd5b6000831161183057600080fd5b8262989680850281151561184057fe5b04905062989680811061185557849150611861565b62989680855b04810291505b5b509392505050565b60008061187684610fdc565b905080831015801561188b5750806101000183105b91505b5092915050565b600d5481565b60006118ad611128610c2f565b611f79565b90505b90565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60006118ea612060565b60006118f46120b3565b6000806000806119048933611279565b801561191c575061191c89611917610c2f565b610fc5565b5b15611a75576000898152600f602052604090819020906101009051908101604090815282548252600183015460208301908152600284015491830191909152600383015460608301526004830154608083015260059092015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e082015297506119b19051610fdc565b60008a8152601060209081526040808320600160a060020a033316845290915290819020919750606090519081016040908152825482526001830154602083015260029092015460ff161515918101919091529450611a1a8751886040015187602001516112a9565b9350611a3684611a3189518a6040015189516112a9565b610ff0565b9093509150611a4486611024565b60405190815260200160405190819003902090508083108015611a675750808210155b15611a755760019750611a7b565b5b600097505b50505050505050919050565b600354600090819060ff1615611a9c57600080fd5b6003805460ff1916600117905583611ab2610c2f565b811415611abe57600080fd5b6000818152600f602052604090206005015460a860020a900460ff161515611ae557600080fd5b6000818152600f602052604090206005015460ff1615611b0457600080fd5b84611b0d610c2f565b811415611b1957600080fd5b611b2a81611917610c2f565b610fc5565b1515611b3557600080fd5b611b4681611b41610c2f565b61186a565b1515611b5157600080fd5b85611b5a612060565b6000828152600f602052604080822090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e08201529150611be283610fdc565b9050611bed81611024565b1515611bf857600080fd5b8833611c048282611279565b1515611c0f57600080fd5b8a611c19816118e0565b1515611c2457600080fd5b60008c8152600f602052604090206005018054600160a060020a03339081166101000261010060a860020a031960ff1990931660019081179390931617909255600a805490910190819055611c79918e61102c565b600160a060020a038c16600090815260016020526040902054909950611ca5908a63ffffffff611f9716565b600160a060020a03808d166000818152600160205260408082209490945580548d0190558e9290913316907f02d996374be8c81683a2ac4abd51bbf94eaa161436677d4195541f2ef4cb63b8908d905190815260200160405180910390a48a600160a060020a031630600160a060020a03166000805160206120d48339815191528b60405190815260200160405180910390a3600199505b5b505b50505b5050505b505b506003805460ff191690555b5092915050565b60085481565b600354600090819081908190819060ff1615611d7d57600080fd5b6003805460ff1916600117905560008611611d9757600080fd5b600160a060020a03331660009081526001602052604090205486901015611dbd57600080fd5b60005486901015611dcd57600080fd5b600160a060020a033316600090815260016020526040902054611df6908763ffffffff611fb116565b600160a060020a03331660009081526001602052604081209190915554611e23908763ffffffff611fb116565b60009081558793509150819050600160a060020a03831663e24a504287836040516040015260405160e060020a63ffffffff841602815260048101919091526024016040805180830381600087803b1515611e7d57600080fd5b6102c65a03f11515611e8e57600080fd5b505050604051805190602001805191935090915050811515611eaf57600080fd5b33600160a060020a03167f11933e4bf668f8fb8314a699158eba5c7836ff5ece3f1bc3056c6c34ccc56e4a30898985604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a28181945094505b6003805460ff191690555b5050509250929050565b6000818152600f602052604081206005015460a860020a900460ff161515611f5857506000610fe5565b506000818152600f602052604090206005015460ff16610fe5565b5b919050565b600060075482811515611f8857fe5b0490505b919050565b600b5481565b600082820183811015611fa657fe5b8091505b5092915050565b600082821115611fbd57fe5b508082035b92915050565b60075460085402600954611fda610c2f565b03111561201f57611ff8600c54600d54600854600654026004610f5a565b600d8190556008549081151561200a57fe5b046005556000600c5561201b610c2f565b6009555b5b565b600e54600090600160a060020a031682156108fc0283604051600060405180830381858888f193505050509050801515610cf957600080fd5b5b5050565b6101006040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000600160a060020a031681526020016000151581525090565b6060604051908101604090815260008083526020830181905290820152905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582023a5ec9c898790009860a99e7c78ae01613b6e446e79605bfbb8d51649f2cb4e0029

Deployed Bytecode

0x606060405236156102405763ffffffff60e060020a600035041663014c3dbc81146102455780630480e58b1461026a57806306fdde031461028f578063095ea7b31461031a5780630f59a6381461033e57806312a00b211461036357806318160ddd1461038b5780631c9ab3ad146103b05780631f6a1bf71461041857806322b2f1781461043d57806323b872dd146104625780632b000f001461048c5780632ff2e9dc146104bd578063313ce567146104e257806332cb6b0c14610507578063333cfa141461052c57806334805e7c1461055957806350c8dbd214610581578063555aaff6146105a65780635f623e15146105d7578063608d031a146105fc5780636eadeba0146106235780636f4ebb701461064b57806370a082311461068257806370d5ae05146106b35780637e21c28b146106e25780637f4e48491461074a578063808cf58e146107c857806388537daf146107ed57806390c469851461082357806395d89b411461085157806399f4b251146108dc5780639a2457c1146108f85780639d8abff314610940578063a6ad57e614610988578063a9059cbb146109ad578063aee1d4d3146109d1578063b0c2a163146109f6578063baa3fc4814610a1b578063c3de7cbf14610a49578063c52e40d014610a76578063c539607c14610a9b578063dd62ed3e14610ac0578063dda6c3ce14610af7578063ddd5e1b214610b21578063f01551f614610b57578063f52ae24b14610b7c578063fa90693b14610bb8578063fab425e714610be2578063ff62d2cf14610c0a575b600080fd5b341561025057600080fd5b610258610c2f565b60405190815260200160405180910390f35b341561027557600080fd5b610258610c34565b60405190815260200160405180910390f35b341561029a57600080fd5b6102a2610c3a565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102df5780820151818401525b6020016102c6565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561032557600080fd5b61033c600160a060020a0360043516602435610c61565b005b341561034957600080fd5b610258610cfd565b60405190815260200160405180910390f35b341561036e57600080fd5b610258600435610d03565b60405190815260200160405180910390f35b341561039657600080fd5b610258610d78565b60405190815260200160405180910390f35b34156103bb57600080fd5b6103c6600435610d7e565b604051978852602088019690965260408088019590955260608701939093526080860191909152151560a0850152600160a060020a031660c084015290151560e0830152610100909101905180910390f35b341561042357600080fd5b610258610e54565b60405190815260200160405180910390f35b341561044857600080fd5b610258610e5a565b60405190815260200160405180910390f35b341561046d57600080fd5b61033c600160a060020a0360043581169060243516604435610e60565b005b341561049757600080fd5b610258600435602435604435606435610f5a565b60405190815260200160405180910390f35b34156104c857600080fd5b610258610fb0565b60405190815260200160405180910390f35b34156104ed57600080fd5b610258610fb5565b60405190815260200160405180910390f35b341561051257600080fd5b610258610fba565b60405190815260200160405180910390f35b341561053757600080fd5b610545600435602435610fc5565b604051901515815260200160405180910390f35b341561056457600080fd5b610258600435610fdc565b60405190815260200160405180910390f35b341561058c57600080fd5b610258610fea565b60405190815260200160405180910390f35b34156105b157600080fd5b6105bf600435602435610ff0565b60405191825260208201526040908101905180910390f35b34156105e257600080fd5b610258611012565b60405190815260200160405180910390f35b341561060757600080fd5b610545611019565b604051901515815260200160405180910390f35b341561062e57600080fd5b610258600435611024565b60405190815260200160405180910390f35b341561065657600080fd5b610258600435600160a060020a036024351660443561102c565b60405190815260200160405180910390f35b341561068d57600080fd5b610258600160a060020a036004351661107e565b60405190815260200160405180910390f35b34156106be57600080fd5b6106c661109d565b604051600160a060020a03909116815260200160405180910390f35b34156106ed57600080fd5b6103c66004356110ac565b604051978852602088019690965260408088019590955260608701939093526080860191909152151560a0850152600160a060020a031660c084015290151560e0830152610100909101905180910390f35b341561075557600080fd5b61075d6110ff565b6040519c8d5260208d019b909b526040808d019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a0909101905180910390f35b34156107d357600080fd5b610258611274565b60405190815260200160405180910390f35b34156107f857600080fd5b610545600435600160a060020a0360243516611279565b604051901515815260200160405180910390f35b341561082e57600080fd5b6102586004356024356044356112a9565b60405190815260200160405180910390f35b341561085c57600080fd5b6102a2611303565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102df5780820151818401525b6020016102c6565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610545611323565b604051901515815260200160405180910390f35b341561090357600080fd5b61091a600435600160a060020a036024351661169c565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561094b57600080fd5b61091a600435600160a060020a036024351661171d565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561099357600080fd5b61025861174c565b60405190815260200160405180910390f35b34156109b857600080fd5b61033c600160a060020a0360043516602435611751565b005b34156109dc57600080fd5b6102586117fa565b60405190815260200160405180910390f35b3415610a0157600080fd5b610258611800565b60405190815260200160405180910390f35b3415610a2657600080fd5b610258600435602435604435611806565b60405190815260200160405180910390f35b3415610a5457600080fd5b61054560043560243561186a565b604051901515815260200160405180910390f35b3415610a8157600080fd5b610258611895565b60405190815260200160405180910390f35b3415610aa657600080fd5b61025861189b565b60405190815260200160405180910390f35b3415610acb57600080fd5b610258600160a060020a03600435811690602435166118b3565b60405190815260200160405180910390f35b3415610b0257600080fd5b6105456004356118e0565b604051901515815260200160405180910390f35b3415610b2c57600080fd5b610545600435600160a060020a0360243516611a87565b604051901515815260200160405180910390f35b3415610b6257600080fd5b610258611d5c565b60405190815260200160405180910390f35b3415610b8757600080fd5b610b9e600160a060020a0360043516602435611d62565b604051911515825260208201526040908101905180910390f35b3415610bc357600080fd5b610545600435611f2e565b604051901515815260200160405180910390f35b3415610bed57600080fd5b610258600435611f79565b60405190815260200160405180910390f35b3415610c1557600080fd5b610258611f91565b60405190815260200160405180910390f35b435b90565b60045481565b60408051908101604052600a815260b060020a69426974636f696e65756d02602082015281565b8015610c9757600160a060020a0333811660009081526002602090815260408083209386168352929052205415610c9757600080fd5b5b600160a060020a03338116600081815260026020908152604080832094871680845294909152908190208490557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35b5050565b600c5481565b60008080808062033450861015610d1f57620334509350610d23565b8593505b6402540be40092506001915062033450845b049050600062033450855b061115610d4b576001015b600191505b80821015610d6b576002835b0492505b600190910190610d50565b8294505b50505050919050565b60005481565b600080600080600080600080610d92612060565b60008a8152600f60205260409081902090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e08201529050805181602001518260400151836060015184608001518560a001518660c001518760e00151985098509850985098509850985098505b50919395975091939597565b60095481565b60065481565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152902054610ea4908363ffffffff611f9716565b600160a060020a038085166000908152600160205260408082209390935590861681522054610ed9908363ffffffff611fb116565b600160a060020a038516600090815260016020526040902055610f02818363ffffffff611fb116565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206120d48339815191529085905190815260200160405180910390a35b50505050565b60008060008386811515610f6a57fe5b0491505084830281871015610f8157819550610f95565b80871115610f9157809550610f95565b8695505b5b84861015610fa2578495505b8592505b5050949350505050565b600081565b600881565b660775f05a07400081565b6000610fd083610fdc565b82101590505b92915050565b60075460018201025b919050565b600a5481565b6000808383018390101561100357600080fd5b508190508281015b9250929050565b6298968081565b600454600054105b90565b80405b919050565b600061107461103a85610d03565b6000848152601060209081526040808320600160a060020a0389168452825280832060010154878452600f90925290912060020154611806565b90505b9392505050565b600160a060020a0381166000908152600160205260409020545b919050565b600e54600160a060020a031681565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff80821691600160a060020a036101008204169160a860020a9091041688565b600080600080600080600080600080600080600061111b612060565b600061112d611128610c2f565b611f79565b6000818152600f602052604090206005015490915060a860020a900460ff16151561119c5761010060405190810160409081526005548252602082018390526000908201819052606082018190526080820181905260a0820181905260c0820152600160e0820152915061121d565b6000818152600f60205260409081902090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e082015291505b60055460065482600754600854600b54600954600a54600c54600d548b600001518c604001518d608001519e509e509e509e509e509e509e509e509e509e509e509e509e505b5050909192939495969798999a9b9c565b606481565b6000828152601060209081526040808320600160a060020a038516845290915290206002015460ff165b92915050565b6000808080868611156112be578592506112c2565b8692505b826298968086028115156112d257fe5b04915060001990506298968082106112ec578093506112f8565b62989680815b04820293505b5b5050509392505050565b604080519081016040526003815260e860020a6242544502602082015281565b600354600090819060ff161561133857600080fd5b6003805460ff1916600117905560055460009062989680905b049050348190101561136257600080fd5b69d3c21bcecceda100000034111561137957600080fd5b611381611019565b151561138c57600080fd5b61139c611128610c2f565b611f79565b6113a4610c2f565b8114156113b057600080fd5b6000818152600f602052604090206005015460a860020a900460ff1615156114c3576113da611fc8565b6101006040519081016040908152600554825260208083018490526000828401819052606084018190526080840181905260a0840181905260c08401819052600160e0850152848152600f90915220815181556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015160058201805460ff191691151591909117905560c08201518160050160016101000a815481600160a060020a030219169083600160a060020a0316021790555060e08201516005909101805491151560a860020a0260a860020a60ff0219909216919091179055505b6114d3611128610c2f565b611f79565b6114db610c2f565b8114156114e757600080fd5b6000818152600f602052604090206005015460a860020a900460ff16151561150e57600080fd5b6000818152600f602052604090206005015460ff161561152d57600080fd5b61153d611128610c2f565b611f79565b33611546610c2f565b82141561155257600080fd5b61155c8282611279565b1561156657600080fd5b611576611128610c2f565b611f79565b9550606060405190810160409081526000888152600f6020908152828220600401548452348185015260018385015289825260108152828220600160a060020a0333168352905220815181556020820151816001015560408201516002918201805460ff19169115159190911790556000888152600f60205260409081902060038101805460010190559182018054349081018255600c80548201905560048401805482019055905492548a945033600160a060020a0316937f79974ce89535ebe44946f7f7d2814356530f301d744391e2da3cb544e8415bac939091905180848152602001838152602001828152602001935050505060405180910390a361167e34612022565b600196505b5b50505b505b505b5b506003805460ff191690555b5090565b6000828152601060209081526040808320600160a060020a03851684529091528120600201548190819060ff161561170b575050506000828152601060209081526040808320600160a060020a038516845290915290208054600182015460029092015490919060ff16611715565b5060009150819050805b5b9250925092565b601060209081526000928352604080842090915290825290208054600182015460029092015490919060ff1683565b600481565b600160a060020a03331660009081526001602052604090205461177a908263ffffffff611fb116565b600160a060020a0333811660009081526001602052604080822093909355908416815220546117af908263ffffffff611f9716565b600160a060020a0380841660008181526001602052604090819020939093559133909116906000805160206120d48339815191529084905190815260200160405180910390a35b5050565b60075481565b60055481565b6000808284111561181657600080fd5b6000841161182357600080fd5b6000831161183057600080fd5b8262989680850281151561184057fe5b04905062989680811061185557849150611861565b62989680855b04810291505b5b509392505050565b60008061187684610fdc565b905080831015801561188b5750806101000183105b91505b5092915050565b600d5481565b60006118ad611128610c2f565b611f79565b90505b90565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60006118ea612060565b60006118f46120b3565b6000806000806119048933611279565b801561191c575061191c89611917610c2f565b610fc5565b5b15611a75576000898152600f602052604090819020906101009051908101604090815282548252600183015460208301908152600284015491830191909152600383015460608301526004830154608083015260059092015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e082015297506119b19051610fdc565b60008a8152601060209081526040808320600160a060020a033316845290915290819020919750606090519081016040908152825482526001830154602083015260029092015460ff161515918101919091529450611a1a8751886040015187602001516112a9565b9350611a3684611a3189518a6040015189516112a9565b610ff0565b9093509150611a4486611024565b60405190815260200160405190819003902090508083108015611a675750808210155b15611a755760019750611a7b565b5b600097505b50505050505050919050565b600354600090819060ff1615611a9c57600080fd5b6003805460ff1916600117905583611ab2610c2f565b811415611abe57600080fd5b6000818152600f602052604090206005015460a860020a900460ff161515611ae557600080fd5b6000818152600f602052604090206005015460ff1615611b0457600080fd5b84611b0d610c2f565b811415611b1957600080fd5b611b2a81611917610c2f565b610fc5565b1515611b3557600080fd5b611b4681611b41610c2f565b61186a565b1515611b5157600080fd5b85611b5a612060565b6000828152600f602052604080822090610100905190810160409081528254825260018301546020830152600283015490820152600382015460608201526004820154608082015260059091015460ff808216151560a0840152600160a060020a0361010083041660c084015260a860020a90910416151560e08201529150611be283610fdc565b9050611bed81611024565b1515611bf857600080fd5b8833611c048282611279565b1515611c0f57600080fd5b8a611c19816118e0565b1515611c2457600080fd5b60008c8152600f602052604090206005018054600160a060020a03339081166101000261010060a860020a031960ff1990931660019081179390931617909255600a805490910190819055611c79918e61102c565b600160a060020a038c16600090815260016020526040902054909950611ca5908a63ffffffff611f9716565b600160a060020a03808d166000818152600160205260408082209490945580548d0190558e9290913316907f02d996374be8c81683a2ac4abd51bbf94eaa161436677d4195541f2ef4cb63b8908d905190815260200160405180910390a48a600160a060020a031630600160a060020a03166000805160206120d48339815191528b60405190815260200160405180910390a3600199505b5b505b50505b5050505b505b506003805460ff191690555b5092915050565b60085481565b600354600090819081908190819060ff1615611d7d57600080fd5b6003805460ff1916600117905560008611611d9757600080fd5b600160a060020a03331660009081526001602052604090205486901015611dbd57600080fd5b60005486901015611dcd57600080fd5b600160a060020a033316600090815260016020526040902054611df6908763ffffffff611fb116565b600160a060020a03331660009081526001602052604081209190915554611e23908763ffffffff611fb116565b60009081558793509150819050600160a060020a03831663e24a504287836040516040015260405160e060020a63ffffffff841602815260048101919091526024016040805180830381600087803b1515611e7d57600080fd5b6102c65a03f11515611e8e57600080fd5b505050604051805190602001805191935090915050811515611eaf57600080fd5b33600160a060020a03167f11933e4bf668f8fb8314a699158eba5c7836ff5ece3f1bc3056c6c34ccc56e4a30898985604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a28181945094505b6003805460ff191690555b5050509250929050565b6000818152600f602052604081206005015460a860020a900460ff161515611f5857506000610fe5565b506000818152600f602052604090206005015460ff16610fe5565b5b919050565b600060075482811515611f8857fe5b0490505b919050565b600b5481565b600082820183811015611fa657fe5b8091505b5092915050565b600082821115611fbd57fe5b508082035b92915050565b60075460085402600954611fda610c2f565b03111561201f57611ff8600c54600d54600854600654026004610f5a565b600d8190556008549081151561200a57fe5b046005556000600c5561201b610c2f565b6009555b5b565b600e54600090600160a060020a031682156108fc0283604051600060405180830381858888f193505050509050801515610cf957600080fd5b5b5050565b6101006040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000600160a060020a031681526020016000151581525090565b6060604051908101604090815260008083526020830181905290820152905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582023a5ec9c898790009860a99e7c78ae01613b6e446e79605bfbb8d51649f2cb4e0029

Swarm Source

bzzr://23a5ec9c898790009860a99e7c78ae01613b6e446e79605bfbb8d51649f2cb4e
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.