Contract 0xe814aee960a85208c3db542c53e7d4a6c8d5f60f

 

TxHash Block Age From To Value [TxFee]
0x6d134344dfa36c64d2929144287b0e4837b1988d2ce8861253b2f7585b2afcc672318171 day 8 hrs ago0x09f06be3597096158bbe9b3a2ec82340569a0945  IN   ChronoLogic_Day0 Ether0.014015153
0x334abb03d3f1d49b539b9e7fc54b31e00c38b53f64294f145742736432de226572256092 days 20 hrs ago0xa8332c5c6dd0cb945cd574d73fbdd5624eec65d2  IN   ChronoLogic_Day0 Ether0.000185072
0xddad2bebb09eb854cea0fbeaa79e3132e251172949517f051490a55059d86ea272256092 days 20 hrs ago0xa8332c5c6dd0cb945cd574d73fbdd5624eec65d2  IN   ChronoLogic_Day0 Ether0.000185072
0xa5f0cd217cb2e4bf815f6fdd22fd87aad5733a666e6ad99c63e72e82c7b83b6672246953 days 1 hr ago0x1c2f9392a119d1fad06c934ee9b7c07ea7778257  IN   ChronoLogic_Day0 Ether0.001165353
0x8d1c077144b8e763f5a9aa105cdce641295f8f275413935284dfdfcb0fb19e4672179504 days 16 hrs ago0xae085f56bffcc4b3cc36de49519f3185e09e64e7  IN   ChronoLogic_Day0 Ether0.00669585
0x9a39548b90d83b252ae7a4c71a5c7e2b4258c0814a87525e94e0c25218b3017372139745 days 15 hrs ago0xc536cc6ff386970ba248b7eaa615580d750f2018  IN   ChronoLogic_Day0 Ether0.00096875
0xf0a446bd659a2a7169bb962341548241d70db381b897f8ab94476a1c496de6d472139405 days 15 hrs ago0xc536cc6ff386970ba248b7eaa615580d750f2018  IN   ChronoLogic_Day0 Ether0.0008
0x9e2aeca04c2d037d46f3f2711594c920c00e55504625fc5bc3ee3d201f3a3e7872101756 days 13 hrs ago0xc536cc6ff386970ba248b7eaa615580d750f2018  IN   ChronoLogic_Day0 Ether0.0008
0xc74a1a94d49f7ce55609ad919a7584cd99a7b1c218ae5776b80e589f1f052daf71953059 days 21 hrs ago0xe58ea8a73b6d7386fbb397d155b3e979d3c65187  IN   ChronoLogic_Day0 Ether0.000162484
0x4132ecef98c3cf59f76aa48d067fd9e9520d7f27b7e6e7c659d58e03097cea03717986713 days 40 mins ago0x9275bc962b54467b90022582631fcb07f4ac2cbc  IN   ChronoLogic_Day0 Ether0.00619856
0x1dadfb2d0cdd953da5c8747489e95cdd5a84942e48dcc1ea5bd1d95f0336e40e717984213 days 46 mins ago0x9275bc962b54467b90022582631fcb07f4ac2cbc  IN   ChronoLogic_Day0 Ether0.001
0x46532b7abb50f0a869d80e1ef289597aa6ae115d42c167f8104ce003cbb68dee717823313 days 8 hrs ago0x1e7a4e1a6859be8279b1a6abbb67b7a858baf772  IN   ChronoLogic_Day0 Ether0.00155906
0x645d459ab66f54f50f67e3d5fe9b326f61568a62da0f06a27ca1c84e9940252d717244114 days 12 hrs ago0x89174a102f1adba064db5324198902b2ee7952eb  IN   ChronoLogic_Day0 Ether0.000040429
0xeb608377967e0e9167c9d3f494b779b3355d5e6fa3ec2de176bdf16027838cd3716982115 days 1 hr agoHitBTC_2  IN   ChronoLogic_Day0 Ether0.0003052115
0x8a2650046793cf14c6661ec21c3d2a16332ea5313b1cdbe22b165a28d0459853715910917 days 6 hrs agoHitBTC_2  IN   ChronoLogic_Day0 Ether0.00076628
0xefd442c92ea8fff8f3feeb55668c4e3d1ef5274f0b7390f5b826742e8773e3e1715823217 days 10 hrs ago0xa25a93f5029e14b8a26b871f353fc9d0762c04ca  IN   ChronoLogic_Day0 Ether0.00041526
0x7686d778caccf801b727d5793590a14cfd729eee3300e8c9cad481a59572f2b8715822517 days 10 hrs agoHitBTC_2  IN   ChronoLogic_Day0 Ether0.00055493
0x73e730943fa029023b7e362c8ef2b3797ae8bafccdb2cd6858bdc83b71be7b3b715803117 days 11 hrs ago0x25de87b3f8d6e5e69319155f84f93571f66e0601  IN   ChronoLogic_Day0 Ether0.00097097
0x4ecf93040e01089453473b596b6ea4d16434e71921276ebb512a8ab5ad9ab552715801217 days 11 hrs ago0x25de87b3f8d6e5e69319155f84f93571f66e0601  IN   ChronoLogic_Day0 Ether0.00149597
0x201278633fc3bb07f3a0b84a58eed5e709a4520d6f397bdcf02ccdeeff7ec25e715799217 days 11 hrs ago0x25de87b3f8d6e5e69319155f84f93571f66e0601  IN   ChronoLogic_Day0 Ether0.00247912
0xa588190dbae6505e2e532a08cbb69cb7a8b2381aa5204fae03db456c72578007715506318 days 2 hrs ago0x38dca470096ff07c74de32ccc8f66c8f89a4dd5f  IN   ChronoLogic_Day0 Ether0.0002307
0xcf61ae28aec0bf7e92b6e784764d9e965704fc0a97bfb5f2378ab09bb05bba63715502518 days 2 hrs ago0x38dca470096ff07c74de32ccc8f66c8f89a4dd5f  IN   ChronoLogic_Day0 Ether0.00018456
0xdb0daec9234926235faf3ff5d32b53c24eaf9e3383e4f02080b819e50d291ea5715436018 days 5 hrs ago0xb067cf553f583314ccb581d42aa8d86f55c8b7d0  IN   ChronoLogic_Day0 Ether0.00110986
0x920c7e4446580bb9f36c3e1243ae155c8cc662b9199db52c7c226ea74e9b73d3715401818 days 7 hrs ago0x72c1aa9a77a7ca00c375363c39858301f65bd973  IN   ChronoLogic_Day0 Ether0.03142044
0xd1c5980a48c84cdefecb3ce0c1420becdfd6923277c05c0c296019d5b9eb0f47715399018 days 7 hrs ago0x72c1aa9a77a7ca00c375363c39858301f65bd973  IN   ChronoLogic_Day0 Ether0.001194412
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Verified Source Code for Contract 0x7268f9c2bc9c9e65b4a16888cb5672531ce8e945
Contract Name: DayToken
Compiler Version: v0.4.16+commit.d7661dd9
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.13; 


////////////////// >>>>> Wallet Contract <<<<< ///////////////////


