ETH Price: $1,791.18 (+10.03%)
 
Transaction Hash
Method
Block
From
To
Emergency Refund210428042024-10-25 13:03:11179 days ago1729861391IN
TokenCard: Token Sale
0 ETH0.000261117.61309191
Emergency Refund210428032024-10-25 13:02:59179 days ago1729861379IN
TokenCard: Token Sale
0 ETH0.000264037.70358176
Emergency Refund210428022024-10-25 13:02:47179 days ago1729861367IN
TokenCard: Token Sale
0 ETH0.000267147.79438309
Emergency Refund210428012024-10-25 13:02:35179 days ago1729861355IN
TokenCard: Token Sale
0 ETH0.000260777.60852164
Emergency Refund210427982024-10-25 13:01:59179 days ago1729861319IN
TokenCard: Token Sale
0 ETH0.000267777.81275214
Emergency Refund210427972024-10-25 13:01:47179 days ago1729861307IN
TokenCard: Token Sale
0 ETH0.000260137.5900082
Emergency Refund210427962024-10-25 13:01:35179 days ago1729861295IN
TokenCard: Token Sale
0 ETH0.000241477.04546686
Emergency Refund210427952024-10-25 13:01:23179 days ago1729861283IN
TokenCard: Token Sale
0 ETH0.000263937.70086948
Emergency Refund210427942024-10-25 13:01:11179 days ago1729861271IN
TokenCard: Token Sale
0 ETH0.000256987.49790836
Emergency Refund210427932024-10-25 13:00:59179 days ago1729861259IN
TokenCard: Token Sale
0 ETH0.000234396.83877194
Emergency Refund210427922024-10-25 13:00:47179 days ago1729861247IN
TokenCard: Token Sale
0 ETH0.000252197.35811815
Emergency Refund210427912024-10-25 13:00:35179 days ago1729861235IN
TokenCard: Token Sale
0 ETH0.000270347.88775675
Emergency Refund210427902024-10-25 13:00:23179 days ago1729861223IN
TokenCard: Token Sale
0 ETH0.000277158.08657138
Emergency Refund210427892024-10-25 13:00:11179 days ago1729861211IN
TokenCard: Token Sale
0 ETH0.000266717.19412491
All Stop210427882024-10-25 12:59:59179 days ago1729861199IN
TokenCard: Token Sale
0 ETH0.000209517.42733886
Transfer210427872024-10-25 12:59:47179 days ago1729861187IN
TokenCard: Token Sale
3.5 ETH0.00090026.64806709
Claim141722992022-02-09 13:56:421168 days ago1644415002IN
TokenCard: Token Sale
0 ETH0.0044062162.98197608
Transfer65363672018-10-18 5:59:322379 days ago1539842372IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65319982018-10-17 13:00:122379 days ago1539781212IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65319712018-10-17 12:52:392379 days ago1539780759IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65319672018-10-17 12:51:362379 days ago1539780696IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65259652018-10-16 13:18:122380 days ago1539695892IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65259162018-10-16 13:06:262380 days ago1539695186IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65258952018-10-16 13:00:322380 days ago1539694832IN
TokenCard: Token Sale
0.01 ETH0.0004220
Transfer65258022018-10-16 12:36:222380 days ago1539693382IN
TokenCard: Token Sale
0.01 ETH0.0004220
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer210428042024-10-25 13:03:11179 days ago1729861391
TokenCard: Token Sale
2.22712502 ETH
Transfer210428032024-10-25 13:02:59179 days ago1729861379
TokenCard: Token Sale
3.5 ETH
Transfer210428022024-10-25 13:02:47179 days ago1729861367
TokenCard: Token Sale
3.5 ETH
Transfer210428012024-10-25 13:02:35179 days ago1729861355
TokenCard: Token Sale
3.5 ETH
Transfer210427982024-10-25 13:01:59179 days ago1729861319
TokenCard: Token Sale
3.5 ETH
Transfer210427972024-10-25 13:01:47179 days ago1729861307
TokenCard: Token Sale
3.5 ETH
Transfer210427962024-10-25 13:01:35179 days ago1729861295
TokenCard: Token Sale
3.5 ETH
Transfer210427952024-10-25 13:01:23179 days ago1729861283
TokenCard: Token Sale
3.5 ETH
Transfer210427942024-10-25 13:01:11179 days ago1729861271
TokenCard: Token Sale
3.5 ETH
Transfer210427932024-10-25 13:00:59179 days ago1729861259
TokenCard: Token Sale
3.5 ETH
Transfer210427922024-10-25 13:00:47179 days ago1729861247
TokenCard: Token Sale
3.5 ETH
Transfer210427912024-10-25 13:00:35179 days ago1729861235
TokenCard: Token Sale
3.5 ETH
Transfer210427902024-10-25 13:00:23179 days ago1729861223
TokenCard: Token Sale
3.5 ETH
Transfer210427892024-10-25 13:00:11179 days ago1729861211
TokenCard: Token Sale
3.5 ETH
Transfer54186172018-04-11 1:38:532569 days ago1523410733
TokenCard: Token Sale
0 ETH
Transfer37349342017-05-19 23:16:542895 days ago1495235814
TokenCard: Token Sale
166,666.66666666 ETH
Transfer36388042017-05-02 17:27:102912 days ago1493746030
TokenCard: Token Sale
15 ETH
Transfer36386872017-05-02 17:03:102912 days ago1493744590
TokenCard: Token Sale
1.5 ETH
Transfer36386592017-05-02 16:56:262912 days ago1493744186
TokenCard: Token Sale
1.5 ETH
Transfer36386442017-05-02 16:49:292912 days ago1493743769
TokenCard: Token Sale
10 ETH
Transfer36386352017-05-02 16:47:422912 days ago1493743662
TokenCard: Token Sale
15 ETH
Transfer36385782017-05-02 16:31:402912 days ago1493742700
TokenCard: Token Sale
1.5 ETH
Transfer36385262017-05-02 16:19:492912 days ago1493741989
TokenCard: Token Sale
1 ETH
Transfer36385072017-05-02 16:13:142912 days ago1493741594
TokenCard: Token Sale
1 ETH
Transfer36384842017-05-02 16:07:012912 days ago1493741221
TokenCard: Token Sale
1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ICO

Compiler Version
v0.4.10+commit.f0d539ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-05-03
*/

pragma solidity >=0.4.4;

contract Sale {
    uint public startTime;
    uint public stopTime;
    uint public target;
    uint public raised;
    uint public collected;
    uint public numContributors;
    mapping(address => uint) public balances;

    function buyTokens(address _a, uint _eth, uint _time) returns (uint); 
    function getTokens(address holder) constant returns (uint); 
    function getRefund(address holder) constant returns (uint); 
    function getSoldTokens() constant returns (uint); 
    function getOwnerEth() constant returns (uint); 
    function tokensPerEth() constant returns (uint);
    function isActive(uint time) constant returns (bool); 
    function isComplete(uint time) constant returns (bool); 
}

contract Constants {
    uint DECIMALS = 8;
}

contract EventDefinitions {
    event logSaleStart(uint startTime, uint stopTime);
    event logPurchase(address indexed purchaser, uint eth);
    event logClaim(address indexed purchaser, uint refund, uint tokens);

    //Token standard events
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
} 

