ETH Price: $3,286.44 (-5.13%)

Contract

0x1Bb21b6EDB83E3dB63bde9F51616dA6909A368D2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x6080604070246982019-01-07 8:28:212150 days ago1546849701IN
 Create: ForeignBridge
0 ETH0.010981294

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ForeignBridge

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-01-07
*/

pragma solidity 0.4.24;

// File: contracts/ERC677Receiver.sol

contract ERC677Receiver {
    function onTokenTransfer(address _from, uint _value, bytes _data) external returns(bool);
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

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

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

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

// File: contracts/ERC677.sol

contract ERC677 is ERC20 {
    event Transfer(address indexed from, address indexed to, uint value, bytes data);

    function transferAndCall(address, uint, bytes) external returns (bool);

}

// File: contracts/IBurnableMintableERC677Token.sol

contract IBurnableMintableERC677Token is ERC677 {
    function mint(address, uint256) public returns (bool);
    function burn(uint256 _value) public;
    function claimTokens(address _token, address _to) public;
}

// File: contracts/IBridgeValidators.sol

interface IBridgeValidators {
    function isValidator(address _validator) public view returns(bool);
    function requiredSignatures() public view returns(uint256);
    function owner() public view returns(address);
}

// File: contracts/libraries/Message.sol

library Message {
    // function uintToString(uint256 inputValue) internal pure returns (string) {
    //     // figure out the length of the resulting string
    //     uint256 length = 0;
    //     uint256 currentValue = inputValue;
    //     do {
    //         length++;
    //         currentValue /= 10;
    //     } while (currentValue != 0);
    //     // allocate enough memory
    //     bytes memory result = new bytes(length);
    //     // construct the string backwards
    //     uint256 i = length - 1;
    //     currentValue = inputValue;
    //     do {
    //         result[i--] = byte(48 + currentValue % 10);
    //         currentValue /= 10;
    //     } while (currentValue != 0);
    //     return string(result);
    // }

    function addressArrayContains(address[] array, address value) internal pure returns (bool) {
        for (uint256 i = 0; i < array.length; i++) {
            if (array[i] == value) {
                return true;
            }
        }
        return false;
    }
    // layout of message :: bytes:
    // offset  0: 32 bytes :: uint256 - message length
    // offset 32: 20 bytes :: address - recipient address
    // offset 52: 32 bytes :: uint256 - value
    // offset 84: 32 bytes :: bytes32 - transaction hash
    // offset 116: 32 bytes :: uint256 - home gas price

    // bytes 1 to 32 are 0 because message length is stored as little endian.
    // mload always reads 32 bytes.
    // so we can and have to start reading recipient at offset 20 instead of 32.
    // if we were to read at 32 the address would contain part of value and be corrupted.
    // when reading from offset 20 mload will read 12 zero bytes followed
    // by the 20 recipient address bytes and correctly convert it into an address.
    // this saves some storage/gas over the alternative solution
    // which is padding address to 32 bytes and reading recipient at offset 32.
    // for more details see discussion in:
    // https://github.com/paritytech/parity-bridge/issues/61
    function parseMessage(bytes message)
    internal
    pure
    returns(address recipient, uint256 amount, bytes32 txHash)
    {
        require(isMessageValid(message));
        assembly {
            recipient := and(mload(add(message, 20)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
            amount := mload(add(message, 52))
            txHash := mload(add(message, 84))
        }
    }

    function isMessageValid(bytes _msg) internal pure returns(bool) {
        return _msg.length == 116;
    }

    function recoverAddressFromSignedMessage(bytes signature, bytes message) internal pure returns (address) {
        require(signature.length == 65);
        bytes32 r;
        bytes32 s;
        bytes1 v;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := mload(add(signature, 0x60))
        }
        return ecrecover(hashMessage(message), uint8(v), r, s);
    }

    function hashMessage(bytes message) internal pure returns (bytes32) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n";
        // message is always 116 length
        string memory msgLength = "116";
        return keccak256(prefix, msgLength, message);
    }

    function hasEnoughValidSignatures(
        bytes _message,
        uint8[] _vs,
        bytes32[] _rs,
        bytes32[] _ss,
        IBridgeValidators _validatorContract) internal view {
        require(isMessageValid(_message));
        uint256 requiredSignatures = _validatorContract.requiredSignatures();
        require(_vs.length >= requiredSignatures);
        bytes32 hash = hashMessage(_message);
        address[] memory encounteredAddresses = new address[](requiredSignatures);

        for (uint256 i = 0; i < requiredSignatures; i++) {
            address recoveredAddress = ecrecover(hash, _vs[i], _rs[i], _ss[i]);
            require(_validatorContract.isValidator(recoveredAddress));
            if (addressArrayContains(encounteredAddresses, recoveredAddress)) {
                revert();
            }
            encounteredAddresses[i] = recoveredAddress;
        }
    }
}

// File: contracts/libraries/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
    * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

// File: contracts/IOwnedUpgradeabilityProxy.sol

interface IOwnedUpgradeabilityProxy {
    function proxyOwner() public view returns (address);
}

// File: contracts/upgradeable_contracts/OwnedUpgradeability.sol

contract OwnedUpgradeability {

    function upgradeabilityAdmin() public view returns (address) {
        return IOwnedUpgradeabilityProxy(this).proxyOwner();
    }

    // Avoid using onlyProxyOwner name to prevent issues with implementation from proxy contract
    modifier onlyIfOwnerOfProxy() {
        require(msg.sender == upgradeabilityAdmin());
        _;
    }
}

// File: contracts/upgradeability/EternalStorage.sol

/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract.
 */
contract EternalStorage {

    mapping(bytes32 => uint256) internal uintStorage;
    mapping(bytes32 => string) internal stringStorage;
    mapping(bytes32 => address) internal addressStorage;
    mapping(bytes32 => bytes) internal bytesStorage;
    mapping(bytes32 => bool) internal boolStorage;
    mapping(bytes32 => int256) internal intStorage;

}

// File: contracts/upgradeable_contracts/Ownable.sol

/**
 * @title Ownable
 * @dev This contract has an owner address providing basic authorization control
 */
contract Ownable is EternalStorage {
    /**
    * @dev Event to show ownership has been transferred
    * @param previousOwner representing the address of the previous owner
    * @param newOwner representing the address of the new owner
    */
    event OwnershipTransferred(address previousOwner, address newOwner);

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

    /**
    * @dev Tells the address of the owner
    * @return the address of the owner
    */
    function owner() public view returns (address) {
        return addressStorage[keccak256("owner")];
    }

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

    /**
    * @dev Sets a new owner address
    */
    function setOwner(address newOwner) internal {
        emit OwnershipTransferred(owner(), newOwner);
        addressStorage[keccak256("owner")] = newOwner;
    }
}

// File: contracts/upgradeable_contracts/Validatable.sol

contract Validatable is EternalStorage {

    function validatorContract() public view returns(IBridgeValidators) {
        return IBridgeValidators(addressStorage[keccak256("validatorContract")]);
    }

    modifier onlyValidator() {
        require(validatorContract().isValidator(msg.sender));
        _;
    }
}

// File: contracts/upgradeable_contracts/U_BasicBridge.sol

contract BasicBridge is EternalStorage, Validatable, Ownable {
    event GasPriceChanged(uint256 gasPrice);
    event RequiredBlockConfirmationChanged(uint256 requiredBlockConfirmations);

    function setGasPrice(uint256 _gasPrice) public onlyOwner {
        require(_gasPrice > 0);
        uintStorage[keccak256("gasPrice")] = _gasPrice;
        emit GasPriceChanged(_gasPrice);
    }

    function gasPrice() public view returns(uint256) {
        return uintStorage[keccak256("gasPrice")];
    }

    function setRequiredBlockConfirmations(uint256 _blockConfirmations) public onlyOwner {
        require(_blockConfirmations > 0);
        uintStorage[keccak256("requiredBlockConfirmations")] = _blockConfirmations;
        emit RequiredBlockConfirmationChanged(_blockConfirmations);
    }

    function requiredBlockConfirmations() public view returns(uint256) {
        return uintStorage[keccak256("requiredBlockConfirmations")];
    }
}

// File: contracts/upgradeable_contracts/U_ForeignBridge.sol

contract ForeignBridge is ERC677Receiver, BasicBridge, OwnedUpgradeability {
    using SafeMath for uint256;
    /// triggered when relay of deposit from HomeBridge is complete
    event Deposit(address recipient, uint value, bytes32 transactionHash);

    /// Event created on money withdraw.
    event Withdraw(address recipient, uint256 value, uint256 homeGasPrice);

    /// Collected signatures which should be relayed to home chain.
    event CollectedSignatures(address authorityResponsibleForRelay, bytes32 messageHash);

    event GasConsumptionLimitsUpdated(uint256 gasLimitDepositRelay, uint256 gasLimitWithdrawConfirm);

    event SignedForDeposit(address indexed signer, bytes32 transactionHash);
    event SignedForWithdraw(address indexed signer, bytes32 messageHash);
    event DailyLimit(uint256 newLimit);
    event HomeDailyLimit(uint256 newLimit);

    function initialize(
        address _validatorContract,
        address _erc677token,
        uint256 _foreignDailyLimit,
        uint256 _maxPerTx,
        uint256 _minPerTx,
        uint256 _foreignGasPrice,
        uint256 _requiredBlockConfirmations
    ) public returns(bool) {
        require(!isInitialized());
        require(_validatorContract != address(0));
        require(_minPerTx > 0 && _maxPerTx > _minPerTx && _foreignDailyLimit > _maxPerTx);
        require(_foreignGasPrice > 0);
        addressStorage[keccak256("validatorContract")] = _validatorContract;
        setErc677token(_erc677token);
        uintStorage[keccak256("foreignDailyLimit")] = _foreignDailyLimit;
        uintStorage[keccak256("deployedAtBlock")] = block.number;
        uintStorage[keccak256("maxPerTx")] = _maxPerTx;
        uintStorage[keccak256("minPerTx")] = _minPerTx;
        uintStorage[keccak256("gasPrice")] = _foreignGasPrice;
        uintStorage[keccak256("requiredBlockConfirmations")] = _requiredBlockConfirmations;
        setInitialize(true);
        return isInitialized();
    }

    function upgradeFrom2To3() public {
        require(owner() == address(0));
        setOwner(validatorContract().owner());
    }

    function onTokenTransfer(address _from, uint256 _value, bytes /*_data*/) external returns(bool) {
        require(msg.sender == address(erc677token()));
        require(withinLimit(_value));
        setTotalSpentPerDay(getCurrentDay(), totalSpentPerDay(getCurrentDay()).add(_value));
        erc677token().burn(_value);
        emit Withdraw(_from, _value, gasPriceForCompensationAtHomeSide());
        return true;
    }

    function setMaxPerTx(uint256 _maxPerTx) external onlyOwner {
        require(_maxPerTx < foreignDailyLimit());
        uintStorage[keccak256("maxPerTx")] = _maxPerTx;
    }

    function setHomeMaxPerTx(uint256 _maxPerTx) external onlyOwner {
        require(_maxPerTx < homeDailyLimit());
        uintStorage[keccak256("homeMaxPerTx")] = _maxPerTx;
    }

    function setMinPerTx(uint256 _minPerTx) external onlyOwner {
        require(_minPerTx < foreignDailyLimit() && _minPerTx < maxPerTx());
        uintStorage[keccak256("minPerTx")] = _minPerTx;
    }

    function claimTokens(address _token, address _to) external onlyIfOwnerOfProxy {
        require(_to != address(0));
        if (_token == address(0)) {
            _to.transfer(address(this).balance);
            return;
        }

        ERC20Basic token = ERC20Basic(_token);
        uint256 balance = token.balanceOf(this);
        require(token.transfer(_to, balance));
    }

    function claimTokensFromErc677(address _token, address _to) external onlyIfOwnerOfProxy {
        erc677token().claimTokens(_token, _to);
    }

    function minPerTx() public view returns(uint256) {
        return uintStorage[keccak256("minPerTx")];
    }

    function maxPerTx() public view returns(uint256) {
        return uintStorage[keccak256("maxPerTx")];
    }

    function homeMaxPerTx() public view returns(uint256) {
        return uintStorage[keccak256("homeMaxPerTx")];
    }

    function totalSpentPerDay(uint256 _day) public view returns(uint256) {
        return uintStorage[keccak256("totalSpentPerDay", _day)];
    }

    function totalExecutedPerDay(uint256 _day) public view returns(uint256) {
        return uintStorage[keccak256("totalExecutedPerDay", _day)];
    }

    function deployedAtBlock() public view returns(uint256) {
        return uintStorage[keccak256("deployedAtBlock")];
    }

    function gasLimitDepositRelay() public view returns(uint256) {
        return uintStorage[keccak256("gasLimitDepositRelay")];
    }

    function gasLimitWithdrawConfirm() public view returns(uint256) {
        return uintStorage[keccak256("gasLimitWithdrawConfirm")];
    }

    function foreignDailyLimit() public view returns(uint256) {
        return uintStorage[keccak256("foreignDailyLimit")];
    }

    function homeDailyLimit() public view returns(uint256) {
        return uintStorage[keccak256("homeDailyLimit")];
    }

    function erc677token() public view returns(IBurnableMintableERC677Token) {
        return IBurnableMintableERC677Token(addressStorage[keccak256("erc677token")]);
    }

    function setGasLimits(uint256 _gasLimitDepositRelay, uint256 _gasLimitWithdrawConfirm) external onlyOwner {
        uintStorage[keccak256("gasLimitDepositRelay")] = _gasLimitDepositRelay;
        uintStorage[keccak256("gasLimitWithdrawConfirm")] = _gasLimitWithdrawConfirm;
        emit GasConsumptionLimitsUpdated(gasLimitDepositRelay(), gasLimitWithdrawConfirm());
    }

    function deposit(address recipient, uint256 value, bytes32 transactionHash) external onlyValidator {
        bytes32 hashMsg = keccak256(recipient, value, transactionHash);
        bytes32 hashSender = keccak256(msg.sender, hashMsg);
        require(withinHomeLimit(value));
        // Duplicated deposits
        require(!depositsSigned(hashSender));
        setDepositsSigned(hashSender, true);

        uint256 signed = numDepositsSigned(hashMsg);
        require(!isAlreadyProcessed(signed));
        // the check above assumes that the case when the value could be overflew will not happen in the addition operation below
        signed = signed + 1;

        setNumDepositsSigned(hashMsg, signed);

        emit SignedForDeposit(msg.sender, transactionHash);

        if (signed >= validatorContract().requiredSignatures()) {
            // If the bridge contract does not own enough tokens to transfer
            // it will couse funds lock on the home side of the bridge
            setTotalExecutedPerDay(getCurrentDay(), totalExecutedPerDay(getCurrentDay()).add(value));
            setNumDepositsSigned(hashMsg, markAsProcessed(signed));
            erc677token().mint(recipient, value);
            emit Deposit(recipient, value, transactionHash);
        }
    }

    /// Should be used as sync tool
    ///
    /// Message is a message that should be relayed to main chain once authorities sign it.
    ///
    /// for withdraw message contains:
    /// withdrawal recipient (bytes20)
    /// withdrawal value (uint)
    /// foreign transaction hash (bytes32) // to avoid transaction duplication
    function submitSignature(bytes signature, bytes message) external onlyValidator {
        // ensure that `signature` is really `message` signed by `msg.sender`
        require(Message.isMessageValid(message));
        require(msg.sender == Message.recoverAddressFromSignedMessage(signature, message));
        bytes32 hashMsg = keccak256(message);
        bytes32 hashSender = keccak256(msg.sender, hashMsg);

        uint256 signed = numMessagesSigned(hashMsg);
        require(!isAlreadyProcessed(signed));
        // the check above assumes that the case when the value could be overflew will not happen in the addition operation below
        signed = signed + 1;
        if (signed > 1) {
            // Duplicated signatures
            require(!messagesSigned(hashSender));
        } else {
            setMessages(hashMsg, message);
        }
        setMessagesSigned(hashSender, true);

        bytes32 signIdx = keccak256(hashMsg, (signed-1));
        setSignatures(signIdx, signature);

        setNumMessagesSigned(hashMsg, signed);

        emit SignedForWithdraw(msg.sender, hashMsg);
        if (signed >= validatorContract().requiredSignatures()) {
            setNumMessagesSigned(hashMsg, markAsProcessed(signed));
            emit CollectedSignatures(msg.sender, hashMsg);
        }
    }

    function gasPriceForCompensationAtHomeSide() public pure returns(uint256) {
        return 1000000000 wei;
    }

    function isAlreadyProcessed(uint256 _number) public pure returns(bool) {
        return _number & 2**255 == 2**255;
    }

    function signature(bytes32 _hash, uint256 _index) public view returns (bytes) {
        bytes32 signIdx = keccak256(_hash, _index);
        return signatures(signIdx);
    }

    /// Get message
    function message(bytes32 _hash) public view returns (bytes) {
        return messages(_hash);
    }

    function getCurrentDay() public view returns(uint256) {
        return now / 1 days;
    }

    function setForeignDailyLimit(uint256 _foreignDailyLimit) public onlyOwner {
        uintStorage[keccak256("foreignDailyLimit")] = _foreignDailyLimit;
        emit DailyLimit(_foreignDailyLimit);
    }

    function setHomeDailyLimit(uint256 _homeDailyLimit) external onlyOwner {
        uintStorage[keccak256("homeDailyLimit")] = _homeDailyLimit;
        emit HomeDailyLimit(_homeDailyLimit);
    }

    function withinLimit(uint256 _amount) public view returns(bool) {
        uint256 nextLimit = totalSpentPerDay(getCurrentDay()).add(_amount);
        return foreignDailyLimit() >= nextLimit && _amount <= maxPerTx() && _amount >= minPerTx();
    }

    function withinHomeLimit(uint256 _amount) public view returns(bool) {
        uint256 nextLimit = totalExecutedPerDay(getCurrentDay()).add(_amount);
        return homeDailyLimit() >= nextLimit && _amount <= homeMaxPerTx();
    }

    function isInitialized() public view returns(bool) {
        return boolStorage[keccak256("isInitialized")];
    }

    function messages(bytes32 _hash) private view returns(bytes) {
        return bytesStorage[keccak256("messages", _hash)];
    }

    function setMessages(bytes32 _hash, bytes _message) private {
        bytesStorage[keccak256("messages", _hash)] = _message;
    }

    function signatures(bytes32 _hash) private view returns(bytes) {
        return bytesStorage[keccak256("signatures", _hash)];
    }

    function setSignatures(bytes32 _hash, bytes _signature) private {
        bytesStorage[keccak256("signatures", _hash)] = _signature;
    }

    function messagesSigned(bytes32 _message) public view returns(bool) {
        return boolStorage[keccak256("messagesSigned", _message)];
    }

    function depositsSigned(bytes32 _deposit) public view returns(bool) {
        return boolStorage[keccak256("depositsSigned", _deposit)];
    }

    function markAsProcessed(uint256 _v) private pure returns(uint256) {
        return _v | 2 ** 255;
    }

    function numMessagesSigned(bytes32 _message) private view returns(uint256) {
        return uintStorage[keccak256("numMessagesSigned", _message)];
    }

    function numDepositsSigned(bytes32 _deposit) private view returns(uint256) {
        return uintStorage[keccak256("numDepositsSigned", _deposit)];
    }

    function setMessagesSigned(bytes32 _hash, bool _status) private {
        boolStorage[keccak256("messagesSigned", _hash)] = _status;
    }

    function setDepositsSigned(bytes32 _deposit, bool _status) private {
        boolStorage[keccak256("depositsSigned", _deposit)] = _status;
    }

    function setNumMessagesSigned(bytes32 _message, uint256 _number) private {
        uintStorage[keccak256("numMessagesSigned", _message)] = _number;
    }

    function setNumDepositsSigned(bytes32 _deposit, uint256 _number) private {
        uintStorage[keccak256("numDepositsSigned", _deposit)] = _number;
    }

    function setTotalSpentPerDay(uint256 _day, uint256 _value) private {
        uintStorage[keccak256("totalSpentPerDay", _day)] = _value;
    }

    function setTotalExecutedPerDay(uint256 _day, uint256 _value) private {
        uintStorage[keccak256("totalExecutedPerDay", _day)] = _value;
    }

    function setErc677token(address _token) private {
        require(_token != address(0));
        addressStorage[keccak256("erc677token")] = _token;
    }

    function setInitialize(bool _status) private {
        boolStorage[keccak256("isInitialized")] = _status;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_index","type":"uint256"}],"name":"signature","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"erc677token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"value","type":"uint256"},{"name":"transactionHash","type":"bytes32"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"homeMaxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"totalSpentPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"requiredBlockConfirmations","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"message","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"totalExecutedPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gasLimitDepositRelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"signature","type":"bytes"},{"name":"message","type":"bytes"}],"name":"submitSignature","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxPerTx","type":"uint256"}],"name":"setHomeMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"bytes32"}],"name":"depositsSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_gasLimitDepositRelay","type":"uint256"},{"name":"_gasLimitWithdrawConfirm","type":"uint256"}],"name":"setGasLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"homeDailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"foreignDailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_message","type":"bytes32"}],"name":"messagesSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"claimTokensFromErc677","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"validatorContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployedAtBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPerTx","type":"uint256"}],"name":"setMinPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blockConfirmations","type":"uint256"}],"name":"setRequiredBlockConfirmations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_homeDailyLimit","type":"uint256"}],"name":"setHomeDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasPriceForCompensationAtHomeSide","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_gasPrice","type":"uint256"}],"name":"setGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasLimitWithdrawConfirm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_foreignDailyLimit","type":"uint256"}],"name":"setForeignDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeabilityAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withinLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_validatorContract","type":"address"},{"name":"_erc677token","type":"address"},{"name":"_foreignDailyLimit","type":"uint256"},{"name":"_maxPerTx","type":"uint256"},{"name":"_minPerTx","type":"uint256"},{"name":"_foreignGasPrice","type":"uint256"},{"name":"_requiredBlockConfirmations","type":"uint256"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withinHomeLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"upgradeFrom2To3","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_number","type":"uint256"}],"name":"isAlreadyProcessed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"transactionHash","type":"bytes32"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"homeGasPrice","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"authorityResponsibleForRelay","type":"address"},{"indexed":false,"name":"messageHash","type":"bytes32"}],"name":"CollectedSignatures","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gasLimitDepositRelay","type":"uint256"},{"indexed":false,"name":"gasLimitWithdrawConfirm","type":"uint256"}],"name":"GasConsumptionLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signer","type":"address"},{"indexed":false,"name":"transactionHash","type":"bytes32"}],"name":"SignedForDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signer","type":"address"},{"indexed":false,"name":"messageHash","type":"bytes32"}],"name":"SignedForWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"DailyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"HomeDailyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gasPrice","type":"uint256"}],"name":"GasPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requiredBlockConfirmations","type":"uint256"}],"name":"RequiredBlockConfirmationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b50612871806100206000396000f3006080604052600436106101ea5763ffffffff60e060020a6000350416631812d99681146101ef57806318d8f9c91461027f57806326b3293f146102b0578063288b7ad8146102d95780632bd0bb0514610300578063392e53cd146103185780633e6968b6146103415780633f0a9f6514610356578063490a32c61461036b5780634fb3fef71461038357806359292ef31461039b578063630cea8e146103b057806363258462146103dc57806369ffa08a146103f4578063793040631461041b57806379f9cc7214610433578063857cfff91461044e5780638a2a60ef146104635780638da5cb5b146104785780638f4b4b981461048d5780639313dc43146104a557806399439089146104cc5780639a454b99146104e1578063a2a6ca27146104f6578063a4c0ed361461050e578063acf5c6891461053f578063b2355b4214610557578063bea7c13a1461056f578063bf1fe42014610584578063c4a1ee371461059c578063c6f6f216146105b1578063cbbc8a51146105c9578063df0ad3de146105e1578063df25f3f0146105f6578063ea9f49681461060b578063edbf4ac214610623578063f2fde38b14610659578063f426d8ac1461067a578063f91b853b14610692578063f968adbe146106a7578063fe173b97146106bc578063ffd19e8c146106d1575b600080fd5b3480156101fb57600080fd5b5061020a6004356024356106e9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024457818101518382015260200161022c565b50505050905090810190601f1680156102715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028b57600080fd5b50610294610716565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b506102d7600160a060020a0360043516602435604435610761565b005b3480156102e557600080fd5b506102ee610a8a565b60408051918252519081900360200190f35b34801561030c57600080fd5b506102ee600435610acb565b34801561032457600080fd5b5061032d610b15565b604080519115158252519081900360200190f35b34801561034d57600080fd5b506102ee610b59565b34801561036257600080fd5b506102ee610b62565b34801561037757600080fd5b5061020a600435610ba3565b34801561038f57600080fd5b506102ee600435610bb4565b3480156103a757600080fd5b506102ee610bfe565b3480156103bc57600080fd5b506102d76024600480358281019290820135918135918201910135610c3f565b3480156103e857600080fd5b506102d7600435610fd1565b34801561040057600080fd5b506102d7600160a060020a0360043581169060243516611040565b34801561042757600080fd5b5061032d6004356111fc565b34801561043f57600080fd5b506102d7600435602435611249565b34801561045a57600080fd5b506102ee61132d565b34801561046f57600080fd5b506102ee61136e565b34801561048457600080fd5b506102946113af565b34801561049957600080fd5b5061032d6004356113f9565b3480156104b157600080fd5b506102d7600160a060020a0360043581169060243516611446565b3480156104d857600080fd5b506102946114eb565b3480156104ed57600080fd5b506102ee611535565b34801561050257600080fd5b506102d7600435611576565b34801561051a57600080fd5b5061032d60048035600160a060020a03169060248035916044359182019101356115f9565b34801561054b57600080fd5b506102d7600435611714565b34801561056357600080fd5b506102d76004356117b3565b34801561057b57600080fd5b506102ee611845565b34801561059057600080fd5b506102d760043561184d565b3480156105a857600080fd5b506102ee6118ec565b3480156105bd57600080fd5b506102d760043561192d565b3480156105d557600080fd5b506102d760043561199c565b3480156105ed57600080fd5b50610294611a2e565b34801561060257600080fd5b506102ee611a9f565b34801561061757600080fd5b5061032d600435611ae0565b34801561062f57600080fd5b5061032d600160a060020a036004358116906024351660443560643560843560a43560c435611b2c565b34801561066557600080fd5b506102d7600160a060020a0360043516611d71565b34801561068657600080fd5b5061032d600435611dae565b34801561069e57600080fd5b506102d7611de6565b3480156106b357600080fd5b506102ee611e7e565b3480156106c857600080fd5b506102ee611ebf565b3480156106dd57600080fd5b5061032d600435611f00565b6040805183815260208101839052815190819003909101902060609061070e81611f28565b949350505050565b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b019020600090815260026020522054600160a060020a03165b90565b600080600061076e6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d60208110156107f257600080fd5b505115156107ff57600080fd5b604080516c01000000000000000000000000600160a060020a038916810282526014808301899052603480840189905284519384900360540184203390930284529083018290529251918290039092019020909350915061085f85611dae565b151561086a57600080fd5b610873826111fc565b1561087d57600080fd5b610888826001611ffe565b6108918361205a565b905061089c81611f00565b156108a657600080fd5b6001016108b383826120a4565b60408051858152905133917f6a09111cb1bbfc898f36504afb4d5411d0dbef45f2c43fac5781e6b640b86a32919081900360200190a26108f16114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050506040513d602081101561095857600080fd5b50518110610a825761099061096b610b59565b61098b8761097f61097a610b59565b610bb4565b9063ffffffff6120f016565b6120ff565b6109a28361099d8361214b565b6120a4565b6109aa610716565b600160a060020a03166340c10f1987876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b505060408051600160a060020a03881681526020810187905280820186905290517f1a771fe656018364a9369da21954bb3081cb08b0196c27e43ca59c7cae8727379181900360600190a15b505050505050565b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c01902060009081526020819052205490565b604080517f746f74616c5370656e74506572446179000000000000000000000000000000008152601081018390528151908190036030019020600090815260208190522054919050565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d01902060009081526004602052205460ff1690565b62015180420490565b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a01902060009081526020819052205490565b6060610bae82612170565b92915050565b604080517f746f74616c4578656375746564506572446179000000000000000000000000008152601381018390528151908190036033019020600090815260208190522054919050565b604080517f6761734c696d69744465706f73697452656c61790000000000000000000000008152815190819003601401902060009081526020819052205490565b600080600080610c4d6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b50511515610cde57600080fd5b610d1786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375061220f945050505050565b1515610d2257600080fd5b610d8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8e018190048102820181019092528c815294508c93508b9250829150840183828082843750612216945050505050565b600160a060020a03163314610d9d57600080fd5b858560405180838380828437604080519190930181900381206c0100000000000000000000000033028252601482018190529251908190036034019020919850909650610df093508792506122d6915050565b9150610dfb82611f00565b15610e0557600080fd5b600191820191821115610e2a57610e1b836113f9565b15610e2557600080fd5b610e64565b610e648487878080601f01602080910402602001604051908101604052809392919081815260200183838082843750612320945050505050565b610e6f83600161237b565b5060408051848152600019830160208083019190915282519182900383018220601f8a01829004820283018201909352888252610ec29183918b908b9081908401838280828437506123d7945050505050565b610ecc848361242d565b60408051858152905133917f962f785fc9b91edbed2fdad62c075258ee14d39bd29cd1e83c298a7bf26d5a65919081900360200190a2610f0a6114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4757600080fd5b505af1158015610f5b573d6000803e3d6000fd5b505050506040513d6020811015610f7157600080fd5b50518210610fc757610f8b84610f868461214b565b61242d565b604080513381526020810186905281517feb043d149eedb81369bec43d4c3a3a53087debc88d2525f13bfaa3eecda28b5c929181900390910190a15b5050505050505050565b610fd96113af565b600160a060020a03163314610fed57600080fd5b610ff561132d565b811061100057600080fd5b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c019020600090815260208190522055565b60008061104b611a2e565b600160a060020a0316331461105f57600080fd5b600160a060020a038316151561107457600080fd5b600160a060020a03841615156110c057604051600160a060020a03841690303180156108fc02916000818181858888f193505050501580156110ba573d6000803e3d6000fd5b506111f6565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505115156111f657600080fd5b50505050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b6112516113af565b600160a060020a0316331461126557600080fd5b604080517f6761734c696d69744465706f73697452656c617900000000000000000000000081528151908190036014018120600090815260208181528382208690557f6761734c696d69745769746864726177436f6e6669726d0000000000000000008352835192839003601701909220815290819052208190557f3b49a33ec45179ab3408f6f29a2b208c909ab1460e94af7558808ea22854c106611309610bfe565b6113116118ec565b6040805192835260208301919091528051918290030190a15050565b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e01902060009081526020819052205490565b604080517f666f726569676e4461696c794c696d69740000000000000000000000000000008152815190819003601101902060009081526020819052205490565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260026020522054600160a060020a031690565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b61144e611a2e565b600160a060020a0316331461146257600080fd5b61146a610716565b604080517f69ffa08a000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152915192909116916369ffa08a9160448082019260009290919082900301818387803b1580156114d757600080fd5b505af1158015610a82573d6000803e3d6000fd5b604080517f76616c696461746f72436f6e747261637400000000000000000000000000000081528151908190036011019020600090815260026020522054600160a060020a031690565b604080517f6465706c6f7965644174426c6f636b00000000000000000000000000000000008152815190819003600f01902060009081526020819052205490565b61157e6113af565b600160a060020a0316331461159257600080fd5b61159a61136e565b811080156115ae57506115ab611e7e565b81105b15156115b957600080fd5b604080517f6d696e506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6000611603610716565b600160a060020a0316331461161757600080fd5b61162084611ae0565b151561162b57600080fd5b61164f611636610b59565b61164a8661097f611645610b59565b610acb565b612479565b611657610716565b600160a060020a03166342966c68856040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885856116e2611845565b60408051600160a060020a039094168452602084019290925282820152519081900360600190a1506001949350505050565b61171c6113af565b600160a060020a0316331461173057600080fd5b6000811161173d57600080fd5b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a018120600090815260208181529083902084905583825291517f4fb76205cd57c896b21511d2114137d8e901b4ccd659e1a0f97d6306795264fb929181900390910190a150565b6117bb6113af565b600160a060020a031633146117cf57600080fd5b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e018120600090815260208181529083902084905583825291517f7cbf6a47cd79c6fef9f0a89db1e9cdca2a3e93d84eae02a0232897b24524089e929181900390910190a150565b633b9aca0090565b6118556113af565b600160a060020a0316331461186957600080fd5b6000811161187657600080fd5b604080517f676173507269636500000000000000000000000000000000000000000000000081528151908190036008018120600090815260208181529083902084905583825291517f52264b89e0fceafb26e79fd49ef8a366eb6297483bf4035b027f0c99a7ad512e929181900390910190a150565b604080517f6761734c696d69745769746864726177436f6e6669726d0000000000000000008152815190819003601701902060009081526020819052205490565b6119356113af565b600160a060020a0316331461194957600080fd5b61195161136e565b811061195c57600080fd5b604080517f6d6178506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6119a46113af565b600160a060020a031633146119b857600080fd5b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181529083902084905583825291517f8d797628d21ca877e321aa59bc2d55eba59ae001c5294d433797019caebab2ab929181900390910190a150565b600030600160a060020a031663025313a26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6e57600080fd5b505af1158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051905090565b604080517f6d696e50657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b600080611af28361097f611645610b59565b905080611afd61136e565b10158015611b125750611b0e611e7e565b8311155b8015611b255750611b21611a9f565b8310155b9392505050565b6000611b36610b15565b15611b4057600080fd5b600160a060020a0388161515611b5557600080fd5b600084118015611b6457508385115b8015611b6f57508486115b1515611b7a57600080fd5b60008311611b8757600080fd5b604080517f76616c696461746f72436f6e74726163740000000000000000000000000000008152815190819003601101902060009081526002602052208054600160a060020a038a1673ffffffffffffffffffffffffffffffffffffffff19909116179055611bf5876124c5565b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181528382208a90557f6465706c6f7965644174426c6f636b00000000000000000000000000000000008352835192839003600f01832082528181528382204390557f6d6178506572547800000000000000000000000000000000000000000000000083528351928390036008908101842083528282528483208a90557f6d696e506572547800000000000000000000000000000000000000000000000084528451938490038101842083528282528483208990557f6761735072696365000000000000000000000000000000000000000000000000845284519384900301832082528181528382208790557f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008352835192839003601a0190922081529081905220829055611d5d6001612545565b611d65610b15565b98975050505050505050565b611d796113af565b600160a060020a03163314611d8d57600080fd5b600160a060020a0381161515611da257600080fd5b611dab81612595565b50565b600080611dc08361097f61097a610b59565b905080611dcb61132d565b10158015611b255750611ddc610a8a565b9092111592915050565b6000611df06113af565b600160a060020a031614611e0357600080fd5b611e7c611e0e6114eb565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505050506040513d6020811015611e7557600080fd5b5051612595565b565b604080517f6d617850657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b604080517f67617350726963650000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a81018390528151602a9181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b820191906000526020600020905b815481529060010190602001808311611fd557829003601f168201915b50505050509050919050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f6e756d4465706f736974735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6e756d4465706f736974735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b600082820183811015611b2557fe5b604080517f746f74616c45786563757465645065724461790000000000000000000000000081526013810193909352805192839003603301909220600090815260208190529190912055565b7f80000000000000000000000000000000000000000000000000000000000000001790565b604080517f6d65737361676573000000000000000000000000000000000000000000000000815260088101839052815160289181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b5160741490565b6000806000808551604114151561222c57600080fd5b50505060208301516040840151606085015160016122498661264b565b60408051600080825260208083018085529490945260ff7f0100000000000000000000000000000000000000000000000000000000000000870416828401526060820188905260808201879052915160a08083019493601f198301938390039091019190865af11580156122c1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b604080517f6e756d4d657373616765735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6d6573736167657300000000000000000000000000000000000000000000000081526008810184905281519081900360280190206000908152600360209081529190208251612376928401906127ad565b505050565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a8101849052815190819003602a0190206000908152600360209081529190208251612376928401906127ad565b604080517f6e756d4d657373616765735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b604080517f746f74616c5370656e745065724461790000000000000000000000000000000081526010810193909352805192839003603001909220600090815260208190529190912055565b600160a060020a03811615156124da57600080fd5b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b01902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d0190206000908152600460205220805491151560ff19909216919091179055565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06125be6113af565b60408051600160a060020a03928316815291841660208301528051918290030190a1604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080518082018252601a81527f19457468657265756d205369676e6564204d6573736167653a0a000000000000602080830191825283518085018552600381527f313136000000000000000000000000000000000000000000000000000000000091810191909152925182516000949284928492889282918083835b602083106126e75780518252601f1990920191602091820191016126c8565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061272f5780518252601f199092019160209182019101612710565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127775780518252601f199092019160209182019101612758565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127ee57805160ff191683800117855561281b565b8280016001018555821561281b579182015b8281111561281b578251825591602001919060010190612800565b5061282792915061282b565b5090565b61075e91905b8082111561282757600081556001016128315600a165627a7a7230582046a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f0029

