ETH Price: $3,296.11 (-3.61%)
Gas: 10 Gwei

Contract

0x5Ba49Fcf7C9Dce67d6a9FC92Cc51c8E77CbA5b7a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Transfer134128892021-10-13 23:20:38993 days ago1634167238IN
Clout: Clout Token
0 ETH0.02227627139
Transfer129433962021-08-02 2:43:281066 days ago1627872208IN
Clout: Clout Token
0 ETH0.0049195537.00000145
Transfer125268252021-05-29 3:27:441131 days ago1622258864IN
Clout: Clout Token
0 ETH0.0038469826
Transfer87101482019-10-09 21:46:021728 days ago1570657562IN
Clout: Clout Token
0 ETH0.0020239620
Approve87100822019-10-09 21:31:291728 days ago1570656689IN
Clout: Clout Token
0 ETH0.000183584
Transfer87099672019-10-09 21:03:591728 days ago1570655039IN
Clout: Clout Token
0 ETH0.0024597220
Transfer85300332019-09-11 18:11:531756 days ago1568225513IN
Clout: Clout Token
0 ETH0.0023742822
Transfer81791922019-07-19 5:17:131811 days ago1563513433IN
Clout: Clout Token
0 ETH0.0014569413.5
Transfer80660382019-07-01 14:00:451829 days ago1561989645IN
Clout: Clout Token
0 ETH0.00216120
Transfer80660052019-07-01 13:53:341829 days ago1561989214IN
Clout: Clout Token
0 ETH0.00660
Transfer80646752019-07-01 8:54:181829 days ago1561971258IN
Clout: Clout Token
0 ETH0.003660.00000204
Transfer80644752019-07-01 8:10:361829 days ago1561968636IN
Clout: Clout Token
0 ETH0.001220
Approve78024012019-05-21 9:19:351870 days ago1558430375IN
Clout: Clout Token
0 ETH0.000050481.1
Transfer75064782019-04-05 6:23:471916 days ago1554445427IN
Clout: Clout Token
0 ETH0.000284613
Transfer74431762019-03-26 8:27:021926 days ago1553588822IN
Clout: Clout Token
0 ETH0.0017252420
Transfer72794682019-02-28 16:53:111952 days ago1551372791IN
Clout: Clout Token
0 ETH0.000534755.34756683
Transfer72767302019-02-28 1:18:241952 days ago1551316704IN
Clout: Clout Token
0 ETH0.0010798610
Transfer72437682019-02-20 7:55:501960 days ago1550649350IN
Clout: Clout Token
0 ETH0.0041464941
Transfer72403712019-02-19 12:40:131961 days ago1550580013IN
Clout: Clout Token
0 ETH0.0021597220
Transfer71426872019-01-29 6:21:391982 days ago1548742899IN
Clout: Clout Token
0 ETH0.002021420
Transfer71348932019-01-27 16:13:231984 days ago1548605603IN
Clout: Clout Token
0 ETH0.000453274.2
Transfer71058372019-01-21 22:29:411989 days ago1548109781IN
Clout: Clout Token
0 ETH0.0017226820
Transfer71036552019-01-21 12:14:531990 days ago1548072893IN
Clout: Clout Token
0 ETH0.0038124241
Transfer70259792019-01-07 13:46:222004 days ago1546868782IN
Clout: Clout Token
0 ETH0.0010785810
Transfer70239752019-01-07 5:17:222004 days ago1546838242IN
Clout: Clout Token
0 ETH0.00104529
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Clout

Compiler Version
v0.4.15+commit.bbb8e64f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-01-14
*/

pragma solidity 0.4.15;


/**
 * @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 {
    //Variables
    address public owner;

    address public newOwner;

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

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

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

    function acceptOwnership() public {
        if (msg.sender == newOwner) {
            owner = newOwner;
            newOwner = address(0);
        }
    }
}


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

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

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

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

contract TokenRecipient {
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public;
}


contract ERC20 is Ownable {
    using SafeMath for uint256;

    /* Public variables of the token */
    uint256 public initialSupply;

    uint256 public creationBlock;

    uint8 public decimals;

    string public name;

    string public symbol;

    string public standard;

    bool public locked;

    bool public transferFrozen;

    mapping (address => uint256) public balances;

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

    /* This generates a public event on the blockchain that will notify clients */
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);

    modifier onlyPayloadSize(uint _numwords) {
        assert(msg.data.length == _numwords * 32 + 4);
        _;
    }

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function ERC20(
        uint256 _initialSupply,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol,
        bool _transferAllSupplyToOwner,
        bool _locked
    )
        public
    {
        standard = "ERC20 0.1";

        initialSupply = _initialSupply;

        if (_transferAllSupplyToOwner) {
            setBalance(msg.sender, initialSupply);
        } else {
            setBalance(this, initialSupply);
        }

        name = _tokenName;
        // Set the name for display purposes
        symbol = _tokenSymbol;
        // Set the symbol for display purposes
        decimals = _decimalUnits;
        // Amount of decimals for display purposes
        locked = _locked;
        creationBlock = block.number;
    }

    /* public methods */
    function transfer(address _to, uint256 _value) public onlyPayloadSize(2) returns (bool) {
        require(locked == false);
        require(transferFrozen == false);
    
        bool status = transferInternal(msg.sender, _to, _value);

        require(status == true);

        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        if (locked) {
            return false;
        }

        allowed[msg.sender][_spender] = _value;

        Approval(msg.sender, _spender, _value);

        return true;
    }

    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
        if (locked) {
            return false;
        }

        TokenRecipient spender = TokenRecipient(_spender);

        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    function transferFrom(address _from, address _to, uint256 _value) public onlyPayloadSize(3) returns (bool success) {
        if (locked) {
            return false;
        }

        if (transferFrozen) {
            return false;
        }

        if (allowed[_from][msg.sender] < _value) {
            return false;
        }

        bool _success = transferInternal(_from, _to, _value);

        if (_success) {
            allowed[_from][msg.sender] -= _value;
        }

        return _success;
    }

    /*constant functions*/
    function totalSupply() public constant returns (uint256) {
        return initialSupply;
    }

    function balanceOf(address _address) public constant returns (uint256 balance) {
        return balances[_address];
    }

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

    /* internal functions*/
    function setBalance(address _holder, uint256 _amount) internal {
        balances[_holder] = _amount;
    }

    function transferInternal(address _from, address _to, uint256 _value) internal returns (bool success) {
        require(locked == false);
        require(transferFrozen == false);

        if (_value == 0) {
            Transfer(_from, _to, _value);

            return true;
        }

        if (balances[_from] < _value) {
            return false;
        }

        setBalance(_from, balances[_from].sub(_value));
        setBalance(_to, balances[_to].add(_value));

        Transfer(_from, _to, _value);

        return true;
    }
}

contract ERC223 {
    event Transfer(address indexed from, address indexed to, uint value, bytes indexed data);
    function transfer(address to, uint value, bytes data) public returns (bool ok);
    function transfer(address to, uint value, bytes data, string customFallback) public returns (bool ok);
}


contract ContractReceiver {
    function tokenFallback(address _from, uint _value, bytes _data) public;
}

/*
    Based on https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/ERC223_Token.sol
*/

