ETH Price: $3,281.97 (-8.54%)
Gas: 83 Gwei

Contract

0x092988FC1090fF8F924b8f9Cc71350e90ca446Cd
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Accept Ownership95629202020-02-27 2:20:471482 days ago1582770047IN
0x092988FC...90ca446Cd
0 ETH0.000157127
Enable Burning63062142018-09-10 13:14:592016 days ago1536585299IN
0x092988FC...90ca446Cd
0 ETH0.0009010220
Accept Ownership46017142017-11-22 16:30:362308 days ago1511368236IN
0x092988FC...90ca446Cd
0 ETH0.0005789421
Change Owner45961352017-11-21 18:51:372309 days ago1511290297IN
0x092988FC...90ca446Cd
0 ETH0.00021965
Set Ledger43197622017-09-28 18:47:342363 days ago1506624454IN
0x092988FC...90ca446Cd
0 ETH0.000218285
Set Token43197602017-09-28 18:47:052363 days ago1506624425IN
0x092988FC...90ca446Cd
0 ETH0.000217845
0x6060604043197452017-09-28 18:38:562363 days ago1506623936IN
 Create: Controller
0 ETH0.005615185

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Controller

Compiler Version
v0.4.17+commit.bdeb9e52

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-11-22
*/

pragma solidity >=0.4.10;

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

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

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

contract Owned {
    address public owner;
    address newOwner;

    function Owned() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

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

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

contract IToken {
    function transfer(address _to, uint _value) returns (bool);
    function balanceOf(address owner) returns(uint);
}

// In case someone accidentally sends token to one of these contracts,
// add a way to get them back out.
contract TokenReceivable is Owned {
    function claimTokens(address _token, address _to) onlyOwner returns (bool) {
        IToken token = IToken(_token);
        return token.transfer(_to, token.balanceOf(this));
    }
}

contract EventDefinitions {
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
    event Burn(address indexed from, bytes32 indexed to, uint value);
    event Claimed(address indexed claimer, uint value);
}

contract Pausable is Owned {
    bool public paused;

    function pause() onlyOwner {
        paused = true;
    }

    function unpause() onlyOwner {
        paused = false;
    }

    modifier notPaused() {
        require(!paused);
        _;
    }
}

contract Finalizable is Owned {
    bool public finalized;

    function finalize() onlyOwner {
        finalized = true;
    }

    modifier notFinalized() {
        require(!finalized);
        _;
    }
}

contract Ledger is Owned, SafeMath, Finalizable {
    Controller public controller;
    mapping(address => uint) public balanceOf;
    mapping (address => mapping (address => uint)) public allowance;
    uint public totalSupply;
    uint public mintingNonce;
    bool public mintingStopped;

    /**
     * Used for updating the contract with proofs. Note that the logic
     * for guarding against unwanted actions happens in the controller. We only
     * specify onlyController here.
     * @notice: not yet used
     */
    mapping(uint256 => bytes32) public proofs;

    /**
     * If bridge delivers currency back from the other network, it may be that we
     * want to lock it until the user is able to "claim" it. This mapping would store the
     * state of the unclaimed currency.
     * @notice: not yet used
     */
    mapping(address => uint256) public locked;

    /**
     * As a precautionary measure, we may want to include a structure to store necessary
     * data should we find that we require additional information.
     * @notice: not yet used
     */
    mapping(bytes32 => bytes32) public metadata;

    /**
     * Set by the controller to indicate where the transfers should go to on a burn
     */
    address public burnAddress;

    /**
     * Mapping allowing us to identify the bridge nodes, in the current setup
     * manipulation of this mapping is only accessible by the parameter.
     */
    mapping(address => bool) public bridgeNodes;

    // functions below this line are onlyOwner

    function Ledger() {
    }

    function setController(address _controller) onlyOwner notFinalized {
        controller = Controller(_controller);
    }

    /**
     * @dev         To be called once minting is complete, disables minting.  
     */
    function stopMinting() onlyOwner {
        mintingStopped = true;
    }

    /**
     * @dev         Used to mint a batch of currency at once.
     * 
     * @notice      This gives us a maximum of 2^96 tokens per user.
     * @notice      Expected packed structure is [ADDR(20) | VALUE(12)].
     *
     * @param       nonce   The minting nonce, an incorrect nonce is rejected.
     * @param       bits    An array of packed bytes of address, value mappings.  
     *
     */
    function multiMint(uint nonce, uint256[] bits) onlyOwner {
        require(!mintingStopped);
        if (nonce != mintingNonce) return;
        mintingNonce += 1;
        uint256 lomask = (1 << 96) - 1;
        uint created = 0;
        for (uint i=0; i<bits.length; i++) {
            address a = address(bits[i]>>96);
            uint value = bits[i]&lomask;
            balanceOf[a] = balanceOf[a] + value;
            controller.ledgerTransfer(0, a, value);
            created += value;
        }
        totalSupply += created;
    }

    // functions below this line are onlyController

    modifier onlyController() {
        require(msg.sender == address(controller));
        _;
    }

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

        balanceOf[_from] = safeSub(balanceOf[_from], _value);
        balanceOf[_to] = safeAdd(balanceOf[_to], _value);
        return true;
    }

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

        var allowed = allowance[_from][_spender];
        if (allowed < _value) return false;

        balanceOf[_to] = safeAdd(balanceOf[_to], _value);
        balanceOf[_from] = safeSub(balanceOf[_from], _value);
        allowance[_from][_spender] = safeSub(allowed, _value);
        return true;
    }

    function approve(address _owner, address _spender, uint _value) onlyController returns (bool success) {
        // require user to set to zero before resetting to nonzero
        if ((_value != 0) && (allowance[_owner][_spender] != 0)) {
            return false;
        }

        allowance[_owner][_spender] = _value;
        return true;
    }

    function increaseApproval (address _owner, address _spender, uint _addedValue) onlyController returns (bool success) {
        uint oldValue = allowance[_owner][_spender];
        allowance[_owner][_spender] = safeAdd(oldValue, _addedValue);
        return true;
    }

    function decreaseApproval (address _owner, address _spender, uint _subtractedValue) onlyController returns (bool success) {
        uint oldValue = allowance[_owner][_spender];
        if (_subtractedValue > oldValue) {
            allowance[_owner][_spender] = 0;
        } else {
            allowance[_owner][_spender] = safeSub(oldValue, _subtractedValue);
        }
        return true;
    }

    function setProof(uint256 _key, bytes32 _proof) onlyController {
        proofs[_key] = _proof;
    }

    function setLocked(address _key, uint256 _value) onlyController {
        locked[_key] = _value;
    }

    function setMetadata(bytes32 _key, bytes32 _value) onlyController {
        metadata[_key] = _value;
    }

    /**
     * Burn related functionality
     */

    /**
     * @dev        sets the burn address to the new value
     *
     * @param      _address  The address
     *
     */
    function setBurnAddress(address _address) onlyController {
        burnAddress = _address;
    }

    function setBridgeNode(address _address, bool enabled) onlyController {
        bridgeNodes[_address] = enabled;
    }
}

