ETH Price: $3,398.27 (-1.76%)
Gas: 5 Gwei

Contract

0x98135aA7D498890176bFd34Bc451B4Dd36b4BE01
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer164626582023-01-22 13:31:47543 days ago1674394307IN
0x98135aA7...d36b4BE01
0 ETH0.0035288116.77390997
Approve115416342020-12-28 9:37:021299 days ago1609148222IN
0x98135aA7...d36b4BE01
0 ETH0.00471366105
Transfer80141472019-06-23 12:00:481852 days ago1561291248IN
0x98135aA7...d36b4BE01
0 ETH0.0005495822
Transfer79799042019-06-18 3:24:221858 days ago1560828262IN
0x98135aA7...d36b4BE01
0 ETH0.0012894421.50802227
Transfer79093642019-06-07 2:21:241869 days ago1559874084IN
0x98135aA7...d36b4BE01
0 ETH0.0111788541
Transfer78663282019-05-31 8:52:551876 days ago1559292775IN
0x98135aA7...d36b4BE01
0 ETH0.0111814741
Transfer66240882018-11-01 14:23:462086 days ago1541082226IN
0x98135aA7...d36b4BE01
0 ETH0.00265252
Transfer63468332018-09-17 6:38:092132 days ago1537166289IN
0x98135aA7...d36b4BE01
0 ETH0.010203942
Transfer63467942018-09-17 6:30:472132 days ago1537165847IN
0x98135aA7...d36b4BE01
0 ETH0.0062291442
Transfer63467412018-09-17 6:17:302132 days ago1537165050IN
0x98135aA7...d36b4BE01
0 ETH0.0020947942
Transfer63335302018-09-15 1:57:402134 days ago1536976660IN
0x98135aA7...d36b4BE01
0 ETH0.000932726
Transfer63335232018-09-15 1:55:172134 days ago1536976517IN
0x98135aA7...d36b4BE01
0 ETH0.0111788541
Transfer62587692018-09-02 14:02:092146 days ago1535896929IN
0x98135aA7...d36b4BE01
0 ETH0.000466323.001
Transfer62587512018-09-02 13:59:062146 days ago1535896746IN
0x98135aA7...d36b4BE01
0 ETH0.0111762341
Transfer62565302018-09-02 5:11:182147 days ago1535865078IN
0x98135aA7...d36b4BE01
0 ETH0.009955741
Transfer62514092018-09-01 8:16:392148 days ago1535789799IN
0x98135aA7...d36b4BE01
0 ETH0.0145731660
Transfer62512272018-09-01 7:30:222148 days ago1535787022IN
0x98135aA7...d36b4BE01
0 ETH0.0004247.1
Transfer62471692018-08-31 14:54:312148 days ago1535727271IN
0x98135aA7...d36b4BE01
0 ETH0.0131698860
Transfer62469312018-08-31 14:02:542148 days ago1535724174IN
0x98135aA7...d36b4BE01
0 ETH0.000477758
Transfer62455992018-08-31 8:41:272149 days ago1535704887IN
0x98135aA7...d36b4BE01
0 ETH0.0035831460
Transfer62443952018-08-31 3:42:082149 days ago1535686928IN
0x98135aA7...d36b4BE01
0 ETH0.0035831460
Transfer62407842018-08-30 13:19:382149 days ago1535635178IN
0x98135aA7...d36b4BE01
0 ETH0.0099583241
Transfer62373232018-08-29 23:07:272150 days ago1535584047IN
0x98135aA7...d36b4BE01
0 ETH0.000779465.01
Transfer62373142018-08-29 23:04:532150 days ago1535583893IN
0x98135aA7...d36b4BE01
0 ETH0.011184141
Transfer62367452018-08-29 20:47:312150 days ago1535575651IN
0x98135aA7...d36b4BE01
0 ETH0.0010615341
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:
Spark

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-16
*/

pragma solidity 0.4.19;


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

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

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

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

/**
 * @title 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;
        }
    }
}

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

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

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

    using SafeMath for uint256;

    mapping (address => uint256) public balances;

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

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

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

}

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

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

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

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

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

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

    /**
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     */
    function increaseApproval(address _spender, uint _addedValue) public returns (bool success) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

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

}

contract SparkERC20 is StandardToken, Ownable {

    using SafeMath for uint256;

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

    uint8 public decimals;

    string public name;

    string public symbol;

    string public standard;

    bool public locked;

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

        if (_transferAllSupplyToOwner) {
            balances[msg.sender] = totalSupply;
        } else {
            balances[this] = totalSupply;
        }
        name = _tokenName;
        // Set the name for display purposes
        symbol = _tokenSymbol;
        // Set the symbol for display purposes
        decimals = _decimalUnits;
        // Amount of decimals for display purposes
        creationBlock = block.number;
    }

    /* public methods */
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(locked == false);
        return super.transfer(_to, _value);
    }

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

    function increaseApproval(address _spender, uint _addedValue) public returns (bool success) {
        if (locked) {
            return false;
        }
        return super.increaseApproval(_spender, _addedValue);
    }

    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool success) {
        if (locked) {
            return false;
        }
        return super.decreaseApproval(_spender, _subtractedValue);
    }

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

        return super.transferFrom(_from, _to, _value);
    }

}

