ETH Price: $2,108.47 (-4.33%)

Contract

0x37Ee40C81813C9Ea545179e71de2B23dce4E30E0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy TDE Tokens W...62291492018-08-28 13:57:402760 days ago1535464660IN
0x37Ee40C8...dce4E30E0
0 ETH0.0002482510
Buy PRETDE Token...62291432018-08-28 13:56:042760 days ago1535464564IN
0x37Ee40C8...dce4E30E0
0 ETH0.0002470910
Finalize TDE62172362018-08-26 13:42:142762 days ago1535290934IN
0x37Ee40C8...dce4E30E0
0 ETH0.000090054
Finalize PRETDE62172082018-08-26 13:34:502762 days ago1535290490IN
0x37Ee40C8...dce4E30E0
0 ETH0.000097694
Transfer62027152018-08-24 3:01:412764 days ago1535079701IN
0x37Ee40C8...dce4E30E0
0 ETH0.000046242.10001
Buy PRETDE Token...61976092018-08-23 5:53:212765 days ago1535003601IN
0x37Ee40C8...dce4E30E0
0 ETH0.000074313
Buy PRETDE Token...61884182018-08-21 16:56:112767 days ago1534870571IN
0x37Ee40C8...dce4E30E0
0 ETH0.00060945
Buy PRETDE Token...61884122018-08-21 16:55:092767 days ago1534870509IN
0x37Ee40C8...dce4E30E0
0 ETH0.00060945
Buy PRETDE Token...61883992018-08-21 16:52:092767 days ago1534870329IN
0x37Ee40C8...dce4E30E0
0 ETH0.00060945
Buy PRETDE Token...61883932018-08-21 16:50:372767 days ago1534870237IN
0x37Ee40C8...dce4E30E0
0 ETH0.00060945
0x3235303061737712018-08-19 5:39:552769 days ago1534657195IN
0x37Ee40C8...dce4E30E0
5 ETH0.000266151.4
Transfer61709702018-08-18 18:17:172769 days ago1534616237IN
0x37Ee40C8...dce4E30E0
5 ETH0.00033
Buy PRETDE Token...61029312018-08-07 5:56:432781 days ago1533621403IN
0x37Ee40C8...dce4E30E0
0 ETH0.000365643
Buy PRETDE Token...61029192018-08-07 5:53:532781 days ago1533621233IN
0x37Ee40C8...dce4E30E0
0 ETH0.000365643
Buy PRETDE Token...61029062018-08-07 5:50:432781 days ago1533621043IN
0x37Ee40C8...dce4E30E0
0 ETH0.000365643
Buy PRETDE Token...60783472018-08-03 2:34:172785 days ago1533263657IN
0x37Ee40C8...dce4E30E0
0 ETH0.000275453
Buy PRETDE Token...60783382018-08-03 2:31:092785 days ago1533263469IN
0x37Ee40C8...dce4E30E0
0 ETH0.000275453
Buy PRETDE Token...60782772018-08-03 2:14:592785 days ago1533262499IN
0x37Ee40C8...dce4E30E0
0 ETH0.000365453
Buy TDE Tokens W...60711412018-08-01 21:17:162786 days ago1533158236IN
0x37Ee40C8...dce4E30E0
0 ETH0.000357983
Transfer60384642018-07-27 9:21:242792 days ago1532683284IN
0x37Ee40C8...dce4E30E0
1.3 ETH0.000377352
Transfer60370182018-07-27 3:24:082792 days ago1532661848IN
0x37Ee40C8...dce4E30E0
0.25 ETH0.000188671
Transfer60368802018-07-27 2:53:182792 days ago1532659998IN
0x37Ee40C8...dce4E30E0
0.25 ETH0.0001053
Transfer60368452018-07-27 2:43:392792 days ago1532659419IN
0x37Ee40C8...dce4E30E0
0.25 ETH0.00004412.1
Transfer60368402018-07-27 2:42:352792 days ago1532659355IN
0x37Ee40C8...dce4E30E0
0.25 ETH0.00004412.1
Transfer60353862018-07-26 20:53:542792 days ago1532638434IN
0x37Ee40C8...dce4E30E0
0.3 ETH0.000188671
View all transactions

Latest 13 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer61737712018-08-19 5:39:552769 days ago1534657195
0x37Ee40C8...dce4E30E0
5 ETH
Transfer60384642018-07-27 9:21:242792 days ago1532683284
0x37Ee40C8...dce4E30E0
1.3 ETH
Transfer60370182018-07-27 3:24:082792 days ago1532661848
0x37Ee40C8...dce4E30E0
0.25 ETH
Transfer60353862018-07-26 20:53:542792 days ago1532638434
0x37Ee40C8...dce4E30E0
0.3 ETH
Transfer60349412018-07-26 18:58:472792 days ago1532631527
0x37Ee40C8...dce4E30E0
0.03 ETH
Transfer60263392018-07-25 7:53:432794 days ago1532505223
0x37Ee40C8...dce4E30E0
0.01 ETH
Transfer60262622018-07-25 7:34:402794 days ago1532504080
0x37Ee40C8...dce4E30E0
0.11378962 ETH
Transfer60255532018-07-25 4:35:092794 days ago1532493309
0x37Ee40C8...dce4E30E0
0.3 ETH
Transfer60249592018-07-25 2:07:432794 days ago1532484463
0x37Ee40C8...dce4E30E0
0.1486 ETH
Transfer60245972018-07-25 0:37:172794 days ago1532479037
0x37Ee40C8...dce4E30E0
1 ETH
Transfer60245602018-07-25 0:30:252794 days ago1532478625
0x37Ee40C8...dce4E30E0
0.33715828 ETH
Transfer60245292018-07-25 0:23:042794 days ago1532478184
0x37Ee40C8...dce4E30E0
1 ETH
Transfer60245272018-07-25 0:22:342794 days ago1532478154
0x37Ee40C8...dce4E30E0
1.29619812 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DNNTDE

Compiler Version
v0.4.15+commit.bbb8e64f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-05-11
*/

pragma solidity ^0.4.15;


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

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

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

contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) constant returns (uint256);
  function transfer(address to, uint256 value) returns (bool);
  event Transfer(address indexed from, address indexed to, 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) returns (bool) {
    require(_to != address(0));

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    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) constant returns (uint256 balance) {
    return balances[_owner];
  }
}

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

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 amount of tokens to be transferred
   */
  function transferFrom(address _from, address _to, uint256 _value) returns (bool) {
    require(_to != address(0));

    var _allowance = allowed[_from][msg.sender];

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

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

  /**
   * @dev Approve 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) returns (bool) {

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

    allowed[msg.sender][_spender] = _value;
    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) constant returns (uint256 remaining) {
    return allowed[_owner][_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
   */
  function increaseApproval (address _spender, uint _addedValue)
    returns (bool success) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval (address _spender, uint _subtractedValue)
    returns (bool success) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }
}