/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    uint constant public MAX_OWNER_COUNT = 50;

    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    modifier onlyWallet() {
        if (msg.sender != address(this))
            throw;
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        if (isOwner[owner])
            throw;
        _;
    }

    modifier ownerExists(address owner) {
        if (!isOwner[owner])
            throw;
        _;
    }

    modifier transactionExists(uint transactionId) {
        if (transactions[transactionId].destination == 0)
            throw;
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        if (!confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        if (confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notExecuted(uint transactionId) {
        if (transactions[transactionId].executed)
            throw;
        _;
    }

    modifier notNull(address _address) {
        if (_address == 0)
            throw;
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        if (   ownerCount > MAX_OWNER_COUNT
            || _required > ownerCount
            || _required == 0
            || ownerCount == 0)
            throw;
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        payable
    {
        if (msg.value > 0)
            Deposit(msg.sender, msg.value);
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    function MultiSigWallet(address[] _owners, uint _required)
        public
        validRequirement(_owners.length, _required)
    {
        for (uint i=0; i<_owners.length; i++) {
            if (isOwner[_owners[i]] || _owners[i] == 0)
                throw;
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint i=0; i<owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.length -= 1;
        if (required > owners.length)
            changeRequirement(owners.length);
        OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param owner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint i=0; i<owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        OwnerRemoval(owner);
        OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction tx = transactions[transactionId];
            tx.executed = true;
            if (tx.destination.call.value(tx.value)(tx.data))
                Execution(transactionId);
            else {
                ExecutionFailure(transactionId);
                tx.executed = false;
            }
        }
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId)
        public
        constant
        returns (bool)
    {
        uint count = 0;
        for (uint i=0; i<owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
                count += 1;
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        constant
        returns (address[])
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint transactionId)
        public
        constant
        returns (address[] _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        constant
        returns (uint[] _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}


////////////////// >>>>> Library Contracts <<<<< ///////////////////


contract SafeMathLib {
  function safeMul(uint a, uint b) constant returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeSub(uint a, uint b) constant returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) constant returns (uint) {
    uint c = a + b;
    assert(c>=a);
    return c;
  }
}




/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control 
 * functions, this simplifies the implementation of "user permissions". 
 */
contract Ownable {
  address public owner;
  address public newOwner;
  event OwnershipTransferred(address indexed _from, address indexed _to);
  /** 
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() {
    owner = msg.sender;
  }


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

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to. 
   */
  function transferOwnership(address _newOwner) onlyOwner {
    newOwner = _newOwner;
  }

  function acceptOwnership() {
    require(msg.sender == newOwner);
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


////////////////// >>>>> Token Contracts <<<<< ///////////////////

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Basic {
  uint public totalSupply;
  function balanceOf(address _owner) constant returns (uint balance);
  function transfer(address _to, uint _value) returns (bool success);
  event Transfer(address indexed _from, address indexed _to, uint _value);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender) constant returns (uint remaining);
  function transferFrom(address _from, address _to, uint _value) returns (bool success);
  function approve(address _spender, uint _value) returns (bool success);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}



/**
 * Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
 *
 * Based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, SafeMathLib {
  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  /* Actual balances of token holders */
  mapping(address => uint) balances;

  /* approve() allowances */
  mapping (address => mapping (address => uint)) allowed;

  function transfer(address _to, uint _value) returns (bool success) {
    if (balances[msg.sender] >= _value 
        && _value > 0 
        && balances[_to] + _value > balances[_to]
        ) {
      balances[msg.sender] = safeSub(balances[msg.sender],_value);
      balances[_to] = safeAdd(balances[_to],_value);
      Transfer(msg.sender, _to, _value);
      return true;
    }
    else{
      return false;
    }
    
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

    if (balances[_from] >= _value   // From a/c has balance
        && _allowance >= _value    // Transfer approved
        && _value > 0              // Non-zero transfer
        && balances[_to] + _value > balances[_to]  // Overflow check
        ){
    balances[_to] = safeAdd(balances[_to],_value);
    balances[_from] = safeSub(balances[_from],_value);
    allowed[_from][msg.sender] = safeSub(_allowance,_value);
    Transfer(_from, _to, _value);
    return true;
        }
    else {
      return false;
    }
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {

    // 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;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}


    

/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableToken is StandardToken, Ownable {

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state  );

  /**
   * Create new tokens and allocate them to an address..
   *
   * Only callably by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent canMint public {
    totalSupply = safeAdd(totalSupply, amount);
    balances[receiver] = safeAdd(balances[receiver], amount);
    // This will make the mint transaction apper in EtherScan.io
    // We can remove this after there is a standardized minting event
    Transfer(0, receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  modifier onlyMintAgent() {
    // Only crowdsale contracts are allowed to mint new tokens
    require(mintAgents[msg.sender]);
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    require(!mintingFinished);
    _;
  }
}



/**
 * Define interface for releasing the token transfer after a successful crowdsale.
 */
contract ReleasableToken is ERC20, Ownable {

  /* The finalizer contract that allows unlift the transfer limits on this token */
  address public releaseAgent;

  /** A crowdsale contract can release us to the wild if ICO success. 
   * If false we are are in transfer lock up period.
   */
  bool public released = false;

  /** Map of agents that are allowed to transfer tokens regardless of the lock down period. 
   * These are crowdsale contracts and possible the team multisig itself. 
   */
  mapping (address => bool) public transferAgents;

  /**
   * Limit token transfer until the crowdsale is over.
   */
  modifier canTransfer(address _sender) {

    if (!released) {
        require(transferAgents[_sender]);
    }

    _;
  }

  /**
   * Set the contract that can call release and make the token transferable.
   *
   * Design choice. Allow reset the release agent to fix fat finger mistakes.
   */
  function setReleaseAgent(address addr) onlyOwner inReleaseState(false) public {

    // We don't do interface check here as we might want to a normal wallet address to act as a release agent
    releaseAgent = addr;
  }

  /**
   * Owner can allow a particular address (a crowdsale contract) to transfer tokens despite the lock up period.
   */
  function setTransferAgent(address addr, bool state) onlyOwner inReleaseState(false) public {
    transferAgents[addr] = state;
  }

  /**
   * One way function to release the tokens to the wild.
   *
   * Can be called only from the release agent that is the final ICO contract. 
   * It is only called if the crowdsale has been success (first milestone reached).
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    released = true;
  }

  /** The function can be called only before or after the tokens have been releasesd */
  modifier inReleaseState(bool releaseState) {
    require(releaseState == released);
    _;
  }

  /** The function can be called only by a whitelisted release agent. */
  modifier onlyReleaseAgent() {
    require(msg.sender == releaseAgent);
    _;
  }

  function transfer(address _to, uint _value) canTransfer(msg.sender) returns (bool success) {
    // Call StandardToken.transfer()
   return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint _value) canTransfer(_from) returns (bool success) {
    // Call StandardToken.transferForm()
    return super.transferFrom(_from, _to, _value);
  }

}


 

/**
 * Upgrade agent interface inspired by Lunyr.
 *
 * Upgrade agent transfers tokens to a new contract.
 * Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting.
 */
contract UpgradeAgent {
  uint public originalSupply;
  /** Interface marker */
  function isUpgradeAgent() public constant returns (bool) {
    return true;
  }
  function upgradeFrom(address _from, uint256 _value) public;
}

/**
 * A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision.
 *
 * First envisioned by Golem and Lunyr projects.
 */
contract UpgradeableToken is StandardToken {

  /** Contract / person who can set the upgrade path. 
   * This can be the same as team multisig wallet, as what it is with its default value. 
   */
  address public upgradeMaster;

  /** The next contract where the tokens will be migrated. */
  UpgradeAgent public upgradeAgent;

  /** How many tokens we have upgraded by now. */
  uint256 public totalUpgraded;

  /**
   * Upgrade states.
   *
   * - NotAllowed: The child contract has not reached a condition where the upgrade can bgun
   * - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet
   * - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet
   * - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens
   *
   */
  enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading}

  /**
   * Somebody has upgraded some of their tokens.
   */
  event Upgrade(address indexed _from, address indexed _to, uint256 _value);

  /**
   * New upgrade agent available.
   */
  event UpgradeAgentSet(address agent);

  /**
   * Do not allow construction without upgrade master set.
   */
  function UpgradeableToken(address _upgradeMaster) {
    upgradeMaster = _upgradeMaster;
  }

  /**
   * Allow the token holder to upgrade some of their tokens to a new contract.
   */
  function upgrade(uint256 value) public {
    UpgradeState state = getUpgradeState();
    require((state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading));
    // Validate input value.
    require(value!=0);

    balances[msg.sender] = safeSub(balances[msg.sender],value);

    // Take tokens out from circulation
    totalSupply = safeSub(totalSupply,value);
    totalUpgraded = safeAdd(totalUpgraded,value);

    // Upgrade agent reissues the tokens
    upgradeAgent.upgradeFrom(msg.sender, value);
    Upgrade(msg.sender, upgradeAgent, value);
  }

  /**
   * Set an upgrade agent that handles
   */
  function setUpgradeAgent(address agent) external {
    require(canUpgrade());
    require(agent != 0x0);
    // Only a master can designate the next agent
    require(msg.sender == upgradeMaster);
    // Upgrade has already begun for an agent
    require(getUpgradeState() != UpgradeState.Upgrading);

    upgradeAgent = UpgradeAgent(agent);

    // Bad interface
    require(upgradeAgent.isUpgradeAgent());
    // Make sure that token supplies match in source and target
    require(upgradeAgent.originalSupply() == totalSupply);

    UpgradeAgentSet(upgradeAgent);
  }

  /**
   * Get the state of the token upgrade.
   */
  function getUpgradeState() public constant returns(UpgradeState) {
    if (!canUpgrade()) return UpgradeState.NotAllowed;
    else if(address(upgradeAgent) == 0x00) return UpgradeState.WaitingForAgent;
    else if(totalUpgraded == 0) return UpgradeState.ReadyToUpgrade;
    else return UpgradeState.Upgrading;
  }

  /**
   * Change the upgrade master.
   *
   * This allows us to set a new owner for the upgrade mechanism.
   */
  function setUpgradeMaster(address master) public {
    require(master != 0x0);
    require(msg.sender == upgradeMaster);
    upgradeMaster = master;
  }

  /**
   * Child contract can enable to provide the condition when the upgrade can begun.
   */
  function canUpgrade() public constant returns(bool) {
     return true;
  }

}


/**
 * A crowdsale token.
 *
 * An ERC-20 token designed specifically for crowdsales with investor protection and 
 * further development path.
 *
 * - The token transfer() is disabled until the crowdsale is over
 * - The token contract gives an opt-in upgrade path to a new contract
 * - The same token can be part of several crowdsales through approve() mechanism
 * - The token can be capped (supply set in the constructor) 
 *   or uncapped (crowdsale contract can mint new tokens)
 */
contract DayToken is  ReleasableToken, MintableToken, UpgradeableToken {

    enum sellingStatus {NOTONSALE, EXPIRED, ONSALE}

    /** Basic structure for a contributor with a minting Address
     * adr address of the contributor
     * initialContributionDay initial contribution of the contributor in wei
     * lastUpdatedOn day count from Minting Epoch when the account balance was last updated
     * mintingPower Initial Minting power of the address
     * expiryBlockNumber Variable to mark end of Minting address sale. Set by user
     * minPriceInDay minimum price of Minting address in Day tokens. Set by user
     * status Selling status Variable for transfer Minting address.
     * sellingPriceInDay Variable for transfer Minting address. Price at which the address is actually sold
     */ 
    struct Contributor {
        address adr;
        uint256 initialContributionDay;
        uint256 lastUpdatedOn; //Day from Minting Epoch
        uint256 mintingPower;
        uint expiryBlockNumber;
        uint256 minPriceInDay;
        sellingStatus status;
    }

    /* Stores maximum days for which minting will happen since minting epoch */
    uint256 public maxMintingDays = 1095;

    /* Mapping to store id of each minting address */
    mapping (address => uint) public idOf;
    /* Mapping from id of each minting address to their respective structures */
    mapping (uint256 => Contributor) public contributors;
    /* mapping to store unix timestamp of when the minting address is issued to each team member */
    mapping (address => uint256) public teamIssuedTimestamp;
    mapping (address => bool) public soldAddresses;
    mapping (address => uint256) public sellingPriceInDayOf;

    /* Stores the id of the first  contributor */
    uint256 public firstContributorId;
    /* Stores total Pre + Post ICO TimeMints */
    uint256 public totalNormalContributorIds;
    /* Stores total Normal TimeMints allocated */
    uint256 public totalNormalContributorIdsAllocated = 0;
    
    /* Stores the id of the first team TimeMint */
    uint256 public firstTeamContributorId;
    /* Stores the total team TimeMints */
    uint256 public totalTeamContributorIds;
    /* Stores total team TimeMints allocated */
    uint256 public totalTeamContributorIdsAllocated = 0;

    /* Stores the id of the first Post ICO contributor (for auctionable TimeMints) */
    uint256 public firstPostIcoContributorId;
    /* Stores total Post ICO TimeMints (for auction) */
    uint256 public totalPostIcoContributorIds;
    /* Stores total Auction TimeMints allocated */
    uint256 public totalPostIcoContributorIdsAllocated = 0;

    /* Maximum number of address */
    uint256 public maxAddresses;

    /* Min Minting power with 19 decimals: 0.5% : 5000000000000000000 */
    uint256 public minMintingPower;
    /* Max Minting power with 19 decimals: 1% : 10000000000000000000 */
    uint256 public maxMintingPower;
    /* Halving cycle in days (88) */
    uint256 public halvingCycle; 
    /* Unix timestamp when minting is to be started */
    uint256 public initialBlockTimestamp;
    /* Flag to prevent setting initialBlockTimestamp more than once */
    bool public isInitialBlockTimestampSet;
    /* number of decimals in minting power */
    uint256 public mintingDec; 

    /* Minimum Balance in Day tokens required to sell a minting address */
    uint256 public minBalanceToSell;
    /* Team address lock down period from issued time, in seconds */
    uint256 public teamLockPeriodInSec;  //Initialize and set function
    /* Duration in secs that we consider as a day. (For test deployment purposes, 
       if we want to decrease length of a day. default: 84600)*/
    uint256 public DayInSecs;

    event UpdatedTokenInformation(string newName, string newSymbol); 
    event MintingAdrTransferred(uint id, address from, address to);
    event ContributorAdded(address adr, uint id);
    event TimeMintOnSale(uint id, address seller, uint minPriceInDay, uint expiryBlockNumber);
    event TimeMintSold(uint id, address buyer, uint offerInDay);
    event PostInvested(address investor, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);
    
    event TeamAddressAdded(address teamAddress, uint id);
    // Tell us invest was success
    event Invested(address receiver, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);

    modifier onlyContributor(uint id){
        require(isValidContributorId(id));
        _;
    }

    string public name; 

    string public symbol; 

    uint8 public decimals; 

    /**
        * Construct the token.
        *
        * This token must be created through a team multisig wallet, so that it is owned by that wallet.
        *
        * @param _name Token name
        * @param _symbol Token symbol - should be all caps
        * @param _initialSupply How many tokens we start with
        * @param _decimals Number of decimal places
        * _mintable Are new tokens created over the crowdsale or do we distribute only the initial supply?
        */
    function DayToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals, 
        bool _mintable, uint _maxAddresses, uint _firstTeamContributorId, uint _totalTeamContributorIds, 
        uint _totalPostIcoContributorIds, uint256 _minMintingPower, uint256 _maxMintingPower, uint _halvingCycle, 
        uint256 _minBalanceToSell, uint256 _dayInSecs, uint256 _teamLockPeriodInSec) 
        UpgradeableToken(msg.sender) {
        
        // Create any address, can be transferred
        // to team multisig via changeOwner(),
        // also remember to call setUpgradeMaster()
        owner = msg.sender; 
        name = _name; 
        symbol = _symbol;  
        totalSupply = _initialSupply; 
        decimals = _decimals; 
        // Create initially all balance on the team multisig
        balances[owner] = totalSupply; 
        maxAddresses = _maxAddresses;
        require(maxAddresses > 1); // else division by zero will occur in setInitialMintingPowerOf
        
        firstContributorId = 1;
        totalNormalContributorIds = maxAddresses - _totalTeamContributorIds - _totalPostIcoContributorIds;

        // check timeMint total is sane
        require(totalNormalContributorIds >= 1);

        firstTeamContributorId = _firstTeamContributorId;
        totalTeamContributorIds = _totalTeamContributorIds;
        totalPostIcoContributorIds = _totalPostIcoContributorIds;
        
        // calculate first contributor id to be auctioned post ICO
        firstPostIcoContributorId = maxAddresses - totalPostIcoContributorIds + 1;
        minMintingPower = _minMintingPower;
        maxMintingPower = _maxMintingPower;
        halvingCycle = _halvingCycle;
        // setting future date far far away, year 2020, 
        // call setInitialBlockTimestamp to set proper timestamp
        initialBlockTimestamp = 1577836800;
        isInitialBlockTimestampSet = false;
        // use setMintingDec to change this
        mintingDec = 19;
        minBalanceToSell = _minBalanceToSell;
        DayInSecs = _dayInSecs;
        teamLockPeriodInSec = _teamLockPeriodInSec;
        
        if (totalSupply > 0) {
            Minted(owner, totalSupply); 
        }

        if (!_mintable) {
            mintingFinished = true; 
            require(totalSupply != 0); 
        }
    }

    /**
    * Used to set timestamp at which minting power of TimeMints is activated
    * Can be called only by owner
    * @param _initialBlockTimestamp timestamp to be set.
    */
    function setInitialBlockTimestamp(uint _initialBlockTimestamp) internal onlyOwner {
        require(!isInitialBlockTimestampSet);
        isInitialBlockTimestampSet = true;
        initialBlockTimestamp = _initialBlockTimestamp;
    }

    /**
    * check if mintining power is activated and Day token and Timemint transfer is enabled
    */
    function isDayTokenActivated() constant returns (bool isActivated) {
        return (block.timestamp >= initialBlockTimestamp);
    }


    /**
    * to check if an id is a valid contributor
    * @param _id contributor id to check.
    */
    function isValidContributorId(uint _id) constant returns (bool isValidContributor) {
        return (_id > 0 && _id <= maxAddresses && contributors[_id].adr != 0 
            && idOf[contributors[_id].adr] == _id); // cross checking
    }

    /**
    * to check if an address is a valid contributor
    * @param _address  contributor address to check.
    */
    function isValidContributorAddress(address _address) constant returns (bool isValidContributor) {
        return isValidContributorId(idOf[_address]);
    }


    /**
    * In case of Team address check if lock-in period is over (returns true for all non team addresses)
    * @param _address team address to check lock in period for.
    */
    function isTeamLockInPeriodOverIfTeamAddress(address _address) constant returns (bool isLockInPeriodOver) {
        isLockInPeriodOver = true;
        if (teamIssuedTimestamp[_address] != 0) {
                if (block.timestamp - teamIssuedTimestamp[_address] < teamLockPeriodInSec)
                    isLockInPeriodOver = false;
        }

        return isLockInPeriodOver;
    }

    /**
    * Used to set mintingDec
    * Can be called only by owner
    * @param _mintingDec bounty to be set.
    */
    function setMintingDec(uint256 _mintingDec) onlyOwner {
        require(!isInitialBlockTimestampSet);
        mintingDec = _mintingDec;
    }

    /**
        * When token is released to be transferable, enforce no new tokens can be created.
        */
    function releaseTokenTransfer() public onlyOwner {
        require(isInitialBlockTimestampSet);
        mintingFinished = true; 
        super.releaseTokenTransfer(); 
    }

    /**
        * Allow upgrade agent functionality kick in only if the crowdsale was success.
        */
    function canUpgrade() public constant returns(bool) {
        return released && super.canUpgrade(); 
    }

    /**
        * Owner can update token information here
        */
    function setTokenInformation(string _name, string _symbol) onlyOwner {
        name = _name; 
        symbol = _symbol; 
        UpdatedTokenInformation(name, symbol); 
    }

    /**
        * Returns the current phase.  
        * Note: Phase starts with 1
        * @param _day Number of days since Minting Epoch
        */
    function getPhaseCount(uint _day) public constant returns (uint phase) {
        phase = (_day/halvingCycle) + 1; 
        return (phase); 
    }
    /**
        * Returns current day number since minting epoch 
        * or zero if initialBlockTimestamp is in future or its DayZero.
        */
    function getDayCount() public constant returns (uint daySinceMintingEpoch) {
        daySinceMintingEpoch = 0;
        if (isDayTokenActivated())
            daySinceMintingEpoch = (block.timestamp - initialBlockTimestamp)/DayInSecs; 

        return daySinceMintingEpoch; 
    }
    /**
        * Calculates and Sets the minting power of a particular id.
        * Called before Minting Epoch by constructor
        * @param _id id of the address whose minting power is to be set.
        */
    function setInitialMintingPowerOf(uint256 _id) internal onlyContributor(_id) {
        contributors[_id].mintingPower = 
            (maxMintingPower - ((_id-1) * (maxMintingPower - minMintingPower)/(maxAddresses-1))); 
    }

    /**
        * Returns minting power of a particular id.
        * @param _id Contribution id whose minting power is to be returned
        */
    function getMintingPowerById(uint _id) public constant returns (uint256 mintingPower) {
        return contributors[_id].mintingPower/(2**(getPhaseCount(getDayCount())-1)); 
    }

    /**
        * Returns minting power of a particular address.
        * @param _adr Address whose minting power is to be returned
        */
    function getMintingPowerByAddress(address _adr) public constant returns (uint256 mintingPower) {
        return getMintingPowerById(idOf[_adr]);
    }


    /**
        * Calculates and returns the balance based on the minting power, day and phase.
        * Can only be called internally
        * Can calculate balance based on last updated.
        * @param _id id whose balnce is to be calculated
        * @param _dayCount day count upto which balance is to be updated
        */
    function availableBalanceOf(uint256 _id, uint _dayCount) internal returns (uint256) {
        uint256 balance = balances[contributors[_id].adr]; 
        uint maxUpdateDays = _dayCount < maxMintingDays ? _dayCount : maxMintingDays;
        uint i = contributors[_id].lastUpdatedOn + 1;
        while(i <= maxUpdateDays) {
             uint phase = getPhaseCount(i);
             uint phaseEndDay = phase * halvingCycle - 1; // as first day is 0
             uint constantFactor = contributors[_id].mintingPower / 2**(phase-1);

            for (uint j = i; j <= phaseEndDay && j <= maxUpdateDays; j++) {
                balance = safeAdd( balance, constantFactor * balance / 10**(mintingDec + 2) );
            }

            i = j;
            
        } 
        return balance; 
    }

    /**
        * Updates the balance of the specified id in its structure and also in the balances[] mapping.
        * returns true if successful.
        * Only for internal calls. Not public.
        * @param _id id whose balance is to be updated.
        */
    function updateBalanceOf(uint256 _id) internal returns (bool success) {
        // check if its contributor
        if (isValidContributorId(_id)) {
            uint dayCount = getDayCount();
            // proceed only if not already updated today
            if (contributors[_id].lastUpdatedOn != dayCount && contributors[_id].lastUpdatedOn < maxMintingDays) {
                address adr = contributors[_id].adr;
                uint oldBalance = balances[adr];
                totalSupply = safeSub(totalSupply, oldBalance);
                uint newBalance = availableBalanceOf(_id, dayCount);
                balances[adr] = newBalance;
                totalSupply = safeAdd(totalSupply, newBalance);
                contributors[_id].lastUpdatedOn = dayCount;
                Transfer(0, adr, newBalance - oldBalance);
                return true; 
            }
        }
        return false;
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified address.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _adr address whose balance is to be returned.
        */
    function balanceOf(address _adr) constant returns (uint balance) {
        uint id = idOf[_adr];
        if (id != 0)
            return balanceById(id);
        else 
            return balances[_adr]; 
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified id.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _id address whose balance is to be returned.
        */
    function balanceById(uint _id) public constant returns (uint256 balance) {
        address adr = contributors[_id].adr; 
        if (isDayTokenActivated()) {
            if (isValidContributorId(_id)) {
                return ( availableBalanceOf(_id, getDayCount()) );
            }
        }
        return balances[adr]; 
    }

    /**
        * Returns totalSupply of DAY tokens.
        */
    function getTotalSupply() public constant returns (uint) {
        return totalSupply;
    }

    /** Function to update balance of a Timemint
        * returns true if balance updated, false otherwise
        * @param _id TimeMint to update
        */
    function updateTimeMintBalance(uint _id) public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(_id);
    }

    /** Function to update balance of sender's Timemint
        * returns true if balance updated, false otherwise
        */
    function updateMyTimeMintBalance() public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(idOf[msg.sender]);
    }

    /**
        * Standard ERC20 function overidden.
        * Used to transfer day tokens from caller's address to another
        * @param _to address to which Day tokens are to be transferred
        * @param _value Number of Day tokens to be transferred
        */
    function transfer(address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());
        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        updateBalanceOf(idOf[msg.sender]);

        // Check sender account has enough balance and transfer amount is non zero
        require ( balanceOf(msg.sender) >= _value && _value != 0 ); 
        
        updateBalanceOf(idOf[_to]);

        balances[msg.sender] = safeSub(balances[msg.sender], _value); 
        balances[_to] = safeAdd(balances[_to], _value); 
        Transfer(msg.sender, _to, _value);

        return true;
    }
    

    /**
        * Standard ERC20 Standard Token function overridden. Added Team address vesting period lock. 
        */
    function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(_from));

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

        updateBalanceOf(idOf[_from]);

        // Check from account has enough balance, transfer amount is non zero 
        // and _value is allowed to be transferred
        require ( balanceOf(_from) >= _value && _value != 0  &&  _value <= _allowance); 

        updateBalanceOf(idOf[_to]);

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


    /** 
        * Add any contributor structure (For every kind of contributors: Team/Pre-ICO/ICO/Test)
        * @param _adr Address of the contributor to be added  
        * @param _initialContributionDay Initial Contribution of the contributor to be added
        */
  function addContributor(uint contributorId, address _adr, uint _initialContributionDay) internal onlyOwner {
        require(contributorId <= maxAddresses);
        //address should not be an existing contributor
        require(!isValidContributorAddress(_adr));
        //TimeMint should not be already allocated
        require(!isValidContributorId(contributorId));
        contributors[contributorId].adr = _adr;
        idOf[_adr] = contributorId;
        setInitialMintingPowerOf(contributorId);
        contributors[contributorId].initialContributionDay = _initialContributionDay;
        contributors[contributorId].lastUpdatedOn = getDayCount();
        ContributorAdded(_adr, contributorId);
        contributors[contributorId].status = sellingStatus.NOTONSALE;
    }


    /** Function to be called by minting addresses in order to sell their address
        * @param _minPriceInDay Minimum price in DAY tokens set by the seller
        * @param _expiryBlockNumber Expiry Block Number set by the seller
        */
    function sellMintingAddress(uint256 _minPriceInDay, uint _expiryBlockNumber) public returns (bool) {
        require(isDayTokenActivated());
        require(_expiryBlockNumber > block.number);

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        uint id = idOf[msg.sender];
        require(contributors[id].status == sellingStatus.NOTONSALE);

        // update balance of sender address before checking for minimum required balance
        updateBalanceOf(id);
        require(balances[msg.sender] >= minBalanceToSell);
        contributors[id].minPriceInDay = _minPriceInDay;
        contributors[id].expiryBlockNumber = _expiryBlockNumber;
        contributors[id].status = sellingStatus.ONSALE;
        balances[msg.sender] = safeSub(balances[msg.sender], minBalanceToSell);
        balances[this] = safeAdd(balances[this], minBalanceToSell);
        Transfer(msg.sender, this, minBalanceToSell);
        TimeMintOnSale(id, msg.sender, contributors[id].minPriceInDay, contributors[id].expiryBlockNumber);
        return true;
    }


    /** Function to be called by minting address in order to cancel the sale of their TimeMint
        */
    function cancelSaleOfMintingAddress() onlyContributor(idOf[msg.sender]) public {
        uint id = idOf[msg.sender];
        // TimeMint should be on sale
        require(contributors[id].status == sellingStatus.ONSALE);
        contributors[id].status = sellingStatus.EXPIRED;
    }


    /** Function to be called by any user to get a list of all On Sale TimeMints
        */
    function getOnSaleIds() constant public returns(uint[]) {
        uint[] memory idsOnSale = new uint[](maxAddresses);
        uint j = 0;
        for(uint i=1; i <= maxAddresses; i++) {

            if ( isValidContributorId(i) &&
                block.number <= contributors[i].expiryBlockNumber && 
                contributors[i].status == sellingStatus.ONSALE ) {
                    idsOnSale[j] = i;
                    j++;     
            }
            
        }
        return idsOnSale;
    }


    /** Function to be called by any user to get status of a Time Mint.
        * returns status 0 - Not on sale, 1 - Expired, 2 - On sale,
        * @param _id ID number of the Time Mint 
        */
    function getSellingStatus(uint _id) constant public returns(sellingStatus status) {
        require(isValidContributorId(_id));
        status = contributors[_id].status;
        if ( block.number > contributors[_id].expiryBlockNumber && 
                status == sellingStatus.ONSALE )
            status = sellingStatus.EXPIRED;

        return status;
    }

    /** Function to be called by any user to buy a onsale address by offering an amount
        * @param _offerId ID number of the address to be bought by the buyer
        * @param _offerInDay Offer given by the buyer in number of DAY tokens
        */
    function buyMintingAddress(uint _offerId, uint256 _offerInDay) public returns(bool) {
        if (contributors[_offerId].status == sellingStatus.ONSALE 
            && block.number > contributors[_offerId].expiryBlockNumber)
        {
            contributors[_offerId].status = sellingStatus.EXPIRED;
        }
        address soldAddress = contributors[_offerId].adr;
        require(contributors[_offerId].status == sellingStatus.ONSALE);
        require(_offerInDay >= contributors[_offerId].minPriceInDay);

        // prevent seller from cancelling sale in between
        contributors[_offerId].status = sellingStatus.NOTONSALE;

        // first get the offered DayToken in the token contract & 
        // then transfer the total sum (minBalanceToSend+_offerInDay) to the seller
        balances[msg.sender] = safeSub(balances[msg.sender], _offerInDay);
        balances[this] = safeAdd(balances[this], _offerInDay);
        Transfer(msg.sender, this, _offerInDay);
        if(transferMintingAddress(contributors[_offerId].adr, msg.sender)) {
            //mark the offer as sold & let seller pull the proceed to their own account.
            sellingPriceInDayOf[soldAddress] = _offerInDay;
            soldAddresses[soldAddress] = true; 
            TimeMintSold(_offerId, msg.sender, _offerInDay);  
        }
        return true;
    }


    /**
        * Transfer minting address from one user to another
        * Gives the transfer-to address, the id of the original address
        * returns true if successful and false if not.
        * @param _to address of the user to which minting address is to be tranferred
        */
    function transferMintingAddress(address _from, address _to) internal onlyContributor(idOf[_from]) returns (bool) {
        require(isDayTokenActivated());

        // _to should be non minting address
        require(!isValidContributorAddress(_to));
        
        uint id = idOf[_from];
        // update balance of from address before transferring minting power
        updateBalanceOf(id);

        contributors[id].adr = _to;
        idOf[_to] = id;
        idOf[_from] = 0;
        contributors[id].initialContributionDay = 0;
        // needed as id is assigned to new address
        contributors[id].lastUpdatedOn = getDayCount();
        contributors[id].expiryBlockNumber = 0;
        contributors[id].minPriceInDay = 0;
        MintingAdrTransferred(id, _from, _to);
        return true;
    }


    /** Function to allow seller to get back their deposited amount of day tokens(minBalanceToSell) and 
        * offer made by buyer after successful sale.
        * Throws if sale is not successful
        */
    function fetchSuccessfulSaleProceed() public  returns(bool) {
        require(soldAddresses[msg.sender] == true);
        // to prevent re-entrancy attack
        soldAddresses[msg.sender] = false;
        uint saleProceed = safeAdd(minBalanceToSell, sellingPriceInDayOf[msg.sender]);
        balances[this] = safeSub(balances[this], saleProceed);
        balances[msg.sender] = safeAdd(balances[msg.sender], saleProceed);
        Transfer(this, msg.sender, saleProceed);
        return true;
                
    }

    /** Function that lets a seller get their deposited day tokens (minBalanceToSell) back, if no buyer turns up.
        * Allowed only after expiryBlockNumber
        * Throws if any other state other than EXPIRED
        */
    function refundFailedAuctionAmount() onlyContributor(idOf[msg.sender]) public returns(bool){
        uint id = idOf[msg.sender];
        if(block.number > contributors[id].expiryBlockNumber && contributors[id].status == sellingStatus.ONSALE)
        {
            contributors[id].status = sellingStatus.EXPIRED;
        }
        require(contributors[id].status == sellingStatus.EXPIRED);
        // reset selling status
        contributors[id].status = sellingStatus.NOTONSALE;
        balances[this] = safeSub(balances[this], minBalanceToSell);
        // update balance of seller address before refunding
        updateBalanceOf(id);
        balances[msg.sender] = safeAdd(balances[msg.sender], minBalanceToSell);
        contributors[id].minPriceInDay = 0;
        contributors[id].expiryBlockNumber = 0;
        Transfer(this, msg.sender, minBalanceToSell);
        return true;
    }


    /** Function to add a team address as a contributor and store it's time issued to calculate vesting period
        * Called by owner
        */
    function addTeamTimeMints(address _adr, uint _id, uint _tokens, bool _isTest) public onlyOwner {
        //check if Id is in range of team Ids
        require(_id >= firstTeamContributorId && _id < firstTeamContributorId + totalTeamContributorIds);
        require(totalTeamContributorIdsAllocated < totalTeamContributorIds);
        addContributor(_id, _adr, 0);
        totalTeamContributorIdsAllocated++;
        // enforce lockin period if not test address
        if(!_isTest) teamIssuedTimestamp[_adr] = block.timestamp;
        mint(_adr, _tokens);
        TeamAddressAdded(_adr, _id);
    }


    /** Function to add reserved aution TimeMints post-ICO. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributorId
        */
    function postAllocateAuctionTimeMints(address _receiver, uint _customerId, uint _id) public onlyOwner {

        //check if Id is in range of Auction Ids
        require(_id >= firstPostIcoContributorId && _id < firstPostIcoContributorId + totalPostIcoContributorIds);
        require(totalPostIcoContributorIdsAllocated < totalPostIcoContributorIds);
        
        require(released == true);
        addContributor(_id, _receiver, 0);
        totalPostIcoContributorIdsAllocated++;
        PostInvested(_receiver, 0, 0, _customerId, _id);
    }


    /** Function to add all contributors except team, test and Auctions TimeMints. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributor id
        * @param _tokens day tokens to allocate
        * @param _weiAmount ether invested in wei
        */
    function allocateNormalTimeMints(address _receiver, uint _customerId, uint _id, uint _tokens, uint _weiAmount) public onlyOwner {
        // check if Id is in range of Normal Ids
        require(_id >= firstContributorId && _id <= totalNormalContributorIds);
        require(totalNormalContributorIdsAllocated < totalNormalContributorIds);
        addContributor(_id, _receiver, _tokens);
        totalNormalContributorIdsAllocated++;
        mint(_receiver, _tokens);
        Invested(_receiver, _weiAmount, _tokens, _customerId, _id);
        
    }


    /** Function to release token
        * Called by owner
        */
    function releaseToken(uint _initialBlockTimestamp) public onlyOwner {
        require(!released); // check not already released
        
        setInitialBlockTimestamp(_initialBlockTimestamp);

        // Make token transferable
        releaseTokenTransfer();
    }
    
}

Contract ABI
[{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setTransferAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_weiAmount","type":"uint256"}],"name":"allocateNormalTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"teamLockPeriodInSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDayTokenActivated","outputs":[{"name":"isActivated","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstTeamContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setReleaseAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"fetchSuccessfulSaleProceed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_adr","type":"address"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_isTest","type":"bool"}],"name":"addTeamTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getMintingPowerById","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"getPhaseCount","outputs":[{"name":"phase","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contributors","outputs":[{"name":"adr","type":"address"},{"name":"initialContributionDay","type":"uint256"},{"name":"lastUpdatedOn","type":"uint256"},{"name":"mintingPower","type":"uint256"},{"name":"expiryBlockNumber","type":"uint256"},{"name":"minPriceInDay","type":"uint256"},{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPriceInDay","type":"uint256"},{"name":"_expiryBlockNumber","type":"uint256"}],"name":"sellMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"mintAgents","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setMintAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"balanceById","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halvingCycle","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DayInSecs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"teamIssuedTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialBlockTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"setTokenInformation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingDec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"soldAddresses","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_offerId","type":"uint256"},{"name":"_offerInDay","type":"uint256"}],"name":"buyMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelSaleOfMintingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUpgradeState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isValidContributorAddress","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"transferAgents","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isTeamLockInPeriodOverIfTeamAddress","outputs":[{"name":"isLockInPeriodOver","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"sellingPriceInDayOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxAddresses","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"released","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"}],"name":"postAllocateAuctionTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialBlockTimestampSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mintingDec","type":"uint256"}],"name":"setMintingDec","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstPostIcoContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeSub","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"updateTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"refundFailedAuctionAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_initialBlockTimestamp","type":"uint256"}],"name":"releaseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"getMintingPowerByAddress","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getSellingStatus","outputs":[{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateMyTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalUpgraded","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBalanceToSell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agent","type":"address"}],"name":"setUpgradeAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"idOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"isValidContributorId","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOnSaleIds","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDayCount","outputs":[{"name":"daySinceMintingEpoch","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"master","type":"address"}],"name":"setUpgradeMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_initialSupply","type":"uint256"},{"name":"_decimals","type":"uint8"},{"name":"_mintable","type":"bool"},{"name":"_maxAddresses","type":"uint256"},{"name":"_firstTeamContributorId","type":"uint256"},{"name":"_totalTeamContributorIds","type":"uint256"},{"name":"_totalPostIcoContributorIds","type":"uint256"},{"name":"_minMintingPower","type":"uint256"},{"name":"_maxMintingPower","type":"uint256"},{"name":"_halvingCycle","type":"uint256"},{"name":"_minBalanceToSell","type":"uint256"},{"name":"_dayInSecs","type":"uint256"},{"name":"_teamLockPeriodInSec","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newName","type":"string"},{"indexed":false,"name":"newSymbol","type":"string"}],"name":"UpdatedTokenInformation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"}],"name":"MintingAdrTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"adr","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"ContributorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"minPriceInDay","type":"uint256"},{"indexed":false,"name":"expiryBlockNumber","type":"uint256"}],"name":"TimeMintOnSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"offerInDay","type":"uint256"}],"name":"TimeMintSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"PostInvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"teamAddress","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"TeamAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agent","type":"address"}],"name":"UpgradeAgentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"state","type":"bool"}],"name":"MintingAgentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}]