contract Testable {
    uint fakeTime;
    bool public testing;
    modifier onlyTesting() {
        if (!testing) throw;
        _;
    }
    function setFakeTime(uint t) onlyTesting {
        fakeTime = t;
    }
    function addMinutes(uint m) onlyTesting {
        fakeTime = fakeTime + (m * 1 minutes);
    }
    function addDays(uint d) onlyTesting {
        fakeTime = fakeTime + (d * 1 days);
    }
    function currTime() constant returns (uint) {
        if (testing) {
            return fakeTime;
        } else {
            return block.timestamp;
        }
    }
    function weiPerEth() constant returns (uint) {
        if (testing) {
            return 200;
        } else {
            return 10**18;
        }
    }
}

contract Owned {
    address public owner;
    
    modifier onlyOwner() {
        if (msg.sender != owner) throw;
        _;
    }

    address newOwner;

    function changeOwner(address _newOwner) onlyOwner {
        newOwner = _newOwner;
    }

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

//from Zeppelin
contract SafeMath {
    function safeMul(uint a, uint b) internal returns (uint) {
        uint c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

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

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

    function assert(bool assertion) internal {
        if (!assertion) throw;
    }
}

contract Token is SafeMath, Owned, Constants {
    uint public totalSupply;

    address ico;
    address controller;

    string public name;
    uint8 public decimals; 
    string public symbol;     

    modifier onlyControllers() {
        if (msg.sender != ico &&
            msg.sender != controller) throw;
        _;
    }

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

    function Token() { 
        owner = msg.sender;
        name = "Monolith TKN";
        decimals = uint8(DECIMALS);
        symbol = "TKN";
    }

    function setICO(address _ico) onlyOwner {
        if (ico != 0) throw;
        ico = _ico;
    }
    function setController(address _controller) onlyOwner {
        if (controller != 0) throw;
        controller = _controller;
    }
    
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
    event Mint(address owner, uint amount);

    //only called from contracts so don't need msg.data.length check
    function mint(address addr, uint amount) onlyControllers {
        if (maxSupply > 0 && safeAdd(totalSupply, amount) > maxSupply) throw;
        balanceOf[addr] = safeAdd(balanceOf[addr], amount);
        totalSupply = safeAdd(totalSupply, amount);
        Mint(addr, amount);
    }

    mapping(address => uint) public balanceOf;
    mapping (address => mapping (address => uint)) public allowance;

    function transfer(address _to, uint _value) 
    onlyPayloadSize(2)
    returns (bool success) {
        if (balanceOf[msg.sender] < _value) return false;

        balanceOf[msg.sender] = balanceOf[msg.sender] - _value;
        balanceOf[_to] = safeAdd(balanceOf[_to], _value);
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint _value) 
    onlyPayloadSize(3)
    returns (bool success) {
        if (balanceOf[_from] < _value) return false; 

        var allowed = allowance[_from][msg.sender];
        if (allowed < _value) return false;

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

    function approve(address _spender, uint _value) 
    onlyPayloadSize(2)
    returns (bool success) {
        //require user to set to zero before resetting to nonzero
        if ((_value != 0) && (allowance[msg.sender][_spender] != 0)) {
            return false;
        }
    
        allowance[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function increaseApproval (address _spender, uint _addedValue) 
    onlyPayloadSize(2)
    returns (bool success) {
        uint oldValue = allowance[msg.sender][_spender];
        allowance[msg.sender][_spender] = safeAdd(oldValue, _addedValue);
        return true;
    }

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

    //Holds accumulated dividend tokens other than TKN
    TokenHolder tokenholder;

    //once locked, can no longer upgrade tokenholder
    bool lockedTokenHolder;

    function lockTokenHolder() onlyOwner {
        lockedTokenHolder = true;
    }

    //while unlocked, 
    //this gives owner lots of power over held dividend tokens
    //effectively can deny access to all accumulated tokens
    //thus crashing TKN value
    function setTokenHolder(address _th) onlyOwner {
        if (lockedTokenHolder) throw;
        tokenholder = TokenHolder(_th);
    }

    event Burn(address burner, uint amount);

    function burn(uint _amount) returns (bool result) {
        if (_amount > balanceOf[msg.sender]) return false;
        balanceOf[msg.sender] = safeSub(balanceOf[msg.sender], _amount);
        totalSupply = safeSub(totalSupply, _amount);
        result = tokenholder.burn(msg.sender, _amount);
        if (!result) throw;
        Burn(msg.sender, _amount);
    }

    uint public maxSupply;

    function setMaxSupply(uint _maxSupply) {
        if (msg.sender != controller) throw;
        if (maxSupply > 0) throw;
        maxSupply = _maxSupply;
    }
}

contract TokenHolder {
    function burn(address _burner, uint _amount)
    returns (bool result) { 
        return false;
    }
}


contract ICO is EventDefinitions, Testable, SafeMath, Owned {
    Token public token;
    address public controller;
    address public payee;

    Sale[] public sales;
    
    //salenum => minimum wei
    mapping (uint => uint) saleMinimumPurchases;

    //next sale number user can claim from
    mapping (address => uint) public nextClaim;

    //net contributed ETH by each user (in case of stop/refund)
    mapping (address => uint) refundInStop;

    modifier tokenIsSet() {
        if (address(token) == 0) throw;
        _;
    }

    modifier onlyController() {
        if (msg.sender != address(controller)) throw;
        _;
    }

    function ICO() { 
        owner = msg.sender;
        payee = msg.sender;
        allStopper = msg.sender;
    }

    //payee can only be changed once
    //intent is to lock payee to a contract that holds or distributes funds
    //in deployment, be sure to do this before changing owner!
    //we initialize to owner to keep things simple if there's no payee contract
    function changePayee(address newPayee) 
    onlyOwner notAllStopped {
        payee = newPayee;
    }

    function setToken(address _token) onlyOwner {
        if (address(token) != 0x0) throw;
        token = Token(_token);
    }

    //before adding sales, we can set this to be a test ico
    //this lets us manipulate time and drastically lowers weiPerEth
    function setAsTest() onlyOwner {
        if (sales.length == 0) {
            testing = true;
        }
    }

    function setController(address _controller) 
    onlyOwner notAllStopped {
        if (address(controller) != 0x0) throw;
        controller = _controller; //ICOController(_controller);
    }

    //********************************************************
    //Sales
    //********************************************************

    function addSale(address sale, uint minimumPurchase) 
    onlyController notAllStopped {
        uint salenum = sales.length;
        sales.push(Sale(sale));
        saleMinimumPurchases[salenum] = minimumPurchase;
        logSaleStart(Sale(sale).startTime(), Sale(sale).stopTime());
    }

    function addSale(address sale) onlyController {
        addSale(sale, 0);
    }

    function getCurrSale() constant returns (uint) {
        if (sales.length == 0) throw; //no reason to call before startFirstSale
        return sales.length - 1;
    }

    function currSaleActive() constant returns (bool) {
        return sales[getCurrSale()].isActive(currTime());
    }

    function currSaleComplete() constant returns (bool) {
        return sales[getCurrSale()].isComplete(currTime());
    }

    function numSales() constant returns (uint) {
        return sales.length;
    }

    function numContributors(uint salenum) constant returns (uint) {
        return sales[salenum].numContributors();
    }

    //********************************************************
    //ETH Purchases
    //********************************************************

    event logPurchase(address indexed purchaser, uint value);

    function () payable {
        deposit();
    }

    function deposit() payable notAllStopped {
        doDeposit(msg.sender, msg.value);

        //not in doDeposit because only for Eth:
        uint contrib = refundInStop[msg.sender];
        refundInStop[msg.sender] = contrib + msg.value;

        logPurchase(msg.sender, msg.value);
    }

    //is also called by token contributions
    function doDeposit(address _for, uint _value) private {
        uint currSale = getCurrSale();
        if (!currSaleActive()) throw;
        if (_value < saleMinimumPurchases[currSale]) throw;

        uint tokensToMintNow = sales[currSale].buyTokens(_for, _value, currTime());

        if (tokensToMintNow > 0) {
            token.mint(_for, tokensToMintNow);
        }
    }

    //********************************************************
    //Token Purchases
    //********************************************************

    //Support for purchase via other tokens
    //We don't attempt to deal with those tokens directly
    //We just give admin ability to tell us what deposit to credit
    //We only allow for first sale 
    //because first sale normally has no refunds
    //As written, the refund would be in ETH

    event logPurchaseViaToken(
                        address indexed purchaser, address indexed token, 
                        uint depositedTokens, uint ethValue, 
                        bytes32 _reference);

    event logPurchaseViaFiat(
                        address indexed purchaser, uint ethValue, 
                        bytes32 _reference);

    mapping (bytes32 => bool) public mintRefs;
    mapping (address => uint) public raisedFromToken;
    uint public raisedFromFiat;

    function depositFiat(address _for, uint _ethValue, bytes32 _reference) 
    notAllStopped onlyOwner {
        if (getCurrSale() > 0) throw; //only first sale allows this
        if (mintRefs[_reference]) throw; //already minted for this reference
        mintRefs[_reference] = true;
        raisedFromFiat = safeAdd(raisedFromFiat, _ethValue);

        doDeposit(_for, _ethValue);
        logPurchaseViaFiat(_for, _ethValue, _reference);
    }

    function depositTokens(address _for, address _token, 
                           uint _ethValue, uint _depositedTokens, 
                           bytes32 _reference) 
    notAllStopped onlyOwner {
        if (getCurrSale() > 0) throw; //only first sale allows this
        if (mintRefs[_reference]) throw; //already minted for this reference
        mintRefs[_reference] = true;
        raisedFromToken[_token] = safeAdd(raisedFromToken[_token], _ethValue);

        //tokens do not count toward price changes and limits
        //we have to look up pricing, and do our own mint()
        uint tokensPerEth = sales[0].tokensPerEth();
        uint tkn = safeMul(_ethValue, tokensPerEth) / weiPerEth();
        token.mint(_for, tkn);
        
        logPurchaseViaToken(_for, _token, _depositedTokens, _ethValue, _reference);
    }

    //********************************************************
    //Roundoff Protection
    //********************************************************
    //protect against roundoff in payouts
    //this prevents last person getting refund from not being able to collect
    function safebalance(uint bal) private returns (uint) {
        if (bal > this.balance) {
            return this.balance;
        } else {
            return bal;
        }
    }

    //It'd be nicer if last person got full amount
    //instead of getting shorted by safebalance()
    //topUp() allows admin to deposit excess ether to cover it
    //and later get back any left over 

    uint public topUpAmount;

    function topUp() payable onlyOwner notAllStopped {
        topUpAmount = safeAdd(topUpAmount, msg.value);
    }

    function withdrawTopUp() onlyOwner notAllStopped {
        uint amount = topUpAmount;
        topUpAmount = 0;
        if (!msg.sender.call.value(safebalance(amount))()) throw;
    }

    //********************************************************
    //Claims
    //********************************************************

    //Claim whatever you're owed, 
    //from whatever completed sales you haven't already claimed
    //this covers refunds, and any tokens not minted immediately
    //(i.e. auction tokens, not firstsale tokens)
    function claim() notAllStopped {
        var (tokens, refund, nc) = claimable(msg.sender, true);
        nextClaim[msg.sender] = nc;
        logClaim(msg.sender, refund, tokens);
        if (tokens > 0) {
            token.mint(msg.sender, tokens);
        }
        if (refund > 0) {
            refundInStop[msg.sender] = safeSub(refundInStop[msg.sender], refund);
            if (!msg.sender.send(safebalance(refund))) throw;
        }
    }

    //Allow admin to claim on behalf of user and send to any address.
    //Scenarios:
    //  user lost key
    //  user sent from an exchange
    //  user has expensive fallback function
    //  user is unknown, funds presumed abandoned
    //We only allow this after one year has passed.
    function claimFor(address _from, address _to) 
    onlyOwner notAllStopped {
        var (tokens, refund, nc) = claimable(_from, false);
        nextClaim[_from] = nc;

        logClaim(_from, refund, tokens);

        if (tokens > 0) {
            token.mint(_to, tokens);
        }
        if (refund > 0) {
            refundInStop[_from] = safeSub(refundInStop[_from], refund);
            if (!_to.send(safebalance(refund))) throw;
        }
    }

    function claimable(address _a, bool _includeRecent) 
    constant private tokenIsSet 
    returns (uint tokens, uint refund, uint nc) {
        nc = nextClaim[_a];

        while (nc < sales.length &&
               sales[nc].isComplete(currTime()) &&
               ( _includeRecent || 
                 sales[nc].stopTime() + 1 years < currTime() )) 
        {
            refund = safeAdd(refund, sales[nc].getRefund(_a));
            tokens = safeAdd(tokens, sales[nc].getTokens(_a));
            nc += 1;
        }
    }

    function claimableTokens(address a) constant returns (uint) {
        var (tokens, refund, nc) = claimable(a, true);
        return tokens;
    }

    function claimableRefund(address a) constant returns (uint) {
        var (tokens, refund, nc) = claimable(a, true);
        return refund;
    }

    function claimableTokens() constant returns (uint) {
        return claimableTokens(msg.sender);
    }

    function claimableRefund() constant returns (uint) {
        return claimableRefund(msg.sender);
    }

    //********************************************************
    //Withdraw ETH
    //********************************************************

    mapping (uint => bool) ownerClaimed;

    function claimableOwnerEth(uint salenum) constant returns (uint) {
        uint time = currTime();
        if (!sales[salenum].isComplete(time)) return 0;
        return sales[salenum].getOwnerEth();
    }

    function claimOwnerEth(uint salenum) onlyOwner notAllStopped {
        if (ownerClaimed[salenum]) throw;

        uint ownereth = claimableOwnerEth(salenum);
        if (ownereth > 0) {
            ownerClaimed[salenum] = true;
            if ( !payee.call.value(safebalance(ownereth))() ) throw;
        }
    }

    //********************************************************
    //Sweep tokens sent here
    //********************************************************

    //Support transfer of erc20 tokens out of this contract's address
    //Even if we don't intend for people to send them here, somebody will

    event logTokenTransfer(address token, address to, uint amount);

    function transferTokens(address _token, address _to) onlyOwner {
        Token token = Token(_token);
        uint balance = token.balanceOf(this);
        token.transfer(_to, balance);
        logTokenTransfer(_token, _to, balance);
    }

    //********************************************************
    //Emergency Stop
    //********************************************************

    bool allstopped;
    bool permastopped;

    //allow allStopper to be more secure address than owner
    //in which case it doesn't make sense to let owner change it again
    address allStopper;
    function setAllStopper(address _a) onlyOwner {
        if (allStopper != owner) return;
        allStopper = _a;
    }
    modifier onlyAllStopper() {
        if (msg.sender != allStopper) throw;
        _;
    }

    event logAllStop();
    event logAllStart();

    modifier allStopped() {
        if (!allstopped) throw;
        _;
    }

    modifier notAllStopped() {
        if (allstopped) throw;
        _;
    }

    function allStop() onlyAllStopper {
        allstopped = true;    
        logAllStop();
    }

    function allStart() onlyAllStopper {
        if (!permastopped) {
            allstopped = false;
            logAllStart();
        }
    }

    function emergencyRefund(address _a, uint _amt) 
    allStopped 
    onlyAllStopper {
        //if you start actually calling this refund, the disaster is real.
        //Don't allow restart, so this can't be abused 
        permastopped = true;

        uint amt = _amt;

        uint ethbal = refundInStop[_a];

        //convenient default so owner doesn't have to look up balances
        //this is fine as long as no funds have been stolen
        if (amt == 0) amt = ethbal; 

        //nobody can be refunded more than they contributed
        if (amt > ethbal) amt = ethbal;

        //since everything is halted, safer to call.value
        //so we don't have to worry about expensive fallbacks
        if ( !_a.call.value(safebalance(amt))() ) throw;
    }

    function raised() constant returns (uint) {
        return sales[getCurrSale()].raised();
    }

    function tokensPerEth() constant returns (uint) {
        return sales[getCurrSale()].tokensPerEth();
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"raisedFromToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_a","type":"address"}],"name":"setAllStopper","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"currTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newPayee","type":"address"}],"name":"changePayee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"currSaleActive","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_for","type":"address"},{"name":"_token","type":"address"},{"name":"_ethValue","type":"uint256"},{"name":"_depositedTokens","type":"uint256"},{"name":"_reference","type":"bytes32"}],"name":"depositTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"allStart","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"currSaleComplete","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"sale","type":"address"}],"name":"addSale","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"salenum","type":"uint256"}],"name":"claimableOwnerEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"claimableRefund","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_a","type":"address"},{"name":"_amt","type":"uint256"}],"name":"emergencyRefund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"transferTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiPerEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"a","type":"address"}],"name":"claimableRefund","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"salenum","type":"uint256"}],"name":"numContributors","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"t","type":"uint256"}],"name":"setFakeTime","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"a","type":"address"}],"name":"claimableTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"testing","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"m","type":"uint256"}],"name":"addMinutes","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_controller","type":"address"}],"name":"setController","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"setAsTest","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numSales","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"raisedFromFiat","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"salenum","type":"uint256"}],"name":"claimOwnerEth","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawTopUp","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"payee","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"claimFor","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sales","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"claimableTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensPerEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"mintRefs","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nextClaim","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"d","type":"uint256"}],"name":"addDays","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"topUp","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"topUpAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getCurrSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"allStop","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_for","type":"address"},{"name":"_ethValue","type":"uint256"},{"name":"_reference","type":"bytes32"}],"name":"depositFiat","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"sale","type":"address"},{"name":"minimumPurchase","type":"uint256"}],"name":"addSale","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"raised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"logPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"depositedTokens","type":"uint256"},{"indexed":false,"name":"ethValue","type":"uint256"},{"indexed":false,"name":"_reference","type":"bytes32"}],"name":"logPurchaseViaToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"ethValue","type":"uint256"},{"indexed":false,"name":"_reference","type":"bytes32"}],"name":"logPurchaseViaFiat","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"logTokenTransfer","type":"event"},{"anonymous":false,"inputs":[],"name":"logAllStop","type":"event"},{"anonymous":false,"inputs":[],"name":"logAllStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"startTime","type":"uint256"},{"indexed":false,"name":"stopTime","type":"uint256"}],"name":"logSaleStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"refund","type":"uint256"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"logClaim","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"}]