/*
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 SparkERC20 {

    // Variables
    uint256 public maxSupply;

    mapping (address => bool) public minters;

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

    function MintingERC20(
        uint256 _initialSupply,
        uint256 _maxSupply,
        string _tokenName,
        uint8 _decimals,
        string _symbol,
        bool _transferAllSupplyToOwner,
        bool _locked
    ) public SparkERC20(
        _initialSupply,
        _tokenName,
        _decimals,
        _symbol,
        _transferAllSupplyToOwner,
        _locked
    )
    {
        standard = "MintingERC20 0.1";
        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) {
        if (_amount == uint256(0)) {
            return uint256(0);
        }

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

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

        return _amount;
    }

}

contract Spark is MintingERC20 {

    ICO public ico;

    SparkDividends public dividends;

    bool public transferFrozen = true;

    function Spark(
        string _tokenName,
        uint8 _decimals,
        string _symbol,
        uint256 _maxSupply,
        bool _locked
    ) public MintingERC20(0, _maxSupply, _tokenName, _decimals, _symbol, false, _locked)
    {
        standard = "Spark 0.1";
    }

    function setICO(address _ico) public onlyOwner {
        require(_ico != address(0));
        ico = ICO(_ico);
    }

    function setSparkDividends(address _dividends) public onlyOwner {
        require(address(0) != _dividends);
        dividends = SparkDividends(_dividends);
    }

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

    // prevent manual minting tokens when ICO is active;
    function mint(address _addr, uint256 _amount) public onlyMinters returns (uint256) {
        uint256 mintedAmount;
        if (msg.sender == owner) {
            require(address(ico) != address(0));
            if (!ico.isActive() && block.timestamp >= ico.startTime()) {
                mintedAmount = super.mint(_addr, _amount);
            }
        } else {
            mintedAmount = super.mint(_addr, _amount);
        }

        if (mintedAmount == _amount) {
            require(address(dividends) != address(0));
            dividends.logAccount(_addr, _amount);
        }

        return mintedAmount;
    }

    // Allow token transfer.
    function freezing(bool _transferFrozen) public onlyOwner {
        if (address(ico) != address(0) && !ico.isActive() && block.timestamp >= ico.startTime()) {
            transferFrozen = _transferFrozen;
        }
    }

    // ERC20 functions
    // =========================
    function transfer(address _to, uint _value) public returns (bool) {
        require(!transferFrozen);

        bool status = super.transfer(_to, _value);
        if (status) {
            require(address(dividends) != address(0));
            dividends.logAccount(msg.sender, 0);
            dividends.logAccount(_to, 0);
        }

        return status;
    }

    function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
        require(!transferFrozen);

        bool status = super.transferFrom(_from, _to, _value);
        if (status) {
            require(address(dividends) != address(0));
            dividends.logAccount(_from, 0);
            dividends.logAccount(_to, 0);
        }

        return status;

    }

}

contract WhiteList is Ownable {

    mapping (address => bool) public whitelist;

    /* events */
    event WhitelistSet(address contributorAddress);

    event WhitelistUnset(address contributorAddress);

    modifier onlyWhitelisted() {
        require(true == whitelist[msg.sender]);
        _;
    }

    function WhiteList() public {
        whitelist[msg.sender] = true;
    }

    function addToWhitelist(address _address) public onlyOwner {
        whitelist[_address] = true;
        WhitelistSet(_address);
    }

    function removeFromWhitelist(address _address) public onlyOwner {
        whitelist[_address] = false;
        WhitelistUnset(_address);
    }

}