contract ERC223Token is ERC223, ERC20 {
    function ERC223Token(
        uint256 _initialSupply,
        string tokenName,
        uint8 decimalUnits,
        string tokenSymbol,
        bool transferAllSupplyToOwner,
        bool _locked
    )
        public
        ERC20(_initialSupply, tokenName, decimalUnits, tokenSymbol, transferAllSupplyToOwner, _locked)
    {
        
    }

    function transfer(address to, uint256 value, bytes data) public returns (bool success) {
        require(locked == false);
        
        bool status = transferInternal(msg.sender, to, value, data);

        return status;
    }

    function transfer(address to, uint value, bytes data, string customFallback) public returns (bool success) {
        require(locked == false);

        bool status = transferInternal(msg.sender, to, value, data, true, customFallback);

        return status;
    }

// rollback changes to transferInternal for transferFrom
    function transferFrom(address _from, address _to, uint256 _value) public onlyPayloadSize(3) returns (bool success) {
        if (locked) {
            return false;
        }

        if (transferFrozen) {
            return false;
        }

        if (allowed[_from][msg.sender] < _value) {
            return false;
        }

        bool _success = super.transferInternal(_from, _to, _value);

        if (_success) {
            allowed[_from][msg.sender] -= _value;
        }

        return _success;
    }

    function transferInternal(address from, address to, uint256 value, bytes data) internal returns (bool success) {
        return transferInternal(from, to, value, data, false, "");
    }

    function transferInternal(
        address from,
        address to,
        uint256 value,
        bytes data,
        bool useCustomFallback,
        string customFallback
    )
        internal returns (bool success)
    {
        bool status = super.transferInternal(from, to, value);

        if (status) {
            if (isContract(to)) {
                ContractReceiver receiver = ContractReceiver(to);

                if (useCustomFallback) {
                    // solhint-disable-next-line avoid-call-value
                    require(receiver.call.value(0)(bytes4(keccak256(customFallback)), from, value, data) == true);
                } else {
                    receiver.tokenFallback(from, value, data);
                }
            }

            Transfer(from, to, value, data);
        }

        return status;
    }

    function transferInternal(address from, address to, uint256 value) internal returns (bool success) {
        require(locked == false);

        bytes memory data;

        return transferInternal(from, to, value, data, false, "");
    }

    //assemble the given address bytecode. If bytecode exists then the _addr is a contract.
    function isContract(address _addr) private returns (bool) {
        uint length;
        assembly {
        //retrieve the size of the code on target address, this needs assembly
            length := extcodesize(_addr)
        }
        return (length > 0);
    }
}

/*
This contract manages the minters and the modifier to allow mint to happen only if called by minters
This contract contains basic minting functionality though
*/
contract MintingERC20 is ERC223Token {

    using SafeMath for uint256;

    uint256 public maxSupply;

    mapping (address => bool) public minters;

    modifier onlyMinters () {
        require(true == minters[msg.sender]);
        _;
    }

    function MintingERC20(
        uint256 _initialSupply,
        uint256 _maxSupply,
        string _tokenName,
        uint8 _decimals,
        string _symbol,
        bool _transferAllSupplyToOwner,
        bool _locked
    )
        ERC223Token(_initialSupply, _tokenName, _decimals, _symbol, _transferAllSupplyToOwner, _locked)
    {
        minters[msg.sender] = true;
        maxSupply = _maxSupply;
    }

    function addMinter(address _newMinter) public onlyOwner {
        minters[_newMinter] = true;
    }

    function removeMinter(address _minter) public onlyOwner {
        minters[_minter] = false;
    }

    function mint(address _addr, uint256 _amount) public onlyMinters returns (uint256) {
        return internalMint(_addr, _amount);
    }

    function internalMint(address _addr, uint256 _amount) internal returns (uint256) {
        if (_amount == uint256(0)) {
            return uint256(0);
        }

        if (totalSupply().add(_amount) > maxSupply) {
            return uint256(0);
        }

        initialSupply = initialSupply.add(_amount);
        balances[_addr] = balances[_addr].add(_amount);
        Transfer(0, _addr, _amount);

        return _amount;
    }
}


contract AbstractClaimableToken {
    function claimedTokens(address _holder, uint256 _tokens) public;
}


contract GenesisToken is MintingERC20 {
    using SafeMath for uint256;

    /* variables */
    uint256 public emitTokensSince;

    TokenEmission[] public emissions;

    mapping(address => uint256) public lastClaims;

    /* structs */
    struct TokenEmission {
        uint256 blockDuration;      // duration of block in secs
        uint256 blockTokens;        // tokens per block
        uint256 periodEndsAt;     // duration in secs
        bool removed;
    }

    /* events */
    event ClaimedTokens(address _holder, uint256 _since, uint256 _till, uint256 _tokens);

    /* constructor */
    function GenesisToken(
        uint256 _totalSupply,
        uint8 _precision,
        string _name,
        string _symbol,
        bool _transferAllSupplyToOwner,
        bool _locked,
        uint256 _emitTokensSince,
        uint256 _maxSupply
    )
        public
        MintingERC20(_totalSupply, _maxSupply, _name, _precision, _symbol, _transferAllSupplyToOwner, _locked)
    {
        standard = "GenesisToken 0.1";
        emitTokensSince = _emitTokensSince;
    }

    function addTokenEmission(uint256 _blockDuration, uint256 _blockTokens, uint256 _periodEndsAt) public onlyOwner {
        emissions.push(TokenEmission(_blockDuration, _blockTokens, _periodEndsAt, false));
    }

    function removeTokenEmission(uint256 _i) public onlyOwner {
        require(_i < emissions.length);

        emissions[_i].removed = true;
    }

    function updateTokenEmission(uint256 _i, uint256 _blockDuration, uint256 _blockTokens, uint256 _periodEndsAt)
        public
        onlyOwner
    {
        require(_i < emissions.length);

        emissions[_i].blockDuration = _blockDuration;
        emissions[_i].blockTokens = _blockTokens;
        emissions[_i].periodEndsAt = _periodEndsAt;
    }

    function claim() public returns (uint256) {
        require(false == locked);

        uint256 currentBalance = balanceOf(msg.sender);
        uint256 currentTotalSupply = totalSupply();

        return claimInternal(block.timestamp, msg.sender, currentBalance, currentTotalSupply);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        return claimableTransferFrom(block.timestamp, _from, _to, _value);
    }

    function calculateEmissionTokens(
        uint256 _lastClaimedAt,
        uint256 _currentTime,
        uint256 _currentBalance,
        uint256 _totalSupply
    )
        public constant returns (uint256 tokens)
    {
        uint256 totalTokens = 0;

        uint256 newCurrentTime = _lastClaimedAt;
        uint256 remainingSeconds = _currentTime.sub(_lastClaimedAt);

        uint256 collectedTokensPerPeriod;

        for (uint256 i = 0; i < emissions.length; i++) {
            TokenEmission storage emission = emissions[i];

            if (emission.removed) {
                continue;
            }

            if (newCurrentTime < emission.periodEndsAt) {
                if (newCurrentTime.add(remainingSeconds) > emission.periodEndsAt) {
                    uint256 diff = emission.periodEndsAt.sub(newCurrentTime);

                    collectedTokensPerPeriod = getPeriodMinedTokens(
                    diff, _currentBalance,
                    emission.blockDuration, emission.blockTokens,
                    _totalSupply);

                    totalTokens += collectedTokensPerPeriod;

                    newCurrentTime += diff;
                    remainingSeconds -= diff;
                } else {
                    collectedTokensPerPeriod = getPeriodMinedTokens(
                        remainingSeconds, _currentBalance,
                        emission.blockDuration, emission.blockTokens,
                        _totalSupply
                    );

                    totalTokens += collectedTokensPerPeriod;

                    newCurrentTime += remainingSeconds;
                    remainingSeconds = 0;
                }
            }

            if (remainingSeconds == 0) {
                break;
            }
        }

        return totalTokens;
    }

    /* internal methods */
    function getPeriodMinedTokens(
        uint256 _duration, uint256 _balance,
        uint256 _blockDuration, uint256 _blockTokens,
        uint256
    )
    internal returns (uint256)
    {
        uint256 blocks = _duration.div(_blockDuration);

        return blocks.mul(_blockTokens).mul(_balance).div(maxSupply);
    }

    function tokensClaimedHook(address _holder, uint256 _since, uint256 _till, uint256 _tokens) internal {
        ClaimedTokens(_holder, _since, _till, _tokens);
    }

    function claimInternal(
        uint256 _time,
        address _address,
        uint256 _currentBalance,
        uint256 _currentTotalSupply
    )
    internal returns (uint256)
    {
        if (_time < emitTokensSince) {
            lastClaims[_address] = emitTokensSince;

            return 0;
        }

        if (_currentBalance == 0) {
            lastClaims[_address] = _time;

            return 0;
        }

        uint256 lastClaimAt = lastClaims[_address];

        if (lastClaimAt == 0) {
            lastClaims[_address] = emitTokensSince;
            lastClaimAt = emitTokensSince;
        }

        if (lastClaimAt >= _time) {
            return 0;
        }

        uint256 tokens = calculateEmissionTokens(lastClaimAt, _time, _currentBalance, _currentTotalSupply);

        if (tokens > 0) {
            tokensClaimedHook(_address, lastClaimAt, _time, tokens);

            lastClaims[_address] = _time;
        
            return tokens;
        }

        return 0;
    }

    function claimableTransfer(
        uint256 _time,
        address _from,
        address _to,
        uint256 _value,
        bytes _data,
        bool _useCustomFallback,
        string _customFallback
    )
    internal returns (bool success)
    {
        uint256 senderCurrentBalance = balanceOf(_from);
        uint256 receiverCurrentBalance = balanceOf(_to);

        uint256 _totalSupply = totalSupply();

        bool status = super.transferInternal(_from, _to, _value, _data, _useCustomFallback, _customFallback);

        require(status);

        claimInternal(_time, _from, senderCurrentBalance, _totalSupply);
        claimInternal(_time, _to, receiverCurrentBalance, _totalSupply);

        return true;
    }

    function transferInternal(
        address _from,
        address _to,
        uint256 _value,
        bytes _data,
        bool _useCustomFallback,
        string _customFallback
    )
    internal returns (bool success)
    {
        return claimableTransfer(block.timestamp, _from, _to, _value, _data, _useCustomFallback, _customFallback);
    }

    function claimableTransferFrom(
        uint256 _time,
        address _from,
        address _to,
        uint256 _value
    )
    internal returns (bool success)
    {
        uint256 senderCurrentBalance = balanceOf(_from);
        uint256 receiverCurrentBalance = balanceOf(_to);

        uint256 _totalSupply = totalSupply();

        bool status = super.transferFrom(_from, _to, _value);

        if (status) {
            claimInternal(_time, _from, senderCurrentBalance, _totalSupply);
            claimInternal(_time, _to, receiverCurrentBalance, _totalSupply);
        }
        
        return status;
    }

    function internalMint(address _addr, uint256 _amount) internal returns (uint256) {
        claimInternal(now, _addr, balanceOf(_addr), totalSupply());

        uint256 minted = super.internalMint(_addr, _amount);

        return minted;
    }
}