contract ControllerEventDefinitions {
    /**
     * An internal burn event, emitted by the controller contract
     * which the bridges could be listening to.
     */
    event ControllerBurn(address indexed from, bytes32 indexed to, uint value);
}

/**
 * @title Controller for business logic between the ERC20 API and State
 *
 * Controller is responsible for the business logic that sits in between
 * the Ledger (model) and the Token (view). Presently, adherence to this model
 * is not strict, but we expect future functionality (Burning, Claiming) to adhere
 * to this model more closely.
 * 
 * The controller must be linked to a Token and Ledger to become functional.
 * 
 */
contract Controller is Owned, Finalizable, ControllerEventDefinitions {
    Ledger public ledger;
    Token public token;
    address public burnAddress;

    function Controller() {
    }

    // functions below this line are onlyOwner


    function setToken(address _token) onlyOwner {
        token = Token(_token);
    }

    function setLedger(address _ledger) onlyOwner {
        ledger = Ledger(_ledger);
    }

    /**
     * @dev         Sets the burn address burn values get moved to. Only call
     *              after token and ledger contracts have been hooked up. Ensures
     *              that all three values are set atomically.
     *             
     * @notice      New Functionality
     *
     * @param       _address    desired address
     *
     */
    function setBurnAddress(address _address) onlyOwner {
        burnAddress = _address;
        ledger.setBurnAddress(_address);
        token.setBurnAddress(_address);
    }

    modifier onlyToken() {
        require(msg.sender == address(token));
        _;
    }

    modifier onlyLedger() {
        require(msg.sender == address(ledger));
        _;
    }

    function totalSupply() constant returns (uint) {
        return ledger.totalSupply();
    }

    function balanceOf(address _a) constant returns (uint) {
        return ledger.balanceOf(_a);
    }

    function allowance(address _owner, address _spender) constant returns (uint) {
        return ledger.allowance(_owner, _spender);
    }

    // functions below this line are onlyLedger

    // let the ledger send transfer events (the most obvious case
    // is when we mint directly to the ledger and need the Transfer()
    // events to appear in the token)
    function ledgerTransfer(address from, address to, uint val) onlyLedger {
        token.controllerTransfer(from, to, val);
    }

    // functions below this line are onlyToken

    function transfer(address _from, address _to, uint _value) onlyToken returns (bool success) {
        return ledger.transfer(_from, _to, _value);
    }

    function transferFrom(address _spender, address _from, address _to, uint _value) onlyToken returns (bool success) {
        return ledger.transferFrom(_spender, _from, _to, _value);
    }

    function approve(address _owner, address _spender, uint _value) onlyToken returns (bool success) {
        return ledger.approve(_owner, _spender, _value);
    }

    function increaseApproval (address _owner, address _spender, uint _addedValue) onlyToken returns (bool success) {
        return ledger.increaseApproval(_owner, _spender, _addedValue);
    }

    function decreaseApproval (address _owner, address _spender, uint _subtractedValue) onlyToken returns (bool success) {
        return ledger.decreaseApproval(_owner, _spender, _subtractedValue);
    }

    /**
     * End Original Contract
     * Below is new functionality
     */

    /**
     * @dev        Enables burning on the token contract
     */
    function enableBurning() onlyOwner {
        token.enableBurning();
    }

    /**
     * @dev        Disables burning on the token contract
     */
    function disableBurning() onlyOwner {
        token.disableBurning();
    }

    // public functions

    /**
     * @dev         
     *
     * @param       _from       account the value is burned from
     * @param       _to         the address receiving the value
     * @param       _amount     the value amount
     * 
     * @return      success     operation successful or not.
     */ 
    function burn(address _from, bytes32 _to, uint _amount) onlyToken returns (bool success) {
        if (ledger.transfer(_from, burnAddress, _amount)) {
            ControllerBurn(_from, _to, _amount);
            token.controllerBurn(_from, _to, _amount);
            return true;
        }
        return false;
    }

    /**
     * @dev         Implementation for claim mechanism. Note that this mechanism has not yet
     *              been implemented. This function is only here for future expansion capabilities.
     *              Presently, just returns false to indicate failure.
     *              
     * @notice      Only one of claimByProof() or claim() will potentially be activated in the future.
     *              Depending on the functionality required and route selected. 
     *
     * @param       _claimer    The individual claiming the tokens (also the recipient of said tokens).
     * @param       data        The input data required to release the tokens.
     * @param       success     The proofs associated with the data, to indicate the legitimacy of said data.
     * @param       number      The block number the proofs and data correspond to.
     *
     * @return      success     operation successful or not.
     * 
     */
    function claimByProof(address _claimer, bytes32[] data, bytes32[] proofs, uint256 number)
        onlyToken
        returns (bool success) {
        return false;
    }

    /**
     * @dev         Implementation for an alternative claim mechanism, in which the participant
     *              is not required to confirm through proofs. Note that this mechanism has not
     *              yet been implemented.
     *              
     * @notice      Only one of claimByProof() or claim() will potentially be activated in the future.
     *              Depending on the functionality required and route selected.
     * 
     * @param       _claimer    The individual claiming the tokens (also the recipient of said tokens).
     * 
     * @return      success     operation successful or not.
     */
    function claim(address _claimer) onlyToken returns (bool success) {
        return false;
    }
}