6060604052341561000c57fe5b5b6001805461010060a860020a03191661010033600160a060020a03169081029190911790915560058054600160a060020a03191682179055600f80546201000060b060020a031916620100009092029190911790555b5b61234b806100736000396000f300606060405236156102355763ffffffff60e060020a60003504166307cbe8ab8114610246578063144fa6d714610274578063156773ca146102925780631a6af7b7146102b05780631c1bc850146102d2578063379ba3b7146102f05780633fe3f42714610314578063443f95dc1461034157806348b17b64146103535780634a6d0292146103775780634e71d92d1461039557806353cea153146103a75780635ab827f6146103cc57806367f8a8b8146103ee5780636a092e791461040f5780636c530ee3146104335780636e1e063f1461045557806371c1d1961461048357806379ba5097146104a85780637a08339d146104ba57806384d24226146104cf5780638d03b102146104fd5780638da5cb5b146105215780638ff591b41461054d57806392eefe9b1461056257806398e54c551461058057806399aa93c8146105925780639c492b9e146105b4578063a015cb10146105d6578063a6f9dae1146105eb578063a8af232b14610609578063ae90b2131461061b578063b4ba9e1114610647578063b5f522f71461066b578063bab8fe401461069a578063cbdd69b5146106bc578063cd5681d5146106de578063cf00746014610705578063d0e30db014610733578063dabd5d651461073d578063dc29f1de14610752578063dd592a321461075c578063e12097b71461077e578063ecb6c47a146107a0578063eeee7cc0146107b2578063efecab8a146107d6578063f0ea4bfc146107f7578063f77c479114610819578063fc0c546a14610845575b6102445b610241610871565b5b565b005b341561024e57fe5b610262600160a060020a03600435166108ef565b60408051918252519081900360200190f35b341561027c57fe5b610244600160a060020a0360043516610901565b005b341561029a57fe5b610244600160a060020a0360043516610959565b005b34156102b857fe5b6102626109d6565b60408051918252519081900360200190f35b34156102da57fe5b610244600160a060020a03600435166109f4565b005b34156102f857fe5b610300610a47565b604080519115158252519081900360200190f35b341561031c57fe5b610244600160a060020a0360043581169060243516604435606435608435610aeb565b005b341561034957fe5b610244610d17565b005b341561035b57fe5b610300610d82565b604080519115158252519081900360200190f35b341561037f57fe5b610244600160a060020a0360043516610e26565b005b341561039d57fe5b610244610e52565b005b34156103af57fe5b610262600435610fc2565b60408051918252519081900360200190f35b34156103d457fe5b610262611100565b60408051918252519081900360200190f35b34156103f657fe5b610244600160a060020a0360043516602435611111565b005b341561041757fe5b610244600160a060020a03600435811690602435166111c9565b005b341561043b57fe5b610262611336565b60408051918252519081900360200190f35b341561045d57fe5b610262600160a060020a036004351661135f565b60408051918252519081900360200190f35b341561048b57fe5b610262600435611384565b60408051918252519081900360200190f35b34156104b057fe5b610244611416565b005b34156104c257fe5b610244600435611467565b005b34156104d757fe5b610262600160a060020a0360043516611483565b60408051918252519081900360200190f35b341561050557fe5b6103006114a8565b604080519115158252519081900360200190f35b341561052957fe5b6105316114b1565b60408051600160a060020a039092168252519081900360200190f35b341561055557fe5b6102446004356114c5565b005b341561056a57fe5b610244600160a060020a03600435166114e7565b005b341561058857fe5b610244611551565b005b341561059a57fe5b61026261158c565b60408051918252519081900360200190f35b34156105bc57fe5b610262611593565b60408051918252519081900360200190f35b34156105de57fe5b610244600435611599565b005b34156105f357fe5b610244600160a060020a0360043516611655565b005b341561061157fe5b610244611696565b005b341561062357fe5b61053161170e565b60408051600160a060020a039092168252519081900360200190f35b341561064f57fe5b610244600160a060020a036004358116906024351661171d565b005b341561067357fe5b6105316004356118b4565b60408051600160a060020a039092168252519081900360200190f35b34156106a257fe5b6102626118e6565b60408051918252519081900360200190f35b34156106c457fe5b6102626118f7565b60408051918252519081900360200190f35b34156106e657fe5b61030060043561198c565b604080519115158252519081900360200190f35b341561070d57fe5b610262600160a060020a03600435166119a1565b60408051918252519081900360200190f35b610244610871565b005b341561074557fe5b6102446004356119b3565b005b6102446119d7565b005b341561076457fe5b610262611a1d565b60408051918252519081900360200190f35b341561078657fe5b610262611a23565b60408051918252519081900360200190f35b34156107a857fe5b610244611a41565b005b34156107ba57fe5b610244600160a060020a0360043516602435604435611a9d565b005b34156107de57fe5b610244600160a060020a0360043516602435611b80565b005b34156107ff57fe5b610262611d08565b60408051918252519081900360200190f35b341561082157fe5b610531611d9d565b60408051600160a060020a039092168252519081900360200190f35b341561084d57fe5b610531611dac565b60408051600160a060020a039092168252519081900360200190f35b600f5460009060ff16156108855760006000fd5b61088f3334611dbb565b50600160a060020a033316600081815260096020908152604091829020805434808201909255835191825292519293927fc30df14cb928081d7587d26c00adb1c5483c8049cc0456e2d2e8e226dfb7c920929181900390910190a25b5b50565b600b6020526000908152604090205481565b60015433600160a060020a0390811661010090920416146109225760006000fd5b600354600160a060020a0316156109395760006000fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a03908116610100909204161461097a5760006000fd5b600154600f54620100009004600160a060020a0390811661010090920416146109a2576108eb565b600f805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038416021790555b5b50565b60015460009060ff16156109ed57506000546109f0565b50425b5b90565b60015433600160a060020a039081166101009092041614610a155760006000fd5b600f5460ff1615610a265760006000fd5b60058054600160a060020a031916600160a060020a0383161790555b5b5b50565b60006006610a53611a23565b81548110610a5d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03166382afd23b610a936109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600f54600090819060ff1615610b015760006000fd5b60015433600160a060020a039081166101009092041614610b225760006000fd5b6000610b2c611a23565b1115610b385760006000fd5b6000838152600a602052604090205460ff1615610b555760006000fd5b6000838152600a60209081526040808320805460ff19166001179055600160a060020a0389168352600b909152902054610b8f9086611f28565b600160a060020a0387166000908152600b6020526040812091909155600680549091908110610bba57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663cbdd69b56000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610c1f57fe5b60325a03f11515610c2c57fe5b5050604051519250610c3e9050611336565b610c488684611f50565b811515610c5157fe5b6003546040805160e060020a6340c10f19028152600160a060020a038c81166004830152949093046024840181905290519094509216916340c10f199160448082019260009290919082900301818387803b1515610cab57fe5b60325a03f11515610cb857fe5b505060408051868152602081018890528082018690529051600160a060020a03808a1693508a16917f15910e5cea9f22af6be011580707d2135bf1a23bf888657249f6e887af70a1fc919081900360600190a35b5b5b50505050505050565b600f5433600160a060020a03908116620100009092041614610d395760006000fd5b600f54610100900460ff16151561024157600f805460ff191690556040517f31ebd13fa817dd60b9d0ca3b04f5c010467dad9e01dce48c68ccd946dd8ec62990600090a15b5b5b565b60006006610d8e611a23565b81548110610d9857fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a6610a936109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b60045433600160a060020a03908116911614610e425760006000fd5b6108eb816000611b80565b5b5b50565b600f546000908190819060ff1615610e6a5760006000fd5b610e75336001611f7f565b600160a060020a03331660008181526008602090815260409182902084905581518581529081018690528151959850939650919450927fb72449e538635569e6f2eb1500da813bc2847392fa6a6972966a484ea8f9d73a9281900390910190a26000831115610f43576003546040805160e060020a6340c10f19028152600160a060020a03338116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b1515610f3257fe5b60325a03f11515610f3f57fe5b5050505b6000821115610fba57600160a060020a033316600090815260096020526040902054610f6f9083612278565b600160a060020a0333166000818152600960205260409020919091556108fc610f9784612291565b6040518115909202916000818181858888f193505050501515610fba5760006000fd5b5b5b5b505050565b60006000610fce6109d6565b9050600683815481101515610fdf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a6826000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b151561104c57fe5b60325a03f1151561105957fe5b5050604051511515905061107057600091506110fa565b600680548490811061107e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663c5dacf686000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156110e357fe5b60325a03f115156110f057fe5b5050604051519250505b50919050565b600061110b3361135f565b90505b90565b600f54600090819060ff1615156111285760006000fd5b600f5433600160a060020a0390811662010000909204161461114a5760006000fd5b5050600f805461ff001916610100179055600160a060020a0382166000908152600960205260409020548190811515611181578091505b8082111561118d578091505b83600160a060020a03166111a083612291565b604051600081818185876185025a03f19250505015156111c05760006000fd5b5b5b5b50505050565b600154600090819033600160a060020a0390811661010090920416146111ef5760006000fd5b83915081600160a060020a03166370a08231306000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561125257fe5b60325a03f1151561125f57fe5b50505060405180519050905081600160a060020a031663a9059cbb84836000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15156112d357fe5b60325a03f115156112e057fe5b505060408051600160a060020a0380881682528616602082015280820184905290517f977a8f1bdcf5f444d404662ea2c090d707ebcef1be61b37fe6ce74d0c6288fb892509081900360600190a15b5b50505050565b60015460009060ff161561134c575060c86109f0565b50670de0b6b3a76400006109f0565b5b90565b6000600060006000611372856001611f7f565b9250925092508193505b505050919050565b600060068281548110151561139557fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316638f03850b6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156113fa57fe5b60325a03f1151561140757fe5b5050604051519150505b919050565b60025433600160a060020a03908116911614156102415760025460018054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b5b565b60015460ff1615156114795760006000fd5b60008190555b5b50565b6000600060006000611496856001611f7f565b9250925092508293505b505050919050565b60015460ff1681565b6001546101009004600160a060020a031681565b60015460ff1615156114d75760006000fd5b60008054603c83020190555b5b50565b60015433600160a060020a0390811661010090920416146115085760006000fd5b600f5460ff16156115195760006000fd5b600454600160a060020a0316156115305760006000fd5b60048054600160a060020a031916600160a060020a0383161790555b5b5b50565b60015433600160a060020a0390811661010090920416146115725760006000fd5b6006541515610241576001805460ff1916811790555b5b5b565b6006545b90565b600c5481565b60015460009033600160a060020a0390811661010090920416146115bd5760006000fd5b600f5460ff16156115ce5760006000fd5b6000828152600e602052604090205460ff16156115eb5760006000fd5b6115f482610fc2565b9050600081111561164d576000828152600e60205260409020805460ff19166001179055600554600160a060020a031661162d82612291565b604051600081818185876185025a03f192505050151561164d5760006000fd5b5b5b5b5b5050565b60015433600160a060020a0390811661010090920416146116765760006000fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b60015460009033600160a060020a0390811661010090920416146116ba5760006000fd5b600f5460ff16156116cb5760006000fd5b50600d80546000909155600160a060020a0333166116e882612291565b604051600081818185876185025a03f19250505015156108eb5760006000fd5b5b5b5b50565b600554600160a060020a031681565b6001546000908190819033600160a060020a0390811661010090920416146117455760006000fd5b600f5460ff16156117565760006000fd5b611761856000611f7f565b600160a060020a03881660008181526008602090815260409182902084905581518581529081018690528151959850939650919450927fb72449e538635569e6f2eb1500da813bc2847392fa6a6972966a484ea8f9d73a9281900390910190a2600083111561182f576003546040805160e060020a6340c10f19028152600160a060020a03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b151561181e57fe5b60325a03f1151561182b57fe5b5050505b60008211156118a957600160a060020a03851660009081526009602052604090205461185b9083612278565b600160a060020a0380871660009081526009602052604090209190915584166108fc61188684612291565b6040518115909202916000818181858888f1935050505015156118a95760006000fd5b5b5b5b5b5050505050565b60068054829081106118c257fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600061110b33611483565b90505b90565b60006006611903611a23565b8154811061190d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663cbdd69b56000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600a6020526000908152604090205460ff1681565b60086020526000908152604090205481565b60015460ff1615156119c55760006000fd5b600080546201518083020190555b5b50565b60015433600160a060020a0390811661010090920416146119f85760006000fd5b600f5460ff1615611a095760006000fd5b611a15600d5434611f28565b600d555b5b5b565b600d5481565b6006546000901515611a355760006000fd5b50600654600019015b90565b600f5433600160a060020a03908116620100009092041614611a635760006000fd5b600f805460ff191660011790556040517f0a9a784214055eda7660e0eea4cac1eb3e349173dce3741cb49393e72e98070190600090a15b5b565b600f5460ff1615611aae5760006000fd5b60015433600160a060020a039081166101009092041614611acf5760006000fd5b6000611ad9611a23565b1115611ae55760006000fd5b6000818152600a602052604090205460ff1615611b025760006000fd5b6000818152600a60205260409020805460ff19166001179055600c54611b289083611f28565b600c55611b358383611dbb565b60408051838152602081018390528151600160a060020a038616927f8a890695a0d1d5bc0de2dd9278f1b080ce4fa5f192849361d46119e98dea1f4d928290030190a25b5b5b505050565b60045460009033600160a060020a03908116911614611b9f5760006000fd5b600f5460ff1615611bb05760006000fd5b5060068054908160018101611bc583826122d4565b916000526020600020900160005b8154600160a060020a038088166101009390930a8381029102199091161790915560008381526007602090815260408083208790558051820183905280517f78e9792500000000000000000000000000000000000000000000000000000000815290517fea217d4dc825d94490e4479842497722c85e7da8444afc5a5c6928966e85849395506378e9792593600480840194938390030190829087803b1515611c7857fe5b60325a03f11515611c8557fe5b5050506040518051905084600160a060020a03166303ff5e736000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611cd557fe5b60325a03f11515611ce257fe5b5050604080518051938152602081019390935280519283900301919050a15b5b5b505050565b60006006611d14611a23565b81548110611d1e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663f0ea4bfc6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600454600160a060020a031681565b600354600160a060020a031681565b60006000611dc7611a23565b9150611dd1610a47565b1515611ddd5760006000fd5b600082815260076020526040902054831015611df95760006000fd5b6006805483908110611e0757fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663d2395dcd8585611e3f6109d6565b6000604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018381526020018281526020019350505050602060405180830381600087803b1515611e9d57fe5b60325a03f11515611eaa57fe5b50506040515191505060008111156111c0576003546040805160e060020a6340c10f19028152600160a060020a03878116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b1515611f1057fe5b60325a03f11515610d0c57fe5b5050505b5b50505050565b6000828201611f45848210801590611f405750838210155b6122c3565b8091505b5092915050565b6000828202611f45841580611f405750838583811515611f6c57fe5b04145b6122c3565b8091505b5092915050565b60035460009081908190600160a060020a03161515611f9e5760006000fd5b50600160a060020a0384166000908152600860205260409020545b6006548110801561205d57506006805482908110611fd357fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a66120096109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b151561204757fe5b60325a03f1151561205457fe5b50506040515190505b80156121055750838061210557506120736109d6565b600680548390811061208157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03166303ff5e736000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156120e657fe5b60325a03f115156120f357fe5b505050604051805190506301e1338001105b5b1561226f576121b78260068381548110151561211e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663696c58c4886000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561219d57fe5b60325a03f115156121aa57fe5b5050604051519050611f28565b9150612265836006838154811015156121cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663450efe21886000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561219d57fe5b60325a03f115156121aa57fe5b5050604051519050611f28565b9250600101611fb9565b5b5b9250925092565b6000612286838311156122c3565b508082035b92915050565b600030600160a060020a0316318211156122b65750600160a060020a03301631611411565b5080611411565b5b919050565b8015156108eb5760006000fd5b5b50565b815481835581811511610fba57600083815260209020610fba9181019083016122fe565b5b505050565b6109f091905b808211156123185760008155600101612304565b5090565b905600a165627a7a72305820f0811d8f921c387af47f7a37b04616fc6ee77f8321d9bb1e4ac21f3b1c61db8e0029