Contract Creation Code
60606040526005805460a060020a60ff02191690556007805460ff19169055610447600c55600060148190556017819055601a5534156200003f57600080fd5b60405162003a9b38038062003a9b833981016040528080518201919060200180518201919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b335b5b60038054600160a060020a03191633600160a060020a03161790555b60098054600160a060020a031916600160a060020a0383161790555b5060038054600160a060020a03191633600160a060020a031617905560258f80516200012d92916020019062000291565b5060268e80516200014392916020019062000291565b5060008d81556027805460ff191660ff8f16179055600354600160a060020a031681526001602081905260409091208e9055601b8b90558a116200018657600080fd5b60016012819055601b5489900388900360138190551015620001a757600080fd5b601589905560168890556019879055601b54879003600101601855601c869055601d859055601e849055635e0be100601f556020805460ff19169055601360215560228390556024829055602381905560008054111562000256576003546000547f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe91600160a060020a031690604051600160a060020a03909216825260208201526040908101905180910390a15b8a15156200027a576007805460ff1916600117905560005415156200027a57600080fd5b5b5b5050505050505050505050505050506200033b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d457805160ff191683800117855562000304565b8280016001018555821562000304579182015b8281111562000304578251825591602001919060010190620002e7565b5b506200031392915062000317565b5090565b6200033891905b808211156200031357600081556001016200031e565b5090565b90565b613750806200034b6000396000f300606060405236156103b65763ffffffff60e060020a60003504166302f652a381146103bb57806304d41474146103e157806305d2035b1461040657806306fdde031461042d578063095ea7b3146104b85780630a402742146104ee5780630c58062b1461051b57806310f1726d14610540578063128e37611461056757806318160ddd1461058c5780631bf2a90a146105b157806323b872dd146105d657806329ff4f53146106125780632f83f78114610633578063313ce5671461065a578063331c55b414610683578063335494a4146106af57806335995022146106d75780633cb5d100146106ff5780633ed66d3d1461077557806340c10f19146107a257806342c1867b146107c657806343214675146107f957806345977d031461081f5780634778dfb8146108375780634813e3e51461085f578063485d5dd21461088457806348bb4067146108a95780634b3d81b6146108da5780634eee966f146108ff578063534439a31461099457806354f63105146109b95780635956b853146109de5780635d444ffb14610a115780635de4ccb014610a365780635df34ff214610a655780635f412d4f14610a92578063600440cb14610aa757806370a0823114610ad6578063718228fa14610b07578063740707cf14610b2c57806379ba509714610b415780638444b39114610b565780638526d09214610b8d578063867c285714610bc05780638da5cb5b14610bf35780638f7b7bce14610c22578063928e659214610c55578063936bbf9a14610c8657806393e5365f14610cab57806395d89b4114610cd05780639613252114610d5b57806396a8069914610d825780639738968c14610da95780639aaac86414610dd05780639bc8e9ee14610df7578063a222a52f14610e0f578063a293d1e814610e34578063a41ff1e514610e5f578063a5f2676014610e84578063a666190114610eae578063a9059cbb14610ed3578063b19b216214610f09578063b54d623814610f30578063b6033daf14610f48578063bef17ed014610f79578063c392f11814610f9e578063c4e41b2214610fd8578063c59513a414610ffd578063c752ff6214611024578063c96e83db14611049578063d05c78da1461106e578063d1f276d314611099578063d49dbb5c146110c8578063d4ee1d90146110ed578063d7e7088a1461111c578063d94fe8321461113d578063dd62ed3e1461116e578063df30e592146111a5578063e0faf0a8146111cf578063e6cb901314611236578063eb60764f14611261578063f2fde38b14611286578063ffeb7d75146112a7575b600080fd5b34156103c657600080fd5b6103df600160a060020a036004351660243515156112c8565b005b34156103ec57600080fd5b6103f4611329565b60405190815260200160405180910390f35b341561041157600080fd5b61041961132f565b604051901515815260200160405180910390f35b341561043857600080fd5b610440611338565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104c357600080fd5b610419600160a060020a03600435166024356113d6565b604051901515815260200160405180910390f35b34156104f957600080fd5b6103df600160a060020a036004351660243560443560643560843561147d565b005b341561052657600080fd5b6103f461154e565b60405190815260200160405180910390f35b341561054b57600080fd5b610419611554565b604051901515815260200160405180910390f35b341561057257600080fd5b6103f461155e565b60405190815260200160405180910390f35b341561059757600080fd5b6103f4611564565b60405190815260200160405180910390f35b34156105bc57600080fd5b6103f461156a565b60405190815260200160405180910390f35b34156105e157600080fd5b610419600160a060020a0360043581169060243516604435611570565b604051901515815260200160405180910390f35b341561061d57600080fd5b6103df600160a060020a03600435166116f7565b005b341561063e57600080fd5b61041961174e565b604051901515815260200160405180910390f35b341561066557600080fd5b61066d611858565b60405160ff909116815260200160405180910390f35b341561068e57600080fd5b6103df600160a060020a03600435166024356044356064351515611861565b005b34156106ba57600080fd5b6103f460043561193c565b60405190815260200160405180910390f35b34156106e257600080fd5b6103f460043561197b565b60405190815260200160405180910390f35b341561070a57600080fd5b610715600435611996565b6040518088600160a060020a0316600160a060020a0316815260200187815260200186815260200185815260200184815260200183815260200182600281111561075b57fe5b60ff16815260200197505050505050505060405180910390f35b341561078057600080fd5b6104196004356024356119e0565b604051901515815260200160405180910390f35b34156107ad57600080fd5b6103df600160a060020a0360043516602435611bf8565b005b34156107d157600080fd5b610419600160a060020a0360043516611ca7565b604051901515815260200160405180910390f35b341561080457600080fd5b6103df600160a060020a03600435166024351515611cbc565b005b341561082a57600080fd5b6103df600435611d5b565b005b341561084257600080fd5b6103f4600435611eb5565b60405190815260200160405180910390f35b341561086a57600080fd5b6103f4611f23565b60405190815260200160405180910390f35b341561088f57600080fd5b6103f4611f29565b60405190815260200160405180910390f35b34156108b457600080fd5b6103f4600160a060020a0360043516611f2f565b60405190815260200160405180910390f35b34156108e557600080fd5b6103f4611f41565b60405190815260200160405180910390f35b341561090a57600080fd5b6103df60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611f4795505050505050565b005b341561099f57600080fd5b6103f46120b7565b60405190815260200160405180910390f35b34156109c457600080fd5b6103f46120bd565b60405190815260200160405180910390f35b34156109e957600080fd5b610419600160a060020a03600435166120c3565b604051901515815260200160405180910390f35b3415610a1c57600080fd5b6103f46120d8565b60405190815260200160405180910390f35b3415610a4157600080fd5b610a496120de565b604051600160a060020a03909116815260200160405180910390f35b3415610a7057600080fd5b6104196004356024356120ed565b604051901515815260200160405180910390f35b3415610a9d57600080fd5b6103df61232d565b005b3415610ab257600080fd5b610a49612372565b604051600160a060020a03909116815260200160405180910390f35b3415610ae157600080fd5b6103f4600160a060020a0360043516612381565b60405190815260200160405180910390f35b3415610b1257600080fd5b6103f46123d7565b60405190815260200160405180910390f35b3415610b3757600080fd5b6103df6123dd565b005b3415610b4c57600080fd5b6103df61247b565b005b3415610b6157600080fd5b610b696124fa565b60405180826004811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610b9857600080fd5b610419600160a060020a036004351661254b565b604051901515815260200160405180910390f35b3415610bcb57600080fd5b610419600160a060020a0360043516612575565b604051901515815260200160405180910390f35b3415610bfe57600080fd5b610a4961258a565b604051600160a060020a03909116815260200160405180910390f35b3415610c2d57600080fd5b610419600160a060020a0360043516612599565b604051901515815260200160405180910390f35b3415610c6057600080fd5b6103f4600160a060020a03600435166125e9565b60405190815260200160405180910390f35b3415610c9157600080fd5b6103f46125fb565b60405190815260200160405180910390f35b3415610cb657600080fd5b6103f4612601565b60405190815260200160405180910390f35b3415610cdb57600080fd5b610440612607565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d6657600080fd5b6104196126a5565b604051901515815260200160405180910390f35b3415610d8d57600080fd5b6103df600160a060020a03600435166024356044356126b5565b005b3415610db457600080fd5b61041961279a565b604051901515815260200160405180910390f35b3415610ddb57600080fd5b6104196127c0565b604051901515815260200160405180910390f35b3415610e0257600080fd5b6103df6004356127c9565b005b3415610e1a57600080fd5b6103f46127fe565b60405190815260200160405180910390f35b3415610e3f57600080fd5b6103f4600435602435612804565b60405190815260200160405180910390f35b3415610e6a57600080fd5b6103f461281b565b60405190815260200160405180910390f35b3415610e8f57600080fd5b610419600435612821565b604051901515815260200160405180910390f35b3415610eb957600080fd5b6103f4612847565b60405190815260200160405180910390f35b3415610ede57600080fd5b610419600160a060020a036004351660243561284d565b604051901515815260200160405180910390f35b3415610f1457600080fd5b610419612980565b604051901515815260200160405180910390f35b3415610f3b57600080fd5b6103df600435612b5a565b005b3415610f5357600080fd5b6103f4600160a060020a0360043516612ba2565b60405190815260200160405180910390f35b3415610f8457600080fd5b6103f4612bcc565b60405190815260200160405180910390f35b3415610fa957600080fd5b610fb4600435612bd2565b60405180826002811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610fe357600080fd5b6103f4612c31565b60405190815260200160405180910390f35b341561100857600080fd5b610419612c38565b604051901515815260200160405180910390f35b341561102f57600080fd5b6103f4612c75565b60405190815260200160405180910390f35b341561105457600080fd5b6103f4612c7b565b60405190815260200160405180910390f35b341561107957600080fd5b6103f4600435602435612c81565b60405190815260200160405180910390f35b34156110a457600080fd5b610a49612cb0565b604051600160a060020a03909116815260200160405180910390f35b34156110d357600080fd5b6103f4612cbf565b60405190815260200160405180910390f35b34156110f857600080fd5b610a49612cc5565b604051600160a060020a03909116815260200160405180910390f35b341561112757600080fd5b6103df600160a060020a0360043516612cd4565b005b341561114857600080fd5b6103f4600160a060020a0360043516612e80565b60405190815260200160405180910390f35b341561117957600080fd5b6103f4600160a060020a0360043581169060243516612e92565b60405190815260200160405180910390f35b34156111b057600080fd5b610419600435612ebf565b604051901515815260200160405180910390f35b34156111da57600080fd5b6111e2612f2b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156112225780820151818401525b602001611209565b505050509050019250505060405180910390f35b341561124157600080fd5b6103f4600435602435612ffc565b60405190815260200160405180910390f35b341561126c57600080fd5b6103f4613016565b60405190815260200160405180910390f35b341561129157600080fd5b6103df600160a060020a036004351661303e565b005b34156112b257600080fd5b6103df600160a060020a0360043516613079565b005b60035433600160a060020a039081169116146112e357600080fd5b60055460009060a060020a900460ff16156112fd57600080fd5b600160a060020a0383166000908152600660205260409020805460ff19168315151790555b5b505b5050565b60145481565b60075460ff1681565b60258054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60008115806114085750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561141357600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035433600160a060020a0390811691161461149857600080fd5b60125483101580156114ac57506013548311155b15156114b757600080fd5b601354601454106114c757600080fd5b6114d28386846130c8565b6014805460010190556114e58583611bf8565b7f6bd11c91e66ab57411c3d72828f939eac4446988c1c1f5862442bf7fa9884e238582848787604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b5050505050565b60235481565b601f544210155b90565b60155481565b60005481565b601a5481565b60008061157b611554565b151561158657600080fd5b61158f85612599565b151561159a57600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600d905291909120546115d9906131fb565b50826115e486612381565b101580156115f157508215155b80156115fd5750808311155b151561160857600080fd5b600160a060020a0384166000908152600d602052604090205461162a906131fb565b506116358184612804565b600160a060020a0380871660008181526002602090815260408083203390951683529381528382209490945590815260019092529020546116769084612804565b600160a060020a0380871660009081526001602052604080822093909355908616815220546116a59084612ffc565b600160a060020a03808616600081815260016020526040908190209390935591908716906000805160206137058339815191529086905190815260200160405180910390a3600191505b509392505050565b60035433600160a060020a0390811691161461171257600080fd5b60055460009060a060020a900460ff161561172c57600080fd5b60058054600160a060020a031916600160a060020a0384161790555b5b505b50565b600160a060020a033316600090815260106020526040812054819060ff16151560011461177a57600080fd5b600160a060020a0333166000908152601060209081526040808320805460ff191690556022546011909252909120546117b39190612ffc565b600160a060020a0330166000908152600160205260409020549091506117d99082612804565b600160a060020a033081166000908152600160205260408082209390935533909116815220546118099082612ffc565b600160a060020a0333811660008181526001602052604090819020939093559130909116906000805160206137058339815191529084905190815260200160405180910390a3600191505b5090565b60275460ff1681565b60035433600160a060020a0390811691161461187c57600080fd5b601554831015801561189357506016546015540183105b151561189e57600080fd5b601654601754106118ae57600080fd5b6118ba838560006130c8565b6017805460010190558015156118e657600160a060020a0384166000908152600f602052604090204290555b6118f08483611bf8565b7fe79fec6463e59273a1da7bc924872b8b35b64c591ce527b6329f0db8d6be71fd8484604051600160a060020a03909216825260208201526040908101905180910390a15b5b50505050565b6000600161195061194b613016565b61197b565b6000848152600e602052604090206003015491900360020a9081151561197257fe5b0490505b919050565b6000601e548281151561198a57fe5b0460010190505b919050565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919060ff1687565b6000806119eb611554565b15156119f657600080fd5b438311611a0257600080fd5b611a0b33612599565b1515611a1657600080fd5b50600160a060020a0333166000908152600d6020526040812054905b6000828152600e602052604090206006015460ff166002811115611a5257fe5b14611a5c57600080fd5b611a65816131fb565b50602254600160a060020a0333166000908152600160205260409020541015611a8d57600080fd5b6000818152600e60205260409020600581018590556004810184905560060180546002919060ff19166001835b0217905550600160a060020a033316600090815260016020526040902054602254611ae59190612804565b600160a060020a03338116600090815260016020526040808220939093553090911681522054602254611b189190612ffc565b6001600030600160a060020a0316600160a060020a031681526020019081526020016000208190555030600160a060020a031633600160a060020a031660008051602061370583398151915260225460405190815260200160405180910390a36000818152600e60205260409081902060058101546004909101547f789864ab03bca8d309c9bec6804307cfc416db24eab7873ba7f3df79797b09179284923392909151938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390a1600191505b5092915050565b600160a060020a03331660009081526008602052604090205460ff161515611c1f57600080fd5b60075460ff1615611c2f57600080fd5b611c3b60005482612ffc565b6000908155600160a060020a038316815260016020526040902054611c609082612ffc565b600160a060020a0383166000818152600160205260408082209390935590916000805160206137058339815191529084905190815260200160405180910390a35b5b5b5050565b60086020526000908152604090205460ff1681565b60035433600160a060020a03908116911614611cd757600080fd5b60075460ff1615611ce757600080fd5b600160a060020a03821660009081526008602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000611d656124fa565b905060035b816004811115611d7657fe5b1480611d8e575060045b816004811115611d8c57fe5b145b1515611d9957600080fd5b811515611da557600080fd5b600160a060020a033316600090815260016020526040902054611dc89083612804565b600160a060020a03331660009081526001602052604081209190915554611def9083612804565b600055600b54611dff9083612ffc565b600b55600a54600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611e5857600080fd5b6102c65a03f11515611e6957600080fd5b5050600a54600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b6000818152600e6020526040812054600160a060020a0316611ed5611554565b15611f0057611ee383612ebf565b15611f0057611ef983611ef4613016565b613321565b9150611f1d565b5b600160a060020a03811660009081526001602052604090205491505b50919050565b601e5481565b60245481565b600f6020526000908152604090205481565b601f5481565b60035433600160a060020a03908116911614611f6257600080fd5b6025828051611f75929160200190613652565b506026818051611f89929160200190613652565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb466025602660405160408082528354600260001961010060018416150201909116049082018190528190602082019060608301908690801561202d5780601f106120025761010080835404028352916020019161202d565b820191906000526020600020905b81548152906001019060200180831161201057829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156120a15780601f10612076576101008083540402835291602001916120a1565b820191906000526020600020905b81548152906001019060200180831161208457829003601f168201915b505094505050505060405180910390a15b5b5050565b60215481565b601d5481565b60106020526000908152604090205460ff1681565b601c5481565b600a54600160a060020a031681565b60008060025b6000858152600e602052604090206006015460ff16600281111561211357fe5b14801561213057506000848152600e602052604090206004015443115b15612159576000848152600e6020526040902060060180546001919060ff191682805b02179055505b506000838152600e6020526040902054600160a060020a031660025b6000858152600e602052604090206006015460ff16600281111561219557fe5b1461219f57600080fd5b6000848152600e60205260409020600501548310156121bd57600080fd5b6000848152600e60205260408120600601805460ff19166001835b0217905550600160a060020a0333166000908152600160205260409020546122009084612804565b600160a060020a033381166000908152600160205260408082209390935530909116815220546122309084612ffc565b600160a060020a0330811660008181526001602052604090819020939093559133909116906000805160206137058339815191529086905190815260200160405180910390a36000848152600e602052604090205461229890600160a060020a031633613420565b1561232157600160a060020a0381166000908152601160209081526040808320869055601090915290819020805460ff191660011790557f72760e46b3824807567c13ec75882de5d9c789a91517ae7b474d2e6b62d3771e9085903390869051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a15b600191505b5092915050565b60035433600160a060020a0390811691161461234857600080fd5b60205460ff16151561235957600080fd5b6007805460ff1916600117905561236e613574565b5b5b565b600954600160a060020a031681565b600160a060020a0381166000908152600d602052604081205480156123b057611ef981611eb5565b9150611f1d565b600160a060020a0383166000908152600160205260409020549150611f1d565b5b50919050565b60175481565b600160a060020a0333166000908152600d60205260408120546123ff81612ebf565b151561240a57600080fd5b600160a060020a0333166000908152600d6020526040902054915060025b6000838152600e602052604090206006015460ff16600281111561244857fe5b1461245257600080fd5b6000828152600e6020526040902060060180546001919060ff191682805b02179055505b5b5050565b60045433600160a060020a0390811691161461249657600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360045460038054600160a060020a031916600160a060020a039092169190911790555b565b600061250461279a565b15156125125750600161155b565b600a54600160a060020a0316151561252c5750600261155b565b600b54151561253d5750600361155b565b50600461155b565b5b5b5b90565b600160a060020a0381166000908152600d602052604081205461256d90612ebf565b90505b919050565b60066020526000908152604090205460ff1681565b600354600160a060020a031681565b600160a060020a0381166000908152600f60205260409020546001901561197657602354600160a060020a0383166000908152600f602052604090205442031015611976575060005b5b5b919050565b60116020526000908152604090205481565b60195481565b601b5481565b60268054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60055460a060020a900460ff1681565b60035433600160a060020a039081169116146126d057600080fd5b60185481101580156126e757506019546018540181105b15156126f257600080fd5b601954601a541061270257600080fd5b60055460a060020a900460ff16151560011461271d57600080fd5b612729818460006130c8565b601a805460010190557f5da87a24d5db985862dc335ff32e322d9588ae9b4a971bd1526a58051c8cbaa4836000808585604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b505050565b60055460009060a060020a900460ff1680156127b957506127b96135b7565b5b90505b90565b60205460ff1681565b60035433600160a060020a039081169116146127e457600080fd5b60205460ff16156127f457600080fd5b60218190555b5b50565b60185481565b60008282111561281057fe5b508082035b92915050565b600c5481565b600061282b611554565b151561283657600080fd5b61256d826131fb565b90505b919050565b60135481565b6000612857611554565b151561286257600080fd5b61286b33612599565b151561287657600080fd5b600160a060020a0333166000908152600d6020526040902054612898906131fb565b50816128a333612381565b101580156128b057508115155b15156128bb57600080fd5b600160a060020a0383166000908152600d60205260409020546128dd906131fb565b50600160a060020a0333166000908152600160205260409020546129019083612804565b600160a060020a0333811660009081526001602052604080822093909355908516815220546129309083612ffc565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206137058339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a0333166000908152600d602052604081205481906129a481612ebf565b15156129af57600080fd5b600160a060020a0333166000908152600d6020908152604080832054808452600e9092529091206004015490925043118015612a0b575060025b6000838152600e602052604090206006015460ff166002811115612a0957fe5b145b15612a34576000828152600e6020526040902060060180546001919060ff191682805b02179055505b60015b6000838152600e602052604090206006015460ff166002811115612a5757fe5b14612a6157600080fd5b6000828152600e60205260408120600601805460ff19166001835b0217905550600160a060020a033016600090815260016020526040902054602254612aa79190612804565b600160a060020a033016600090815260016020526040902055612ac9826131fb565b50600160a060020a033316600090815260016020526040902054602254612af09190612ffc565b600160a060020a03338116600081815260016020908152604080832095909555868252600e905283812060058101829055600401556022549092309092169160008051602061370583398151915291905190815260200160405180910390a3600192505b5b505090565b60035433600160a060020a03908116911614612b7557600080fd5b60055460a060020a900460ff1615612b8c57600080fd5b612b95816135bd565b61174b61232d565b5b5b50565b600160a060020a0381166000908152600d602052604081205461256d9061193c565b90505b919050565b60165481565b6000612bdd82612ebf565b1515612be857600080fd5b506000818152600e60205260409020600681015460049091015460ff9091169043118015612c22575060025b816002811115612c2057fe5b145b15611976575060015b5b919050565b6000545b90565b6000612c42611554565b1515612c4d57600080fd5b600160a060020a0333166000908152600d60205260409020546127b9906131fb565b90505b90565b600b5481565b60125481565b6000828202831580612c9d5750828482811515612c9a57fe5b04145b1515612ca557fe5b8091505b5092915050565b600554600160a060020a031681565b60225481565b600454600160a060020a031681565b612cdc61279a565b1515612ce757600080fd5b600160a060020a0381161515612cfc57600080fd5b60095433600160a060020a03908116911614612d1757600080fd5b60045b612d226124fa565b6004811115612d2d57fe5b1415612d3857600080fd5b600a8054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612d9657600080fd5b6102c65a03f11515612da757600080fd5b505050604051805190501515612dbc57600080fd5b60008054600a549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0c57600080fd5b6102c65a03f11515612e1d57600080fd5b50505060405180519050141515612e3357600080fd5b600a547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600d6020526000908152604090205481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008082118015612ed25750601b548211155b8015612ef457506000828152600e6020526040902054600160a060020a031615155b801561256d57506000828152600e6020908152604080832054600160a060020a03168352600d90915290205482145b90505b919050565b612f336136d1565b612f3b6136d1565b600080601b54604051805910612f4e5750595b908082528060200260200182016040525b50925060009150600190505b601b548111612ff257612f7d81612ebf565b8015612f9a57506000818152600e60205260409020600401544311155b8015612fc6575060025b6000828152600e602052604090206006015460ff166002811115612fc457fe5b145b15612fe95780838381518110612fd857fe5b602090810290910101526001909101905b5b600101612f6b565b8293505b50505090565b600082820183811015612ca557fe5b8091505b5092915050565b6000613020611554565b1561155b57602454601f54420381151561303657fe5b0490505b5b90565b60035433600160a060020a0390811691161461305957600080fd5b60048054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038116151561308e57600080fd5b60095433600160a060020a039081169116146130a957600080fd5b60098054600160a060020a031916600160a060020a0383161790555b50565b60035433600160a060020a039081169116146130e357600080fd5b601b548311156130f257600080fd5b6130fb8261254b565b1561310557600080fd5b61310e83612ebf565b1561311857600080fd5b6000838152600e602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600d909152902083905561315a836135ff565b6000838152600e60205260409020600101819055613176613016565b600e6000858152602001908152602001600020600201819055507f5fd6d0b7e707fe344bd2a1887f9d0eeea8bfcac6f339ba4200e74f0647f101c08284604051600160a060020a03909216825260208201526040908101905180910390a16000838152600e60205260408120600601805460ff19166001835b02179055505b5b505050565b600080600080600061320c86612ebf565b1561331257613219613016565b6000878152600e6020526040902060020154909450841480159061324f5750600c546000878152600e6020526040902060020154105b15613312576000868152600e6020908152604080832054600160a060020a03168084526001909252822054915490945090925061328c9083612804565b6000556132998685613321565b600160a060020a0384166000908152600160205260408120829055549091506132c29082612ffc565b6000908155868152600e6020526040808220600201869055600160a060020a038516919060008051602061370583398151915290858503905190815260200160405180910390a360019450613318565b5b600094505b50505050919050565b6000828152600e6020908152604080832054600160a060020a031683526001909152812054600c54829081908190819081908190891061336357600c54613365565b885b60008b8152600e602052604090206002015490965060010194505b85851161340f576133908561197b565b601e5460008c8152600e602052604090206003015491955060001990860281019450850160020a908115156133c157fe5b0491508490505b8281111580156133d85750858111155b15613407576133fc87602154600201600a0a8985028115156133f657fe5b04612ffc565b96505b6001016133c8565b809450613380565b8697505b5050505050505092915050565b600160a060020a0382166000908152600d6020526040812054819061344481612ebf565b151561344f57600080fd5b613457611554565b151561346257600080fd5b61346b8461254b565b1561347557600080fd5b600160a060020a0385166000908152600d60205260409020549150613499826131fb565b506000828152600e602081815260408084208054600160a060020a031916600160a060020a038a81169182178355908652600d84528286208890558a168552908420849055858452919052600101556134f0613016565b6000838152600e60205260408082206002810193909355600483018290556005909201557ffb7aaa2ec871044b8cde9fee0cd727b02c8d6caf7aeb7f5fa2e02ffdfe1643349083908790879051928352600160a060020a039182166020840152166040808301919091526060909101905180910390a1600192505b5b505092915050565b60055433600160a060020a0390811691161461358f57600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015b90565b60035433600160a060020a039081169116146135d857600080fd5b60205460ff16156135e857600080fd5b6020805460ff19166001179055601f8190555b5b50565b8061360981612ebf565b151561361457600080fd5b6001601b5403601c54601d5403600184030281151561362f57fe5b601d546000858152600e602052604090209290910490036003909101555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061369357805160ff19168380011785556136c0565b828001600101855582156136c0579182015b828111156136c05782518255916020019190600101906136a5565b5b506118549291506136e3565b5090565b60206040519081016040526000815290565b61155b91905b8082111561185457600081556001016136e9565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058203c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f002900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000c9c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000001e1d1c72d5b97e0000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000000000003444159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034441590000000000000000000000000000000000000000000000000000000000


   Swarm Source:
bzzr://3c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.