contract CLC is MintingERC20, AbstractClaimableToken {
    uint256 public createdAt;
    Clout public genesisToken;

    function CLC(uint256 _maxSupply, uint8 decimals, Clout _genesisToken, bool transferAllSupplyToOwner) public
        MintingERC20(0, _maxSupply, "CLC", decimals, "CLC", transferAllSupplyToOwner, false)
    {
        createdAt = now;
        standard = "CLC 0.1";
        genesisToken = _genesisToken;
    }

    function claimedTokens(address _holder, uint256 _tokens) public {
        require(msg.sender == address(genesisToken));

        uint256 minted = internalMint(_holder, _tokens);

        require(minted == _tokens);
    }

    function setGenesisToken(Clout _genesisToken) public onlyOwner {
        genesisToken = _genesisToken;
    }

    function setTransferFrozen(bool _frozen) public onlyOwner {
        transferFrozen = _frozen;
    }

    function setLocked(bool _locked) public onlyOwner {
        locked = _locked;
    }
}


contract Clout is GenesisToken {
    AbstractClaimableToken public claimableToken;
    uint256 public createdAt;

    mapping (address => bool) public issuers;

    function Clout(uint256 emitTokensSince,
        bool init,
        uint256 initialSupply,
        uint8 decimals,
        string tokenName,
        string tokenSymbol,
        bool transferAllSupplyToOwner
    )
        public
        GenesisToken(
            0,
            decimals,
            tokenName,
            tokenSymbol,
            transferAllSupplyToOwner,
            false,
            emitTokensSince,
            initialSupply
        )
        // solhint-disable-next-line function-max-lines
    {
        standard = "Clout 0.1";

        createdAt = now;

        // emissions
        if (init) {
//            uint256 period0 = createdAt;
//            uint256 period1 = 1514764800; // 2018-01-01T00:00:00Z
//            uint256 period2 = 1577836800; // 2020-01-01T00:00:00Z
//            uint256 period3 = 1672531200; // 2023-01-01T00:00:00Z
//            uint256 period4 = 1798761600; // 2027-01-01T00:00:00Z
//            uint256 period5 = 1956528000; // 2032-01-01T00:00:00Z
//            uint256 period6 = 2145916800; // 2038-01-01T00:00:00Z
//            uint256 period7 = 2366841600; // 2045-01-01T00:00:00Z
//            uint256 period8 = 2619302400; // 2053-01-01T00:00:00Z
//            uint256 period9 = 2903299200; // 2062-01-01T00:00:00Z

            uint256 blockDuration = 15;

            // after ico till 2018-01-01
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((1514764800 - emitTokensSince) / blockDuration), // tokens
                    1514764800, // till
                    false // removed
                )
            );

            // till 2020-01-01. blocks 4,204,800, tokens per block 2.378234399E19
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((1577836800 - 1514764800) / blockDuration), // tokens
                    1577836800, // till
                    false // removed
                )
            );

            // till 2023-01-01, blocks 6,312,960, tokens per block 1.584042985E19
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((1672531200 - 1577836800) / blockDuration), // tokens
                    1672531200, // till
                    false // removed
                )
            );

            // till 2027-01-01, blocks 8,415,360, tokens per block 1.188303293E19
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((1798761600 - 1672531200) / blockDuration), // tokens
                    1798761600, // till
                    false // removed
                )
            );

            // till 2032-01-01, blocks 10,517,760, tokens per block 9.507727881E18
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((1956528000 - 1798761600) / blockDuration), // tokens
                    1956528000, // till
                    false // removed
                )
            );

            // till 2038-01-01, blocks 12,625,920, tokens per block 7.920214923E18
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((2145916800 - 1956528000) / blockDuration), // tokens
                    2145916800, // till
                    false // removed
                )
            );

            // till 2045-01-01, blocks 14,728,320, tokens per block 6.789640638E18
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((2366841600 - 2145916800) / blockDuration), // tokens
                    2366841600, // till
                    false // removed
                )
            );

            // till 2053-01-01, blocks 16,830,720, tokens per block 5.941516465E18
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((2619302400 - 2366841600) / blockDuration), // tokens
                    2619302400, // till
                    false // removed
                )
            );

            // till 2062-01-01, blocks 18,933,120, tokens per block 5.281749654E18
            emissions.push(
                TokenEmission(
                    blockDuration,
                    100000000 * 10 ** 18 / ((2903299200 - 2619302400) / blockDuration), // tokens
                    2903299200, // till
                    false // removed
                )
            );
        }
    }

    function setEmissions(uint256[] array) public onlyOwner {
        require(array.length % 4 == 0);

        delete emissions;

        for (uint256 i = 0; i < array.length; i += 4) {
            emissions.push(TokenEmission(array[i], array[i + 1], array[i + 2], array[i + 3] == 0 ? false : true));
        }
    }

    function setClaimableToken(AbstractClaimableToken _token) public onlyOwner {
        claimableToken = _token;
    }

    function setTransferFrozen(bool _frozen) public onlyOwner {
        transferFrozen = _frozen;
    }

    function setLocked(bool _locked) public onlyOwner {
        locked = _locked;
    }

    function tokensClaimedHook(address _holder, uint256 since, uint256 till, uint256 amount) internal {
        if (claimableToken != address(0)) {
            claimableToken.claimedTokens(_holder, amount);
        }

        ClaimedTokens(_holder, since, till, amount);
    }
}

contract Multivest is Ownable {
    /* public variables */
    mapping (address => bool) public allowedMultivests;

    /* events */
    event MultivestSet(address multivest);

    event MultivestUnset(address multivest);

    event Contribution(address _holder, uint256 value, uint256 tokens);

    modifier onlyAllowedMultivests() {
        require(true == allowedMultivests[msg.sender]);
        _;
    }

    /* constructor */
    function Multivest(address multivest) {
        allowedMultivests[multivest] = true;
    }

    /* public methods */
    function setAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = true;
    }

    function unsetAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = false;
    }

    function multivestBuy(
        address _holder,
        uint256 _value
    )
    public
    onlyAllowedMultivests
    {
        bool status = buy(_holder, block.timestamp, _value);

        require(status == true);
    }

    function multivestBuy(
        bytes32 _hash,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        public payable
    {
        require(_hash == keccak256(msg.sender));
        require(allowedMultivests[verify(_hash, _v, _r, _s)] == true);
        bool status = buy(msg.sender, block.timestamp, msg.value);

        require(status == true);
    }

    function verify(bytes32 hash, uint8 v, bytes32 r, bytes32 s) public constant returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";

        return ecrecover(keccak256(prefix, hash), v, r, s);
    }

    function buy(address _address, uint256 _time, uint256 _value) internal returns (bool);
}