contract SparkDividends is Ownable {

    using SafeMath for uint256;

    Spark public spark;

    ICO public ico;

    address public treasuryAddress;

    mapping(address => DividendData[]) public accounts;

    FundsData[] public funds;

    struct DividendData {
        uint256 period;
        uint256 day;
        uint256 balance;
    }

    struct FundsData {
        uint256 period;
        uint256 ethersAmount;
    }

    event Disbursed(address indexed holder, uint256 value);

    modifier onlySparkContracts() {
        require(msg.sender == address(spark) || msg.sender == address(ico));
        _;
    }

    function SparkDividends(
        address _spark,
        address _ico,
        address _treasuryAddress
    ) public {
        require(_spark != address(0) && _ico != address(0) && _treasuryAddress != address(0));
        spark = Spark(_spark);
        ico = ICO(_ico);
        treasuryAddress = _treasuryAddress;
    }

    function setSpark(address _spark) public onlyOwner {
        require(_spark != address(0));
        spark = Spark(_spark);
    }

    function setICO(address _ico) public onlyOwner {
        require(_ico != address(0));
        ico = ICO(_ico);
    }

    function setTreasuryAddress(address _treasuryAddress) public onlyOwner {
        require(_treasuryAddress != address(0));
        treasuryAddress = _treasuryAddress;
    }

    function transferEthers() public onlyOwner {
        owner.transfer(this.balance);
    }

    function logAccount(address _address, uint256 _amount) public onlySparkContracts returns (bool) {
        uint256 day = 0;
        uint256 period = 1;

        if (now > ico.endTime()) {
            (period, day) = getPeriod(now);
        }

        if (_address != address(0) && period > 0) {
            if (day != 0 && _amount > 0) {
                logData(_address, period, 0, _amount);
            }

            logData(_address, period, day, 0);

            return true;
        }

        return false;
    }

    function setEtherAmount() public payable returns (bool) {
        if (msg.value == 0) {
            return false;
        }

        uint256 day = 0;
        uint256 period = 1;

        if (now > ico.endTime()) {
            (period, day) = getPeriod(now);
        }

        uint256 index = getFundsDataIndex(period);

        if (index == funds.length) {
            funds.push(FundsData(period, msg.value));
        } else {
            funds[index].ethersAmount = funds[index].ethersAmount.add(msg.value);
        }

        return true;
    }

    function claim() public returns (bool) {
        uint256 currentDay;
        uint256 currentPeriod;
        bool status;
        (currentPeriod, currentDay) = getPeriod(now);
        if (currentPeriod == 1) {
            return false;
        }

        uint256 dividendAmount;
        uint256 outdatedAmount;
        (dividendAmount, outdatedAmount) = calculateAmount(msg.sender, currentPeriod, currentDay);

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

        msg.sender.transfer(dividendAmount);

        if (outdatedAmount > 0) {
            treasuryAddress.transfer(outdatedAmount);
        }

        if (cleanDividendsData(msg.sender, currentPeriod)) {
            Disbursed(msg.sender, dividendAmount);
            status = true;
        }

        require(status);
        return true;
    }

    function calculateAmount(
        address _address,
        uint256 _currentPeriod,
        uint256 _currentDay
    ) public view returns (uint256 totalAmount, uint256 totalOutdated) {
        for (uint256 i = 0; i < accounts[_address].length; i++) {
            if (accounts[_address][i].period < _currentPeriod) {
                uint256 index = getFundsDataIndex(accounts[_address][i].period);
                if (index == funds.length) {
                    continue;
                }
                uint256 dayEthers = funds[index].ethersAmount.div(90);
                uint256 balance;
                uint256 to = 90;

                if (
                    accounts[_address].length > i.add(1) &&
                    accounts[_address][i.add(1)].period == accounts[_address][i].period
                ) {
                    to = accounts[_address][i.add(1)].day;
                }

                for (uint256 j = accounts[_address][i].day; j < to; j++) {
                    balance = getBalanceByDay(_address, accounts[_address][i].period, j);
                    if (_currentPeriod.sub(accounts[_address][i].period) > 1 && _currentDay > 2) {
                        totalOutdated = totalOutdated.add(balance.mul(dayEthers).div(spark.maxSupply()));
                    } else {
                        totalAmount = totalAmount.add(balance.mul(dayEthers).div(spark.maxSupply()));
                    }
                }
            }
        }
    }

    function logData(address _address, uint256 _period, uint256 _day, uint256 _amount) internal {
        uint256 index = getDividendDataIndex(_address, _period, _day);
        if (accounts[_address].length == index) {
            accounts[_address].push(DividendData(_period, _day, spark.balanceOf(_address).sub(_amount)));
        } else if (_amount == 0) {
            accounts[_address][index].balance = spark.balanceOf(_address);
        }
    }

    function getPeriod(uint256 _time) internal view returns (uint256, uint256) {
        uint256 day = uint(_time.sub(ico.endTime()) % 90 days).div(1 days);
        uint256 period = _time.sub(ico.endTime()).div(90 days);

        return (++period, day);
    }

    function cleanDividendsData(address _address, uint256 _currentPeriod) internal returns (bool) {
        for (uint256 i = 0; i < accounts[_address].length; i++) {
            if (accounts[_address][i].period < _currentPeriod) {
                for (uint256 j = i; j < accounts[_address].length.sub(1); j++) {
                    DividendData storage dividend = accounts[_address][j];

                    dividend.period = accounts[_address][j.add(1)].period;
                    dividend.day = accounts[_address][j.add(1)].day;
                    dividend.balance = accounts[_address][j.add(1)].balance;
                }
                delete accounts[_address][accounts[_address].length.sub(1)];
                accounts[_address].length--;
                i--;
            }
        }

        return true;
    }

    function getFundsDataIndex(uint256 _period) internal view returns (uint256) {
        for (uint256 i = 0; i < funds.length; i++) {
            if (funds[i].period == _period) {
                return i;
            }
        }

        return funds.length;
    }

    function getBalanceByDay(address _address, uint256 _period, uint256 _day) internal view returns (uint256) {
        for (uint256 i = accounts[_address].length.sub(1); i >= 0; i--) {
            if (accounts[_address][i].period == _period && accounts[_address][i].day <= _day) {
                return accounts[_address][i].balance;
            }
        }

        return 0;
    }

    function getDividendDataIndex(address _address, uint256 _period, uint256 _day) internal view returns (uint256) {
        for (uint256 i = 0; i < accounts[_address].length; i++) {
            if (accounts[_address][i].period == _period && accounts[_address][i].day == _day) {
                return i;
            }
        }

        return accounts[_address].length;
    }

}

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(address _addresss) {
        require(allowedMultivests[_addresss] == true);
        _;
    }

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

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

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

    function multivestBuy(address _address, uint256 _value) public onlyAllowedMultivests(msg.sender) {
        require(buy(_address, _value) == true);
    }

    function multivestBuy(
        address _address,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public payable onlyAllowedMultivests(verify(keccak256(msg.sender), _v, _r, _s)) {
        require(_address == msg.sender && buy(msg.sender, msg.value) == true);
    }

    function verify(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) internal pure returns(address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";

        return ecrecover(keccak256(prefix, _hash), _v, _r, _s);
    }

    function buy(address _address, uint256 value) internal returns (bool);

}