contract Token is Finalizable, TokenReceivable, SafeMath, EventDefinitions, Pausable {
    // Set these appropriately before you deploy
    string constant public name = "AION";
    uint8 constant public decimals = 8;
    string constant public symbol = "AION";
    Controller public controller;
    string public motd;
    event Motd(string message);

    address public burnAddress; //@ATTENTION: set this to a correct value
    bool public burnable = false;

    // functions below this line are onlyOwner

    // set "message of the day"
    function setMotd(string _m) onlyOwner {
        motd = _m;
        Motd(_m);
    }

    function setController(address _c) onlyOwner notFinalized {
        controller = Controller(_c);
    }

    // functions below this line are public

    function balanceOf(address a) constant returns (uint) {
        return controller.balanceOf(a);
    }

    function totalSupply() constant returns (uint) {
        return controller.totalSupply();
    }

    function allowance(address _owner, address _spender) constant returns (uint) {
        return controller.allowance(_owner, _spender);
    }

    function transfer(address _to, uint _value) notPaused returns (bool success) {
        if (controller.transfer(msg.sender, _to, _value)) {
            Transfer(msg.sender, _to, _value);
            return true;
        }
        return false;
    }

    function transferFrom(address _from, address _to, uint _value) notPaused returns (bool success) {
        if (controller.transferFrom(msg.sender, _from, _to, _value)) {
            Transfer(_from, _to, _value);
            return true;
        }
        return false;
    }

    function approve(address _spender, uint _value) notPaused returns (bool success) {
        // promote safe user behavior
        if (controller.approve(msg.sender, _spender, _value)) {
            Approval(msg.sender, _spender, _value);
            return true;
        }
        return false;
    }

    function increaseApproval (address _spender, uint _addedValue) notPaused returns (bool success) {
        if (controller.increaseApproval(msg.sender, _spender, _addedValue)) {
            uint newval = controller.allowance(msg.sender, _spender);
            Approval(msg.sender, _spender, newval);
            return true;
        }
        return false;
    }

    function decreaseApproval (address _spender, uint _subtractedValue) notPaused returns (bool success) {
        if (controller.decreaseApproval(msg.sender, _spender, _subtractedValue)) {
            uint newval = controller.allowance(msg.sender, _spender);
            Approval(msg.sender, _spender, newval);
            return true;
        }
        return false;
    }

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

    // functions below this line are onlyController

    modifier onlyController() {
        assert(msg.sender == address(controller));
        _;
    }

    // In the future, when the controller supports multiple token
    // heads, allow the controller to reconstitute the transfer and
    // approval history.

    function controllerTransfer(address _from, address _to, uint _value) onlyController {
        Transfer(_from, _to, _value);
    }

    function controllerApprove(address _owner, address _spender, uint _value) onlyController {
        Approval(_owner, _spender, _value);
    }

    /**
     * @dev        Burn event possibly called by the controller on a burn. This is
     *             the public facing event that anyone can track, the bridges listen
     *             to an alternative event emitted by the controller.
     *
     * @param      _from   address that coins are burned from
     * @param      _to     address (on other network) that coins are received by
     * @param      _value  amount of value to be burned
     *
     * @return     { description_of_the_return_value }
     */
    function controllerBurn(address _from, bytes32 _to, uint256 _value) onlyController {
        Burn(_from, _to, _value);
    }

    function controllerClaim(address _claimer, uint256 _value) onlyController {
        Claimed(_claimer, _value);
    }

    /**
     * @dev        Sets the burn address to a new value
     *
     * @param      _address  The address
     *
     */
    function setBurnAddress(address _address) onlyController {
        burnAddress = _address;
    }

    /**
     * @dev         Enables burning through burnable bool
     *
     */
    function enableBurning() onlyController {
        burnable = true;
    }

    /**
     * @dev         Disables burning through burnable bool
     *
     */
    function disableBurning() onlyController {
        burnable = false;
    }

    /**
     * @dev         Indicates that burning is enabled
     */
    modifier burnEnabled() {
        require(burnable == true);
        _;
    }

    /**
     * @dev         burn function, changed from original implementation. Public facing API
     *              indicating who the token holder wants to burn currency to and the amount.
     *
     * @param       _amount  The amount
     *
     */
    function burn(bytes32 _to, uint _amount) notPaused burnEnabled returns (bool success) {
        return controller.burn(msg.sender, _to, _amount);
    }

    /**
     * @dev         claim (quantumReceive) allows the user to "prove" some an ICT to the contract
     *              thereby thereby releasing the tokens into their account
     * 
     */
    function claimByProof(bytes32[] data, bytes32[] proofs, uint256 number) notPaused burnEnabled returns (bool success) {
        return controller.claimByProof(msg.sender, data, proofs, number);
    }

    /**
     * @dev         Simplified version of claim, just requires user to call to claim.
     *              No proof is needed, which version is chosen depends on our bridging model.
     *
     * @return      
     */
    function claim() notPaused burnEnabled returns (bool success) {
        return controller.claim(msg.sender);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"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":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_claimer","type":"address"}],"name":"claim","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ledger","type":"address"}],"name":"setLedger","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"bytes32"},{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setBurnAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_claimer","type":"address"},{"name":"data","type":"bytes32[]"},{"name":"proofs","type":"bytes32[]"},{"name":"number","type":"uint256"}],"name":"claimByProof","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ledger","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_a","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableBurning","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableBurning","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","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":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"val","type":"uint256"}],"name":"ledgerTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"}],"name":"ControllerBurn","type":"event"}]

6060604052341561000f57600080fd5b60008054600160a060020a033316600160a060020a0319909116179055610f688061003b6000396000f3006060604052361561012d5763ffffffff60e060020a600035041663144fa6d7811461013257806315dacbea1461015357806318160ddd146101955780631e83409a146101ba5780633246887d146101d95780634460fb6d146101f85780634b0e72161461021d5780634bb278f31461023c5780635513a2ac1461024f57806356397c35146102ee57806370a082311461031d57806370d5ae051461033c5780637581a8e61461034f57806379ba5097146103625780638da5cb5b1461037557806398603cca14610388578063a6f9dae11461039b578063b3f05b97146103ba578063bcdd6121146103cd578063beabacc8146103f5578063dd62ed3e1461041d578063e1f21c6714610442578063f019c2671461046a578063f5c86d2a14610492578063fc0c546a146104ba575b600080fd5b341561013d57600080fd5b610151600160a060020a03600435166104cd565b005b341561015e57600080fd5b610181600160a060020a0360043581169060243581169060443516606435610517565b604051901515815260200160405180910390f35b34156101a057600080fd5b6101a86105cb565b60405190815260200160405180910390f35b34156101c557600080fd5b610181600160a060020a0360043516610634565b34156101e457600080fd5b610151600160a060020a036004351661065a565b341561020357600080fd5b610181600160a060020a03600435166024356044356106a4565b341561022857600080fd5b610151600160a060020a036004351661081b565b341561024757600080fd5b610151610927565b341561025a57600080fd5b61018160048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650509335935061097992505050565b34156102f957600080fd5b6103016109a2565b604051600160a060020a03909116815260200160405180910390f35b341561032857600080fd5b6101a8600160a060020a03600435166109b1565b341561034757600080fd5b610301610a2c565b341561035a57600080fd5b610151610a3b565b341561036d57600080fd5b610151610aab565b341561038057600080fd5b610301610af4565b341561039357600080fd5b610151610b03565b34156103a657600080fd5b610151600160a060020a0360043516610b5d565b34156103c557600080fd5b610181610ba7565b34156103d857600080fd5b610181600160a060020a0360043581169060243516604435610bc8565b341561040057600080fd5b610181600160a060020a0360043581169060243516604435610c74565b341561042857600080fd5b6101a8600160a060020a0360043581169060243516610cfe565b341561044d57600080fd5b610181600160a060020a0360043581169060243516604435610d82565b341561047557600080fd5b610181600160a060020a0360043581169060243516604435610e0c565b341561049d57600080fd5b610151600160a060020a0360043581169060243516604435610e96565b34156104c557600080fd5b610301610f2d565b60005433600160a060020a039081169116146104e857600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009033600160a060020a0390811691161461053557600080fd5b600254600160a060020a03166315dacbea8686868660006040516020015260405160e060020a63ffffffff8716028152600160a060020a0394851660048201529284166024840152921660448201526064810191909152608401602060405180830381600087803b15156105a857600080fd5b6102c65a03f115156105b957600080fd5b50505060405180519695505050505050565b600254600090600160a060020a03166318160ddd82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561061557600080fd5b6102c65a03f1151561062657600080fd5b505050604051805191505090565b60035460009033600160a060020a0390811691161461065257600080fd5b506000919050565b60005433600160a060020a0390811691161461067557600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009033600160a060020a039081169116146106c257600080fd5b600254600454600160a060020a039182169163beabacc8918791168560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561073657600080fd5b6102c65a03f1151561074757600080fd5b50505060405180519050156108105782600160a060020a0385167f764cd707402c711fc543d2e9223b77e23b168f4a37f56632635eaf7b6f1a0c9c8460405190815260200160405180910390a3600354600160a060020a031663eb81e95a85858560405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b15156107f357600080fd5b6102c65a03f1151561080457600080fd5b50505060019050610814565b5060005b9392505050565b60005433600160a060020a0390811691161461083657600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911790915560025416634b0e72168260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156108ab57600080fd5b6102c65a03f115156108bc57600080fd5b5050600354600160a060020a03169050634b0e72168260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561091057600080fd5b6102c65a03f1151561092157600080fd5b50505050565b60005433600160a060020a0390811691161461094257600080fd5b6001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b60035460009033600160a060020a0390811691161461099757600080fd5b506000949350505050565b600254600160a060020a031681565b600254600090600160a060020a03166370a0823183836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610a0c57600080fd5b6102c65a03f11515610a1d57600080fd5b50505060405180519392505050565b600454600160a060020a031681565b60005433600160a060020a03908116911614610a5657600080fd5b600354600160a060020a0316637581a8e66040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610a9557600080fd5b6102c65a03f11515610aa657600080fd5b505050565b60015433600160a060020a0390811691161415610af2576001546000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b600054600160a060020a031681565b60005433600160a060020a03908116911614610b1e57600080fd5b600354600160a060020a03166398603cca6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610a9557600080fd5b60005433600160a060020a03908116911614610b7857600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015474010000000000000000000000000000000000000000900460ff1681565b60035460009033600160a060020a03908116911614610be657600080fd5b600254600160a060020a031663bcdd612185858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b6102c65a03f11515610c6357600080fd5b505050604051805195945050505050565b60035460009033600160a060020a03908116911614610c9257600080fd5b600254600160a060020a031663beabacc885858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b600254600090600160a060020a031663dd62ed3e8484846040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515610d6157600080fd5b6102c65a03f11515610d7257600080fd5b5050506040518051949350505050565b60035460009033600160a060020a03908116911614610da057600080fd5b600254600160a060020a031663e1f21c6785858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b60035460009033600160a060020a03908116911614610e2a57600080fd5b600254600160a060020a031663f019c26785858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b60025433600160a060020a03908116911614610eb157600080fd5b600354600160a060020a0316639b50438784848460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610f1457600080fd5b6102c65a03f11515610f2557600080fd5b505050505050565b600354600160a060020a0316815600a165627a7a7230582033b2f7e4e19b77364bd7dc10c5bc7388b6caa2c46c755af62129fbff5301a1290029

Deployed Bytecode

0x6060604052361561012d5763ffffffff60e060020a600035041663144fa6d7811461013257806315dacbea1461015357806318160ddd146101955780631e83409a146101ba5780633246887d146101d95780634460fb6d146101f85780634b0e72161461021d5780634bb278f31461023c5780635513a2ac1461024f57806356397c35146102ee57806370a082311461031d57806370d5ae051461033c5780637581a8e61461034f57806379ba5097146103625780638da5cb5b1461037557806398603cca14610388578063a6f9dae11461039b578063b3f05b97146103ba578063bcdd6121146103cd578063beabacc8146103f5578063dd62ed3e1461041d578063e1f21c6714610442578063f019c2671461046a578063f5c86d2a14610492578063fc0c546a146104ba575b600080fd5b341561013d57600080fd5b610151600160a060020a03600435166104cd565b005b341561015e57600080fd5b610181600160a060020a0360043581169060243581169060443516606435610517565b604051901515815260200160405180910390f35b34156101a057600080fd5b6101a86105cb565b60405190815260200160405180910390f35b34156101c557600080fd5b610181600160a060020a0360043516610634565b34156101e457600080fd5b610151600160a060020a036004351661065a565b341561020357600080fd5b610181600160a060020a03600435166024356044356106a4565b341561022857600080fd5b610151600160a060020a036004351661081b565b341561024757600080fd5b610151610927565b341561025a57600080fd5b61018160048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650509335935061097992505050565b34156102f957600080fd5b6103016109a2565b604051600160a060020a03909116815260200160405180910390f35b341561032857600080fd5b6101a8600160a060020a03600435166109b1565b341561034757600080fd5b610301610a2c565b341561035a57600080fd5b610151610a3b565b341561036d57600080fd5b610151610aab565b341561038057600080fd5b610301610af4565b341561039357600080fd5b610151610b03565b34156103a657600080fd5b610151600160a060020a0360043516610b5d565b34156103c557600080fd5b610181610ba7565b34156103d857600080fd5b610181600160a060020a0360043581169060243516604435610bc8565b341561040057600080fd5b610181600160a060020a0360043581169060243516604435610c74565b341561042857600080fd5b6101a8600160a060020a0360043581169060243516610cfe565b341561044d57600080fd5b610181600160a060020a0360043581169060243516604435610d82565b341561047557600080fd5b610181600160a060020a0360043581169060243516604435610e0c565b341561049d57600080fd5b610151600160a060020a0360043581169060243516604435610e96565b34156104c557600080fd5b610301610f2d565b60005433600160a060020a039081169116146104e857600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009033600160a060020a0390811691161461053557600080fd5b600254600160a060020a03166315dacbea8686868660006040516020015260405160e060020a63ffffffff8716028152600160a060020a0394851660048201529284166024840152921660448201526064810191909152608401602060405180830381600087803b15156105a857600080fd5b6102c65a03f115156105b957600080fd5b50505060405180519695505050505050565b600254600090600160a060020a03166318160ddd82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561061557600080fd5b6102c65a03f1151561062657600080fd5b505050604051805191505090565b60035460009033600160a060020a0390811691161461065257600080fd5b506000919050565b60005433600160a060020a0390811691161461067557600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035460009033600160a060020a039081169116146106c257600080fd5b600254600454600160a060020a039182169163beabacc8918791168560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561073657600080fd5b6102c65a03f1151561074757600080fd5b50505060405180519050156108105782600160a060020a0385167f764cd707402c711fc543d2e9223b77e23b168f4a37f56632635eaf7b6f1a0c9c8460405190815260200160405180910390a3600354600160a060020a031663eb81e95a85858560405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401600060405180830381600087803b15156107f357600080fd5b6102c65a03f1151561080457600080fd5b50505060019050610814565b5060005b9392505050565b60005433600160a060020a0390811691161461083657600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911790915560025416634b0e72168260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156108ab57600080fd5b6102c65a03f115156108bc57600080fd5b5050600354600160a060020a03169050634b0e72168260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561091057600080fd5b6102c65a03f1151561092157600080fd5b50505050565b60005433600160a060020a0390811691161461094257600080fd5b6001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b60035460009033600160a060020a0390811691161461099757600080fd5b506000949350505050565b600254600160a060020a031681565b600254600090600160a060020a03166370a0823183836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610a0c57600080fd5b6102c65a03f11515610a1d57600080fd5b50505060405180519392505050565b600454600160a060020a031681565b60005433600160a060020a03908116911614610a5657600080fd5b600354600160a060020a0316637581a8e66040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610a9557600080fd5b6102c65a03f11515610aa657600080fd5b505050565b60015433600160a060020a0390811691161415610af2576001546000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555b565b600054600160a060020a031681565b60005433600160a060020a03908116911614610b1e57600080fd5b600354600160a060020a03166398603cca6040518163ffffffff1660e060020a028152600401600060405180830381600087803b1515610a9557600080fd5b60005433600160a060020a03908116911614610b7857600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60015474010000000000000000000000000000000000000000900460ff1681565b60035460009033600160a060020a03908116911614610be657600080fd5b600254600160a060020a031663bcdd612185858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b6102c65a03f11515610c6357600080fd5b505050604051805195945050505050565b60035460009033600160a060020a03908116911614610c9257600080fd5b600254600160a060020a031663beabacc885858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b600254600090600160a060020a031663dd62ed3e8484846040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b1515610d6157600080fd5b6102c65a03f11515610d7257600080fd5b5050506040518051949350505050565b60035460009033600160a060020a03908116911614610da057600080fd5b600254600160a060020a031663e1f21c6785858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b60035460009033600160a060020a03908116911614610e2a57600080fd5b600254600160a060020a031663f019c26785858560006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c5257600080fd5b60025433600160a060020a03908116911614610eb157600080fd5b600354600160a060020a0316639b50438784848460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b1515610f1457600080fd5b6102c65a03f11515610f2557600080fd5b505050505050565b600354600160a060020a0316815600a165627a7a7230582033b2f7e4e19b77364bd7dc10c5bc7388b6caa2c46c755af62129fbff5301a1290029

Swarm Source

bzzr://33b2f7e4e19b77364bd7dc10c5bc7388b6caa2c46c755af62129fbff5301a129

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

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.