contract ICO is Ownable, Multivest {
    uint256 public icoSince;
    uint256 public icoTill;

    uint8 public decimals;

    mapping(address => uint256) public holderEthers;
    uint256 public collectedEthers;
    uint256 public soldTokens;

    uint256 public minEthToContribute;

    Phase[] public phases;

    bool public locked;

    Clout public clout;
    CLC public clc;

    address[] public etherReceivers;
    address public etherMasterWallet;

    struct Phase {
        uint256 price;
        uint256 maxAmount;
    }

    event Contribution(address _holder, uint256 _ethers, uint256 _clouts, uint256 _clcs);

    function ICO(
        uint256 _icoSince,
        uint256 _icoTill,
        uint8 _decimals,
        uint256 price1,
        uint256 price2,
        uint256 price3,
        Clout _clout,
        CLC _clc,
        uint256 _minEthToContribute,
        bool _locked
    )
        public
        Multivest(msg.sender)
    {
        icoSince = _icoSince;
        icoTill = _icoTill;
        decimals = _decimals;
        locked = _locked;

        clout = _clout;
        clc = _clc;

        if (_minEthToContribute > 0) {
            minEthToContribute = _minEthToContribute;
        } else {
            minEthToContribute = 0;
        }

        phases.push(Phase(price1, 5000000 * (uint256(10) ** decimals)));
        phases.push(Phase(price2, 3000000 * (uint256(10) ** decimals)));
        phases.push(Phase(price3, 2000000 * (uint256(10) ** decimals)));
    }

    function () payable {
        bool status = buy(msg.sender, block.timestamp, msg.value);

        require(status == true);
    }

    function setEtherReceivers(
        address _masterWallet,
        address[] _etherReceivers
    )
        public onlyOwner
    {
        require(_masterWallet != address(0));
        require(_etherReceivers.length == 4);
        require(_etherReceivers[0] != address(0));
        require(_etherReceivers[1] != address(0));
        require(_etherReceivers[2] != address(0));
        require(_etherReceivers[3] != address(0));

        etherMasterWallet = _masterWallet;
        etherReceivers = _etherReceivers;
    }

    function setPrice(uint256 price1, uint256 price2, uint256 price3) public onlyOwner {
        phases[0].price = price1;
        phases[1].price = price2;
        phases[2].price = price3;
    }

    function setPeriod(uint256 since, uint256 till) public onlyOwner {
        icoSince = since;
        icoTill = till;
    }

    function setClout(Clout _clout) public onlyOwner {
        clout = _clout;
    }

    function setCLC(CLC _clc) public onlyOwner {
        clc = _clc;
    }

    function setLocked(bool _locked) public onlyOwner {
        locked = _locked;
    }

    function getIcoTokensAmount(uint256 _soldTokens, uint256 _value) public constant returns (uint256) {
        uint256 amount;

        uint256 newSoldTokens = _soldTokens;
        uint256 remainingValue = _value;
    
        for (uint i = 0; i < phases.length; i++) {
            Phase storage phase = phases[i];

            uint256 tokens = remainingValue * (uint256(10) ** decimals) / phase.price;

            if (phase.maxAmount > newSoldTokens) {
                if (newSoldTokens + tokens > phase.maxAmount) {
                    uint256 diff = phase.maxAmount - tokens;

                    amount += diff;

                    // get optimal amount of ethers for this phase
                    uint256 phaseEthers = diff * phase.price / (uint256(10) ** decimals);

                    remainingValue -= phaseEthers;
                    newSoldTokens += (phaseEthers * (uint256(10) ** decimals) / phase.price);
                } else {
                    amount += tokens;

                    newSoldTokens += tokens;

                    remainingValue = 0;
                }
            }

            if (remainingValue == 0) {
                break;
            }
        }

        if (remainingValue > 0) {
            return 0;
        }

        return amount;
    }

    // solhint-disable-next-line code-complexity
    function transferEthers() public onlyOwner {
        require(this.balance > 0);
        require(etherReceivers.length == 4);
        require(etherMasterWallet != address(0));

        // ether balance on smart contract
        if (this.balance > 0) {
            uint256 balance = this.balance;

            etherReceivers[0].transfer(balance * 15 / 100);

            etherReceivers[1].transfer(balance * 15 / 100);

            etherReceivers[2].transfer(balance * 10 / 100);

            etherReceivers[3].transfer(balance * 10 / 100);

            // send rest to master wallet

            etherMasterWallet.transfer(this.balance);
        }
    }

    function buy(address _address, uint256 _time, uint256 _value) internal returns (bool) {
        if (locked == true) {
            return false;
        }

        if (_time < icoSince) {
            return false;
        }

        if (_time > icoTill) {
            return false;
        }

        if (_value < minEthToContribute || _value == 0) {
            return false;
        }

        uint256 amount = getIcoTokensAmount(soldTokens, _value);

        if (amount == 0) {
            return false;
        }

        uint256 cloutMinted = clout.mint(_address, amount);
        uint256 clcMinted = clc.mint(_address, amount);

        require(cloutMinted == amount);
        require(clcMinted == amount);

        soldTokens += amount;
        collectedEthers += _value;
        holderEthers[_address] += _value;

        Contribution(_address, _value, amount, amount);

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"creationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_locked","type":"bool"}],"name":"setLocked","outputs":[],"payable":false,"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,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"initialSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"issuers","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"standard","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setClaimableToken","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"array","type":"uint256[]"}],"name":"setEmissions","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newMinter","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_i","type":"uint256"}],"name":"removeTokenEmission","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferFrozen","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_lastClaimedAt","type":"uint256"},{"name":"_currentTime","type":"uint256"},{"name":"_currentBalance","type":"uint256"},{"name":"_totalSupply","type":"uint256"}],"name":"calculateEmissionTokens","outputs":[{"name":"tokens","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_blockDuration","type":"uint256"},{"name":"_blockTokens","type":"uint256"},{"name":"_periodEndsAt","type":"uint256"}],"name":"addTokenEmission","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"emissions","outputs":[{"name":"blockDuration","type":"uint256"},{"name":"blockTokens","type":"uint256"},{"name":"periodEndsAt","type":"uint256"},{"name":"removed","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"createdAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastClaims","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_frozen","type":"bool"}],"name":"setTransferFrozen","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"emitTokensSince","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"minters","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"claimableToken","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_i","type":"uint256"},{"name":"_blockDuration","type":"uint256"},{"name":"_blockTokens","type":"uint256"},{"name":"_periodEndsAt","type":"uint256"}],"name":"updateTokenEmission","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"emitTokensSince","type":"uint256"},{"name":"init","type":"bool"},{"name":"initialSupply","type":"uint256"},{"name":"decimals","type":"uint8"},{"name":"tokenName","type":"string"},{"name":"tokenSymbol","type":"string"},{"name":"transferAllSupplyToOwner","type":"bool"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_holder","type":"address"},{"indexed":false,"name":"_since","type":"uint256"},{"indexed":false,"name":"_till","type":"uint256"},{"indexed":false,"name":"_tokens","type":"uint256"}],"name":"ClaimedTokens","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"},{"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"}]

606060405234156200001057600080fd5b60405162002ca738038062002ca783398101604052808051919060200180519190602001805191906020018051919060200180518201919060200180518201919060200180519150505b6000808585858560008d8c5b878187898888885b8685858585855b8585858585855b5b60008054600160a060020a03191633600160a060020a03161790555b60408051908101604052600981527f455243323020302e31000000000000000000000000000000000000000000000060208201526007908051620000e2929160200190620008a5565b5060028690558115620001175762000111336002546200088564010000000002620021d8176401000000009004565b62000139565b62000139306002546200088564010000000002620021d8176401000000009004565b5b60058580516200014f929160200190620008a5565b50600683805162000165929160200190620008a5565b506004805460ff1990811660ff87161790915560088054909116821515179055436003555b5050505050505b505050600160a060020a0333166000908152600c60205260409020805460ff19166001179055505050600b8690555b5050505050505060408051908101604052601081527f47656e65736973546f6b656e20302e31000000000000000000000000000000006020820152600790805162000210929160200190620008a5565b50600d8290555b505050505050505060408051908101604052600981527f436c6f757420302e3100000000000000000000000000000000000000000000006020820152600790805162000268929160200190620008a5565b50426011558615620008765750600e8054600f9190600181016200028d83826200092b565b916000526020600020906004020160005b608060405190810160405280858152602001858d635a497a0003811515620002c257fe5b046a52b7d2dcc80cd2e4000000811515620002d957fe5b048152635a497a00602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e8054600181016200033983826200092b565b916000526020600020906004020160005b608060405190810160405280858152602001856303c267008115156200036c57fe5b046a52b7d2dcc80cd2e40000008115156200038357fe5b048152635e0be100602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e805460018101620003e383826200092b565b916000526020600020906004020160005b608060405190810160405280858152602001856305a4ec008115156200041657fe5b046a52b7d2dcc80cd2e40000008115156200042d57fe5b0481526363b0cd00602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e8054600181016200048d83826200092b565b916000526020600020906004020160005b608060405190810160405280858152602001856307861f80811515620004c057fe5b046a52b7d2dcc80cd2e4000000811515620004d757fe5b048152636b36ec80602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e8054600181016200053783826200092b565b916000526020600020906004020160005b6080604051908101604052808581526020018563096753008115156200056a57fe5b046a52b7d2dcc80cd2e40000008115156200058157fe5b04815263749e3f80602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e805460018101620005e183826200092b565b916000526020600020906004020160005b60806040519081016040528085815260200185630b49d8008115156200061457fe5b046a52b7d2dcc80cd2e40000008115156200062b57fe5b048152637fe81780602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e8054600181016200068b83826200092b565b916000526020600020906004020160005b60806040519081016040528085815260200185630d2b0b80811515620006be57fe5b046a52b7d2dcc80cd2e4000000811515620006d557fe5b048152638d132300602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e8054600181016200073583826200092b565b916000526020600020906004020160005b60806040519081016040528085815260200185630f0c3f008115156200076857fe5b046a52b7d2dcc80cd2e40000008115156200077f57fe5b048152639c1f6200602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff19169115159190911790555050600e805460018101620007df83826200092b565b916000526020600020906004020160005b608060405190810160405280858152602001856310ed72808115156200081257fe5b046a52b7d2dcc80cd2e40000008115156200082957fe5b04815263ad0cd480602082015260006040909101529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b5b5050505050505050620009c1565b600160a060020a03821660009081526009602052604090208190555b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008e857805160ff191683800117855562000918565b8280016001018555821562000918579182015b8281111562000918578251825591602001919060010190620008fb565b5b506200092792915062000960565b5090565b8154818355818115116200095a576004028160040283600052602060002091820191016200095a919062000984565b5b505050565b6200098191905b8082111562000927576000815560010162000967565b5090565b90565b6200098191905b808211156200092757600080825560018201819055600282015560038101805460ff191690556004016200098b565b5090565b90565b6122d680620009d16000396000f300606060405236156101f35763ffffffff60e060020a60003504166306fdde0381146101f8578063095ea7b31461028357806317634514146102b957806318160ddd146102de578063211e28b61461030357806323b872dd1461031d57806327e235e3146103595780633092afd51461038a578063313ce567146103ab578063378dc3dc146103d457806338a7543e146103f957806340c10f191461042c5780634e71d92d146104605780635a3b7e42146104855780635c658165146105105780636a26b7fe1461054757806370a082311461056857806379ba5097146105995780638afbcdd0146105ae5780638da5cb5b146105ff57806395d89b411461062e578063983b2d56146106b9578063a9059cbb146106da578063a909d7d314610710578063ade4637a14610728578063b971667c1461074f578063be45fd6214610780578063c7b97288146107f9578063cae9ca5114610817578063cb6da67014610890578063cf09e0d0146108d2578063cf309012146108f7578063d4ee1d901461091e578063d5abeb011461094d578063dd62ed3e14610972578063dddf31f1146109a9578063dde2b332146109da578063f2fde38b146109f4578063f416d2cb14610a15578063f46eccc414610a3a578063f6368f8a14610a6d578063f6d6d5aa14610b28578063fc06013a14610b57575b600080fd5b341561020357600080fd5b61020b610b78565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561028e57600080fd5b6102a5600160a060020a0360043516602435610c16565b604051901515815260200160405180910390f35b34156102c457600080fd5b6102cc610c96565b60405190815260200160405180910390f35b34156102e957600080fd5b6102cc610c9c565b60405190815260200160405180910390f35b341561030e57600080fd5b61031b6004351515610ca3565b005b341561032857600080fd5b6102a5600160a060020a0360043581169060243516604435610cd1565b604051901515815260200160405180910390f35b341561036457600080fd5b6102cc600160a060020a0360043516610ce9565b60405190815260200160405180910390f35b341561039557600080fd5b61031b600160a060020a0360043516610cfb565b005b34156103b657600080fd5b6103be610d3b565b60405160ff909116815260200160405180910390f35b34156103df57600080fd5b6102cc610d44565b60405190815260200160405180910390f35b341561040457600080fd5b6102a5600160a060020a0360043516610d4a565b604051901515815260200160405180910390f35b341561043757600080fd5b6102cc600160a060020a0360043516602435610d5f565b60405190815260200160405180910390f35b341561046b57600080fd5b6102cc610d9d565b60405190815260200160405180910390f35b341561049057600080fd5b61020b610ddd565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051b57600080fd5b6102cc600160a060020a0360043581169060243516610e7b565b60405190815260200160405180910390f35b341561055257600080fd5b61031b600160a060020a0360043516610e98565b005b341561057357600080fd5b6102cc600160a060020a0360043516610ee0565b60405190815260200160405180910390f35b34156105a457600080fd5b61031b610eff565b005b34156105b957600080fd5b61031b6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650610f4c95505050505050565b005b341561060a57600080fd5b610612611091565b604051600160a060020a03909116815260200160405180910390f35b341561063957600080fd5b61020b6110a0565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156106c457600080fd5b61031b600160a060020a036004351661113e565b005b34156106e557600080fd5b6102a5600160a060020a0360043516602435611181565b604051901515815260200160405180910390f35b341561071b57600080fd5b61031b6004356111df565b005b341561073357600080fd5b6102a5611242565b604051901515815260200160405180910390f35b341561075a57600080fd5b6102cc600435602435604435606435611250565b60405190815260200160405180910390f35b341561078b57600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061136695505050505050565b604051901515815260200160405180910390f35b341561080457600080fd5b61031b600435602435604435611395565b005b341561082257600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061143495505050505050565b604051901515815260200160405180910390f35b341561089b57600080fd5b6108a660043561156b565b604051938452602084019290925260408084019190915290151560608301526080909101905180910390f35b34156108dd57600080fd5b6102cc6115a8565b60405190815260200160405180910390f35b341561090257600080fd5b6102a56115ae565b604051901515815260200160405180910390f35b341561092957600080fd5b6106126115b7565b604051600160a060020a03909116815260200160405180910390f35b341561095857600080fd5b6102cc6115c6565b60405190815260200160405180910390f35b341561097d57600080fd5b6102cc600160a060020a03600435811690602435166115cc565b60405190815260200160405180910390f35b34156109b457600080fd5b6102cc600160a060020a03600435166115f9565b60405190815260200160405180910390f35b34156109e557600080fd5b61031b600435151561160b565b005b34156109ff57600080fd5b61031b600160a060020a036004351661163e565b005b3415610a2057600080fd5b6102cc61169b565b60405190815260200160405180910390f35b3415610a4557600080fd5b6102a5600160a060020a03600435166116a1565b604051901515815260200160405180910390f35b3415610a7857600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506116b695505050505050565b604051901515815260200160405180910390f35b3415610b3357600080fd5b6106126116e9565b604051600160a060020a03909116815260200160405180910390f35b3415610b6257600080fd5b61031b6004356024356044356064356116f8565b005b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b60085460009060ff1615610c2c57506000610c90565b600160a060020a033381166000818152600a6020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035481565b6002545b90565b60005433600160a060020a03908116911614610cbe57600080fd5b6008805460ff19168215151790555b5b50565b6000610cdf4285858561179a565b90505b9392505050565b60096020526000908152604090205481565b60005433600160a060020a03908116911614610d1657600080fd5b600160a060020a0381166000908152600c60205260409020805460ff191690555b5b50565b60045460ff1681565b60025481565b60126020526000908152604090205460ff1681565b600160a060020a0333166000908152600c602052604081205460ff161515600114610d8957600080fd5b610d938383611800565b90505b5b92915050565b6008546000908190819060ff1615610db457600080fd5b610dbd33610ee0565b9150610dc7610c9c565b9050610dd542338484611836565b92505b505090565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b600a60209081526000928352604080842090915290825290205481565b60005433600160a060020a03908116911614610eb357600080fd5b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600160a060020a0381166000908152600960205260409020545b919050565b60015433600160a060020a0390811691161415610f4957600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551690555b5b565b6000805433600160a060020a03908116911614610f6857600080fd5b60048251811515610f7557fe5b0615610f8057600080fd5b610f8c600e6000612207565b5060005b815181101561108b57600e805460018101610fab838261222c565b916000526020600020906004020160005b608060405190810160405280868681518110610fd457fe5b906020019060200201518152602001868660010181518110610ff257fe5b90602001906020020151815260200186866002018151811061101057fe5b90602001906020020151815260200186866003018151811061102e57fe5b9060200190602002015115611044576001611047565b60005b151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600401610f90565b5b5b5050565b600054600160a060020a031681565b60068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b60005433600160a060020a0390811691161461115957600080fd5b600160a060020a0381166000908152600c60205260409020805460ff191660011790555b5b50565b60008060023660441461119057fe5b60085460ff16156111a057600080fd5b600854610100900460ff16156111b557600080fd5b6111c033868661193c565b91506001821515146111d157600080fd5b600192505b5b505092915050565b60005433600160a060020a039081169116146111fa57600080fd5b600e54811061120857600080fd5b6001600e8281548110151561121957fe5b906000526020600020906004020160005b50600301805460ff19169115159190911790555b5b50565b600854610100900460ff1681565b6000808581808080806112698b8763ffffffff61197e16565b9450600092505b600e5483101561135357600e80548490811061128857fe5b906000526020600020906004020160005b50600381015490925060ff16156112af57611347565b816002015486101561133a5760028201546112d0878763ffffffff61199516565b11156113165760028201546112eb908763ffffffff61197e16565b9050611302818b846000015485600101548d6119af565b96870196958101959481900394935061133a565b61132b858b846000015485600101548d6119af565b96870196949095019460009493505b5b84151561134757611353565b5b600190920191611270565b8697505b50505050505050949350505050565b600854600090819060ff161561137b57600080fd5b61138733868686611a05565b90508091505b509392505050565b60005433600160a060020a039081169116146113b057600080fd5b600e8054600181016113c2838261222c565b916000526020600020906004020160005b60806040519081016040908152878252602082018790528101859052600060608201529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b5b505050565b600854600090819060ff161561144d576000915061138d565b50836114598185610c16565b1561138d5780600160a060020a0316638f4ffcb1338630876040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114f75780820151818401525b6020016114de565b50505050905090810190601f1680156115245780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561154557600080fd5b6102c65a03f1151561155657600080fd5b5050506001915061138d565b5b509392505050565b600e80548290811061157957fe5b906000526020600020906004020160005b50805460018201546002830154600390930154919350919060ff1684565b60115481565b60085460ff1681565b600154600160a060020a031681565b600b5481565b600160a060020a038083166000908152600a60209081526040808320938516835292905220545b92915050565b600f6020526000908152604090205481565b60005433600160a060020a0390811691161461162657600080fd5b6008805461ff001916610100831515021790555b5b50565b60005433600160a060020a0390811691161461165957600080fd5b600160a060020a038116151561166e57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600d5481565b600c6020526000908152604090205460ff1681565b600854600090819060ff16156116cb57600080fd5b6116da33878787600188611a2f565b90508091505b50949350505050565b601054600160a060020a031681565b60005433600160a060020a0390811691161461171357600080fd5b600e54841061172157600080fd5b82600e8581548110151561173157fe5b906000526020600020906004020160005b5055600e80548391908690811061175557fe5b906000526020600020906004020160005b5060010155600e80548291908690811061177c57fe5b906000526020600020906004020160005b50600201555b5b50505050565b60008060008060006117ab88610ee0565b93506117b687610ee0565b92506117c0610c9c565b91506117cd888888611a4d565b905080156117f0576117e189898685611836565b506117ee89888585611836565b505b8094505b50505050949350505050565b60008061181e428561181187610ee0565b611819610c9c565b611836565b506118298484611b10565b90508091505b5092915050565b6000806000600d5487101561186b57600d54600160a060020a0387166000908152600f60205260408120919091559250611932565b84151561189457600160a060020a0386166000908152600f602052604081208890559250611932565b600160a060020a0386166000908152600f602052604090205491508115156118d757600d54600160a060020a0387166000908152600f6020526040902081905591505b8682106118e75760009250611932565b6118f382888787611250565b9050600081111561192d5761190a86838984611be4565b600160a060020a0386166000908152600f60205260409020879055915081611932565b600092505b5050949350505050565b600061194661225e565b60085460ff161561195657600080fd5b611973858585846000602060405190810160405260008152611a2f565b91505b509392505050565b60008282111561198a57fe5b508082035b92915050565b6000828201838110156119a457fe5b8091505b5092915050565b6000806119c2878663ffffffff611cc816565b600b549091506119f8906119ec886119e0858963ffffffff611ce416565b9063ffffffff611ce416565b9063ffffffff611cc816565b91505b5095945050505050565b6000611a24858585856000602060405190810160405260008152611a2f565b90505b949350505050565b6000611a4042888888888888611d13565b90505b9695505050505050565b600080600336606414611a5c57fe5b60085460ff1615611a705760009250611b06565b600854610100900460ff1615611a895760009250611b06565b600160a060020a038087166000908152600a60209081526040808320339094168352929052205484901015611ac15760009250611b06565b611acc868686611d85565b91508115611b0257600160a060020a038087166000908152600a6020908152604080832033909416835292905220805485900390555b8192505b5b50509392505050565b6000811515611b2157506000610c90565b600b54611b3c83611b30610c9c565b9063ffffffff61199516565b1115611b4a57506000610c90565b600254611b5d908363ffffffff61199516565b600255600160a060020a038316600090815260096020526040902054611b89908363ffffffff61199516565b600160a060020a0384166000818152600960205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350805b92915050565b601054600160a060020a031615611c6057601054600160a060020a031663d199168d858360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611c4b57600080fd5b6102c65a03f11515611c5c57600080fd5b5050505b7f21ac01d829f16af45bd6ada89df10129ee8517b432b43419cd081edcff3126bc848484846040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15b50505050565b6000808284811515611cd657fe5b0490508091505b5092915050565b6000828202831580611d005750828482811515611cfd57fe5b04145b15156119a457fe5b8091505b5092915050565b6000806000806000611d248b610ee0565b9350611d2f8a610ee0565b9250611d39610c9c565b9150611d498b8b8b8b8b8b611ee6565b9050801515611d5757600080fd5b611d638c8c8685611836565b50611d708c8b8585611836565b50600194505b50505050979650505050505050565b60085460009060ff1615611d9857600080fd5b600854610100900460ff1615611dad57600080fd5b811515611e035782600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a3506001610ce2565b600160a060020a03841660009081526009602052604090205482901015611e2c57506000610ce2565b600160a060020a038416600090815260096020526040902054611e60908590611e5b908563ffffffff61197e16565b6121d8565b600160a060020a038316600090815260096020526040902054611e94908490611e5b908563ffffffff61199516565b6121d8565b82600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a35060015b9392505050565b6000806000611ef6898989611d85565b915081156121c857611f07886121f8565b1561212257508684156120405780600160a060020a03166000856040518082805190602001908083835b60208310611f5157805182525b601f199092019160209182019101611f31565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902060e060020a9004908b8a8a6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001828051906020019080838360005b83811015611fe35780820151818401525b602001611fca565b50505050905090810190601f1680156120105780820380516001836020036101000a031916815260200191505b50935050505060006040518083038185886187965a03f11515600114935061203b9250505057600080fd5b612122565b80600160a060020a031663c0ee0b8a8a89896040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c05780820151818401525b6020016120a7565b50505050905090810190601f1680156120ed5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b151561210d57600080fd5b6102c65a03f1151561211e57600080fd5b5050505b5b856040518082805190602001908083835b6020831061215457805182525b601f199092019160209182019101612134565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902088600160a060020a03168a600160a060020a03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c168a60405190815260200160405180910390a45b8192505b50509695505050505050565b600160a060020a03821660009081526009602052604090208190555b5050565b6000813b908111905b50919050565b5080546000825560040290600052602060002090810190610ccd9190612270565b5b50565b81548183558181151161142e5760040281600402836000526020600020918201910161142e9190612270565b5b505050565b60206040519081016040526000815290565b610ca091905b808211156122a357600080825560018201819055600282015560038101805460ff19169055600401612276565b5090565b905600a165627a7a72305820f91b7dfca7202056c4afb62e9d1a730c397ef72f8f0f990364882494e9ec71710029000000000000000000000000000000000000000000000000000000005a0eeb60000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005434c4f55540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005434c4f5554000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x606060405236156101f35763ffffffff60e060020a60003504166306fdde0381146101f8578063095ea7b31461028357806317634514146102b957806318160ddd146102de578063211e28b61461030357806323b872dd1461031d57806327e235e3146103595780633092afd51461038a578063313ce567146103ab578063378dc3dc146103d457806338a7543e146103f957806340c10f191461042c5780634e71d92d146104605780635a3b7e42146104855780635c658165146105105780636a26b7fe1461054757806370a082311461056857806379ba5097146105995780638afbcdd0146105ae5780638da5cb5b146105ff57806395d89b411461062e578063983b2d56146106b9578063a9059cbb146106da578063a909d7d314610710578063ade4637a14610728578063b971667c1461074f578063be45fd6214610780578063c7b97288146107f9578063cae9ca5114610817578063cb6da67014610890578063cf09e0d0146108d2578063cf309012146108f7578063d4ee1d901461091e578063d5abeb011461094d578063dd62ed3e14610972578063dddf31f1146109a9578063dde2b332146109da578063f2fde38b146109f4578063f416d2cb14610a15578063f46eccc414610a3a578063f6368f8a14610a6d578063f6d6d5aa14610b28578063fc06013a14610b57575b600080fd5b341561020357600080fd5b61020b610b78565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561028e57600080fd5b6102a5600160a060020a0360043516602435610c16565b604051901515815260200160405180910390f35b34156102c457600080fd5b6102cc610c96565b60405190815260200160405180910390f35b34156102e957600080fd5b6102cc610c9c565b60405190815260200160405180910390f35b341561030e57600080fd5b61031b6004351515610ca3565b005b341561032857600080fd5b6102a5600160a060020a0360043581169060243516604435610cd1565b604051901515815260200160405180910390f35b341561036457600080fd5b6102cc600160a060020a0360043516610ce9565b60405190815260200160405180910390f35b341561039557600080fd5b61031b600160a060020a0360043516610cfb565b005b34156103b657600080fd5b6103be610d3b565b60405160ff909116815260200160405180910390f35b34156103df57600080fd5b6102cc610d44565b60405190815260200160405180910390f35b341561040457600080fd5b6102a5600160a060020a0360043516610d4a565b604051901515815260200160405180910390f35b341561043757600080fd5b6102cc600160a060020a0360043516602435610d5f565b60405190815260200160405180910390f35b341561046b57600080fd5b6102cc610d9d565b60405190815260200160405180910390f35b341561049057600080fd5b61020b610ddd565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051b57600080fd5b6102cc600160a060020a0360043581169060243516610e7b565b60405190815260200160405180910390f35b341561055257600080fd5b61031b600160a060020a0360043516610e98565b005b341561057357600080fd5b6102cc600160a060020a0360043516610ee0565b60405190815260200160405180910390f35b34156105a457600080fd5b61031b610eff565b005b34156105b957600080fd5b61031b6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650610f4c95505050505050565b005b341561060a57600080fd5b610612611091565b604051600160a060020a03909116815260200160405180910390f35b341561063957600080fd5b61020b6110a0565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102485780820151818401525b60200161022f565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156106c457600080fd5b61031b600160a060020a036004351661113e565b005b34156106e557600080fd5b6102a5600160a060020a0360043516602435611181565b604051901515815260200160405180910390f35b341561071b57600080fd5b61031b6004356111df565b005b341561073357600080fd5b6102a5611242565b604051901515815260200160405180910390f35b341561075a57600080fd5b6102cc600435602435604435606435611250565b60405190815260200160405180910390f35b341561078b57600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061136695505050505050565b604051901515815260200160405180910390f35b341561080457600080fd5b61031b600435602435604435611395565b005b341561082257600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061143495505050505050565b604051901515815260200160405180910390f35b341561089b57600080fd5b6108a660043561156b565b604051938452602084019290925260408084019190915290151560608301526080909101905180910390f35b34156108dd57600080fd5b6102cc6115a8565b60405190815260200160405180910390f35b341561090257600080fd5b6102a56115ae565b604051901515815260200160405180910390f35b341561092957600080fd5b6106126115b7565b604051600160a060020a03909116815260200160405180910390f35b341561095857600080fd5b6102cc6115c6565b60405190815260200160405180910390f35b341561097d57600080fd5b6102cc600160a060020a03600435811690602435166115cc565b60405190815260200160405180910390f35b34156109b457600080fd5b6102cc600160a060020a03600435166115f9565b60405190815260200160405180910390f35b34156109e557600080fd5b61031b600435151561160b565b005b34156109ff57600080fd5b61031b600160a060020a036004351661163e565b005b3415610a2057600080fd5b6102cc61169b565b60405190815260200160405180910390f35b3415610a4557600080fd5b6102a5600160a060020a03600435166116a1565b604051901515815260200160405180910390f35b3415610a7857600080fd5b6102a560048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506116b695505050505050565b604051901515815260200160405180910390f35b3415610b3357600080fd5b6106126116e9565b604051600160a060020a03909116815260200160405180910390f35b3415610b6257600080fd5b61031b6004356024356044356064356116f8565b005b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b60085460009060ff1615610c2c57506000610c90565b600160a060020a033381166000818152600a6020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035481565b6002545b90565b60005433600160a060020a03908116911614610cbe57600080fd5b6008805460ff19168215151790555b5b50565b6000610cdf4285858561179a565b90505b9392505050565b60096020526000908152604090205481565b60005433600160a060020a03908116911614610d1657600080fd5b600160a060020a0381166000908152600c60205260409020805460ff191690555b5b50565b60045460ff1681565b60025481565b60126020526000908152604090205460ff1681565b600160a060020a0333166000908152600c602052604081205460ff161515600114610d8957600080fd5b610d938383611800565b90505b5b92915050565b6008546000908190819060ff1615610db457600080fd5b610dbd33610ee0565b9150610dc7610c9c565b9050610dd542338484611836565b92505b505090565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b600a60209081526000928352604080842090915290825290205481565b60005433600160a060020a03908116911614610eb357600080fd5b6010805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600160a060020a0381166000908152600960205260409020545b919050565b60015433600160a060020a0390811691161415610f4957600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551690555b5b565b6000805433600160a060020a03908116911614610f6857600080fd5b60048251811515610f7557fe5b0615610f8057600080fd5b610f8c600e6000612207565b5060005b815181101561108b57600e805460018101610fab838261222c565b916000526020600020906004020160005b608060405190810160405280868681518110610fd457fe5b906020019060200201518152602001868660010181518110610ff257fe5b90602001906020020151815260200186866002018151811061101057fe5b90602001906020020151815260200186866003018151811061102e57fe5b9060200190602002015115611044576001611047565b60005b151590529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b600401610f90565b5b5b5050565b600054600160a060020a031681565b60068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b505050505081565b60005433600160a060020a0390811691161461115957600080fd5b600160a060020a0381166000908152600c60205260409020805460ff191660011790555b5b50565b60008060023660441461119057fe5b60085460ff16156111a057600080fd5b600854610100900460ff16156111b557600080fd5b6111c033868661193c565b91506001821515146111d157600080fd5b600192505b5b505092915050565b60005433600160a060020a039081169116146111fa57600080fd5b600e54811061120857600080fd5b6001600e8281548110151561121957fe5b906000526020600020906004020160005b50600301805460ff19169115159190911790555b5b50565b600854610100900460ff1681565b6000808581808080806112698b8763ffffffff61197e16565b9450600092505b600e5483101561135357600e80548490811061128857fe5b906000526020600020906004020160005b50600381015490925060ff16156112af57611347565b816002015486101561133a5760028201546112d0878763ffffffff61199516565b11156113165760028201546112eb908763ffffffff61197e16565b9050611302818b846000015485600101548d6119af565b96870196958101959481900394935061133a565b61132b858b846000015485600101548d6119af565b96870196949095019460009493505b5b84151561134757611353565b5b600190920191611270565b8697505b50505050505050949350505050565b600854600090819060ff161561137b57600080fd5b61138733868686611a05565b90508091505b509392505050565b60005433600160a060020a039081169116146113b057600080fd5b600e8054600181016113c2838261222c565b916000526020600020906004020160005b60806040519081016040908152878252602082018790528101859052600060608201529190508151815560208201518160010155604082015181600201556060820151600391909101805460ff191691151591909117905550505b5b505050565b600854600090819060ff161561144d576000915061138d565b50836114598185610c16565b1561138d5780600160a060020a0316638f4ffcb1338630876040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114f75780820151818401525b6020016114de565b50505050905090810190601f1680156115245780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561154557600080fd5b6102c65a03f1151561155657600080fd5b5050506001915061138d565b5b509392505050565b600e80548290811061157957fe5b906000526020600020906004020160005b50805460018201546002830154600390930154919350919060ff1684565b60115481565b60085460ff1681565b600154600160a060020a031681565b600b5481565b600160a060020a038083166000908152600a60209081526040808320938516835292905220545b92915050565b600f6020526000908152604090205481565b60005433600160a060020a0390811691161461162657600080fd5b6008805461ff001916610100831515021790555b5b50565b60005433600160a060020a0390811691161461165957600080fd5b600160a060020a038116151561166e57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600d5481565b600c6020526000908152604090205460ff1681565b600854600090819060ff16156116cb57600080fd5b6116da33878787600188611a2f565b90508091505b50949350505050565b601054600160a060020a031681565b60005433600160a060020a0390811691161461171357600080fd5b600e54841061172157600080fd5b82600e8581548110151561173157fe5b906000526020600020906004020160005b5055600e80548391908690811061175557fe5b906000526020600020906004020160005b5060010155600e80548291908690811061177c57fe5b906000526020600020906004020160005b50600201555b5b50505050565b60008060008060006117ab88610ee0565b93506117b687610ee0565b92506117c0610c9c565b91506117cd888888611a4d565b905080156117f0576117e189898685611836565b506117ee89888585611836565b505b8094505b50505050949350505050565b60008061181e428561181187610ee0565b611819610c9c565b611836565b506118298484611b10565b90508091505b5092915050565b6000806000600d5487101561186b57600d54600160a060020a0387166000908152600f60205260408120919091559250611932565b84151561189457600160a060020a0386166000908152600f602052604081208890559250611932565b600160a060020a0386166000908152600f602052604090205491508115156118d757600d54600160a060020a0387166000908152600f6020526040902081905591505b8682106118e75760009250611932565b6118f382888787611250565b9050600081111561192d5761190a86838984611be4565b600160a060020a0386166000908152600f60205260409020879055915081611932565b600092505b5050949350505050565b600061194661225e565b60085460ff161561195657600080fd5b611973858585846000602060405190810160405260008152611a2f565b91505b509392505050565b60008282111561198a57fe5b508082035b92915050565b6000828201838110156119a457fe5b8091505b5092915050565b6000806119c2878663ffffffff611cc816565b600b549091506119f8906119ec886119e0858963ffffffff611ce416565b9063ffffffff611ce416565b9063ffffffff611cc816565b91505b5095945050505050565b6000611a24858585856000602060405190810160405260008152611a2f565b90505b949350505050565b6000611a4042888888888888611d13565b90505b9695505050505050565b600080600336606414611a5c57fe5b60085460ff1615611a705760009250611b06565b600854610100900460ff1615611a895760009250611b06565b600160a060020a038087166000908152600a60209081526040808320339094168352929052205484901015611ac15760009250611b06565b611acc868686611d85565b91508115611b0257600160a060020a038087166000908152600a6020908152604080832033909416835292905220805485900390555b8192505b5b50509392505050565b6000811515611b2157506000610c90565b600b54611b3c83611b30610c9c565b9063ffffffff61199516565b1115611b4a57506000610c90565b600254611b5d908363ffffffff61199516565b600255600160a060020a038316600090815260096020526040902054611b89908363ffffffff61199516565b600160a060020a0384166000818152600960205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350805b92915050565b601054600160a060020a031615611c6057601054600160a060020a031663d199168d858360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611c4b57600080fd5b6102c65a03f11515611c5c57600080fd5b5050505b7f21ac01d829f16af45bd6ada89df10129ee8517b432b43419cd081edcff3126bc848484846040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15b50505050565b6000808284811515611cd657fe5b0490508091505b5092915050565b6000828202831580611d005750828482811515611cfd57fe5b04145b15156119a457fe5b8091505b5092915050565b6000806000806000611d248b610ee0565b9350611d2f8a610ee0565b9250611d39610c9c565b9150611d498b8b8b8b8b8b611ee6565b9050801515611d5757600080fd5b611d638c8c8685611836565b50611d708c8b8585611836565b50600194505b50505050979650505050505050565b60085460009060ff1615611d9857600080fd5b600854610100900460ff1615611dad57600080fd5b811515611e035782600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a3506001610ce2565b600160a060020a03841660009081526009602052604090205482901015611e2c57506000610ce2565b600160a060020a038416600090815260096020526040902054611e60908590611e5b908563ffffffff61197e16565b6121d8565b600160a060020a038316600090815260096020526040902054611e94908490611e5b908563ffffffff61199516565b6121d8565b82600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a35060015b9392505050565b6000806000611ef6898989611d85565b915081156121c857611f07886121f8565b1561212257508684156120405780600160a060020a03166000856040518082805190602001908083835b60208310611f5157805182525b601f199092019160209182019101611f31565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902060e060020a9004908b8a8a6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001828051906020019080838360005b83811015611fe35780820151818401525b602001611fca565b50505050905090810190601f1680156120105780820380516001836020036101000a031916815260200191505b50935050505060006040518083038185886187965a03f11515600114935061203b9250505057600080fd5b612122565b80600160a060020a031663c0ee0b8a8a89896040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c05780820151818401525b6020016120a7565b50505050905090810190601f1680156120ed5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b151561210d57600080fd5b6102c65a03f1151561211e57600080fd5b5050505b5b856040518082805190602001908083835b6020831061215457805182525b601f199092019160209182019101612134565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902088600160a060020a03168a600160a060020a03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c168a60405190815260200160405180910390a45b8192505b50509695505050505050565b600160a060020a03821660009081526009602052604090208190555b5050565b6000813b908111905b50919050565b5080546000825560040290600052602060002090810190610ccd9190612270565b5b50565b81548183558181151161142e5760040281600402836000526020600020918201910161142e9190612270565b5b505050565b60206040519081016040526000815290565b610ca091905b808211156122a357600080825560018201819055600282015560038101805460ff19169055600401612276565b5090565b905600a165627a7a72305820f91b7dfca7202056c4afb62e9d1a730c397ef72f8f0f990364882494e9ec71710029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000005a0eeb60000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005434c4f55540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005434c4f5554000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : emitTokensSince (uint256): 1510927200
Arg [1] : init (bool): True
Arg [2] : initialSupply (uint256): 100000000000000000000000000
Arg [3] : decimals (uint8): 18
Arg [4] : tokenName (string): CLOUT
Arg [5] : tokenSymbol (string): CLOUT
Arg [6] : transferAllSupplyToOwner (bool): False

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000005a0eeb60
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 434c4f5554000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 434c4f5554000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://f91b7dfca7202056c4afb62e9d1a730c397ef72f8f0f990364882494e9ec7171

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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