/// @title Token contract - Implements Standard Token Interface with DNN features.
/// @author Dondrey Taylor - <dondrey@dnn.media>
contract DNNToken is StandardToken {

    using SafeMath for uint256;

    ////////////////////////////////////////////////////////////
    // Used to indicate which allocation we issue tokens from //
    ////////////////////////////////////////////////////////////
    enum DNNSupplyAllocations {
        EarlyBackerSupplyAllocation,
        PRETDESupplyAllocation,
        TDESupplyAllocation,
        BountySupplyAllocation,
        WriterAccountSupplyAllocation,
        AdvisorySupplyAllocation,
        PlatformSupplyAllocation
    }

    /////////////////////////////////////////////////////////////////////
    // Smart-Contract with permission to allocate tokens from supplies //
    /////////////////////////////////////////////////////////////////////
    address public allocatorAddress;
    address public crowdfundContract;

    /////////////////////
    // Token Meta Data //
    /////////////////////
    string constant public name = "DNN";
    string constant public symbol = "DNN";
    uint8 constant public decimals = 18; // 1 DNN = 1 * 10^18 atto-DNN

    /////////////////////////////////////////
    // Addresses of the co-founders of DNN //
    /////////////////////////////////////////
    address public cofounderA;
    address public cofounderB;

    /////////////////////////
    // Address of Platform //
    /////////////////////////
    address public platform;

    /////////////////////////////////////////////
    // Token Distributions (% of total supply) //
    /////////////////////////////////////////////
    uint256 public earlyBackerSupply; // 10%
    uint256 public PRETDESupply; // 10%
    uint256 public TDESupply; // 40%
    uint256 public bountySupply; // 1%
    uint256 public writerAccountSupply; // 4%
    uint256 public advisorySupply; // 14%
    uint256 public cofoundersSupply; // 10%
    uint256 public platformSupply; // 11%

    uint256 public earlyBackerSupplyRemaining; // 10%
    uint256 public PRETDESupplyRemaining; // 10%
    uint256 public TDESupplyRemaining; // 40%
    uint256 public bountySupplyRemaining; // 1%
    uint256 public writerAccountSupplyRemaining; // 4%
    uint256 public advisorySupplyRemaining; // 14%
    uint256 public cofoundersSupplyRemaining; // 10%
    uint256 public platformSupplyRemaining; // 11%

    ////////////////////////////////////////////////////////////////////////////////////
    // Amount of CoFounder Supply that has been distributed based on vesting schedule //
    ////////////////////////////////////////////////////////////////////////////////////
    uint256 public cofoundersSupplyVestingTranches = 10;
    uint256 public cofoundersSupplyVestingTranchesIssued = 0;
    uint256 public cofoundersSupplyVestingStartDate; // Epoch
    uint256 public cofoundersSupplyDistributed = 0;  // # of atto-DNN distributed to founders

    //////////////////////////////////////////////
    // Prevents tokens from being transferrable //
    //////////////////////////////////////////////
    bool public tokensLocked = true;

    /////////////////////////////////////////////////////////////////////////////
    // Event triggered when tokens are transferred from one address to another //
    /////////////////////////////////////////////////////////////////////////////
    event Transfer(address indexed from, address indexed to, uint256 value);

    ////////////////////////////////////////////////////////////
    // Checks if tokens can be issued to founder at this time //
    ////////////////////////////////////////////////////////////
    modifier CofoundersTokensVested()
    {
        // Make sure that a starting vesting date has been set and 4 weeks have passed since vesting date
        require (cofoundersSupplyVestingStartDate != 0 && (now-cofoundersSupplyVestingStartDate) >= 4 weeks);

        // Get current tranche based on the amount of time that has passed since vesting start date
        uint256 currentTranche = now.sub(cofoundersSupplyVestingStartDate) / 4 weeks;

        // Amount of tranches that have been issued so far
        uint256 issuedTranches = cofoundersSupplyVestingTranchesIssued;

        // Amount of tranches that cofounders are entitled to
        uint256 maxTranches = cofoundersSupplyVestingTranches;

        // Make sure that we still have unvested tokens and that
        // the tokens for the current tranche have not been issued.
        require (issuedTranches != maxTranches && currentTranche > issuedTranches);

        _;
    }

    ///////////////////////////////////
    // Checks if tokens are unlocked //
    ///////////////////////////////////
    modifier TokensUnlocked()
    {
        require (tokensLocked == false);
        _;
    }

    /////////////////////////////////
    // Checks if tokens are locked //
    /////////////////////////////////
    modifier TokensLocked()
    {
       require (tokensLocked == true);
       _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounders are performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounders()
    {
        require (msg.sender == cofounderA || msg.sender == cofounderB);
        _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounder A is performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounderA()
    {
        require (msg.sender == cofounderA);
        _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounder B is performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounderB()
    {
        require (msg.sender == cofounderB);
        _;
    }

    //////////////////////////////////////////////////
    // Checks if Allocator is performing the action //
    //////////////////////////////////////////////////
    modifier onlyAllocator()
    {
        require (msg.sender == allocatorAddress);
        _;
    }

    ///////////////////////////////////////////////////////////
    // Checks if Crowdfund Contract is performing the action //
    ///////////////////////////////////////////////////////////
    modifier onlyCrowdfundContract()
    {
        require (msg.sender == crowdfundContract);
        _;
    }

    ///////////////////////////////////////////////////////////////////////////////////
    // Checks if Crowdfund Contract, Platform, or Allocator is performing the action //
    ///////////////////////////////////////////////////////////////////////////////////
    modifier onlyAllocatorOrCrowdfundContractOrPlatform()
    {
        require (msg.sender == allocatorAddress || msg.sender == crowdfundContract || msg.sender == platform);
        _;
    }

    ///////////////////////////////////////////////////////////////////////
    //  @des Function to change address that is manage platform holding  //
    //  @param newAddress Address of new issuance contract.              //
    ///////////////////////////////////////////////////////////////////////
    function changePlatform(address newAddress)
        onlyCofounders
    {
        platform = newAddress;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  @des Function to change address that is allowed to do token issuance. Crowdfund contract can only be set once.   //
    //  @param newAddress Address of new issuance contract.                                                              //
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function changeCrowdfundContract(address newAddress)
        onlyCofounders
    {
        crowdfundContract = newAddress;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  @des Function to change address that is allowed to do token issuance. Allocator can only be set once.  //
    //  @param newAddress Address of new issuance contract.                                                    //
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function changeAllocator(address newAddress)
        onlyCofounders
    {
        allocatorAddress = newAddress;
    }

    ///////////////////////////////////////////////////////
    //  @des Function to change founder A address.       //
    //  @param newAddress Address of new founder A.      //
    ///////////////////////////////////////////////////////
    function changeCofounderA(address newAddress)
        onlyCofounderA
    {
        cofounderA = newAddress;
    }

    //////////////////////////////////////////////////////
    //  @des Function to change founder B address.      //
    //  @param newAddress Address of new founder B.     //
    //////////////////////////////////////////////////////
    function changeCofounderB(address newAddress)
        onlyCofounderB
    {
        cofounderB = newAddress;
    }


    //////////////////////////////////////////////////////////////
    // Transfers tokens from senders address to another address //
    //////////////////////////////////////////////////////////////
    function transfer(address _to, uint256 _value)
      TokensUnlocked
      returns (bool)
    {
          Transfer(msg.sender, _to, _value);
          return BasicToken.transfer(_to, _value);
    }

    //////////////////////////////////////////////////////////
    // Transfers tokens from one address to another address //
    //////////////////////////////////////////////////////////
    function transferFrom(address _from, address _to, uint256 _value)
      TokensUnlocked
      returns (bool)
    {
          Transfer(_from, _to, _value);
          return StandardToken.transferFrom(_from, _to, _value);
    }


    ///////////////////////////////////////////////////////////////////////////////////////////////
    //  @des Cofounders issue tokens to themsleves if within vesting period. Returns success.    //
    //  @param beneficiary Address of receiver.                                                  //
    //  @param tokenCount Number of tokens to issue.                                             //
    ///////////////////////////////////////////////////////////////////////////////////////////////
    function issueCofoundersTokensIfPossible()
        onlyCofounders
        CofoundersTokensVested
        returns (bool)
    {
        // Compute total amount of vested tokens to issue
        uint256 tokenCount = cofoundersSupply.div(cofoundersSupplyVestingTranches);

        // Make sure that there are cofounder tokens left
        if (tokenCount > cofoundersSupplyRemaining) {
           return false;
        }

        // Decrease cofounders supply
        cofoundersSupplyRemaining = cofoundersSupplyRemaining.sub(tokenCount);

        // Update how many tokens have been distributed to cofounders
        cofoundersSupplyDistributed = cofoundersSupplyDistributed.add(tokenCount);

        // Split tokens between both founders
        balances[cofounderA] = balances[cofounderA].add(tokenCount.div(2));
        balances[cofounderB] = balances[cofounderB].add(tokenCount.div(2));

        // Update that a tranche has been issued
        cofoundersSupplyVestingTranchesIssued += 1;

        return true;
    }


    //////////////////
    // Issue tokens //
    //////////////////
    function issueTokens(address beneficiary, uint256 tokenCount, DNNSupplyAllocations allocationType)
      onlyAllocatorOrCrowdfundContractOrPlatform
      returns (bool)
    {
        // We'll use the following to determine whether the allocator, platform,
        // or the crowdfunding contract can allocate specified supply
        bool canAllocatorPerform = msg.sender == allocatorAddress;
        bool canCrowdfundContractPerform = msg.sender == crowdfundContract;
        bool canPlatformPerform = msg.sender == platform;

        // Early Backers
        if (canAllocatorPerform && allocationType == DNNSupplyAllocations.EarlyBackerSupplyAllocation && tokenCount <= earlyBackerSupplyRemaining) {
            earlyBackerSupplyRemaining = earlyBackerSupplyRemaining.sub(tokenCount);
        }

        // PRE-TDE
        else if (canCrowdfundContractPerform && msg.sender == crowdfundContract && allocationType == DNNSupplyAllocations.PRETDESupplyAllocation) {

              // Check to see if we have enough tokens to satisfy this purchase
              // using just the pre-tde.
              if (PRETDESupplyRemaining >= tokenCount) {

                    // Decrease pre-tde supply
                    PRETDESupplyRemaining = PRETDESupplyRemaining.sub(tokenCount);
              }

              // Check to see if we can satisfy this using pre-tde and tde supply combined
              else if (PRETDESupplyRemaining+TDESupplyRemaining >= tokenCount) {

                    // Decrease tde supply
                    TDESupplyRemaining = TDESupplyRemaining.sub(tokenCount-PRETDESupplyRemaining);

                    // Decrease pre-tde supply by its' remaining tokens
                    PRETDESupplyRemaining = 0;
              }

              // Otherwise, we can't satisfy this sale because we don't have enough tokens.
              else {
                  return false;
              }
        }

        // TDE
        else if (canCrowdfundContractPerform && allocationType == DNNSupplyAllocations.TDESupplyAllocation && tokenCount <= TDESupplyRemaining) {
            TDESupplyRemaining = TDESupplyRemaining.sub(tokenCount);
        }

        // Bounty
        else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.BountySupplyAllocation && tokenCount <= bountySupplyRemaining) {
            bountySupplyRemaining = bountySupplyRemaining.sub(tokenCount);
        }

        // Writer Accounts
        else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.WriterAccountSupplyAllocation && tokenCount <= writerAccountSupplyRemaining) {
            writerAccountSupplyRemaining = writerAccountSupplyRemaining.sub(tokenCount);
        }

        // Advisory
        else if (canAllocatorPerform && allocationType == DNNSupplyAllocations.AdvisorySupplyAllocation && tokenCount <= advisorySupplyRemaining) {
            advisorySupplyRemaining = advisorySupplyRemaining.sub(tokenCount);
        }

        // Platform (Also makes sure that the beneficiary is the platform address specified in this contract)
        else if (canPlatformPerform && allocationType == DNNSupplyAllocations.PlatformSupplyAllocation && tokenCount <= platformSupplyRemaining) {
            platformSupplyRemaining = platformSupplyRemaining.sub(tokenCount);
        }

        else {
            return false;
        }

        // Transfer tokens
        Transfer(address(this), beneficiary, tokenCount);

        // Credit tokens to the address specified
        balances[beneficiary] = balances[beneficiary].add(tokenCount);

        return true;
    }

    /////////////////////////////////////////////////
    // Transfer Unsold tokens from TDE to Platform //
    /////////////////////////////////////////////////
    function sendUnsoldTDETokensToPlatform()
      external
      onlyCrowdfundContract
    {
        // Make sure we have tokens to send from TDE
        if (TDESupplyRemaining > 0) {

            // Add remaining tde tokens to platform remaining tokens
            platformSupplyRemaining = platformSupplyRemaining.add(TDESupplyRemaining);

            // Clear remaining tde token count
            TDESupplyRemaining = 0;
        }
    }

    /////////////////////////////////////////////////////
    // Transfer Unsold tokens from pre-TDE to Platform //
    /////////////////////////////////////////////////////
    function sendUnsoldPRETDETokensToTDE()
      external
      onlyCrowdfundContract
    {
          // Make sure we have tokens to send from pre-TDE
          if (PRETDESupplyRemaining > 0) {

              // Add remaining pre-tde tokens to tde remaining tokens
              TDESupplyRemaining = TDESupplyRemaining.add(PRETDESupplyRemaining);

              // Clear remaining pre-tde token count
              PRETDESupplyRemaining = 0;
        }
    }

    ////////////////////////////////////////////////////////////////
    // @des Allows tokens to be transferrable. Returns lock state //
    ////////////////////////////////////////////////////////////////
    function unlockTokens()
        external
        onlyCrowdfundContract
    {
        // Make sure tokens are currently locked before proceeding to unlock them
        require(tokensLocked == true);

        tokensLocked = false;
    }

    ///////////////////////////////////////////////////////////////////////
    //  @des Contract constructor function sets initial token balances.  //
    ///////////////////////////////////////////////////////////////////////
    function DNNToken()
    {
          // Start date
          uint256 vestingStartDate = 1526072145;

          // Set cofounder addresses
          cofounderA = 0x3Cf26a9FE33C219dB87c2e50572e50803eFb2981;
          cofounderB = 0x9FFE2aD5D76954C7C25be0cEE30795279c4Cab9f;

          // Sets platform address
          platform = address(this);

          // Set total supply - 1 Billion DNN Tokens = (1,000,000,000 * 10^18) atto-DNN
          // 1 DNN = 10^18 atto-DNN
          totalSupply = uint256(1000000000).mul(uint256(10)**decimals);

          // Set Token Distributions (% of total supply)
          earlyBackerSupply = totalSupply.mul(10).div(100); // 10%
          PRETDESupply = totalSupply.mul(10).div(100); // 10%
          TDESupply = totalSupply.mul(40).div(100); // 40%
          bountySupply = totalSupply.mul(1).div(100); // 1%
          writerAccountSupply = totalSupply.mul(4).div(100); // 4%
          advisorySupply = totalSupply.mul(14).div(100); // 14%
          cofoundersSupply = totalSupply.mul(10).div(100); // 10%
          platformSupply = totalSupply.mul(11).div(100); // 11%

          // Set each remaining token count equal to its' respective supply
          earlyBackerSupplyRemaining = earlyBackerSupply;
          PRETDESupplyRemaining = PRETDESupply;
          TDESupplyRemaining = TDESupply;
          bountySupplyRemaining = bountySupply;
          writerAccountSupplyRemaining = writerAccountSupply;
          advisorySupplyRemaining = advisorySupply;
          cofoundersSupplyRemaining = cofoundersSupply;
          platformSupplyRemaining = platformSupply;

          // Sets cofounder vesting start date (Ensures that it is a date in the future, otherwise it will default to now)
          cofoundersSupplyVestingStartDate = vestingStartDate >= now ? vestingStartDate : now;
    }
}

/// @title DNNTDE contract - Takes funds from users and issues tokens.
/// @author Dondrey Taylor - <dondrey@dnn.media>
contract DNNTDE {

    using SafeMath for uint256;

    /////////////////////////
    // DNN Token Contract  //
    /////////////////////////
    DNNToken public dnnToken;

    //////////////////////////////////////////
    // Addresses of the co-founders of DNN. //
    //////////////////////////////////////////
    address public cofounderA;
    address public cofounderB;

    ///////////////////////////
    // DNN Holding Multisig //
    //////////////////////////
    address public dnnHoldingMultisig;

    ///////////////////////////
    // Start date of the TDE //
    ///////////////////////////
    uint256 public TDEStartDate;  // Epoch

    /////////////////////////
    // End date of the TDE //
    /////////////////////////
    uint256 public TDEEndDate;  // Epoch

    /////////////////////////////////
    // Amount of atto-DNN per wei //
    /////////////////////////////////
    uint256 public tokenExchangeRateBase = 3000; // 1 Wei = 3000 atto-DNN

    /////////////////////////////////////////////////
    // Number of tokens distributed (in atto-DNN) //
    /////////////////////////////////////////////////
    uint256 public tokensDistributed = 0;

    ///////////////////////////////////////////////
    // Minumum Contributions for pre-TDE and TDE //
    ///////////////////////////////////////////////
    uint256 public minimumTDEContributionInWei = 0.001 ether;
    uint256 public minimumPRETDEContributionInWei = 5 ether;

    //////////////////////
    // Funding Hard cap //
    //////////////////////
    uint256 public maximumFundingGoalInETH;

    //////////////////
    // Funds Raised //
    //////////////////
    uint256 public fundsRaisedInWei = 0;
    uint256 public presaleFundsRaisedInWei = 0;
    uint256 public tdeFundsRaisedInWei = 0;

    ////////////////////////////////////////////
    // Keep track of Wei contributed per user //
    ////////////////////////////////////////////
    mapping(address => uint256) ETHContributions;

    ////////////////////////////////////////////////
    // Keeps track of tokens per eth contribution //
    ////////////////////////////////////////////////
    mapping(address => uint256) ETHContributorTokens;


    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Keeps track of pre-tde contributors and how many tokens they are entitled to get based on their contribution //
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    mapping(address => uint256) PRETDEContributorTokensPendingRelease;
    uint256 PRETDEContributorsTokensPendingCount = 0; // keep track of contributors waiting for tokens
    uint256 TokensPurchasedDuringPRETDE = 0; // keep track of how many tokens need to be issued to presale contributors


    //////////////////
    // Bonus ranges //
    //////////////////
    bool public trickleDownBonusesReleased = false;
    uint256 public rangeETHAmount = 0;
    uint256 public bonusRangeCount = 4;

    uint256 public TDEContributorCount = 0;
    mapping(uint256 => address) public TDEContributorAddresses;
    mapping(address => uint256) public TDEContributorInitialBonusByAddress;

    uint256 public tokensIssuedForBonusRangeOne    = 0;
    uint256 public tokensIssuedForBonusRangeTwo    = 0;
    uint256 public tokensIssuedForBonusRangeThree  = 0;
    uint256 public tokensIssuedForBonusRangeFour   = 0;

    //////////////////////////////////////////////////////
    // Checks if trickle down bonuses not been released //
    //////////////////////////////////////////////////////
    modifier HasTrickleDownBonusesNotBeenReleased() {
        require (trickleDownBonusesReleased == false);
        _;
    }

    ///////////////////////////////////////////////////////////////////
    // Checks if all pre-tde contributors have received their tokens //
    ///////////////////////////////////////////////////////////////////
    modifier NoPRETDEContributorsAwaitingTokens() {
        // Determine if all pre-tde contributors have received tokens
        require(PRETDEContributorsTokensPendingCount == 0);
        _;
    }

    ///////////////////////////////////////////////////////////////////////////////////////
    // Checks if there are any pre-tde contributors that have not recieved their tokens  //
    ///////////////////////////////////////////////////////////////////////////////////////
    modifier PRETDEContributorsAwaitingTokens() {

        // Determine if there pre-tde contributors that have not received tokens
        require(PRETDEContributorsTokensPendingCount > 0);

        _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounders are performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounders() {
        require (msg.sender == cofounderA || msg.sender == cofounderB);
        _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounder A is performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounderA() {
        require (msg.sender == cofounderA);
        _;
    }

    ////////////////////////////////////////////////////
    // Checks if CoFounder B is performing the action //
    ////////////////////////////////////////////////////
    modifier onlyCofounderB() {
        require (msg.sender == cofounderB);
        _;
    }

    ////////////////////////////////s
    // Check if the tde has ended //
    ////////////////////////////////
    modifier TDEHasEnded() {
       require (now >= TDEEndDate || fundsRaisedInWei >= maximumFundingGoalInETH);
       _;
    }

    //////////////////////////////////////////////////////////////////////////////
    // Checksto see if the contribution is at least the minimum allowed for tde //
    //////////////////////////////////////////////////////////////////////////////
    modifier ContributionIsAtLeastMinimum() {
        require (msg.value >= minimumTDEContributionInWei);
        _;
    }

    ///////////////////////////////////////////////////////////////
    // Make sure max cap is not exceeded with added contribution //
    ///////////////////////////////////////////////////////////////
    modifier ContributionDoesNotCauseGoalExceedance() {
       uint256 newFundsRaised = msg.value+fundsRaisedInWei;
       require (newFundsRaised <= maximumFundingGoalInETH);
       _;
    }

    ///////////////////////////////////////////////////////////////
    // Make sure max tokens is not exceeded with added contribution //
    ///////////////////////////////////////////////////////////////
    modifier TDEBonusesDoesNotCauseTokenExceedance() {
       uint256 tokensDistributedPlusBonuses = getTokensDistributedPlusTrickleDownBonuses();
       require (tokensDistributedPlusBonuses < dnnToken.TDESupplyRemaining());
       _;
    }

    /////////////////////////////////////////////////////////////////
    // Check if the specified beneficiary has sent us funds before //
    /////////////////////////////////////////////////////////////////
    modifier HasPendingPRETDETokens(address _contributor) {
        require (PRETDEContributorTokensPendingRelease[_contributor] !=  0);
        _;
    }

    /////////////////////////////////////////////////////////////
    // Check if pre-tde contributors is not waiting for tokens //
    /////////////////////////////////////////////////////////////
    modifier IsNotAwaitingPRETDETokens(address _contributor) {
        require (PRETDEContributorTokensPendingRelease[_contributor] ==  0);
        _;
    }

    ///////////////////////////////////////////////////////
    //  @des Function to change founder A address.       //
    //  @param newAddress Address of new founder A.      //
    ///////////////////////////////////////////////////////
    function changeCofounderA(address newAddress)
        onlyCofounderA
    {
        cofounderA = newAddress;
    }

    //////////////////////////////////////////////////////
    //  @des Function to change founder B address.      //
    //  @param newAddress Address of new founder B.     //
    //////////////////////////////////////////////////////
    function changeCofounderB(address newAddress)
        onlyCofounderB
    {
        cofounderB = newAddress;
    }

    /////////////////////////////////////////////////////////
    //  @des Tokens distributed plus trickle down bonuses. //
    /////////////////////////////////////////////////////////
    function getTokensDistributedPlusTrickleDownBonuses()
        constant
        returns (uint256)
    {
        return tokensIssuedForBonusRangeOne.mul(220).div(100) + tokensIssuedForBonusRangeTwo.mul(190).div(100) + tokensIssuedForBonusRangeThree.mul(150).div(100) + tokensIssuedForBonusRangeFour.mul(100).div(100);
    }

    ////////////////////////////////////////
    //  @des Function to extend tde       //
    //  @param new crowdsale start date   //
    ////////////////////////////////////////
    function extendTDE(uint256 endDate)
        onlyCofounders
        returns (bool)
    {
        // Make sure that the new date is past the existing date and
        // is not in the past.
        if (endDate > now && endDate > TDEEndDate) {
            TDEEndDate = endDate;
            return true;
        }

        return false;
    }

    ////////////////////////////////////////
    //  @des Function to extend pre-tde   //
    //  @param new crowdsale start date   //
    ////////////////////////////////////////
    function extendPRETDE(uint256 startDate)
        onlyCofounders
        returns (bool)
    {
        // Make sure that the new date is past the existing date and
        // is not in the past.
        if (startDate > now && startDate > TDEStartDate) {
            TDEEndDate = TDEEndDate + (startDate-TDEStartDate); // Move end date the same amount of days as start date
            TDEStartDate = startDate; // set new start date
            return true;
        }

        return false;
    }

    //////////////////////////////////////////////////////
    //  @des Function to change multisig address.       //
    //  @param newAddress Address of new multisig.      //
    //////////////////////////////////////////////////////
    function changeDNNHoldingMultisig(address newAddress)
        onlyCofounders
    {
        dnnHoldingMultisig = newAddress;
    }

    //////////////////////////////////////////
    // @des ETH balance of each contributor //
    //////////////////////////////////////////
    function contributorETHBalance(address _owner)
      constant
      returns (uint256 balance)
    {
        return ETHContributions[_owner];
    }

    ////////////////////////////////////////////////////////////
    // @des Determines if an address is a pre-TDE contributor //
    ////////////////////////////////////////////////////////////
    function isAwaitingPRETDETokens(address _contributorAddress)
       internal
       returns (bool)
    {
        return PRETDEContributorTokensPendingRelease[_contributorAddress] > 0;
    }

    /////////////////////////////////////////////////////////////
    // @des Returns pending presale tokens for a given address //
    /////////////////////////////////////////////////////////////
    function getPendingPresaleTokens(address _contributor)
        constant
        returns (uint256)
    {
        return PRETDEContributorTokensPendingRelease[_contributor];
    }

    ////////////////////////////////
    // @des Returns current bonus //
    ////////////////////////////////
    function getCurrentTDEBonus()
        constant
        returns (uint256)
    {
        return getTDETokenExchangeRate(now);
    }


    ////////////////////////////////
    // @des Returns current bonus //
    ////////////////////////////////
    function getCurrentPRETDEBonus()
        constant
        returns (uint256)
    {
        return getPRETDETokenExchangeRate(now);
    }

    ///////////////////////////////////////////////////////////////////////
    // @des Returns bonus (in atto-DNN) per wei for the specific moment //
    // @param timestamp Time of purchase (in seconds)                    //
    ///////////////////////////////////////////////////////////////////////
    function getTDETokenExchangeRate(uint256 timestamp)
        constant
        returns (uint256)
    {
        // No bonus - TDE ended
        if (timestamp > TDEEndDate) {
            return uint256(0);
        }

        // No bonus - TDE has not started
        if (TDEStartDate > timestamp) {
            return uint256(0);
        }

        // Bonus One --> 0 - 25% of raise
        if (tdeFundsRaisedInWei <= rangeETHAmount) {
            return tokenExchangeRateBase.mul(120).div(100);
        }
        // Bonus Two --> 25% - 50% of raise
        else if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {
            return tokenExchangeRateBase.mul(130).div(100);
        }
        // Bonus Three --> 50% - 75% of raise
        else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {
            return tokenExchangeRateBase.mul(140).div(100);
        }
        // Bonus Four --> 75% - 100% of raise
        else if (tdeFundsRaisedInWei > rangeETHAmount.mul(3) && tdeFundsRaisedInWei <= maximumFundingGoalInETH) {
            return tokenExchangeRateBase.mul(150).div(100);
        }
        else {
            return tokenExchangeRateBase;
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // @des Returns bonus (in atto-DNN) per wei for the specific contribution amount //
    // @param weiamount The amount of wei being contributed                           //
    ////////////////////////////////////////////////////////////////////////////////////
    function getPRETDETokenExchangeRate(uint256 weiamount)
        constant
        returns (uint256)
    {
        // Presale will only accept contributions above minimum
        if (weiamount < minimumPRETDEContributionInWei) {
            return uint256(0);
        }

        // Minimum Contribution - 199 ETH (25% Bonus)
        if (weiamount >= minimumPRETDEContributionInWei && weiamount <= 199 ether) {
            return tokenExchangeRateBase + tokenExchangeRateBase.mul(25).div(100);

        // 200 ETH - 300 ETH Bonus (30% Bonus)
        } else if (weiamount >= 200 ether && weiamount <= 300 ether) {
            return tokenExchangeRateBase + tokenExchangeRateBase.mul(30).div(100);

        // 301 ETH - 2665 ETH Bonus (35% Bonus)
        } else if (weiamount >= 301 ether && weiamount <= 2665 ether) {
            return tokenExchangeRateBase + tokenExchangeRateBase.mul(35).div(100);

        // 2666+ ETH Bonus (50% Bonus)
        } else {
            return tokenExchangeRateBase + tokenExchangeRateBase.mul(50).div(100);
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////
    // @des Computes how many tokens a buyer is entitled to based on contribution and time. //
    //////////////////////////////////////////////////////////////////////////////////////////
    function calculateTokens(uint256 weiamount, uint256 timestamp)
        constant
        returns (uint256)
    {
        // Compute how many atto-DNN user is entitled to.
        uint256 computedTokensForPurchase = weiamount.mul(timestamp >= TDEStartDate ? getTDETokenExchangeRate(timestamp) : getPRETDETokenExchangeRate(weiamount));

        // Amount of atto-DNN to issue
        return computedTokensForPurchase;
     }


    ///////////////////////////////////////////////////////////////
    // @des Issues tokens for users who made purchase with ETH   //
    // @param beneficiary Address the tokens will be issued to.  //
    // @param weiamount ETH amount (in Wei)                      //
    // @param timestamp Time of purchase (in seconds)            //
    ///////////////////////////////////////////////////////////////
    function buyTokens()
        internal
        ContributionIsAtLeastMinimum
        ContributionDoesNotCauseGoalExceedance
        TDEBonusesDoesNotCauseTokenExceedance
        returns (bool)
    {
        // Determine how many tokens should be issued
        uint256 tokenCount = calculateTokens(msg.value, now);

         // Bonus Four
        if (tdeFundsRaisedInWei > rangeETHAmount.mul(3) && tdeFundsRaisedInWei <= maximumFundingGoalInETH) {
            if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
                TDEContributorInitialBonusByAddress[msg.sender] = tdeFundsRaisedInWei;
                TDEContributorAddresses[TDEContributorCount] = msg.sender;
                TDEContributorCount++;
            }
        }
        // Bonus Three
        else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {
            if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
                TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount.mul(3);
                TDEContributorAddresses[TDEContributorCount] = msg.sender;
                TDEContributorCount++;
            }
        }
        // Bonus Two
        else if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {
            if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
                TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount.mul(2);
                TDEContributorAddresses[TDEContributorCount] = msg.sender;
                TDEContributorCount++;
            }
        }
        // Bonus One
        else if (tdeFundsRaisedInWei <= rangeETHAmount) {
            if (TDEContributorInitialBonusByAddress[msg.sender] == 0) {
                TDEContributorInitialBonusByAddress[msg.sender] = rangeETHAmount;
                TDEContributorAddresses[TDEContributorCount] = msg.sender;
                TDEContributorCount++;
            }
        }

        // Keep track of tokens issued within each range
        // Bonus Four
        if (TDEContributorInitialBonusByAddress[msg.sender] == tdeFundsRaisedInWei) {
            tokensIssuedForBonusRangeFour = tokensIssuedForBonusRangeFour.add(tokenCount);
        }
        // Bonus Three
        else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount.mul(3)) {
            tokensIssuedForBonusRangeThree = tokensIssuedForBonusRangeThree.add(tokenCount);
        }
        // Bonus Two
        else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount.mul(2)) {
            tokensIssuedForBonusRangeTwo = tokensIssuedForBonusRangeTwo.add(tokenCount);
        }
        // Bonus One
        else if (TDEContributorInitialBonusByAddress[msg.sender] == rangeETHAmount) {
            tokensIssuedForBonusRangeOne = tokensIssuedForBonusRangeOne.add(tokenCount);
        }

        // Get total tokens distributed plus bonuses
        uint256 tokensDistributedPlusBonuses = getTokensDistributedPlusTrickleDownBonuses();

        // Make sure we have enough tokens to satisfy the transaction
        if (tokensDistributedPlusBonuses > dnnToken.TDESupplyRemaining()) {
            revert();
        }

        // Update total amount of tokens distributed (in atto-DNN)
        tokensDistributed = tokensDistributed.add(tokenCount);

        // Keep track of contributions (in Wei)
        ETHContributions[msg.sender] = ETHContributions[msg.sender].add(msg.value);

        // Keep track of how much tokens are issued to each contributor
        ETHContributorTokens[msg.sender] = ETHContributorTokens[msg.sender].add(tokenCount);

        // Increase total funds raised by contribution
        fundsRaisedInWei = fundsRaisedInWei.add(msg.value);

        // Increase tde total funds raised by contribution
        tdeFundsRaisedInWei = tdeFundsRaisedInWei.add(msg.value);

        // Determine which token allocation we should be deducting from
        DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;

        // Attempt to issue tokens to contributor
        if (!dnnToken.issueTokens(msg.sender, tokenCount, allocationType)) {
            revert();
        }

        // Transfer funds to multisig
        dnnHoldingMultisig.transfer(msg.value);

        return true;
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    // @des Issues tokens for users who made purchase without using ETH during presale.   //
    // @param beneficiary Address the tokens will be issued to.                           //
    // @param weiamount ETH amount (in Wei)                                               //
    ////////////////////////////////////////////////////////////////////////////////////////
    function buyPRETDETokensWithoutETH(address beneficiary, uint256 weiamount, uint256 tokenCount)
        onlyCofounders
        IsNotAwaitingPRETDETokens(beneficiary)
        returns (bool)
    {

          // Keep track of how much tokens are issued to each contributor
          ETHContributorTokens[beneficiary] = ETHContributorTokens[beneficiary].add(tokenCount);

          // Keep track of contributions (in Wei)
          ETHContributions[beneficiary] = ETHContributions[beneficiary].add(weiamount);

          // Increase total funds raised by contribution
          fundsRaisedInWei = fundsRaisedInWei.add(weiamount);

          // Keep track of presale funds in addition, separately
          presaleFundsRaisedInWei = presaleFundsRaisedInWei.add(weiamount);

          // Add these tokens to the total amount of tokens this contributor is entitled to
          PRETDEContributorTokensPendingRelease[beneficiary] = PRETDEContributorTokensPendingRelease[beneficiary].add(tokenCount);

          // Incrment number of pre-tde contributors waiting for tokens
          PRETDEContributorsTokensPendingCount += 1;

          // Send tokens to contibutor
          return issuePRETDETokens(beneficiary);
      }

      ////////////////////////////////////////////////////////////////////////////////////////////
      // @des Issues tokens for users who made purchase without using ETH during public sale.   //
      // @param beneficiary Address the tokens will be issued to.                               //
      // @param weiamount ETH amount (in Wei)                                                   //
      ////////////////////////////////////////////////////////////////////////////////////////////
      function buyTDETokensWithoutETH(address beneficiary, uint256 weiamount, uint256 tokenCount)
          onlyCofounders
          returns (bool)
      {
            // Get total tokens distributed plus bonuses
            uint256 tokensDistributedPlusBonuses = tokenCount.add(getTokensDistributedPlusTrickleDownBonuses());

            // Make sure we have enough tokens to satisfy the transaction
            if (tokensDistributedPlusBonuses > dnnToken.TDESupplyRemaining()) {
                revert();
            }

            // Keep track of how much tokens are issued to each contributor
            ETHContributorTokens[beneficiary] = ETHContributorTokens[beneficiary].add(tokenCount);

            // Keep track of contributions (in Wei)
            ETHContributions[beneficiary] = ETHContributions[beneficiary].add(weiamount);

            // Increase total funds raised by contribution
            fundsRaisedInWei = fundsRaisedInWei.add(weiamount);

            // Keep track of tde funds in addition, separately
            tdeFundsRaisedInWei = tdeFundsRaisedInWei.add(weiamount);

            // Send tokens to contibutor
            return issueTDETokens(beneficiary, tokenCount);
        }

      ///////////////////////////////////////////////////////////////
      // @des Issues bulk token purchases                          //
      // @param beneficiary Address the tokens will be issued to.  //
      ///////////////////////////////////////////////////////////////
      function issueTDETokens(address beneficiary, uint256 tokenCount)
          internal
          returns (bool)
      {

          // Update total amount of tokens distributed (in atto-DNN)
          tokensDistributed = tokensDistributed.add(tokenCount);

          // Allocation type will be PRETDESupplyAllocation
          DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;

          // Attempt to issue tokens
          if (!dnnToken.issueTokens(beneficiary, tokenCount, allocationType)) {
              revert();
          }

          return true;
      }

    ///////////////////////////////////////////////////////////////
    // @des Issues pending tokens to pre-tde contributor         //
    // @param beneficiary Address the tokens will be issued to.  //
    ///////////////////////////////////////////////////////////////
    function issuePRETDETokens(address beneficiary)
        onlyCofounders
        PRETDEContributorsAwaitingTokens
        HasPendingPRETDETokens(beneficiary)
        returns (bool)
    {
        // Amount of tokens to credit pre-tde contributor
        uint256 tokenCount = PRETDEContributorTokensPendingRelease[beneficiary];

        // Update total amount of tokens distributed (in atto-DNN)
        tokensDistributed = tokensDistributed.add(tokenCount);

        // Allocation type will be PRETDESupplyAllocation
        DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.PRETDESupplyAllocation;

        // Attempt to issue tokens
        if (!dnnToken.issueTokens(beneficiary, tokenCount, allocationType)) {
            revert();
        }

        // Reduce number of pre-tde contributors waiting for tokens
        PRETDEContributorsTokensPendingCount -= 1;

        // Denote that tokens have been issued for this pre-tde contributor
        PRETDEContributorTokensPendingRelease[beneficiary] = 0;

        return true;
    }

    /////////////////////////////////////
    // @des Issue trickle down bonuses //
    /////////////////////////////////////
    function releaseTrickleDownBonuses()
      onlyCofounders
    {
        // Issue trickle down bonuses if we have not already done so
        if (trickleDownBonusesReleased == false) {

            // Determine which token allocation we should be deducting from
            DNNToken.DNNSupplyAllocations allocationType = DNNToken.DNNSupplyAllocations.TDESupplyAllocation;

            // Temporary reference to contribution
            address contributorAddress;

            // Temporary reference to contributor bonus tokens
            uint256 bonusTokens;

            // Iterate through contributors
            for (uint256 iteration=0; iteration < TDEContributorCount; iteration++) {

                // No bonus tokens to issue until contribute range and funds raised
                // are determined.
                bonusTokens = 0;

                // If we have at least reached the bonus 2 range, issue bonuses to everyone in bonus 1
                if (tdeFundsRaisedInWei > rangeETHAmount && tdeFundsRaisedInWei <= rangeETHAmount.mul(2)) {

                    // Contributor address to send tokens to
                    contributorAddress = TDEContributorAddresses[iteration];

                    // Issue a range 2 bonus if the contributor was in range 1
                    if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(130).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }

                    // Issue tokens to contributor address if bonus applies
                    if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
                        revert();
                    }
                }

                // If we have at least reached the bonus 3 range, issue bonuses to everyone in bonus 1 & 2
                else if (tdeFundsRaisedInWei > rangeETHAmount.mul(2) && tdeFundsRaisedInWei <= rangeETHAmount.mul(3)) {

                    // Contributor address to send tokens to
                    contributorAddress = TDEContributorAddresses[iteration];

                    // Issue a range 2 and range 3 bonus if the contributor was in range 1
                    if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(170).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }
                    // Issue a range 3 bonus if the contributor was in range 2
                    else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(2)) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(140).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }

                    // Issue tokens to contributor address if bonus applies
                    if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
                        revert();
                    }
                }

                // If we have at least reached the bonus 4 range, issue bonuses to everyone in bonus 1, 2, & 3
                else if (tdeFundsRaisedInWei > rangeETHAmount.mul(3)) {

                    // Contributor address to send tokens to
                    contributorAddress = TDEContributorAddresses[iteration];

                    // Issue a range 2 and range 3 bonus if the contributor was in range 1
                    if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(220).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }
                    // Issue a range 3 bonus if the contributor was in range 2
                    else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(2)) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(190).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }
                    // Issue a range 3 bonus if the contributor was in range 2
                    else if (TDEContributorInitialBonusByAddress[contributorAddress] == rangeETHAmount.mul(3)) {
                        bonusTokens = ETHContributorTokens[contributorAddress].mul(150).div(100).sub(ETHContributorTokens[contributorAddress]);
                    }

                    // Issue tokens to contributor address if bonus applies
                    if (bonusTokens > 0 && !dnnToken.issueTokens(contributorAddress, bonusTokens, allocationType)) {
                        revert();
                    }
                }
            }

            // Mark down that bonuses have been released
            trickleDownBonusesReleased = true;
        }
    }

    /////////////////////////////////
    // @des Marks TDE as completed //
    /////////////////////////////////
    function finalizeTDE()
       onlyCofounders
       TDEHasEnded
    {
        // Check if the tokens are locked and all pre-sale tokens have been
        // transferred to the TDE Supply before unlocking tokens.
        require(dnnToken.tokensLocked() == true && dnnToken.PRETDESupplyRemaining() == 0);

        // Release Bonuses
        releaseTrickleDownBonuses();

        // Unlock tokens
        dnnToken.unlockTokens();

        // Update tokens distributed
        tokensDistributed += dnnToken.TDESupplyRemaining();

        // Transfer unsold TDE tokens to platform
        dnnToken.sendUnsoldTDETokensToPlatform();
    }


    ////////////////////////////////////////////////////////////////////////////////
    // @des Marks pre-TDE as completed by moving remaining tokens into TDE supply //
    ////////////////////////////////////////////////////////////////////////////////
    function finalizePRETDE()
       onlyCofounders
       NoPRETDEContributorsAwaitingTokens
    {
        // Check if we have tokens to transfer to TDE
        require(dnnToken.PRETDESupplyRemaining() > 0);

        // Transfer unsold TDE tokens to platform
        dnnToken.sendUnsoldPRETDETokensToTDE();
    }


    ///////////////////////////////
    // @des Contract constructor /xw/
    ///////////////////////////////
    function DNNTDE()
    {
        // Hard Cap
        uint256 hardCap = 35000;

        // Set token address
        dnnToken = DNNToken(0x9D9832d1beb29CC949d75D61415FD00279f84Dc2);

        // Set cofounder addresses
        cofounderA = 0x3Cf26a9FE33C219dB87c2e50572e50803eFb2981;
        cofounderB = 0x9FFE2aD5D76954C7C25be0cEE30795279c4Cab9f;

        // Set DNN holding address
        dnnHoldingMultisig = 0x5980a47514a0Af79a8d2F6276f8673a006ec9929;

        // Set hard cap
        maximumFundingGoalInETH = hardCap * 1 ether;

        // Range ETH
        rangeETHAmount = hardCap.div(bonusRangeCount) * 1 ether;

        // Set Start Date
        TDEStartDate = 1529020801;

        // Set End date (Make sure the end date is at least 30 days from start date)
        // Will default to a date that is exactly 30 days from start date.
        TDEEndDate = (TDEStartDate + 35 days);
    }

    /////////////////////////////////////////////////////////
    // @des Handle's ETH sent directly to contract address //
    /////////////////////////////////////////////////////////
    function () payable {

        // Handle pre-sale contribution (tokens held, until tx confirmation from contributor)
        // Makes sure the user sends minimum PRE-TDE contribution, and that  pre-tde contributors
        // are unable to send subsequent ETH contributors before being issued tokens.
        if (now < TDEStartDate && msg.value >= minimumPRETDEContributionInWei && PRETDEContributorTokensPendingRelease[msg.sender] == 0) {

            // Keep track of contributions (in Wei)
            ETHContributions[msg.sender] = ETHContributions[msg.sender].add(msg.value);

            // Increase total funds raised by contribution
            fundsRaisedInWei = fundsRaisedInWei.add(msg.value);

            // Keep track of presale funds in addition, separately
            presaleFundsRaisedInWei = presaleFundsRaisedInWei.add(msg.value);

            /// Make a note of how many tokens this user should get for their contribution to the presale
            PRETDEContributorTokensPendingRelease[msg.sender] = PRETDEContributorTokensPendingRelease[msg.sender].add(calculateTokens(msg.value, now));

            // Keep track of pending tokens
            TokensPurchasedDuringPRETDE += calculateTokens(msg.value, now);

            // Increment number of pre-tde contributors waiting for tokens
            PRETDEContributorsTokensPendingCount += 1;

            // Prevent contributions that will cause us to have a shortage of tokens during the pre-sale
            if (TokensPurchasedDuringPRETDE > dnnToken.TDESupplyRemaining()+dnnToken.PRETDESupplyRemaining()) {
                revert();
            }

            // Transfer contribution directly to multisig
            dnnHoldingMultisig.transfer(msg.value);
        }

        // Handle public-sale contribution (tokens issued immediately)
        else if (now >= TDEStartDate && now < TDEEndDate) buyTokens();

        // Otherwise, reject the contribution
        else revert();
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeFour","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"endDate","type":"uint256"}],"name":"extendTDE","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"TDEContributorAddresses","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalizeTDE","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensDistributed","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"bonusRangeCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPRETDEBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeTwo","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"TDEContributorInitialBonusByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tdeFundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTDEBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEEndDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"releaseTrickleDownBonuses","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"cofounderB","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_contributor","type":"address"}],"name":"getPendingPresaleTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"trickleDownBonusesReleased","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"weiamount","type":"uint256"},{"name":"tokenCount","type":"uint256"}],"name":"buyPRETDETokensWithoutETH","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeCofounderA","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalizePRETDE","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenExchangeRateBase","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeDNNHoldingMultisig","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"weiamount","type":"uint256"},{"name":"tokenCount","type":"uint256"}],"name":"buyTDETokensWithoutETH","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEContributorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"contributorETHBalance","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"weiamount","type":"uint256"}],"name":"getPRETDETokenExchangeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"weiamount","type":"uint256"},{"name":"timestamp","type":"uint256"}],"name":"calculateTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dnnHoldingMultisig","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"changeCofounderB","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeOne","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"startDate","type":"uint256"}],"name":"extendPRETDE","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TDEStartDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maximumFundingGoalInETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"issuePRETDETokens","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"rangeETHAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumTDEContributionInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensIssuedForBonusRangeThree","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumPRETDEContributionInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"presaleFundsRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getTokensDistributedPlusTrickleDownBonuses","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"cofounderA","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dnnToken","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getTDETokenExchangeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"}]