contract SellableToken is Multivest {

    using SafeMath for uint256;

    // The token being sold
    Spark public spark;

    // start and end timestamps where investments are allowed (both inclusive)
    uint256 public startTime;
    uint256 public endTime;

    // amount of sold tokens
    uint256 public soldTokens;

    // amount of raised money in wei
    uint256 public collectedEthers;

    // address where funds are collected
    address public etherHolder;

    address public tokensHolder;

    Bonus[] public bonuses;

    struct Bonus {
        uint256 maxAmount;
        uint256 bonus;
    }

    function SellableToken(
        address _multivestAddress,
        address _etherHolder,
        address _tokensHolder,
        address _spark,
        uint256 _startTime,
        uint256 _endTime
    ) public Multivest(_multivestAddress)
    {
        require(_spark != address(0) && _etherHolder != address(0) && _tokensHolder != address(0));
        spark = Spark(_spark);
        etherHolder = _etherHolder;
        tokensHolder = _tokensHolder;

        require(_startTime < _endTime);

        startTime = _startTime;
        endTime = _endTime;
    }

    function setSpark(address _spark) public onlyOwner {
        require(_spark != address(0));
        spark = Spark(_spark);
    }

    function setEtherHolder(address _etherHolder) public onlyOwner {
        require(_etherHolder != address(0));
        etherHolder = _etherHolder;
    }

    function setTokenHolder(address _tokensHolder) public onlyOwner {
        require(_tokensHolder != address(0));
        tokensHolder = _tokensHolder;
    }

    function transferEthers() public onlyOwner {
        etherHolder.transfer(this.balance);
    }

    // @return true if sale period is active
    function isActive() public constant returns (bool) {
        if (soldTokens == spark.maxSupply()) {
            return false;
        }
        return withinPeriod();
    }

    // @return true if the transaction can buy tokens
    function withinPeriod() public constant returns (bool) {
        return block.timestamp >= startTime && block.timestamp <= endTime;
    }
}

contract ICO is SellableToken, WhiteList {

    uint256 public price;

    function ICO(
        address _multivestAddress,
        address _etherHolder,
        address _tokensHolder,
        address _spark,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _price
    ) public SellableToken(
        _multivestAddress,
        _etherHolder,
        _tokensHolder,
        _spark,
        _startTime,
        _endTime
    ) WhiteList() {
        require(_price > 0);
        price = _price;

        bonuses.push(Bonus(uint(10000000).mul(uint(10) ** spark.decimals()), uint256(150)));
        bonuses.push(Bonus(uint(15000000).mul(uint(10) ** spark.decimals()), uint256(125)));
        bonuses.push(Bonus(uint(20000000).mul(uint(10) ** spark.decimals()), uint256(110)));
    }

    function() public payable onlyWhitelisted {
        require(buy(msg.sender, msg.value) == true);
    }

    function allocateUnsoldTokens() public {
        if (!isActive() && block.timestamp >= startTime) {
            uint256 amount = spark.maxSupply().sub(soldTokens);
            require(amount > 0 && spark.mint(tokensHolder, amount) == amount);
            soldTokens = spark.maxSupply();
        }
    }

    function calculateTokensAmount(uint256 _value) public view returns (uint256 amount) {
        amount = _value.mul(uint(10) ** spark.decimals()).div(price);
        amount = amount.add(calculateBonusAmount(amount));
    }

    function calculateEthersAmount(uint256 _tokens) public view returns (uint256 ethers, uint256 bonus) {
        if (_tokens == 0) {
            return (0, 0);
        }

        ethers = _tokens.mul(price).div(uint(10) ** spark.decimals());
        bonus = calculateBonusAmount(_tokens);
    }

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

        require(withinPeriod() && _address != address(0));

        uint256 amount = calculateTokensAmount(_value);

        require(amount > 0 && spark.mint(_address, amount) == amount);

        collectedEthers = collectedEthers.add(_value);
        soldTokens = soldTokens.add(amount);

        Contribution(_address, _value, amount);

        return true;
    }

    function calculateBonusAmount(uint256 _amount) internal view returns (uint256) {
        uint256 newSoldTokens = soldTokens;
        uint256 remainingValue = _amount;

        for (uint i = 0; i < bonuses.length; i++) {

            if (bonuses[i].maxAmount > soldTokens) {
                uint256 amount = remainingValue.mul(bonuses[i].bonus).div(100);
                if (newSoldTokens.add(amount) > bonuses[i].maxAmount) {
                    uint256 diff = bonuses[i].maxAmount.sub(newSoldTokens);
                    remainingValue = remainingValue.sub(diff.mul(100).div(bonuses[i].bonus));
                    newSoldTokens = newSoldTokens.add(diff);
                } else {
                    remainingValue = 0;
                    newSoldTokens = newSoldTokens.add(amount);
                }

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

        return newSoldTokens.add(remainingValue).sub(soldTokens.add(_amount));
    }

}

Contract Security Audit

Contract ABI

[{"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":true,"inputs":[],"name":"creationBlock","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":false,"inputs":[{"name":"_locked","type":"bool"}],"name":"setLocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dividends","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transferFrozen","type":"bool"}],"name":"freezing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"standard","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ico","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dividends","type":"address"}],"name":"setSparkDividends","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newMinter","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferFrozen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ico","type":"address"}],"name":"setICO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"minters","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tokenName","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_symbol","type":"string"},{"name":"_maxSupply","type":"uint256"},{"name":"_locked","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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"}]