Deployed Bytecode

0x6080604052600436106101ea5763ffffffff60e060020a6000350416631812d99681146101ef57806318d8f9c91461027f57806326b3293f146102b0578063288b7ad8146102d95780632bd0bb0514610300578063392e53cd146103185780633e6968b6146103415780633f0a9f6514610356578063490a32c61461036b5780634fb3fef71461038357806359292ef31461039b578063630cea8e146103b057806363258462146103dc57806369ffa08a146103f4578063793040631461041b57806379f9cc7214610433578063857cfff91461044e5780638a2a60ef146104635780638da5cb5b146104785780638f4b4b981461048d5780639313dc43146104a557806399439089146104cc5780639a454b99146104e1578063a2a6ca27146104f6578063a4c0ed361461050e578063acf5c6891461053f578063b2355b4214610557578063bea7c13a1461056f578063bf1fe42014610584578063c4a1ee371461059c578063c6f6f216146105b1578063cbbc8a51146105c9578063df0ad3de146105e1578063df25f3f0146105f6578063ea9f49681461060b578063edbf4ac214610623578063f2fde38b14610659578063f426d8ac1461067a578063f91b853b14610692578063f968adbe146106a7578063fe173b97146106bc578063ffd19e8c146106d1575b600080fd5b3480156101fb57600080fd5b5061020a6004356024356106e9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024457818101518382015260200161022c565b50505050905090810190601f1680156102715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028b57600080fd5b50610294610716565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b506102d7600160a060020a0360043516602435604435610761565b005b3480156102e557600080fd5b506102ee610a8a565b60408051918252519081900360200190f35b34801561030c57600080fd5b506102ee600435610acb565b34801561032457600080fd5b5061032d610b15565b604080519115158252519081900360200190f35b34801561034d57600080fd5b506102ee610b59565b34801561036257600080fd5b506102ee610b62565b34801561037757600080fd5b5061020a600435610ba3565b34801561038f57600080fd5b506102ee600435610bb4565b3480156103a757600080fd5b506102ee610bfe565b3480156103bc57600080fd5b506102d76024600480358281019290820135918135918201910135610c3f565b3480156103e857600080fd5b506102d7600435610fd1565b34801561040057600080fd5b506102d7600160a060020a0360043581169060243516611040565b34801561042757600080fd5b5061032d6004356111fc565b34801561043f57600080fd5b506102d7600435602435611249565b34801561045a57600080fd5b506102ee61132d565b34801561046f57600080fd5b506102ee61136e565b34801561048457600080fd5b506102946113af565b34801561049957600080fd5b5061032d6004356113f9565b3480156104b157600080fd5b506102d7600160a060020a0360043581169060243516611446565b3480156104d857600080fd5b506102946114eb565b3480156104ed57600080fd5b506102ee611535565b34801561050257600080fd5b506102d7600435611576565b34801561051a57600080fd5b5061032d60048035600160a060020a03169060248035916044359182019101356115f9565b34801561054b57600080fd5b506102d7600435611714565b34801561056357600080fd5b506102d76004356117b3565b34801561057b57600080fd5b506102ee611845565b34801561059057600080fd5b506102d760043561184d565b3480156105a857600080fd5b506102ee6118ec565b3480156105bd57600080fd5b506102d760043561192d565b3480156105d557600080fd5b506102d760043561199c565b3480156105ed57600080fd5b50610294611a2e565b34801561060257600080fd5b506102ee611a9f565b34801561061757600080fd5b5061032d600435611ae0565b34801561062f57600080fd5b5061032d600160a060020a036004358116906024351660443560643560843560a43560c435611b2c565b34801561066557600080fd5b506102d7600160a060020a0360043516611d71565b34801561068657600080fd5b5061032d600435611dae565b34801561069e57600080fd5b506102d7611de6565b3480156106b357600080fd5b506102ee611e7e565b3480156106c857600080fd5b506102ee611ebf565b3480156106dd57600080fd5b5061032d600435611f00565b6040805183815260208101839052815190819003909101902060609061070e81611f28565b949350505050565b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b019020600090815260026020522054600160a060020a03165b90565b600080600061076e6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d60208110156107f257600080fd5b505115156107ff57600080fd5b604080516c01000000000000000000000000600160a060020a038916810282526014808301899052603480840189905284519384900360540184203390930284529083018290529251918290039092019020909350915061085f85611dae565b151561086a57600080fd5b610873826111fc565b1561087d57600080fd5b610888826001611ffe565b6108918361205a565b905061089c81611f00565b156108a657600080fd5b6001016108b383826120a4565b60408051858152905133917f6a09111cb1bbfc898f36504afb4d5411d0dbef45f2c43fac5781e6b640b86a32919081900360200190a26108f16114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050506040513d602081101561095857600080fd5b50518110610a825761099061096b610b59565b61098b8761097f61097a610b59565b610bb4565b9063ffffffff6120f016565b6120ff565b6109a28361099d8361214b565b6120a4565b6109aa610716565b600160a060020a03166340c10f1987876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b505060408051600160a060020a03881681526020810187905280820186905290517f1a771fe656018364a9369da21954bb3081cb08b0196c27e43ca59c7cae8727379181900360600190a15b505050505050565b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c01902060009081526020819052205490565b604080517f746f74616c5370656e74506572446179000000000000000000000000000000008152601081018390528151908190036030019020600090815260208190522054919050565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d01902060009081526004602052205460ff1690565b62015180420490565b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a01902060009081526020819052205490565b6060610bae82612170565b92915050565b604080517f746f74616c4578656375746564506572446179000000000000000000000000008152601381018390528151908190036033019020600090815260208190522054919050565b604080517f6761734c696d69744465706f73697452656c61790000000000000000000000008152815190819003601401902060009081526020819052205490565b600080600080610c4d6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b50511515610cde57600080fd5b610d1786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375061220f945050505050565b1515610d2257600080fd5b610d8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8e018190048102820181019092528c815294508c93508b9250829150840183828082843750612216945050505050565b600160a060020a03163314610d9d57600080fd5b858560405180838380828437604080519190930181900381206c0100000000000000000000000033028252601482018190529251908190036034019020919850909650610df093508792506122d6915050565b9150610dfb82611f00565b15610e0557600080fd5b600191820191821115610e2a57610e1b836113f9565b15610e2557600080fd5b610e64565b610e648487878080601f01602080910402602001604051908101604052809392919081815260200183838082843750612320945050505050565b610e6f83600161237b565b5060408051848152600019830160208083019190915282519182900383018220601f8a01829004820283018201909352888252610ec29183918b908b9081908401838280828437506123d7945050505050565b610ecc848361242d565b60408051858152905133917f962f785fc9b91edbed2fdad62c075258ee14d39bd29cd1e83c298a7bf26d5a65919081900360200190a2610f0a6114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4757600080fd5b505af1158015610f5b573d6000803e3d6000fd5b505050506040513d6020811015610f7157600080fd5b50518210610fc757610f8b84610f868461214b565b61242d565b604080513381526020810186905281517feb043d149eedb81369bec43d4c3a3a53087debc88d2525f13bfaa3eecda28b5c929181900390910190a15b5050505050505050565b610fd96113af565b600160a060020a03163314610fed57600080fd5b610ff561132d565b811061100057600080fd5b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c019020600090815260208190522055565b60008061104b611a2e565b600160a060020a0316331461105f57600080fd5b600160a060020a038316151561107457600080fd5b600160a060020a03841615156110c057604051600160a060020a03841690303180156108fc02916000818181858888f193505050501580156110ba573d6000803e3d6000fd5b506111f6565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505115156111f657600080fd5b50505050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b6112516113af565b600160a060020a0316331461126557600080fd5b604080517f6761734c696d69744465706f73697452656c617900000000000000000000000081528151908190036014018120600090815260208181528382208690557f6761734c696d69745769746864726177436f6e6669726d0000000000000000008352835192839003601701909220815290819052208190557f3b49a33ec45179ab3408f6f29a2b208c909ab1460e94af7558808ea22854c106611309610bfe565b6113116118ec565b6040805192835260208301919091528051918290030190a15050565b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e01902060009081526020819052205490565b604080517f666f726569676e4461696c794c696d69740000000000000000000000000000008152815190819003601101902060009081526020819052205490565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260026020522054600160a060020a031690565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b61144e611a2e565b600160a060020a0316331461146257600080fd5b61146a610716565b604080517f69ffa08a000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152915192909116916369ffa08a9160448082019260009290919082900301818387803b1580156114d757600080fd5b505af1158015610a82573d6000803e3d6000fd5b604080517f76616c696461746f72436f6e747261637400000000000000000000000000000081528151908190036011019020600090815260026020522054600160a060020a031690565b604080517f6465706c6f7965644174426c6f636b00000000000000000000000000000000008152815190819003600f01902060009081526020819052205490565b61157e6113af565b600160a060020a0316331461159257600080fd5b61159a61136e565b811080156115ae57506115ab611e7e565b81105b15156115b957600080fd5b604080517f6d696e506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6000611603610716565b600160a060020a0316331461161757600080fd5b61162084611ae0565b151561162b57600080fd5b61164f611636610b59565b61164a8661097f611645610b59565b610acb565b612479565b611657610716565b600160a060020a03166342966c68856040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885856116e2611845565b60408051600160a060020a039094168452602084019290925282820152519081900360600190a1506001949350505050565b61171c6113af565b600160a060020a0316331461173057600080fd5b6000811161173d57600080fd5b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a018120600090815260208181529083902084905583825291517f4fb76205cd57c896b21511d2114137d8e901b4ccd659e1a0f97d6306795264fb929181900390910190a150565b6117bb6113af565b600160a060020a031633146117cf57600080fd5b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e018120600090815260208181529083902084905583825291517f7cbf6a47cd79c6fef9f0a89db1e9cdca2a3e93d84eae02a0232897b24524089e929181900390910190a150565b633b9aca0090565b6118556113af565b600160a060020a0316331461186957600080fd5b6000811161187657600080fd5b604080517f676173507269636500000000000000000000000000000000000000000000000081528151908190036008018120600090815260208181529083902084905583825291517f52264b89e0fceafb26e79fd49ef8a366eb6297483bf4035b027f0c99a7ad512e929181900390910190a150565b604080517f6761734c696d69745769746864726177436f6e6669726d0000000000000000008152815190819003601701902060009081526020819052205490565b6119356113af565b600160a060020a0316331461194957600080fd5b61195161136e565b811061195c57600080fd5b604080517f6d6178506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6119a46113af565b600160a060020a031633146119b857600080fd5b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181529083902084905583825291517f8d797628d21ca877e321aa59bc2d55eba59ae001c5294d433797019caebab2ab929181900390910190a150565b600030600160a060020a031663025313a26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6e57600080fd5b505af1158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051905090565b604080517f6d696e50657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b600080611af28361097f611645610b59565b905080611afd61136e565b10158015611b125750611b0e611e7e565b8311155b8015611b255750611b21611a9f565b8310155b9392505050565b6000611b36610b15565b15611b4057600080fd5b600160a060020a0388161515611b5557600080fd5b600084118015611b6457508385115b8015611b6f57508486115b1515611b7a57600080fd5b60008311611b8757600080fd5b604080517f76616c696461746f72436f6e74726163740000000000000000000000000000008152815190819003601101902060009081526002602052208054600160a060020a038a1673ffffffffffffffffffffffffffffffffffffffff19909116179055611bf5876124c5565b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181528382208a90557f6465706c6f7965644174426c6f636b00000000000000000000000000000000008352835192839003600f01832082528181528382204390557f6d6178506572547800000000000000000000000000000000000000000000000083528351928390036008908101842083528282528483208a90557f6d696e506572547800000000000000000000000000000000000000000000000084528451938490038101842083528282528483208990557f6761735072696365000000000000000000000000000000000000000000000000845284519384900301832082528181528382208790557f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008352835192839003601a0190922081529081905220829055611d5d6001612545565b611d65610b15565b98975050505050505050565b611d796113af565b600160a060020a03163314611d8d57600080fd5b600160a060020a0381161515611da257600080fd5b611dab81612595565b50565b600080611dc08361097f61097a610b59565b905080611dcb61132d565b10158015611b255750611ddc610a8a565b9092111592915050565b6000611df06113af565b600160a060020a031614611e0357600080fd5b611e7c611e0e6114eb565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505050506040513d6020811015611e7557600080fd5b5051612595565b565b604080517f6d617850657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b604080517f67617350726963650000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a81018390528151602a9181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b820191906000526020600020905b815481529060010190602001808311611fd557829003601f168201915b50505050509050919050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f6e756d4465706f736974735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6e756d4465706f736974735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b600082820183811015611b2557fe5b604080517f746f74616c45786563757465645065724461790000000000000000000000000081526013810193909352805192839003603301909220600090815260208190529190912055565b7f80000000000000000000000000000000000000000000000000000000000000001790565b604080517f6d65737361676573000000000000000000000000000000000000000000000000815260088101839052815160289181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b5160741490565b6000806000808551604114151561222c57600080fd5b50505060208301516040840151606085015160016122498661264b565b60408051600080825260208083018085529490945260ff7f0100000000000000000000000000000000000000000000000000000000000000870416828401526060820188905260808201879052915160a08083019493601f198301938390039091019190865af11580156122c1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b604080517f6e756d4d657373616765735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6d6573736167657300000000000000000000000000000000000000000000000081526008810184905281519081900360280190206000908152600360209081529190208251612376928401906127ad565b505050565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a8101849052815190819003602a0190206000908152600360209081529190208251612376928401906127ad565b604080517f6e756d4d657373616765735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b604080517f746f74616c5370656e745065724461790000000000000000000000000000000081526010810193909352805192839003603001909220600090815260208190529190912055565b600160a060020a03811615156124da57600080fd5b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b01902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d0190206000908152600460205220805491151560ff19909216919091179055565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06125be6113af565b60408051600160a060020a03928316815291841660208301528051918290030190a1604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080518082018252601a81527f19457468657265756d205369676e6564204d6573736167653a0a000000000000602080830191825283518085018552600381527f313136000000000000000000000000000000000000000000000000000000000091810191909152925182516000949284928492889282918083835b602083106126e75780518252601f1990920191602091820191016126c8565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061272f5780518252601f199092019160209182019101612710565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127775780518252601f199092019160209182019101612758565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127ee57805160ff191683800117855561281b565b8280016001018555821561281b579182015b8281111561281b578251825591602001919060010190612800565b5061282792915061282b565b5090565b61075e91905b8082111561282757600081556001016128315600a165627a7a7230582046a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f0029

Swarm Source

bzzr://46a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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