6060604052610bb86006556000600781905566038d7ea4c68000600855674563918244f40000600955600b819055600c819055600d819055601181905560128190556013805460ff191690556014819055600460155560168190556019819055601a819055601b819055601c5534156200007857600080fd5b5b60008054600160a060020a0319908116739d9832d1beb29cc949d75d61415fd00279f84dc217909155600180548216733cf26a9fe33c219db87c2e50572e50803efb2981179055600280548216739ffe2ad5d76954c7c25be0cee30795279c4cab9f17905560038054909116735980a47514a0af79a8d2f6276f8673a006ec99291790556907695a92c20d6fe00000600a556015546188b8906200012d9082906401000000006200266f6200015282021704565b670de0b6b3a764000002601455635b230181600455635b5126016005555b506200016f565b60008082848115156200016157fe5b0490508091505b5092915050565b6127a8806200017f6000396000f300606060405236156101f35763ffffffff60e060020a60003504166307df3fa481146104455780630b1aff481461046a5780630c6c9036146104945780631485ffc4146104c6578063152e84a7146104db5780631c054b141461050057806324c4c9e4146105255780632a2729741461054a5780633cc0048f1461056f57806343581c80146105a057806347c8cc69146105c55780634bfa0d11146105ea5780634e77a38e1461060f57806351290d0614610624578063540cf75e146106535780635a32d0701461068457806365e16933146106ab5780636b0f182e146106e45780636d156add146107055780636eaefc871461071a57806371f115521461073f5780637374b013146107605780637e569e661461079957806385d51d19146107be5780638efa00e2146107ef578063903cc583146108175780639199a8bb14610842578063941993f814610871578063949eabff146108925780639e90ce6c146108b7578063a1bc76d1146108dc578063a785b96a14610906578063af20b9641461092b578063cd9679dd14610950578063d1b1b65a14610983578063d903c5ae146109a8578063d951d39a146109cd578063e0f4a1a2146109f2578063e380575a14610a17578063ee73c11714610a3c578063f05aa33414610a61578063fa508d3e14610a90578063fed0311814610abf575b5b6004544210801561020757506009543410155b80156102295750600160a060020a033316600090815260106020526040902054155b1561041657600160a060020a0333166000908152600e6020526040902054610257903463ffffffff610ae716565b600160a060020a0333166000908152600e6020526040902055600b54610283903463ffffffff610ae716565b600b55600c54610299903463ffffffff610ae716565b600c556102ce6102a93442610b01565b600160a060020a0333166000908152601060205260409020549063ffffffff610ae716565b600160a060020a0333166000908152601060205260409020556102f13442610b01565b60128054909101905560118054600101905560008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561034c57600080fd5b6102c65a03f1151561035d57600080fd5b505050604051805160008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103b357600080fd5b6102c65a03f115156103c457600080fd5b505050604051805190500160125411156103dd57600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561041157600080fd5b610441565b6004544210158015610429575060055442105b1561043c57610436610b43565b50610441565b600080fd5b5b5b005b341561045057600080fd5b6104586111b4565b60405190815260200160405180910390f35b341561047557600080fd5b6104806004356111ba565b604051901515815260200160405180910390f35b341561049f57600080fd5b6104aa60043561121f565b604051600160a060020a03909116815260200160405180910390f35b34156104d157600080fd5b61044161123a565b005b34156104e657600080fd5b610458611490565b60405190815260200160405180910390f35b341561050b57600080fd5b610458611496565b60405190815260200160405180910390f35b341561053057600080fd5b61045861149c565b60405190815260200160405180910390f35b341561055557600080fd5b6104586114ad565b60405190815260200160405180910390f35b341561057a57600080fd5b610458600160a060020a03600435166114b3565b60405190815260200160405180910390f35b34156105ab57600080fd5b6104586114c5565b60405190815260200160405180910390f35b34156105d057600080fd5b6104586114cb565b60405190815260200160405180910390f35b34156105f557600080fd5b6104586114dc565b60405190815260200160405180910390f35b341561061a57600080fd5b6104416114e2565b005b341561062f57600080fd5b6104aa611b3a565b604051600160a060020a03909116815260200160405180910390f35b341561065e57600080fd5b610458600160a060020a0360043516611b49565b60405190815260200160405180910390f35b341561068f57600080fd5b610480611b68565b604051901515815260200160405180910390f35b34156106b657600080fd5b610480600160a060020a0360043516602435604435611b71565b604051901515815260200160405180910390f35b34156106ef57600080fd5b610441600160a060020a0360043516611cd3565b005b341561071057600080fd5b610441611d0e565b005b341561072557600080fd5b610458611e18565b60405190815260200160405180910390f35b341561074a57600080fd5b610441600160a060020a0360043516611e1e565b005b341561076b57600080fd5b610480600160a060020a0360043516602435604435611e74565b604051901515815260200160405180910390f35b34156107a457600080fd5b610458611ff5565b60405190815260200160405180910390f35b34156107c957600080fd5b610458600160a060020a0360043516611ffb565b60405190815260200160405180910390f35b34156107fa57600080fd5b61045860043561201a565b60405190815260200160405180910390f35b341561082257600080fd5b610458600435602435610b01565b60405190815260200160405180910390f35b341561084d57600080fd5b6104aa61216c565b604051600160a060020a03909116815260200160405180910390f35b341561087c57600080fd5b610441600160a060020a036004351661217b565b005b341561089d57600080fd5b6104586121b6565b60405190815260200160405180910390f35b34156108c257600080fd5b6104586121bc565b60405190815260200160405180910390f35b34156108e757600080fd5b6104806004356121c2565b604051901515815260200160405180910390f35b341561091157600080fd5b610458612235565b60405190815260200160405180910390f35b341561093657600080fd5b61045861223b565b60405190815260200160405180910390f35b341561095b57600080fd5b610480600160a060020a0360043516612241565b604051901515815260200160405180910390f35b341561098e57600080fd5b6104586123ca565b60405190815260200160405180910390f35b34156109b357600080fd5b6104586123d0565b60405190815260200160405180910390f35b34156109d857600080fd5b6104586123d6565b60405190815260200160405180910390f35b34156109fd57600080fd5b6104586123dc565b60405190815260200160405180910390f35b3415610a2257600080fd5b6104586123e2565b60405190815260200160405180910390f35b3415610a4757600080fd5b6104586123e8565b60405190815260200160405180910390f35b3415610a6c57600080fd5b6104aa61248f565b604051600160a060020a03909116815260200160405180910390f35b3415610a9b57600080fd5b6104aa61249e565b604051600160a060020a03909116815260200160405180910390f35b3415610aca57600080fd5b6104586004356124ad565b60405190815260200160405180910390f35b600082820183811015610af657fe5b8091505b5092915050565b600080610b36600454841015610b1f57610b1a8561201a565b610b28565b610b28846124ad565b5b859063ffffffff61264016565b90508091505b5092915050565b6000806000806008543410151515610b5a57600080fd5b600b54600a543490910190811115610b7157600080fd5b6000610b7b6123e8565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bc957600080fd5b6102c65a03f11515610bda57600080fd5b505050604051805182109050610bef57600080fd5b610bf93442610b01565b601454909550610c1090600363ffffffff61264016565b600d54118015610c245750600a54600d5411155b15610c9657600160a060020a0333166000908152601860205260409020541515610c9157600d54600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454610caa90600263ffffffff61264016565b600d54118015610ccf5750601454610cc990600363ffffffff61264016565b600d5411155b15610d5257600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600363ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d54118015610d7a5750601454610d7490600263ffffffff61264016565b600d5411155b15610dfd57600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600263ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d5411610e7057600160a060020a0333166000908152601860205260409020541515610e7057601454600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b5b5b5b5b600d54600160a060020a0333166000908152601860205260409020541415610eb157601c54610ea9908663ffffffff610ae716565b601c55610f86565b601454610ec590600363ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610eff57601b54610ef7908663ffffffff610ae716565b601b55610f86565b601454610f1390600263ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610f4d57601a54610f45908663ffffffff610ae716565b601a55610f86565b601454600160a060020a0333166000908152601860205260409020541415610f8657601954610f82908663ffffffff610ae716565b6019555b5b5b5b610f916123e8565b60008054919550600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fdf57600080fd5b6102c65a03f11515610ff057600080fd5b5050506040518051905084111561100657600080fd5b600754611019908663ffffffff610ae716565b600755600160a060020a0333166000908152600e6020526040902054611045903463ffffffff610ae716565b600160a060020a0333166000908152600e6020908152604080832093909355600f9052205461107a908663ffffffff610ae716565b600160a060020a0333166000908152600f6020526040902055600b546110a6903463ffffffff610ae716565b600b55600d546110bc903463ffffffff610ae716565b600d556000805460029450600160a060020a03169063237d262890339088908790604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561112457fe5b60ff1681526020019350505050602060405180830381600087803b151561114a57600080fd5b6102c65a03f1151561115b57600080fd5b50505060405180519050151561117057600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f1935050505015156111a457600080fd5b600195505b5b505b505b50505090565b601c5481565b60015460009033600160a060020a03908116911614806111e8575060025433600160a060020a039081169116145b15156111f357600080fd5b4282118015611203575060055482115b15611215575060058190556001611219565b5060005b5b919050565b601760205260009081526040902054600160a060020a031681565b60015433600160a060020a0390811691161480611265575060025433600160a060020a039081169116145b151561127057600080fd5b600554421015806112855750600a54600b5410155b151561129057600080fd5b60008054600160a060020a03169063a1feba4290604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112d957600080fd5b6102c65a03f115156112ea57600080fd5b5050506040518051151560011490508015611366575060008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561134957600080fd5b6102c65a03f1151561135a57600080fd5b50505060405180511590505b151561137157600080fd5b6113796114e2565b600054600160a060020a031663f968f4936040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b857600080fd5b6102c65a03f115156113c957600080fd5b505060008054600160a060020a031691506356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561141557600080fd5b6102c65a03f1151561142657600080fd5b505050604051805160078054909101905550600054600160a060020a03166359b796106040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60075481565b60155481565b60006114a74261201a565b90505b90565b601a5481565b60186020526000908152604090205481565b600d5481565b60006114a7426124ad565b90505b90565b60055481565b60015460009081908190819033600160a060020a0390811691161480611516575060025433600160a060020a039081169116145b151561152157600080fd5b60135460ff161515611b3257506002925060005b601654811015611b245760009150601454600d5411801561156b575060145461156590600263ffffffff61264016565b600d5411155b156116b057600081815260176020908152604080832054601454600160a060020a03909116808552601890935292205490945014156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608263ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546116c490600263ffffffff61264016565b600d541180156116e957506014546116e390600363ffffffff61264016565b600d5411155b156118b457600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561177457600160a060020a0383166000908152600f602052604090205461176d906115e360646115d78360aa63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91506115f2565b60145461178890600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608c63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546118c890600363ffffffff61264016565b600d541115611b1857600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561195757600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360dc63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b60145461196b90600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156119dc57600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360be63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b6014546119f090600363ffffffff61264016565b600160a060020a0384166000908152601860205260409020541415611a5d57600160a060020a0383166000908152600f6020526040902054611a5a906115e360646115d783609663ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b5b600082118015611b0e575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001826006811115611acb57fe5b60ff1681526020019350505050602060405180830381600087803b1515611af157600080fd5b6102c65a03f11515611b0257600080fd5b50505060405180519050155b15611b1857600080fd5b5b5b5b5b600101611535565b6013805460ff191660011790555b5b5b50505050565b600254600160a060020a031681565b600160a060020a0381166000908152601060205260409020545b919050565b60135460ff1681565b60015460009033600160a060020a0390811691161480611b9f575060025433600160a060020a039081169116145b1515611baa57600080fd5b600160a060020a038416600090815260106020526040902054849015611bcf57600080fd5b600160a060020a0385166000908152600f6020526040902054611bf8908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611c2d908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611c59908563ffffffff610ae716565b600b55600c54611c6f908563ffffffff610ae716565b600c55600160a060020a038516600090815260106020526040902054611c9b908463ffffffff610ae716565b600160a060020a038616600090815260106020526040902055601180546001019055611cc685612241565b91505b5b505b9392505050565b60015433600160a060020a03908116911614611cee57600080fd5b60018054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a0390811691161480611d39575060025433600160a060020a039081169116145b1515611d4457600080fd5b60115415611d5157600080fd5b60008054600160a060020a031663c269f26382604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b50505060405180519050111515611dc057600080fd5b600054600160a060020a031663ce21abf36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60065481565b60015433600160a060020a0390811691161480611e49575060025433600160a060020a039081169116145b1515611e5457600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600154600090819033600160a060020a0390811691161480611ea4575060025433600160a060020a039081169116145b1515611eaf57600080fd5b611ec7611eba6123e8565b849063ffffffff610ae716565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611f1557600080fd5b6102c65a03f11515611f2657600080fd5b50505060405180519050811115611f3c57600080fd5b600160a060020a0385166000908152600f6020526040902054611f65908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611f9a908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611fc6908563ffffffff610ae716565b600b55600d54611fdc908563ffffffff610ae716565b600d55611cc685846126a2565b91505b5b509392505050565b60165481565b600160a060020a0381166000908152600e60205260409020545b919050565b600060095482101561202e57506000611219565b60095482101580156120495750680ac9ae05a71ebc00008211155b156120805761207560646115d7601960065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b680ad78ebc5ac620000082101580156120a25750681043561a88293000008211155b156120d95761207560646115d7601e60065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b68105136d13bd094000082101580156120fb57506890784df439900400008211155b156121325761207560646115d7602360065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b61207560646115d7603260065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b5b5b5b919050565b600354600160a060020a031681565b60025433600160a060020a0390811691161461219657600080fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b600b5481565b60195481565b60015460009033600160a060020a03908116911614806121f0575060025433600160a060020a039081169116145b15156121fb57600080fd5b428211801561220b575060045482115b156112155750600480546005805491840390910190558190556001611219565b5060005b5b919050565b60045481565b600a5481565b6001546000908190819033600160a060020a0390811691161480612273575060025433600160a060020a039081169116145b151561227e57600080fd5b6011546000901161228e57600080fd5b600160a060020a038416600090815260106020526040902054849015156122b457600080fd5b600160a060020a0385166000908152601060205260409020546007549093506122e3908463ffffffff610ae716565b6007556000805460019350600160a060020a03169063237d262890879086908690604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561234b57fe5b60ff1681526020019350505050602060405180830381600087803b151561237157600080fd5b6102c65a03f1151561238257600080fd5b50505060405180519050151561239757600080fd5b60118054600019019055600160a060020a038516600090815260106020526040812055600193505b5b505b5b5050919050565b60145481565b60085481565b601b5481565b60095481565b600c5481565b600061241160646115d76064601c5461264090919063ffffffff16565b9063ffffffff61266f16565b61243860646115d76096601b5461264090919063ffffffff16565b9063ffffffff61266f16565b61245f60646115d760be601a5461264090919063ffffffff16565b9063ffffffff61266f16565b61248660646115d760dc60195461264090919063ffffffff16565b9063ffffffff61266f16565b01010190505b90565b600154600160a060020a031681565b600054600160a060020a031681565b60006005548211156124c157506000611219565b8160045411156124d357506000611219565b601454600d541161250c5761250560646115d7607860065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b601454600d54118015612534575060145461252e90600263ffffffff61264016565b600d5411155b156125675761250560646115d7608260065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b60145461257b90600263ffffffff61264016565b600d541180156125a0575060145461259a90600363ffffffff61264016565b600d5411155b156125d35761250560646115d7608c60065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b6014546125e790600363ffffffff61264016565b600d541180156125fb5750600a54600d5411155b1561262e5761250560646115d7609660065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b50600654611219565b5b5b5b5b919050565b600082820283158061265c575082848281151561265957fe5b04145b1515610af657fe5b8091505b5092915050565b600080828481151561267d57fe5b0490508091505b5092915050565b60008282111561269757fe5b508082035b92915050565b6000806126ba83600754610ae790919063ffffffff16565b6007555060008054600291600160a060020a039091169063237d262890869086908590604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561272457fe5b60ff1681526020019350505050602060405180830381600087803b151561274a57600080fd5b6102c65a03f1151561275b57600080fd5b50505060405180519050151561277057600080fd5b600191505b50929150505600a165627a7a723058203a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f4380029