6060604052600e805460a060020a60ff0219167401000000000000000000000000000000000000000017905534156200003757600080fd5b604051620018d0380380620018d083398101604052808051820191906020018051919060200180518201919060200180519190602001805160038054600160a060020a03191633600160a060020a03161790559150600090508286868684868185858583856040805190810160405260098082527f455243323020302e3100000000000000000000000000000000000000000000006020830152908051620000e492916020019062000257565b50600a805460ff191682151517905560008690558115620001205760008054600160a060020a033316825260016020526040909120556200013c565b60008054600160a060020a033016825260016020526040909120555b60078580516200015192916020019062000257565b5060088380516200016792916020019062000257565b50506006805460ff191660ff949094169390931790925550504360055550604090508051908101604052601081527f4d696e74696e67455243323020302e310000000000000000000000000000000060208201526009908051620001d092916020019062000257565b505050600160a060020a0333166000908152600c602052604090819020805460ff19166001179055600b9490945550919250829150505190810160405260098082527f537061726b20302e31000000000000000000000000000000000000000000000060208301529080516200024b92916020019062000257565b505050505050620002fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029a57805160ff1916838001178555620002ca565b82800160010185558215620002ca579182015b82811115620002ca578251825591602001919060010190620002ad565b50620002d8929150620002dc565b5090565b620002f991905b80821115620002d85760008155600101620002e3565b90565b6115c4806200030c6000396000f3006060604052600436106101715763ffffffff60e060020a60003504166306fdde038114610176578063095ea7b314610200578063176345141461023657806318160ddd1461025b578063211e28b61461026e57806323b872dd1461028857806327e235e3146102b05780633092afd5146102cf578063313ce567146102ee57806335d974051461031757806336a23dbf1461034657806340c10f191461035e5780635a3b7e42146103805780635d4522011461039357806366188463146103a657806370a08231146103c857806379ba5097146103e75780637ec2ae46146103fa5780638da5cb5b1461041957806395d89b411461042c578063983b2d561461043f578063a9059cbb1461045e578063ade4637a14610480578063b6f50c2914610493578063cf309012146104b2578063d4ee1d90146104c5578063d5abeb01146104d8578063d73dd623146104eb578063dd62ed3e1461050d578063f2fde38b14610532578063f46eccc414610551575b600080fd5b341561018157600080fd5b610189610570565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101c55780820151838201526020016101ad565b50505050905090810190601f1680156101f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020b57600080fd5b610222600160a060020a036004351660243561060e565b604051901515815260200160405180910390f35b341561024157600080fd5b610249610637565b60405190815260200160405180910390f35b341561026657600080fd5b61024961063d565b341561027957600080fd5b6102866004351515610643565b005b341561029357600080fd5b610222600160a060020a0360043581169060243516604435610671565b34156102bb57600080fd5b610249600160a060020a03600435166107b4565b34156102da57600080fd5b610286600160a060020a03600435166107c6565b34156102f957600080fd5b610301610802565b60405160ff909116815260200160405180910390f35b341561032257600080fd5b61032a61080b565b604051600160a060020a03909116815260200160405180910390f35b341561035157600080fd5b610286600435151561081a565b341561036957600080fd5b610249600160a060020a036004351660243561094e565b341561038b57600080fd5b610189610b3f565b341561039e57600080fd5b61032a610baa565b34156103b157600080fd5b610222600160a060020a0360043516602435610bb9565b34156103d357600080fd5b610249600160a060020a0360043516610bd9565b34156103f257600080fd5b610286610bf4565b341561040557600080fd5b610286600160a060020a0360043516610c3d565b341561042457600080fd5b61032a610c9c565b341561043757600080fd5b610189610cab565b341561044a57600080fd5b610286600160a060020a0360043516610d16565b341561046957600080fd5b610222600160a060020a0360043516602435610d55565b341561048b57600080fd5b610222610e73565b341561049e57600080fd5b610286600160a060020a0360043516610e83565b34156104bd57600080fd5b610222610ee2565b34156104d057600080fd5b61032a610eeb565b34156104e357600080fd5b610249610efa565b34156104f657600080fd5b610222600160a060020a0360043516602435610f00565b341561051857600080fd5b610249600160a060020a0360043581169060243516610f20565b341561053d57600080fd5b610286600160a060020a0360043516610f4b565b341561055c57600080fd5b610222600160a060020a0360043516610faa565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b820191906000526020600020905b8154815290600101906020018083116105e957829003601f168201915b505050505081565b600a5460009060ff161561062457506000610631565b61062e8383610fbf565b90505b92915050565b60055481565b60005481565b60035433600160a060020a0390811691161461065e57600080fd5b600a805460ff1916911515919091179055565b600e54600090819060a060020a900460ff161561068d57600080fd5b61069885858561102b565b905080156107ac57600e54600160a060020a031615156106b757600080fd5b600e54600160a060020a031663fc688e87866000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561071657600080fd5b6102c65a03f1151561072757600080fd5b50505060405180515050600e54600160a060020a031663fc688e87856000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561079057600080fd5b6102c65a03f115156107a157600080fd5b505050604051805150505b949350505050565b60016020526000908152604090205481565b60035433600160a060020a039081169116146107e157600080fd5b600160a060020a03166000908152600c60205260409020805460ff19169055565b60065460ff1681565b600e54600160a060020a031681565b60035433600160a060020a0390811691161461083557600080fd5b600d54600160a060020a0316158015906108af5750600d54600160a060020a03166322f3e2d46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561089257600080fd5b6102c65a03f115156108a357600080fd5b50505060405180519050155b801561091d5750600d54600160a060020a03166378e979256000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156108fe57600080fd5b6102c65a03f1151561090f57600080fd5b505050604051805190504210155b1561094b57600e805474ff0000000000000000000000000000000000000000191660a060020a831515021790555b50565b600160a060020a0333166000908152600c6020526040812054819060ff16151560011461097a57600080fd5b60035433600160a060020a0390811691161415610a9157600d54600160a060020a031615156109a857600080fd5b600d54600160a060020a03166322f3e2d46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156109f057600080fd5b6102c65a03f11515610a0157600080fd5b50505060405180519050158015610a7a5750600d54600160a060020a03166378e979256000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a5b57600080fd5b6102c65a03f11515610a6c57600080fd5b505050604051805190504210155b15610a8c57610a89848461104c565b90505b610a9e565b610a9b848461104c565b90505b82811415610b3857600e54600160a060020a03161515610abd57600080fd5b600e54600160a060020a031663fc688e87858560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1c57600080fd5b6102c65a03f11515610b2d57600080fd5b505050604051805150505b9392505050565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b600d54600160a060020a031681565b600a5460009060ff1615610bcf57506000610631565b61062e838361113f565b600160a060020a031660009081526001602052604090205490565b60045433600160a060020a0390811691161415610c3b576004546003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b60035433600160a060020a03908116911614610c5857600080fd5b600160a060020a0381161515610c6d57600080fd5b600e805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600354600160a060020a031681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b60035433600160a060020a03908116911614610d3157600080fd5b600160a060020a03166000908152600c60205260409020805460ff19166001179055565b600e54600090819060a060020a900460ff1615610d7157600080fd5b610d7b8484611239565b90508015610b3857600e54600160a060020a03161515610d9a57600080fd5b600e54600160a060020a031663fc688e87336000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610df957600080fd5b6102c65a03f11515610e0a57600080fd5b50505060405180515050600e54600160a060020a031663fc688e87856000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1c57600080fd5b600e5460a060020a900460ff1681565b60035433600160a060020a03908116911614610e9e57600080fd5b600160a060020a0381161515610eb357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a5460ff1681565b600454600160a060020a031681565b600b5481565b600a5460009060ff1615610f1657506000610631565b61062e8383611256565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610f6657600080fd5b600160a060020a0381161515610f7b57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600a5460009060ff161561104157506000610b38565b6107ac8484846112fa565b600160a060020a0333166000908152600c602052604081205460ff16151560011461107657600080fd5b81151561108557506000610631565b600b5460005461109b908463ffffffff61147c16565b11156110a957506000610631565b6000546110bc908363ffffffff61147c16565b6000908155600160a060020a0384168152600160205260409020546110e7908363ffffffff61147c16565b600160a060020a0384166000818152600160205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350919050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561119c57600160a060020a0333811660009081526002602090815260408083209388168352929052908120556111d3565b6111ac818463ffffffff61148b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600a5460009060ff161561124c57600080fd5b61062e838361149d565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205461128e908363ffffffff61147c16565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b6000600160a060020a038316151561131157600080fd5b600160a060020a03841660009081526001602052604090205482111561133657600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561136957600080fd5b600160a060020a038416600090815260016020526040902054611392908363ffffffff61148b16565b600160a060020a0380861660009081526001602052604080822093909355908516815220546113c7908363ffffffff61147c16565b600160a060020a0380851660009081526001602090815260408083209490945587831682526002815283822033909316825291909152205461140f908363ffffffff61148b16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600082820183811015610b3857fe5b60008282111561149757fe5b50900390565b6000600160a060020a03831615156114b457600080fd5b600160a060020a0333166000908152600160205260409020548211156114d957600080fd5b600160a060020a033316600090815260016020526040902054611502908363ffffffff61148b16565b600160a060020a033381166000908152600160205260408082209390935590851681522054611537908363ffffffff61147c16565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001929150505600a165627a7a723058209c17de793d6f708f92cc0b4bea1d1fb791d042f6707316c659f806a32946ffc8002900000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000014adf4b7320334b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005535041524b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005535041524b000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6060604052600436106101715763ffffffff60e060020a60003504166306fdde038114610176578063095ea7b314610200578063176345141461023657806318160ddd1461025b578063211e28b61461026e57806323b872dd1461028857806327e235e3146102b05780633092afd5146102cf578063313ce567146102ee57806335d974051461031757806336a23dbf1461034657806340c10f191461035e5780635a3b7e42146103805780635d4522011461039357806366188463146103a657806370a08231146103c857806379ba5097146103e75780637ec2ae46146103fa5780638da5cb5b1461041957806395d89b411461042c578063983b2d561461043f578063a9059cbb1461045e578063ade4637a14610480578063b6f50c2914610493578063cf309012146104b2578063d4ee1d90146104c5578063d5abeb01146104d8578063d73dd623146104eb578063dd62ed3e1461050d578063f2fde38b14610532578063f46eccc414610551575b600080fd5b341561018157600080fd5b610189610570565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101c55780820151838201526020016101ad565b50505050905090810190601f1680156101f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020b57600080fd5b610222600160a060020a036004351660243561060e565b604051901515815260200160405180910390f35b341561024157600080fd5b610249610637565b60405190815260200160405180910390f35b341561026657600080fd5b61024961063d565b341561027957600080fd5b6102866004351515610643565b005b341561029357600080fd5b610222600160a060020a0360043581169060243516604435610671565b34156102bb57600080fd5b610249600160a060020a03600435166107b4565b34156102da57600080fd5b610286600160a060020a03600435166107c6565b34156102f957600080fd5b610301610802565b60405160ff909116815260200160405180910390f35b341561032257600080fd5b61032a61080b565b604051600160a060020a03909116815260200160405180910390f35b341561035157600080fd5b610286600435151561081a565b341561036957600080fd5b610249600160a060020a036004351660243561094e565b341561038b57600080fd5b610189610b3f565b341561039e57600080fd5b61032a610baa565b34156103b157600080fd5b610222600160a060020a0360043516602435610bb9565b34156103d357600080fd5b610249600160a060020a0360043516610bd9565b34156103f257600080fd5b610286610bf4565b341561040557600080fd5b610286600160a060020a0360043516610c3d565b341561042457600080fd5b61032a610c9c565b341561043757600080fd5b610189610cab565b341561044a57600080fd5b610286600160a060020a0360043516610d16565b341561046957600080fd5b610222600160a060020a0360043516602435610d55565b341561048b57600080fd5b610222610e73565b341561049e57600080fd5b610286600160a060020a0360043516610e83565b34156104bd57600080fd5b610222610ee2565b34156104d057600080fd5b61032a610eeb565b34156104e357600080fd5b610249610efa565b34156104f657600080fd5b610222600160a060020a0360043516602435610f00565b341561051857600080fd5b610249600160a060020a0360043581169060243516610f20565b341561053d57600080fd5b610286600160a060020a0360043516610f4b565b341561055c57600080fd5b610222600160a060020a0360043516610faa565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b820191906000526020600020905b8154815290600101906020018083116105e957829003601f168201915b505050505081565b600a5460009060ff161561062457506000610631565b61062e8383610fbf565b90505b92915050565b60055481565b60005481565b60035433600160a060020a0390811691161461065e57600080fd5b600a805460ff1916911515919091179055565b600e54600090819060a060020a900460ff161561068d57600080fd5b61069885858561102b565b905080156107ac57600e54600160a060020a031615156106b757600080fd5b600e54600160a060020a031663fc688e87866000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561071657600080fd5b6102c65a03f1151561072757600080fd5b50505060405180515050600e54600160a060020a031663fc688e87856000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561079057600080fd5b6102c65a03f115156107a157600080fd5b505050604051805150505b949350505050565b60016020526000908152604090205481565b60035433600160a060020a039081169116146107e157600080fd5b600160a060020a03166000908152600c60205260409020805460ff19169055565b60065460ff1681565b600e54600160a060020a031681565b60035433600160a060020a0390811691161461083557600080fd5b600d54600160a060020a0316158015906108af5750600d54600160a060020a03166322f3e2d46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561089257600080fd5b6102c65a03f115156108a357600080fd5b50505060405180519050155b801561091d5750600d54600160a060020a03166378e979256000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156108fe57600080fd5b6102c65a03f1151561090f57600080fd5b505050604051805190504210155b1561094b57600e805474ff0000000000000000000000000000000000000000191660a060020a831515021790555b50565b600160a060020a0333166000908152600c6020526040812054819060ff16151560011461097a57600080fd5b60035433600160a060020a0390811691161415610a9157600d54600160a060020a031615156109a857600080fd5b600d54600160a060020a03166322f3e2d46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156109f057600080fd5b6102c65a03f11515610a0157600080fd5b50505060405180519050158015610a7a5750600d54600160a060020a03166378e979256000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610a5b57600080fd5b6102c65a03f11515610a6c57600080fd5b505050604051805190504210155b15610a8c57610a89848461104c565b90505b610a9e565b610a9b848461104c565b90505b82811415610b3857600e54600160a060020a03161515610abd57600080fd5b600e54600160a060020a031663fc688e87858560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1c57600080fd5b6102c65a03f11515610b2d57600080fd5b505050604051805150505b9392505050565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b600d54600160a060020a031681565b600a5460009060ff1615610bcf57506000610631565b61062e838361113f565b600160a060020a031660009081526001602052604090205490565b60045433600160a060020a0390811691161415610c3b576004546003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b60035433600160a060020a03908116911614610c5857600080fd5b600160a060020a0381161515610c6d57600080fd5b600e805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600354600160a060020a031681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106065780601f106105db57610100808354040283529160200191610606565b60035433600160a060020a03908116911614610d3157600080fd5b600160a060020a03166000908152600c60205260409020805460ff19166001179055565b600e54600090819060a060020a900460ff1615610d7157600080fd5b610d7b8484611239565b90508015610b3857600e54600160a060020a03161515610d9a57600080fd5b600e54600160a060020a031663fc688e87336000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610df957600080fd5b6102c65a03f11515610e0a57600080fd5b50505060405180515050600e54600160a060020a031663fc688e87856000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b1c57600080fd5b600e5460a060020a900460ff1681565b60035433600160a060020a03908116911614610e9e57600080fd5b600160a060020a0381161515610eb357600080fd5b600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a5460ff1681565b600454600160a060020a031681565b600b5481565b600a5460009060ff1615610f1657506000610631565b61062e8383611256565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610f6657600080fd5b600160a060020a0381161515610f7b57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c6020526000908152604090205460ff1681565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600a5460009060ff161561104157506000610b38565b6107ac8484846112fa565b600160a060020a0333166000908152600c602052604081205460ff16151560011461107657600080fd5b81151561108557506000610631565b600b5460005461109b908463ffffffff61147c16565b11156110a957506000610631565b6000546110bc908363ffffffff61147c16565b6000908155600160a060020a0384168152600160205260409020546110e7908363ffffffff61147c16565b600160a060020a0384166000818152600160205260408082209390935590917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350919050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561119c57600160a060020a0333811660009081526002602090815260408083209388168352929052908120556111d3565b6111ac818463ffffffff61148b16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600a5460009060ff161561124c57600080fd5b61062e838361149d565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205461128e908363ffffffff61147c16565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b6000600160a060020a038316151561131157600080fd5b600160a060020a03841660009081526001602052604090205482111561133657600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561136957600080fd5b600160a060020a038416600090815260016020526040902054611392908363ffffffff61148b16565b600160a060020a0380861660009081526001602052604080822093909355908516815220546113c7908363ffffffff61147c16565b600160a060020a0380851660009081526001602090815260408083209490945587831682526002815283822033909316825291909152205461140f908363ffffffff61148b16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600082820183811015610b3857fe5b60008282111561149757fe5b50900390565b6000600160a060020a03831615156114b457600080fd5b600160a060020a0333166000908152600160205260409020548211156114d957600080fd5b600160a060020a033316600090815260016020526040902054611502908363ffffffff61148b16565b600160a060020a033381166000908152600160205260408082209390935590851681522054611537908363ffffffff61147c16565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001929150505600a165627a7a723058209c17de793d6f708f92cc0b4bea1d1fb791d042f6707316c659f806a32946ffc80029

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000014adf4b7320334b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005535041524b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005535041524b000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): SPARK
Arg [1] : _decimals (uint8): 18
Arg [2] : _symbol (string): SPARK
Arg [3] : _maxSupply (uint256): 25000000000000000000000000
Arg [4] : _locked (bool): False

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 00000000000000000000000000000000000000000014adf4b7320334b9000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 535041524b000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 535041524b000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://9c17de793d6f708f92cc0b4bea1d1fb791d042f6707316c659f806a32946ffc8

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.