Deployed Bytecode

0x606060405236156102355763ffffffff60e060020a60003504166307cbe8ab8114610246578063144fa6d714610274578063156773ca146102925780631a6af7b7146102b05780631c1bc850146102d2578063379ba3b7146102f05780633fe3f42714610314578063443f95dc1461034157806348b17b64146103535780634a6d0292146103775780634e71d92d1461039557806353cea153146103a75780635ab827f6146103cc57806367f8a8b8146103ee5780636a092e791461040f5780636c530ee3146104335780636e1e063f1461045557806371c1d1961461048357806379ba5097146104a85780637a08339d146104ba57806384d24226146104cf5780638d03b102146104fd5780638da5cb5b146105215780638ff591b41461054d57806392eefe9b1461056257806398e54c551461058057806399aa93c8146105925780639c492b9e146105b4578063a015cb10146105d6578063a6f9dae1146105eb578063a8af232b14610609578063ae90b2131461061b578063b4ba9e1114610647578063b5f522f71461066b578063bab8fe401461069a578063cbdd69b5146106bc578063cd5681d5146106de578063cf00746014610705578063d0e30db014610733578063dabd5d651461073d578063dc29f1de14610752578063dd592a321461075c578063e12097b71461077e578063ecb6c47a146107a0578063eeee7cc0146107b2578063efecab8a146107d6578063f0ea4bfc146107f7578063f77c479114610819578063fc0c546a14610845575b6102445b610241610871565b5b565b005b341561024e57fe5b610262600160a060020a03600435166108ef565b60408051918252519081900360200190f35b341561027c57fe5b610244600160a060020a0360043516610901565b005b341561029a57fe5b610244600160a060020a0360043516610959565b005b34156102b857fe5b6102626109d6565b60408051918252519081900360200190f35b34156102da57fe5b610244600160a060020a03600435166109f4565b005b34156102f857fe5b610300610a47565b604080519115158252519081900360200190f35b341561031c57fe5b610244600160a060020a0360043581169060243516604435606435608435610aeb565b005b341561034957fe5b610244610d17565b005b341561035b57fe5b610300610d82565b604080519115158252519081900360200190f35b341561037f57fe5b610244600160a060020a0360043516610e26565b005b341561039d57fe5b610244610e52565b005b34156103af57fe5b610262600435610fc2565b60408051918252519081900360200190f35b34156103d457fe5b610262611100565b60408051918252519081900360200190f35b34156103f657fe5b610244600160a060020a0360043516602435611111565b005b341561041757fe5b610244600160a060020a03600435811690602435166111c9565b005b341561043b57fe5b610262611336565b60408051918252519081900360200190f35b341561045d57fe5b610262600160a060020a036004351661135f565b60408051918252519081900360200190f35b341561048b57fe5b610262600435611384565b60408051918252519081900360200190f35b34156104b057fe5b610244611416565b005b34156104c257fe5b610244600435611467565b005b34156104d757fe5b610262600160a060020a0360043516611483565b60408051918252519081900360200190f35b341561050557fe5b6103006114a8565b604080519115158252519081900360200190f35b341561052957fe5b6105316114b1565b60408051600160a060020a039092168252519081900360200190f35b341561055557fe5b6102446004356114c5565b005b341561056a57fe5b610244600160a060020a03600435166114e7565b005b341561058857fe5b610244611551565b005b341561059a57fe5b61026261158c565b60408051918252519081900360200190f35b34156105bc57fe5b610262611593565b60408051918252519081900360200190f35b34156105de57fe5b610244600435611599565b005b34156105f357fe5b610244600160a060020a0360043516611655565b005b341561061157fe5b610244611696565b005b341561062357fe5b61053161170e565b60408051600160a060020a039092168252519081900360200190f35b341561064f57fe5b610244600160a060020a036004358116906024351661171d565b005b341561067357fe5b6105316004356118b4565b60408051600160a060020a039092168252519081900360200190f35b34156106a257fe5b6102626118e6565b60408051918252519081900360200190f35b34156106c457fe5b6102626118f7565b60408051918252519081900360200190f35b34156106e657fe5b61030060043561198c565b604080519115158252519081900360200190f35b341561070d57fe5b610262600160a060020a03600435166119a1565b60408051918252519081900360200190f35b610244610871565b005b341561074557fe5b6102446004356119b3565b005b6102446119d7565b005b341561076457fe5b610262611a1d565b60408051918252519081900360200190f35b341561078657fe5b610262611a23565b60408051918252519081900360200190f35b34156107a857fe5b610244611a41565b005b34156107ba57fe5b610244600160a060020a0360043516602435604435611a9d565b005b34156107de57fe5b610244600160a060020a0360043516602435611b80565b005b34156107ff57fe5b610262611d08565b60408051918252519081900360200190f35b341561082157fe5b610531611d9d565b60408051600160a060020a039092168252519081900360200190f35b341561084d57fe5b610531611dac565b60408051600160a060020a039092168252519081900360200190f35b600f5460009060ff16156108855760006000fd5b61088f3334611dbb565b50600160a060020a033316600081815260096020908152604091829020805434808201909255835191825292519293927fc30df14cb928081d7587d26c00adb1c5483c8049cc0456e2d2e8e226dfb7c920929181900390910190a25b5b50565b600b6020526000908152604090205481565b60015433600160a060020a0390811661010090920416146109225760006000fd5b600354600160a060020a0316156109395760006000fd5b60038054600160a060020a031916600160a060020a0383161790555b5b50565b60015433600160a060020a03908116610100909204161461097a5760006000fd5b600154600f54620100009004600160a060020a0390811661010090920416146109a2576108eb565b600f805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a038416021790555b5b50565b60015460009060ff16156109ed57506000546109f0565b50425b5b90565b60015433600160a060020a039081166101009092041614610a155760006000fd5b600f5460ff1615610a265760006000fd5b60058054600160a060020a031916600160a060020a0383161790555b5b5b50565b60006006610a53611a23565b81548110610a5d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03166382afd23b610a936109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600f54600090819060ff1615610b015760006000fd5b60015433600160a060020a039081166101009092041614610b225760006000fd5b6000610b2c611a23565b1115610b385760006000fd5b6000838152600a602052604090205460ff1615610b555760006000fd5b6000838152600a60209081526040808320805460ff19166001179055600160a060020a0389168352600b909152902054610b8f9086611f28565b600160a060020a0387166000908152600b6020526040812091909155600680549091908110610bba57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663cbdd69b56000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610c1f57fe5b60325a03f11515610c2c57fe5b5050604051519250610c3e9050611336565b610c488684611f50565b811515610c5157fe5b6003546040805160e060020a6340c10f19028152600160a060020a038c81166004830152949093046024840181905290519094509216916340c10f199160448082019260009290919082900301818387803b1515610cab57fe5b60325a03f11515610cb857fe5b505060408051868152602081018890528082018690529051600160a060020a03808a1693508a16917f15910e5cea9f22af6be011580707d2135bf1a23bf888657249f6e887af70a1fc919081900360600190a35b5b5b50505050505050565b600f5433600160a060020a03908116620100009092041614610d395760006000fd5b600f54610100900460ff16151561024157600f805460ff191690556040517f31ebd13fa817dd60b9d0ca3b04f5c010467dad9e01dce48c68ccd946dd8ec62990600090a15b5b5b565b60006006610d8e611a23565b81548110610d9857fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a6610a936109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b60045433600160a060020a03908116911614610e425760006000fd5b6108eb816000611b80565b5b5b50565b600f546000908190819060ff1615610e6a5760006000fd5b610e75336001611f7f565b600160a060020a03331660008181526008602090815260409182902084905581518581529081018690528151959850939650919450927fb72449e538635569e6f2eb1500da813bc2847392fa6a6972966a484ea8f9d73a9281900390910190a26000831115610f43576003546040805160e060020a6340c10f19028152600160a060020a03338116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b1515610f3257fe5b60325a03f11515610f3f57fe5b5050505b6000821115610fba57600160a060020a033316600090815260096020526040902054610f6f9083612278565b600160a060020a0333166000818152600960205260409020919091556108fc610f9784612291565b6040518115909202916000818181858888f193505050501515610fba5760006000fd5b5b5b5b505050565b60006000610fce6109d6565b9050600683815481101515610fdf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a6826000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b151561104c57fe5b60325a03f1151561105957fe5b5050604051511515905061107057600091506110fa565b600680548490811061107e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663c5dacf686000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156110e357fe5b60325a03f115156110f057fe5b5050604051519250505b50919050565b600061110b3361135f565b90505b90565b600f54600090819060ff1615156111285760006000fd5b600f5433600160a060020a0390811662010000909204161461114a5760006000fd5b5050600f805461ff001916610100179055600160a060020a0382166000908152600960205260409020548190811515611181578091505b8082111561118d578091505b83600160a060020a03166111a083612291565b604051600081818185876185025a03f19250505015156111c05760006000fd5b5b5b5b50505050565b600154600090819033600160a060020a0390811661010090920416146111ef5760006000fd5b83915081600160a060020a03166370a08231306000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561125257fe5b60325a03f1151561125f57fe5b50505060405180519050905081600160a060020a031663a9059cbb84836000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15156112d357fe5b60325a03f115156112e057fe5b505060408051600160a060020a0380881682528616602082015280820184905290517f977a8f1bdcf5f444d404662ea2c090d707ebcef1be61b37fe6ce74d0c6288fb892509081900360600190a15b5b50505050565b60015460009060ff161561134c575060c86109f0565b50670de0b6b3a76400006109f0565b5b90565b6000600060006000611372856001611f7f565b9250925092508193505b505050919050565b600060068281548110151561139557fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316638f03850b6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156113fa57fe5b60325a03f1151561140757fe5b5050604051519150505b919050565b60025433600160a060020a03908116911614156102415760025460018054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b5b565b60015460ff1615156114795760006000fd5b60008190555b5b50565b6000600060006000611496856001611f7f565b9250925092508293505b505050919050565b60015460ff1681565b6001546101009004600160a060020a031681565b60015460ff1615156114d75760006000fd5b60008054603c83020190555b5b50565b60015433600160a060020a0390811661010090920416146115085760006000fd5b600f5460ff16156115195760006000fd5b600454600160a060020a0316156115305760006000fd5b60048054600160a060020a031916600160a060020a0383161790555b5b5b50565b60015433600160a060020a0390811661010090920416146115725760006000fd5b6006541515610241576001805460ff1916811790555b5b5b565b6006545b90565b600c5481565b60015460009033600160a060020a0390811661010090920416146115bd5760006000fd5b600f5460ff16156115ce5760006000fd5b6000828152600e602052604090205460ff16156115eb5760006000fd5b6115f482610fc2565b9050600081111561164d576000828152600e60205260409020805460ff19166001179055600554600160a060020a031661162d82612291565b604051600081818185876185025a03f192505050151561164d5760006000fd5b5b5b5b5b5050565b60015433600160a060020a0390811661010090920416146116765760006000fd5b60028054600160a060020a031916600160a060020a0383161790555b5b50565b60015460009033600160a060020a0390811661010090920416146116ba5760006000fd5b600f5460ff16156116cb5760006000fd5b50600d80546000909155600160a060020a0333166116e882612291565b604051600081818185876185025a03f19250505015156108eb5760006000fd5b5b5b5b50565b600554600160a060020a031681565b6001546000908190819033600160a060020a0390811661010090920416146117455760006000fd5b600f5460ff16156117565760006000fd5b611761856000611f7f565b600160a060020a03881660008181526008602090815260409182902084905581518581529081018690528151959850939650919450927fb72449e538635569e6f2eb1500da813bc2847392fa6a6972966a484ea8f9d73a9281900390910190a2600083111561182f576003546040805160e060020a6340c10f19028152600160a060020a03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b151561181e57fe5b60325a03f1151561182b57fe5b5050505b60008211156118a957600160a060020a03851660009081526009602052604090205461185b9083612278565b600160a060020a0380871660009081526009602052604090209190915584166108fc61188684612291565b6040518115909202916000818181858888f1935050505015156118a95760006000fd5b5b5b5b5b5050505050565b60068054829081106118c257fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600061110b33611483565b90505b90565b60006006611903611a23565b8154811061190d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663cbdd69b56000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600a6020526000908152604090205460ff1681565b60086020526000908152604090205481565b60015460ff1615156119c55760006000fd5b600080546201518083020190555b5b50565b60015433600160a060020a0390811661010090920416146119f85760006000fd5b600f5460ff1615611a095760006000fd5b611a15600d5434611f28565b600d555b5b5b565b600d5481565b6006546000901515611a355760006000fd5b50600654600019015b90565b600f5433600160a060020a03908116620100009092041614611a635760006000fd5b600f805460ff191660011790556040517f0a9a784214055eda7660e0eea4cac1eb3e349173dce3741cb49393e72e98070190600090a15b5b565b600f5460ff1615611aae5760006000fd5b60015433600160a060020a039081166101009092041614611acf5760006000fd5b6000611ad9611a23565b1115611ae55760006000fd5b6000818152600a602052604090205460ff1615611b025760006000fd5b6000818152600a60205260409020805460ff19166001179055600c54611b289083611f28565b600c55611b358383611dbb565b60408051838152602081018390528151600160a060020a038616927f8a890695a0d1d5bc0de2dd9278f1b080ce4fa5f192849361d46119e98dea1f4d928290030190a25b5b5b505050565b60045460009033600160a060020a03908116911614611b9f5760006000fd5b600f5460ff1615611bb05760006000fd5b5060068054908160018101611bc583826122d4565b916000526020600020900160005b8154600160a060020a038088166101009390930a8381029102199091161790915560008381526007602090815260408083208790558051820183905280517f78e9792500000000000000000000000000000000000000000000000000000000815290517fea217d4dc825d94490e4479842497722c85e7da8444afc5a5c6928966e85849395506378e9792593600480840194938390030190829087803b1515611c7857fe5b60325a03f11515611c8557fe5b5050506040518051905084600160a060020a03166303ff5e736000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611cd557fe5b60325a03f11515611ce257fe5b5050604080518051938152602081019390935280519283900301919050a15b5b5b505050565b60006006611d14611a23565b81548110611d1e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663f0ea4bfc6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ad157fe5b60325a03f11515610ade57fe5b5050604051519150505b90565b600454600160a060020a031681565b600354600160a060020a031681565b60006000611dc7611a23565b9150611dd1610a47565b1515611ddd5760006000fd5b600082815260076020526040902054831015611df95760006000fd5b6006805483908110611e0757fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663d2395dcd8585611e3f6109d6565b6000604051602001526040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018381526020018281526020019350505050602060405180830381600087803b1515611e9d57fe5b60325a03f11515611eaa57fe5b50506040515191505060008111156111c0576003546040805160e060020a6340c10f19028152600160a060020a03878116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b1515611f1057fe5b60325a03f11515610d0c57fe5b5050505b5b50505050565b6000828201611f45848210801590611f405750838210155b6122c3565b8091505b5092915050565b6000828202611f45841580611f405750838583811515611f6c57fe5b04145b6122c3565b8091505b5092915050565b60035460009081908190600160a060020a03161515611f9e5760006000fd5b50600160a060020a0384166000908152600860205260409020545b6006548110801561205d57506006805482908110611fd357fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316633a0be1a66120096109d6565b6000604051602001526040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b151561204757fe5b60325a03f1151561205457fe5b50506040515190505b80156121055750838061210557506120736109d6565b600680548390811061208157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03166303ff5e736000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156120e657fe5b60325a03f115156120f357fe5b505050604051805190506301e1338001105b5b1561226f576121b78260068381548110151561211e57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663696c58c4886000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561219d57fe5b60325a03f115156121aa57fe5b5050604051519050611f28565b9150612265836006838154811015156121cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031663450efe21886000604051602001526040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b151561219d57fe5b60325a03f115156121aa57fe5b5050604051519050611f28565b9250600101611fb9565b5b5b9250925092565b6000612286838311156122c3565b508082035b92915050565b600030600160a060020a0316318211156122b65750600160a060020a03301631611411565b5080611411565b5b919050565b8015156108eb5760006000fd5b5b50565b815481835581811511610fba57600083815260209020610fba9181019083016122fe565b5b505050565b6109f091905b808211156123185760008155600101612304565b5090565b905600a165627a7a72305820f0811d8f921c387af47f7a37b04616fc6ee77f8321d9bb1e4ac21f3b1c61db8e0029

Swarm Source

bzzr://f0811d8f921c387af47f7a37b04616fc6ee77f8321d9bb1e4ac21f3b1c61db8e

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  ]
[ 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.