Deployed Bytecode

0x606060405236156101f35763ffffffff60e060020a60003504166307df3fa481146104455780630b1aff481461046a5780630c6c9036146104945780631485ffc4146104c6578063152e84a7146104db5780631c054b141461050057806324c4c9e4146105255780632a2729741461054a5780633cc0048f1461056f57806343581c80146105a057806347c8cc69146105c55780634bfa0d11146105ea5780634e77a38e1461060f57806351290d0614610624578063540cf75e146106535780635a32d0701461068457806365e16933146106ab5780636b0f182e146106e45780636d156add146107055780636eaefc871461071a57806371f115521461073f5780637374b013146107605780637e569e661461079957806385d51d19146107be5780638efa00e2146107ef578063903cc583146108175780639199a8bb14610842578063941993f814610871578063949eabff146108925780639e90ce6c146108b7578063a1bc76d1146108dc578063a785b96a14610906578063af20b9641461092b578063cd9679dd14610950578063d1b1b65a14610983578063d903c5ae146109a8578063d951d39a146109cd578063e0f4a1a2146109f2578063e380575a14610a17578063ee73c11714610a3c578063f05aa33414610a61578063fa508d3e14610a90578063fed0311814610abf575b5b6004544210801561020757506009543410155b80156102295750600160a060020a033316600090815260106020526040902054155b1561041657600160a060020a0333166000908152600e6020526040902054610257903463ffffffff610ae716565b600160a060020a0333166000908152600e6020526040902055600b54610283903463ffffffff610ae716565b600b55600c54610299903463ffffffff610ae716565b600c556102ce6102a93442610b01565b600160a060020a0333166000908152601060205260409020549063ffffffff610ae716565b600160a060020a0333166000908152601060205260409020556102f13442610b01565b60128054909101905560118054600101905560008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561034c57600080fd5b6102c65a03f1151561035d57600080fd5b505050604051805160008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156103b357600080fd5b6102c65a03f115156103c457600080fd5b505050604051805190500160125411156103dd57600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f19350505050151561041157600080fd5b610441565b6004544210158015610429575060055442105b1561043c57610436610b43565b50610441565b600080fd5b5b5b005b341561045057600080fd5b6104586111b4565b60405190815260200160405180910390f35b341561047557600080fd5b6104806004356111ba565b604051901515815260200160405180910390f35b341561049f57600080fd5b6104aa60043561121f565b604051600160a060020a03909116815260200160405180910390f35b34156104d157600080fd5b61044161123a565b005b34156104e657600080fd5b610458611490565b60405190815260200160405180910390f35b341561050b57600080fd5b610458611496565b60405190815260200160405180910390f35b341561053057600080fd5b61045861149c565b60405190815260200160405180910390f35b341561055557600080fd5b6104586114ad565b60405190815260200160405180910390f35b341561057a57600080fd5b610458600160a060020a03600435166114b3565b60405190815260200160405180910390f35b34156105ab57600080fd5b6104586114c5565b60405190815260200160405180910390f35b34156105d057600080fd5b6104586114cb565b60405190815260200160405180910390f35b34156105f557600080fd5b6104586114dc565b60405190815260200160405180910390f35b341561061a57600080fd5b6104416114e2565b005b341561062f57600080fd5b6104aa611b3a565b604051600160a060020a03909116815260200160405180910390f35b341561065e57600080fd5b610458600160a060020a0360043516611b49565b60405190815260200160405180910390f35b341561068f57600080fd5b610480611b68565b604051901515815260200160405180910390f35b34156106b657600080fd5b610480600160a060020a0360043516602435604435611b71565b604051901515815260200160405180910390f35b34156106ef57600080fd5b610441600160a060020a0360043516611cd3565b005b341561071057600080fd5b610441611d0e565b005b341561072557600080fd5b610458611e18565b60405190815260200160405180910390f35b341561074a57600080fd5b610441600160a060020a0360043516611e1e565b005b341561076b57600080fd5b610480600160a060020a0360043516602435604435611e74565b604051901515815260200160405180910390f35b34156107a457600080fd5b610458611ff5565b60405190815260200160405180910390f35b34156107c957600080fd5b610458600160a060020a0360043516611ffb565b60405190815260200160405180910390f35b34156107fa57600080fd5b61045860043561201a565b60405190815260200160405180910390f35b341561082257600080fd5b610458600435602435610b01565b60405190815260200160405180910390f35b341561084d57600080fd5b6104aa61216c565b604051600160a060020a03909116815260200160405180910390f35b341561087c57600080fd5b610441600160a060020a036004351661217b565b005b341561089d57600080fd5b6104586121b6565b60405190815260200160405180910390f35b34156108c257600080fd5b6104586121bc565b60405190815260200160405180910390f35b34156108e757600080fd5b6104806004356121c2565b604051901515815260200160405180910390f35b341561091157600080fd5b610458612235565b60405190815260200160405180910390f35b341561093657600080fd5b61045861223b565b60405190815260200160405180910390f35b341561095b57600080fd5b610480600160a060020a0360043516612241565b604051901515815260200160405180910390f35b341561098e57600080fd5b6104586123ca565b60405190815260200160405180910390f35b34156109b357600080fd5b6104586123d0565b60405190815260200160405180910390f35b34156109d857600080fd5b6104586123d6565b60405190815260200160405180910390f35b34156109fd57600080fd5b6104586123dc565b60405190815260200160405180910390f35b3415610a2257600080fd5b6104586123e2565b60405190815260200160405180910390f35b3415610a4757600080fd5b6104586123e8565b60405190815260200160405180910390f35b3415610a6c57600080fd5b6104aa61248f565b604051600160a060020a03909116815260200160405180910390f35b3415610a9b57600080fd5b6104aa61249e565b604051600160a060020a03909116815260200160405180910390f35b3415610aca57600080fd5b6104586004356124ad565b60405190815260200160405180910390f35b600082820183811015610af657fe5b8091505b5092915050565b600080610b36600454841015610b1f57610b1a8561201a565b610b28565b610b28846124ad565b5b859063ffffffff61264016565b90508091505b5092915050565b6000806000806008543410151515610b5a57600080fd5b600b54600a543490910190811115610b7157600080fd5b6000610b7b6123e8565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bc957600080fd5b6102c65a03f11515610bda57600080fd5b505050604051805182109050610bef57600080fd5b610bf93442610b01565b601454909550610c1090600363ffffffff61264016565b600d54118015610c245750600a54600d5411155b15610c9657600160a060020a0333166000908152601860205260409020541515610c9157600d54600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454610caa90600263ffffffff61264016565b600d54118015610ccf5750601454610cc990600363ffffffff61264016565b600d5411155b15610d5257600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600363ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d54118015610d7a5750601454610d7490600263ffffffff61264016565b600d5411155b15610dfd57600160a060020a0333166000908152601860205260409020541515610c9157601454610d0790600263ffffffff61264016565b600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b610e70565b601454600d5411610e7057600160a060020a0333166000908152601860205260409020541515610e7057601454600160a060020a03331660008181526018602090815260408083209490945560168054835260179091529290208054600160a060020a0319169091179055805460010190555b5b5b5b5b600d54600160a060020a0333166000908152601860205260409020541415610eb157601c54610ea9908663ffffffff610ae716565b601c55610f86565b601454610ec590600363ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610eff57601b54610ef7908663ffffffff610ae716565b601b55610f86565b601454610f1390600263ffffffff61264016565b600160a060020a0333166000908152601860205260409020541415610f4d57601a54610f45908663ffffffff610ae716565b601a55610f86565b601454600160a060020a0333166000908152601860205260409020541415610f8657601954610f82908663ffffffff610ae716565b6019555b5b5b5b610f916123e8565b60008054919550600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610fdf57600080fd5b6102c65a03f11515610ff057600080fd5b5050506040518051905084111561100657600080fd5b600754611019908663ffffffff610ae716565b600755600160a060020a0333166000908152600e6020526040902054611045903463ffffffff610ae716565b600160a060020a0333166000908152600e6020908152604080832093909355600f9052205461107a908663ffffffff610ae716565b600160a060020a0333166000908152600f6020526040902055600b546110a6903463ffffffff610ae716565b600b55600d546110bc903463ffffffff610ae716565b600d556000805460029450600160a060020a03169063237d262890339088908790604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561112457fe5b60ff1681526020019350505050602060405180830381600087803b151561114a57600080fd5b6102c65a03f1151561115b57600080fd5b50505060405180519050151561117057600080fd5b600354600160a060020a03163480156108fc0290604051600060405180830381858888f1935050505015156111a457600080fd5b600195505b5b505b505b50505090565b601c5481565b60015460009033600160a060020a03908116911614806111e8575060025433600160a060020a039081169116145b15156111f357600080fd5b4282118015611203575060055482115b15611215575060058190556001611219565b5060005b5b919050565b601760205260009081526040902054600160a060020a031681565b60015433600160a060020a0390811691161480611265575060025433600160a060020a039081169116145b151561127057600080fd5b600554421015806112855750600a54600b5410155b151561129057600080fd5b60008054600160a060020a03169063a1feba4290604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112d957600080fd5b6102c65a03f115156112ea57600080fd5b5050506040518051151560011490508015611366575060008054600160a060020a03169063c269f26390604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561134957600080fd5b6102c65a03f1151561135a57600080fd5b50505060405180511590505b151561137157600080fd5b6113796114e2565b600054600160a060020a031663f968f4936040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156113b857600080fd5b6102c65a03f115156113c957600080fd5b505060008054600160a060020a031691506356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561141557600080fd5b6102c65a03f1151561142657600080fd5b505050604051805160078054909101905550600054600160a060020a03166359b796106040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60075481565b60155481565b60006114a74261201a565b90505b90565b601a5481565b60186020526000908152604090205481565b600d5481565b60006114a7426124ad565b90505b90565b60055481565b60015460009081908190819033600160a060020a0390811691161480611516575060025433600160a060020a039081169116145b151561152157600080fd5b60135460ff161515611b3257506002925060005b601654811015611b245760009150601454600d5411801561156b575060145461156590600263ffffffff61264016565b600d5411155b156116b057600081815260176020908152604080832054601454600160a060020a03909116808552601890935292205490945014156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608263ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546116c490600263ffffffff61264016565b600d541180156116e957506014546116e390600363ffffffff61264016565b600d5411155b156118b457600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561177457600160a060020a0383166000908152600f602052604090205461176d906115e360646115d78360aa63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91506115f2565b60145461178890600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156115f257600160a060020a0383166000908152600f60205260409020546115ef906115e360646115d783608c63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b6000821180156116a1575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561165e57fe5b60ff1681526020019350505050602060405180830381600087803b151561168457600080fd5b6102c65a03f1151561169557600080fd5b50505060405180519050155b156116ab57600080fd5b611b18565b6014546118c890600363ffffffff61264016565b600d541115611b1857600081815260176020908152604080832054601454600160a060020a039091168085526018909352922054909450141561195757600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360dc63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b60145461196b90600263ffffffff61264016565b600160a060020a03841660009081526018602052604090205414156119dc57600160a060020a0383166000908152600f6020526040902054611950906115e360646115d78360be63ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b9150611a5d565b6014546119f090600363ffffffff61264016565b600160a060020a0384166000908152601860205260409020541415611a5d57600160a060020a0383166000908152600f6020526040902054611a5a906115e360646115d783609663ffffffff61264016565b9063ffffffff61266f16565b9063ffffffff61268b16565b91505b5b5b600082118015611b0e575060008054600160a060020a03169063237d262890859085908890604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001826006811115611acb57fe5b60ff1681526020019350505050602060405180830381600087803b1515611af157600080fd5b6102c65a03f11515611b0257600080fd5b50505060405180519050155b15611b1857600080fd5b5b5b5b5b600101611535565b6013805460ff191660011790555b5b5b50505050565b600254600160a060020a031681565b600160a060020a0381166000908152601060205260409020545b919050565b60135460ff1681565b60015460009033600160a060020a0390811691161480611b9f575060025433600160a060020a039081169116145b1515611baa57600080fd5b600160a060020a038416600090815260106020526040902054849015611bcf57600080fd5b600160a060020a0385166000908152600f6020526040902054611bf8908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611c2d908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611c59908563ffffffff610ae716565b600b55600c54611c6f908563ffffffff610ae716565b600c55600160a060020a038516600090815260106020526040902054611c9b908463ffffffff610ae716565b600160a060020a038616600090815260106020526040902055601180546001019055611cc685612241565b91505b5b505b9392505050565b60015433600160a060020a03908116911614611cee57600080fd5b60018054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a0390811691161480611d39575060025433600160a060020a039081169116145b1515611d4457600080fd5b60115415611d5157600080fd5b60008054600160a060020a031663c269f26382604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d9957600080fd5b6102c65a03f11515611daa57600080fd5b50505060405180519050111515611dc057600080fd5b600054600160a060020a031663ce21abf36040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b5050505b5b5b565b60065481565b60015433600160a060020a0390811691161480611e49575060025433600160a060020a039081169116145b1515611e5457600080fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b600154600090819033600160a060020a0390811691161480611ea4575060025433600160a060020a039081169116145b1515611eaf57600080fd5b611ec7611eba6123e8565b849063ffffffff610ae716565b60008054919250600160a060020a03909116906356996f6b90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611f1557600080fd5b6102c65a03f11515611f2657600080fd5b50505060405180519050811115611f3c57600080fd5b600160a060020a0385166000908152600f6020526040902054611f65908463ffffffff610ae716565b600160a060020a0386166000908152600f6020908152604080832093909355600e90522054611f9a908563ffffffff610ae716565b600160a060020a0386166000908152600e6020526040902055600b54611fc6908563ffffffff610ae716565b600b55600d54611fdc908563ffffffff610ae716565b600d55611cc685846126a2565b91505b5b509392505050565b60165481565b600160a060020a0381166000908152600e60205260409020545b919050565b600060095482101561202e57506000611219565b60095482101580156120495750680ac9ae05a71ebc00008211155b156120805761207560646115d7601960065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b680ad78ebc5ac620000082101580156120a25750681043561a88293000008211155b156120d95761207560646115d7601e60065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b68105136d13bd094000082101580156120fb57506890784df439900400008211155b156121325761207560646115d7602360065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b61207560646115d7603260065461264090919063ffffffff16565b9063ffffffff61266f16565b600654019050611219565b5b5b5b919050565b600354600160a060020a031681565b60025433600160a060020a0390811691161461219657600080fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b600b5481565b60195481565b60015460009033600160a060020a03908116911614806121f0575060025433600160a060020a039081169116145b15156121fb57600080fd5b428211801561220b575060045482115b156112155750600480546005805491840390910190558190556001611219565b5060005b5b919050565b60045481565b600a5481565b6001546000908190819033600160a060020a0390811691161480612273575060025433600160a060020a039081169116145b151561227e57600080fd5b6011546000901161228e57600080fd5b600160a060020a038416600090815260106020526040902054849015156122b457600080fd5b600160a060020a0385166000908152601060205260409020546007549093506122e3908463ffffffff610ae716565b6007556000805460019350600160a060020a03169063237d262890879086908690604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561234b57fe5b60ff1681526020019350505050602060405180830381600087803b151561237157600080fd5b6102c65a03f1151561238257600080fd5b50505060405180519050151561239757600080fd5b60118054600019019055600160a060020a038516600090815260106020526040812055600193505b5b505b5b5050919050565b60145481565b60085481565b601b5481565b60095481565b600c5481565b600061241160646115d76064601c5461264090919063ffffffff16565b9063ffffffff61266f16565b61243860646115d76096601b5461264090919063ffffffff16565b9063ffffffff61266f16565b61245f60646115d760be601a5461264090919063ffffffff16565b9063ffffffff61266f16565b61248660646115d760dc60195461264090919063ffffffff16565b9063ffffffff61266f16565b01010190505b90565b600154600160a060020a031681565b600054600160a060020a031681565b60006005548211156124c157506000611219565b8160045411156124d357506000611219565b601454600d541161250c5761250560646115d7607860065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b601454600d54118015612534575060145461252e90600263ffffffff61264016565b600d5411155b156125675761250560646115d7608260065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b60145461257b90600263ffffffff61264016565b600d541180156125a0575060145461259a90600363ffffffff61264016565b600d5411155b156125d35761250560646115d7608c60065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b6014546125e790600363ffffffff61264016565b600d541180156125fb5750600a54600d5411155b1561262e5761250560646115d7609660065461264090919063ffffffff16565b9063ffffffff61266f16565b9050611219565b50600654611219565b5b5b5b5b919050565b600082820283158061265c575082848281151561265957fe5b04145b1515610af657fe5b8091505b5092915050565b600080828481151561267d57fe5b0490508091505b5092915050565b60008282111561269757fe5b508082035b92915050565b6000806126ba83600754610ae790919063ffffffff16565b6007555060008054600291600160a060020a039091169063237d262890869086908590604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200182600681111561272457fe5b60ff1681526020019350505050602060405180830381600087803b151561274a57600080fd5b6102c65a03f1151561275b57600080fd5b50505060405180519050151561277057600080fd5b600191505b50929150505600a165627a7a723058203a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f4380029

Swarm Source

bzzr://3a46fb9836ae542f547f449c2dc40e33938e90c9c14188dbb192fbdc0002f438

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.