ETH Price: $2,978.68 (+1.88%)
Gas: 6 Gwei

Contract

0x4c2103152a1A402af283fa52903569f05477611f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Forge Exchange90542912019-12-05 9:47:511610 days ago1575539271IN
0x4c210315...05477611f
0 ETH0.008801789
Register Protoco...89678002019-11-20 10:24:391625 days ago1574245479IN
0x4c210315...05477611f
0 ETH0.012441269
0x6080604089675262019-11-20 9:16:461625 days ago1574241406IN
 Create: UniversalRegistry
0 ETH0.045603429

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
90542912019-12-05 9:47:511610 days ago1575539271
0x4c210315...05477611f
 Contract Creation0 ETH
89678002019-11-20 10:24:391625 days ago1574245479
0x4c210315...05477611f
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniversalRegistry

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-11-20
*/

/**
Author: Loopring Foundation (Loopring Project Ltd)
*/

pragma solidity ^0.5.11;


contract ERC20 {
    function totalSupply()
        public
        view
        returns (uint);

    function balanceOf(
        address who
        )
        public
        view
        returns (uint);

    function allowance(
        address owner,
        address spender
        )
        public
        view
        returns (uint);

    function transfer(
        address to,
        uint value
        )
        public
        returns (bool);

    function transferFrom(
        address from,
        address to,
        uint    value
        )
        public
        returns (bool);

    function approve(
        address spender,
        uint    value
        )
        public
        returns (bool);
}

contract BurnableERC20 is ERC20
{
    function burn(
        uint value
        )
        public
        returns (bool);

    function burnFrom(
        address from,
        uint value
        )
        public
        returns (bool);
}

contract Proxy {
  
  function implementation() public view returns (address);

  
  function () payable external {
    address _impl = implementation();
    require(_impl != address(0));

    assembly {
      let ptr := mload(0x40)
      calldatacopy(ptr, 0, calldatasize)
      let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
      let size := returndatasize
      returndatacopy(ptr, 0, size)

      switch result
      case 0 { revert(ptr, size) }
      default { return(ptr, size) }
    }
  }
}

contract SimpleProxy is Proxy
{
    bytes32 private constant implementationPosition = keccak256(
        "org.loopring.protocol.simple.proxy"
    );

    constructor(address _implementation)
        public
    {
        bytes32 position = implementationPosition;
        assembly {sstore(position, _implementation) }
    }

    function implementation()
        public
        view
        returns (address impl)
    {
        bytes32 position = implementationPosition;
        assembly { impl := sload(position) }
    }
}

library Cloneable {
    function clone(address a)
        external
        returns (address)
    {

    
        address retval;
        assembly{
            mstore(0x0, or (0x5880730000000000000000000000000000000000000000803b80938091923cF3 ,mul(a,0x1000000000000000000)))
            retval := create(0,0, 32)
        }
        return retval;
    }
}

contract Ownable {
    address public owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    
    
    constructor()
        public
    {
        owner = msg.sender;
    }

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

    
    
    
    function transferOwnership(
        address newOwner
        )
        public
        onlyOwner
    {
        require(newOwner != address(0), "ZERO_ADDRESS");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function renounceOwnership()
        public
        onlyOwner
    {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }
}

contract Claimable is Ownable
{
    address public pendingOwner;

    
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner, "UNAUTHORIZED");
        _;
    }

    
    
    function transferOwnership(
        address newOwner
        )
        public
        onlyOwner
    {
        require(newOwner != address(0) && newOwner != owner, "INVALID_ADDRESS");
        pendingOwner = newOwner;
    }

    
    function claimOwnership()
        public
        onlyPendingOwner
    {
        emit OwnershipTransferred(owner, pendingOwner);
        owner = pendingOwner;
        pendingOwner = address(0);
    }
}

contract ReentrancyGuard {
    
    uint private _guardValue;

    
    modifier nonReentrant()
    {
        
        require(_guardValue == 0, "REENTRANCY");

        
        _guardValue = 1;

        
        _;

        
        _guardValue = 0;
    }
}

contract IExchange is Claimable, ReentrancyGuard
{
    string constant public version = ""; 

    event Cloned (address indexed clone);

    
    
    function clone()
        external
        nonReentrant
        returns (address cloneAddress)
    {
        address origin = address(this);
        cloneAddress = Cloneable.clone(origin);

        assert(cloneAddress != origin);
        assert(cloneAddress != address(0));

        emit Cloned(cloneAddress);
    }
}

contract ILoopring is Claimable, ReentrancyGuard
{
    string  constant public version = ""; 

    uint    public exchangeCreationCostLRC;
    address public universalRegistry;
    address public lrcAddress;

    event ExchangeInitialized(
        uint    indexed exchangeId,
        address indexed exchangeAddress,
        address indexed owner,
        address         operator,
        bool            onchainDataAvailability
    );

    
    
    
    
    
    
    
    
    
    
    function initializeExchange(
        address exchangeAddress,
        uint    exchangeId,
        address owner,
        address payable operator,
        bool    onchainDataAvailability
        )
        external;
}

contract IUniversalRegistry is Claimable, ReentrancyGuard
{
    enum ForgeMode {
        AUTO_UPGRADABLE,
        MANUAL_UPGRADABLE,
        PROXIED,
        NATIVE
    }

    

    event ProtocolRegistered (
        address indexed protocol,
        address indexed implementationManager,
        string          version
    );

    event ProtocolEnabled (
        address indexed protocol
    );

    event ProtocolDisabled (
        address indexed protocol
    );

    event DefaultProtocolChanged (
        address indexed oldDefault,
        address indexed newDefault
    );

    event ExchangeForged (
        address indexed protocol,
        address indexed implementation,
        address indexed exchangeAddress,
        address         owner,
        ForgeMode       forgeMode,
        bool            onchainDataAvailability,
        uint            exchangeId,
        uint            amountLRCBurned
    );

    

    address   public lrcAddress;
    address[] public exchanges;
    address[] public protocols;

    
    mapping (string => address) public versionMap;

    

    
    
    
    
    function registerProtocol(
        address protocol,
        address implementation
        )
        external
        returns (address implManager);

    
    
    function setDefaultProtocol(
        address protocol
        )
        external;

    
    
    function enableProtocol(
        address protocol
        )
        external;

    
    
    function disableProtocol(
        address protocol
        )
        external;

    
    
    
    
    
    
    
    
    function forgeExchange(
        ForgeMode forgeMode,
        bool      onchainDataAvailability,
        address   protocol,
        address   implementation
        )
        external
        returns (
            address exchangeAddress,
            uint    exchangeId
        );

    
    
    
    
    
    function defaultProtocol()
        public
        view
        returns (
            address protocol,
            address versionmanager,
            address defaultImpl,
            string  memory protocolVersion,
            string  memory defaultImplVersion
        );

    
    
    
    function isProtocolRegistered(
        address protocol
        )
        public
        view
        returns (bool registered);

    
    
    
    function isProtocolEnabled(
        address protocol
        )
        public
        view
        returns (bool enabled);

    
    
    function isExchangeRegistered(
        address exchange
        )
        public
        view
        returns (bool registered);

    
    
    
    
    function isProtocolAndImplementationEnabled(
        address protocol,
        address implementation
        )
        public
        view
        returns (bool enabled);

    
    
    
    
    
    function getExchangeProtocol(
        address exchangeAddress
        )
        public
        view
        returns (
            address protocol,
            address implementation
        );
}

contract IImplementationManager is Claimable, ReentrancyGuard
{
    

    event DefaultChanged (
        address indexed oldDefault,
        address indexed newDefault
    );

    event Registered (
        address indexed implementation,
        string          version
    );

    event Enabled (
        address indexed implementation
    );

    event Disabled (
        address indexed implementation
    );

    

    address   public protocol;
    address   public defaultImpl;
    address[] public implementations;

    
    mapping (string => address) public versionMap;

    

    
    
    function register(
        address implementation
        )
        external;

    
    
    function setDefault(
        address implementation
        )
        external;

    
    
    function enable(
        address implementation
        )
        external;

    
    
    function disable(
        address implementation
        )
        external;

    
    
    
    function version()
        public
        view
        returns (
            string  memory protocolVersion,
            string  memory defaultImplVersion
        );

    
    
    function latest()
        public
        view
        returns (address implementation);

    
    
    function isRegistered(
        address implementation
        )
        public
        view
        returns (bool registered);

    
    
    function isEnabled(
        address implementation
        )
        public
        view
        returns (bool enabled);
}

contract IExchangeProxy is Proxy
{
    bytes32 private constant registryPosition = keccak256(
        "org.loopring.protocol.v3.registry"
    );

    constructor(address _registry)
        public
    {
        setRegistry(_registry);
    }

    
    function registry()
        public
        view
        returns (address registryAddress)
    {
        bytes32 position = registryPosition;
        assembly { registryAddress := sload(position) }
    }

    
    function protocol()
        public
        view
        returns (address protocolAddress)
    {
        IUniversalRegistry r = IUniversalRegistry(registry());
        (protocolAddress, ) = r.getExchangeProtocol(address(this));
    }

    function setRegistry(address _registry)
        private
    {
        require(_registry != address(0), "ZERO_ADDRESS");
        bytes32 position = registryPosition;
        assembly { sstore(position, _registry) }
    }
}

contract AutoUpgradabilityProxy is IExchangeProxy
{
    constructor(address _registry) public IExchangeProxy(_registry) {}

    function implementation()
        public
        view
        returns (address)
    {
        IUniversalRegistry r = IUniversalRegistry(registry());
        (, address managerAddr) = r.getExchangeProtocol(address(this));
        return IImplementationManager(managerAddr).defaultImpl();
    }
}

contract ManualUpgradabilityProxy is IExchangeProxy
{
    event Upgraded(address indexed implementation);

    bytes32 private constant implementationPosition = keccak256(
        "org.loopring.protocol.v3.implementation"
    );

    modifier onlyUnderlyingOwner()
    {
        address underlyingOwner = Ownable(address(this)).owner();
        require(underlyingOwner != address(0), "NO_OWNER");
        require(underlyingOwner == msg.sender, "UNAUTHORIZED");
        _;
    }

    constructor(
        address _registry,
        address _implementation
        )
        public
        IExchangeProxy(_registry)
    {
        setImplementation(_implementation);
    }

    function implementation()
        public
        view
        returns (address impl)
    {
        bytes32 position = implementationPosition;
        assembly { impl := sload(position) }
    }

    function upgradeTo(
        address newImplementation
        )
        external
        onlyUnderlyingOwner
    {
        require(implementation() != newImplementation, "SAME_IMPLEMENTATION");

        IUniversalRegistry r = IUniversalRegistry(registry());
        require(
            r.isProtocolAndImplementationEnabled(protocol(), newImplementation),
            "INVALID_PROTOCOL_OR_IMPLEMENTATION"
        );

        setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    function setImplementation(
        address newImplementation
        )
        private
    {
        bytes32 position = implementationPosition;
        assembly {sstore(position, newImplementation) }
    }
}

contract ImplementationManager is IImplementationManager
{
    struct Status
    {
        bool registered;
        bool enabled;
    }

    
    mapping (address => Status) private statusMap;

    constructor(
        address _owner,
        address _protocol,
        address _implementation
        )
        public
    {
        require(_owner != address(0), "ZERO_ADDRESS");
        require(_protocol != address(0), "ZERO_PROTOCOL");

        owner = _owner;
        protocol = _protocol;
        defaultImpl = _implementation;

        registerInternal(_implementation);
    }

    

    function register(
        address implementation
        )
        external
        nonReentrant
        onlyOwner
    {
        registerInternal(implementation);
    }

    function setDefault(
        address implementation
        )
        external
        nonReentrant
        onlyOwner
    {
        require(implementation != defaultImpl, "SAME_IMPLEMENTATION");
        require(isEnabled(implementation), "INVALID_IMPLEMENTATION");

        address oldDefault = defaultImpl;
        defaultImpl = implementation;

        emit DefaultChanged(
            oldDefault,
            implementation
        );
    }

    function enable(
        address implementation
        )
        external
        nonReentrant
        onlyOwner
    {
        Status storage status = statusMap[implementation];
        require(status.registered && !status.enabled, "INVALID_IMPLEMENTATION");

        status.enabled = true;
        emit Enabled(implementation);
    }

    function disable(
        address implementation
        )
        external
        nonReentrant
        onlyOwner
    {
        require(implementation != defaultImpl, "FORBIDDEN");
        require(isEnabled(implementation), "INVALID_IMPLEMENTATION");

        statusMap[implementation].enabled = false;
        emit Disabled(implementation);
    }

    function version()
        public
        view
        returns (
            string  memory protocolVersion,
            string  memory defaultImplVersion
        )
    {
        protocolVersion = ILoopring(protocol).version();
        defaultImplVersion = IExchange(defaultImpl).version();
    }

    function latest()
        public
        view
        returns (address)
    {
        return implementations[implementations.length - 1];
    }

    function isRegistered(
        address implementation
        )
        public
        view
        returns (bool)
    {
        return statusMap[implementation].registered;
    }

    function isEnabled(
        address implementation
        )
        public
        view
        returns (bool)
    {
        return statusMap[implementation].enabled;
    }

    function registerInternal(
        address implementation
        )
        internal
    {
        require(implementation != address(0), "INVALID_IMPLEMENTATION");

        string memory _version = IExchange(implementation).version();
        require(bytes(_version).length >= 3, "INVALID_VERSION");
        require(versionMap[_version] == address(0), "VERSION_USED");
        require(!statusMap[implementation].registered, "ALREADY_REGISTERED");

        implementations.push(implementation);
        statusMap[implementation] = Status(true, true);
        versionMap[_version] = implementation;

        emit Registered(implementation, _version);
    }
}

contract UniversalRegistry is IUniversalRegistry {
    struct Protocol
    {
        address protocol;
        bool    registered;
        bool    enabled;
        address manager;
        string  version;
    }

    
    mapping (address => address) private exchangeMap;
     
    mapping (address => Protocol) private protocolMap;

    address private defaultProtocolAddress;

    
    constructor(
        address _lrcAddress
        )
        Claimable()
        public
    {
        require(_lrcAddress != address(0), "ZERO_ADDRESS");
        lrcAddress = _lrcAddress;
    }

    function registerProtocol(
        address protocol,
        address implementation
        )
        external
        nonReentrant
        onlyOwner
        returns (address manager)
    {
        require(!protocolMap[protocol].registered, "PROTOCOL_REGISTERED");

        ILoopring loopring = ILoopring(protocol);
        require(loopring.universalRegistry() == address(this), "REGISTRY_MISMATCH");
        require(loopring.owner() == owner, "OWNER_MISMATCH");
        require(loopring.lrcAddress() == lrcAddress, "LRC_ADDRESS_MISMATCH");

        IImplementationManager m = new ImplementationManager(owner, protocol, implementation);
        manager = address(m);

        string memory version = loopring.version();
        require(versionMap[version] == address(0), "VERSION_REGISTERED");
        require(!protocolMap[protocol].registered, "PROTOCOL_REGISTERED");

        protocols.push(protocol);
        versionMap[version] = protocol;
        protocolMap[protocol] = Protocol(protocol, true, true, manager, version);

        if (defaultProtocolAddress == address(0)) {
            defaultProtocolAddress = protocol;
        }

        emit ProtocolRegistered(protocol, manager, version);
    }

    function setDefaultProtocol(
        address protocol
        )
        external
        nonReentrant
        onlyOwner
    {
        require(protocol != defaultProtocolAddress, "SAME_PROTOCOL");
        require(protocolMap[protocol].registered, "NOT_REGISTERED");
        require(protocolMap[protocol].enabled, "PROTOCOL_DISABLED");
        address oldDefault = defaultProtocolAddress;
        defaultProtocolAddress = protocol;
        emit DefaultProtocolChanged(oldDefault, defaultProtocolAddress);
    }

    function enableProtocol(
        address protocol
        )
        external
        nonReentrant
        onlyOwner
    {
        require(protocolMap[protocol].registered, "NOT_REGISTERED");
        require(!protocolMap[protocol].enabled, "ALREADY_ENABLED");

        protocolMap[protocol].enabled = true;
        emit ProtocolEnabled(protocol);
    }

    function disableProtocol(
        address protocol
        )
        external
        nonReentrant
        onlyOwner
    {
        require(protocolMap[protocol].enabled, "ALREADY_DISABLED");

        protocolMap[protocol].enabled = false;
        emit ProtocolDisabled(protocol);
    }

    function forgeExchange(
        ForgeMode forgeMode,
        bool      onchainDataAvailability,
        address   protocol,
        address   implementation
        )
        external
        nonReentrant
        returns (
            address exchangeAddress,
            uint    exchangeId
        )
    {
        (address _protocol, address _implementation) = getProtocolAndImplementationToUse(
            protocol,
            implementation
        );

        ILoopring loopring = ILoopring(_protocol);
        uint exchangeCreationCostLRC = loopring.exchangeCreationCostLRC();

        if (exchangeCreationCostLRC > 0) {
            require(
                BurnableERC20(lrcAddress).burnFrom(msg.sender, exchangeCreationCostLRC),
                "BURN_FAILURE"
            );
        }

        exchangeAddress = forgeInternal(forgeMode, _implementation);
        assert(exchangeMap[exchangeAddress] == address(0));

        exchangeMap[exchangeAddress] = _protocol;
        exchanges.push(exchangeAddress);
        exchangeId = exchanges.length;

        loopring.initializeExchange(
            exchangeAddress,
            exchangeId,
            msg.sender,  
            msg.sender,  
            onchainDataAvailability
        );

        emit ExchangeForged(
            _protocol,
            _implementation,
            exchangeAddress,
            msg.sender,
            forgeMode,
            onchainDataAvailability,
            exchangeId,
            exchangeCreationCostLRC
        );
    }

    function defaultProtocol()
        public
        view
        returns (
            address protocol,
            address manager,
            address defaultImpl,
            string  memory protocolVersion,
            string  memory defaultImplVersion
        )
    {
        protocol = defaultProtocolAddress;
        Protocol storage p = protocolMap[protocol];
        manager = p.manager;

        IImplementationManager m = IImplementationManager(manager);
        defaultImpl = m.defaultImpl();
        (protocolVersion, defaultImplVersion) = m.version();
    }

    function isProtocolRegistered(
        address protocol
        )
        public
        view
        returns (bool)
    {
        return protocolMap[protocol].registered;
    }

    function isProtocolEnabled(
        address protocol
        )
        public
        view
        returns (bool)
    {
        return protocolMap[protocol].enabled;
    }

    function isExchangeRegistered(
        address exchange
        )
        public
        view
        returns (bool)
    {
        return exchangeMap[exchange] != address(0);
    }

    function isProtocolAndImplementationEnabled(
        address protocol,
        address implementation
        )
        public
        view
        returns (bool enabled)
    {
        if (!isProtocolEnabled(protocol)) {
            return false;
        }

        address managerAddr = protocolMap[protocol].manager;
        IImplementationManager m = IImplementationManager(managerAddr);
        return m.isEnabled(implementation);
    }

    function getExchangeProtocol(
        address exchangeAddress
        )
        public
        view
        returns (
            address protocol,
            address manager
        )
    {
        require(exchangeAddress != address(0), "ZERO_ADDRESS");
        protocol = exchangeMap[exchangeAddress];
        require(protocol != address(0), "INVALID_EXCHANGE");
        manager = protocolMap[protocol].manager;
    }

    

    function getProtocolAndImplementationToUse(
        address protocol,
        address implementation
        )
        private
        view
        returns (
            address protocolToUse,
            address implementationToUse
        )
    {
        protocolToUse = protocol;
        if (protocolToUse == address(0)) {
            protocolToUse = defaultProtocolAddress;
        } else {
            require(isProtocolEnabled(protocolToUse), "INVALID_PROTOCOL");
        }

        implementationToUse = implementation;
        IImplementationManager m = IImplementationManager(protocolMap[protocolToUse].manager);
        if (implementationToUse == address(0)) {
            implementationToUse = m.defaultImpl();
        } else {
            require(m.isEnabled(implementationToUse), "INVALID_IMPLEMENTATION");
        }
    }

    function forgeInternal(
        ForgeMode forgeMode,
        address   implementation
        )
        private
        returns (address)
    {
        if (forgeMode == ForgeMode.AUTO_UPGRADABLE) {
            return address(new AutoUpgradabilityProxy(address(this)));
        } else if (forgeMode == ForgeMode.MANUAL_UPGRADABLE) {
            return address(new ManualUpgradabilityProxy(address(this), implementation));
        } else if (forgeMode == ForgeMode.PROXIED) {
            return address(new SimpleProxy(implementation));
        } else if (forgeMode == ForgeMode.NATIVE) {
            return IExchange(implementation).clone();
        } else {
            revert("INVALID_FORGE_MODE");
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"exchanges","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"registerProtocol","outputs":[{"internalType":"address","name":"manager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"exchange","type":"address"}],"name":"isExchangeRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lrcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"isProtocolEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"setDefaultProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"defaultProtocol","outputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"defaultImpl","type":"address"},{"internalType":"string","name":"protocolVersion","type":"string"},{"internalType":"string","name":"defaultImplVersion","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"exchangeAddress","type":"address"}],"name":"getExchangeProtocol","outputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"enableProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocols","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"enum IUniversalRegistry.ForgeMode","name":"forgeMode","type":"uint8"},{"internalType":"bool","name":"onchainDataAvailability","type":"bool"},{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"forgeExchange","outputs":[{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"uint256","name":"exchangeId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"disableProtocol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"isProtocolAndImplementationEnabled","outputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"protocol","type":"address"}],"name":"isProtocolRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"versionMap","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lrcAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"},{"indexed":true,"internalType":"address","name":"implementationManager","type":"address"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"ProtocolRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"}],"name":"ProtocolEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"}],"name":"ProtocolDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldDefault","type":"address"},{"indexed":true,"internalType":"address","name":"newDefault","type":"address"}],"name":"DefaultProtocolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"protocol","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"address","name":"exchangeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"enum IUniversalRegistry.ForgeMode","name":"forgeMode","type":"uint8"},{"indexed":false,"internalType":"bool","name":"onchainDataAvailability","type":"bool"},{"indexed":false,"internalType":"uint256","name":"exchangeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLRCBurned","type":"uint256"}],"name":"ExchangeForged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b50604051614a2b380380614a2b8339818101604052602081101561003357600080fd5b5051600080546001600160a01b031916331790556001600160a01b0381166100bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055614940806100eb6000396000f3fe60806040523480156200001157600080fd5b5060043610620001485760003560e01c8063821f6c0f11620000bd578063c4897cd5116200007b578063c4897cd514620004d2578063e30c39781462000503578063e9407b2b146200050d578063f2bdeea61462000536578063f2fde38b14620005e05762000148565b8063821f6c0f14620003f15780638c396220146200041a5780638da5cb5b146200043a578063942fef131462000444578063bf60411814620004a95762000148565b80634e6b6376116200010b5780634e6b6376146200022a5780634e71e0c81462000255578063529a579a146200025f578063715018a6146200039857806374e6365e14620003a25762000148565b80632839fc29146200014d57806328a09ba014620001895780633bbcf73e14620001ba5780633d6cf72214620001f75780634df1e5cd1462000201575b600080fd5b6200016d600480360360208110156200016557600080fd5b503562000609565b604080516001600160a01b039092168252519081900360200190f35b6200016d60048036036040811015620001a157600080fd5b506001600160a01b038135811691602001351662000631565b620001e360048036036020811015620001d257600080fd5b50356001600160a01b031662000eb5565b604080519115158252519081900360200190f35b6200016d62000ed5565b620001e3600480360360208110156200021957600080fd5b50356001600160a01b031662000ee4565b62000253600480360360208110156200024257600080fd5b50356001600160a01b031662000f09565b005b620002536200111c565b62000269620011cf565b60405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620002f4578181015183820152602001620002da565b50505050905090810190601f168015620003225780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620003575781810151838201526020016200033d565b50505050905090810190601f168015620003855780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6200025362001456565b620003cb60048036036020811015620003ba57600080fd5b50356001600160a01b0316620014ef565b604080516001600160a01b03938416815291909216602082015281519081900390910190f35b62000253600480360360208110156200040957600080fd5b50356001600160a01b0316620015c6565b6200016d600480360360208110156200043257600080fd5b503562001782565b6200016d62001790565b62000486600480360360808110156200045c57600080fd5b5060ff8135169060208101351515906001600160a01b03604082013581169160600135166200179f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200025360048036036020811015620004c157600080fd5b50356001600160a01b031662001af5565b620001e360048036036040811015620004ea57600080fd5b506001600160a01b038135811691602001351662001c45565b6200016d62001cf8565b620001e3600480360360208110156200052557600080fd5b50356001600160a01b031662001d07565b6200016d600480360360208110156200054e57600080fd5b810190602081018135600160201b8111156200056957600080fd5b8201836020820111156200057c57600080fd5b803590602001918460018302840111600160201b831117156200059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062001d2c945050505050565b6200025360048036036020811015620005f857600080fd5b50356001600160a01b031662001d52565b600481815481106200061757fe5b6000918252602090912001546001600160a01b0316905081565b600060025460001462000678576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314620006cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038316600090815260086020526040902054600160a01b900460ff161562000738576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b6000839050306001600160a01b0316816001600160a01b03166325ebe7eb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200078157600080fd5b505afa15801562000796573d6000803e3d6000fd5b505050506040513d6020811015620007ad57600080fd5b50516001600160a01b031614620007ff576040805162461bcd60e51b81526020600482015260116024820152700a48a8e92a6a8a4b2be9a92a69a82a8869607b1b604482015290519081900360640190fd5b60005460408051638da5cb5b60e01b815290516001600160a01b0392831692841691638da5cb5b916004808301926020929190829003018186803b1580156200084757600080fd5b505afa1580156200085c573d6000803e3d6000fd5b505050506040513d60208110156200087357600080fd5b50516001600160a01b031614620008c2576040805162461bcd60e51b815260206004820152600e60248201526d09eae9c8aa4be9a92a69a82a886960931b604482015290519081900360640190fd5b60035460408051631eb67b9160e11b815290516001600160a01b0392831692841691633d6cf722916004808301926020929190829003018186803b1580156200090a57600080fd5b505afa1580156200091f573d6000803e3d6000fd5b505050506040513d60208110156200093657600080fd5b50516001600160a01b0316146200098b576040805162461bcd60e51b8152602060048201526014602482015273098a486be828888a48aa6a6be9a92a69a82a886960631b604482015290519081900360640190fd5b600080546040516001600160a01b039091169086908690620009ad90620021bd565b6001600160a01b03938416815291831660208301529091166040808301919091525190819003606001906000f080158015620009ed573d6000803e3d6000fd5b5090508092506060826001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801562000a2f57600080fd5b505afa15801562000a44573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6e57600080fd5b8101908080516040519392919084600160201b82111562000a8e57600080fd5b90830190602082018581111562000aa457600080fd5b8251600160201b81118282018810171562000abe57600080fd5b82525081516020918201929091019080838360005b8381101562000aed57818101518382015260200162000ad3565b50505050905090810190601f16801562000b1b5780820380516001836020036101000a031916815260200191505b50604052505050905060006001600160a01b03166006826040518082805190602001908083835b6020831062000b635780518252601f19909201916020918201910162000b42565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214915062000be79050576040805162461bcd60e51b815260206004820152601260248201527115915494d253d397d49151d254d51154915160721b604482015290519081900360640190fd5b6001600160a01b038616600090815260086020526040902054600160a01b900460ff161562000c53576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03881617905560405181518791600691849190819060208401908083835b6020831062000cd75780518252601f19909201916020918201910162000cb6565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b03199081166001600160a01b039889161790915560a0860182528c871680875260018785018181528885018281528e8b1660608b0190815260808b018d8152600095865260088952969094208a51815493519251938716908d161760ff60a01b1916600160a01b921515929092029190911760ff60a81b1916600160a81b9215159290920291909117815591519082018054909316981697909717905551805194959462000dc49450600286019350910190620021cb565b50506009546001600160a01b03161515905062000df757600980546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b03167f1b4568a587d9e2e57686ed25c91d408b5a35e919686f643f081ee017f4ea542c836040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000e6c57818101518382015260200162000e52565b50505050905090810190601f16801562000e9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505060006002555092915050565b6001600160a01b0390811660009081526007602052604090205416151590565b6003546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a81b900460ff1690565b6002541562000f4c576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462000fa0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6009546001600160a01b038281169116141562000ff4576040805162461bcd60e51b815260206004820152600d60248201526c14d0535157d41493d513d0d3d3609a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff166200105a576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16620010c3576040805162461bcd60e51b8152602060048201526011602482015270141493d513d0d3d317d11254d050931151607a1b604482015290519081900360640190fd5b600980546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f43159b3d893e5120a3c82b7c4701c08e2f426b046c3f420dcee43d5ae18b5b5690600090a350506000600255565b6001546001600160a01b031633146200116b576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6009546001600160a01b0390811660008181526008602090815260408083206001810154825163631ffbf360e01b815292519596169460609384938792839263631ffbf39260048082019391829003018186803b1580156200123057600080fd5b505afa15801562001245573d6000803e3d6000fd5b505050506040513d60208110156200125c57600080fd5b50516040805163054fd4d560e41b815290519196506001600160a01b038316916354fd4d5091600480820192600092909190829003018186803b158015620012a357600080fd5b505afa158015620012b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015620012e257600080fd5b8101908080516040519392919084600160201b8211156200130257600080fd5b9083019060208201858111156200131857600080fd5b8251600160201b8111828201881017156200133257600080fd5b82525081516020918201929091019080838360005b838110156200136157818101518382015260200162001347565b50505050905090810190601f1680156200138f5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084600160201b821115620013b257600080fd5b908301906020820185811115620013c857600080fd5b8251600160201b811182820188101715620013e257600080fd5b82525081516020918201929091019080838360005b8381101562001411578181015183820152602001620013f7565b50505050905090810190601f1680156200143f5780820380516001836020036101000a031916815260200191505b5060405250999a9899509697919650945092505050565b6000546001600160a01b03163314620014a5576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806001600160a01b0383166200153d576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b6001600160a01b0380841660009081526007602052604090205416915081620015a0576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f45584348414e474560801b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154919391169150565b6002541562001609576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146200165d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff16620016c3576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16156200172b576040805162461bcd60e51b815260206004820152600f60248201526e1053149150511657d1539050931151608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b1916600160a81b179055517fc6dddbd701f38521605face97e4a42c12d0458040f3e33b7c3c3e14c6bc55d959190a2506000600255565b600581815481106200061757fe5b6000546001600160a01b031681565b600080600254600014620017e7576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b6001600255600080620017fb868662001e2e565b9150915060008290506000816001600160a01b0316637207d1886040518163ffffffff1660e01b815260040160206040518083038186803b1580156200184057600080fd5b505afa15801562001855573d6000803e3d6000fd5b505050506040513d60208110156200186c57600080fd5b5051905080156200193b576003546040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc6790916044808201926020929091908290030181600087803b158015620018cc57600080fd5b505af1158015620018e1573d6000803e3d6000fd5b505050506040513d6020811015620018f857600080fd5b50516200193b576040805162461bcd60e51b815260206004820152600c60248201526b4255524e5f4641494c55524560a01b604482015290519081900360640190fd5b620019478a8462002017565b6001600160a01b0380821660009081526007602052604090205491975016156200196d57fe5b6001600160a01b038087166000818152600760205260408082208054858a166001600160a01b031991821617909155600480546001810182558185527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805490921685179091558054825163f2fc7d6760e01b81529182019490945260248101849052336044820181905260648201528d1515608482015290519298509285169263f2fc7d679260a4808301939282900301818387803b15801562001a3257600080fd5b505af115801562001a47573d6000803e3d6000fd5b50505050856001600160a01b0316836001600160a01b0316856001600160a01b03167fef332a01dc11ee04eab2405c2f60c65d8e33b933136b7b085aae6e7a77e8eb99338e8e8b8860405180866001600160a01b03166001600160a01b0316815260200185600381111562001ab857fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a4505060006002555091969095509350505050565b6002541562001b38576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462001b8c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff1662001bf4576040805162461bcd60e51b815260206004820152601060248201526f1053149150511657d11254d05093115160821b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b19169055517f4eefa26623f720c6c56f2a3ecbe4e895171df2f804bb6a917d30d394743256239190a2506000600255565b600062001c528362000ee4565b62001c605750600062001cf2565b6001600160a01b03808416600090815260086020908152604091829020600101548251639015d37160e01b81528685166004820152925193169283928392639015d37192602480840193829003018186803b15801562001cbf57600080fd5b505afa15801562001cd4573d6000803e3d6000fd5b505050506040513d602081101562001ceb57600080fd5b5051925050505b92915050565b6001546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a01b900460ff1690565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b0316331462001da1576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159062001dc857506000546001600160a01b03828116911614155b62001e0c576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8160006001600160a01b03821662001e54576009546001600160a01b0316915062001ea4565b62001e5f8262000ee4565b62001ea4576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d41493d513d0d3d360821b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154839190811690821662001f3f57806001600160a01b031663631ffbf36040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f0957600080fd5b505afa15801562001f1e573d6000803e3d6000fd5b505050506040513d602081101562001f3557600080fd5b505191506200200f565b806001600160a01b0316639015d371836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801562001f9657600080fd5b505afa15801562001fab573d6000803e3d6000fd5b505050506040513d602081101562001fc257600080fd5b50516200200f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b509250929050565b6000808360038111156200202757fe5b14156200207457306040516200203d9062002250565b6001600160a01b03909116815260405190819003602001906000f0801580156200206b573d6000803e3d6000fd5b50905062001cf2565b60018360038111156200208357fe5b1415620020ce5730826040516200209a906200225e565b6001600160a01b03928316815291166020820152604080519182900301906000f0801580156200206b573d6000803e3d6000fd5b6002836003811115620020dd57fe5b1415620020f357816040516200203d906200226c565b60038360038111156200210257fe5b14156200217b57816001600160a01b03166309ed46076040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200214557600080fd5b505af11580156200215a573d6000803e3d6000fd5b505050506040513d60208110156200217157600080fd5b5051905062001cf2565b6040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f464f5247455f4d4f444560701b604482015290519081900360640190fd5b611a7d806200229b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200220e57805160ff19168380011785556200223e565b828001600101855582156200223e579182015b828111156200223e57825182559160200191906001019062002221565b506200224c9291506200227a565b5090565b6103db8062003d1883390190565b61068f80620040f383390190565b61018a806200478283390190565b6200229791905b808211156200224c576000815560010162002281565b9056fe60806040523480156200001157600080fd5b5060405162001a7d38038062001a7d833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b038316620000d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166200014657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f50524f544f434f4c00000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b038086166001600160a01b03199283161790925560038054858416908316179055600480549284169290911691909117905562000197816001600160e01b03620001a016565b505050620006d9565b6001600160a01b0381166200021657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200029157600080fd5b8101908080516040519392919084640100000000821115620002b257600080fd5b908301906020820185811115620002c857600080fd5b8251640100000000811182820188101715620002e357600080fd5b82525081516020918201929091019080838360005b8381101562000312578181015183820152602001620002f8565b50505050905090810190601f168015620003405780820380516001836020036101000a031916815260200191505b506040525050509050600381511015620003bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f56455253494f4e0000000000000000000000000000000000604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b60208310620003fa5780518252601f199092019160209182019101620003d9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b0316929092149150620004a3905057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f56455253494f4e5f555345440000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156200052c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f414c52454144595f524547495354455245440000000000000000000000000000604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b60208310620005f55780518252601f199092019160209182019101620005d4565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b838110156200069a57818101518382015260200162000680565b50505050905090810190601f168015620006c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61139480620006e96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638ce74426116100a2578063e30c397811610071578063e30c39781461030d578063e6c09edf14610315578063e823d5cf1461033b578063f2bdeea614610361578063f2fde38b146104055761010b565b80638ce744261461029d5780638da5cb5b146102a55780639015d371146102ad578063c3c5a547146102e75761010b565b80635bfa1b68116100de5780635bfa1b681461024a578063631ffbf314610270578063715018a614610278578063845affc8146102805761010b565b80634420e486146101105780634e71e0c81461013857806352bfe7891461014057806354fd4d5014610164575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661042b565b005b6101366104d1565b610148610583565b604080516001600160a01b039092168252519081900360200190f35b61016c6105b3565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156101ad578181015183820152602001610195565b50505050905090810190601f1680156101da5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6101366004803603602081101561026057600080fd5b50356001600160a01b0316610823565b61014861097c565b61013661098b565b6101486004803603602081101561029657600080fd5b5035610a23565b610148610a4a565b610148610a59565b6102d3600480360360208110156102c357600080fd5b50356001600160a01b0316610a68565b604080519115158252519081900360200190f35b6102d3600480360360208110156102fd57600080fd5b50356001600160a01b0316610a8b565b610148610aa9565b6101366004803603602081101561032b57600080fd5b50356001600160a01b0316610ab8565b6101366004803603602081101561035157600080fd5b50356001600160a01b0316610c3e565b6101486004803603602081101561037757600080fd5b810190602081018135600160201b81111561039157600080fd5b8201836020820111156103a357600080fd5b803590602001918460018302840111600160201b831117156103c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dd6945050505050565b6101366004803603602081101561041b57600080fd5b50356001600160a01b0316610dfc565b6002541561046d576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146104c0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6104c981610ed5565b506000600255565b6001546001600160a01b0316331461051f576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6005805460009190600019810190811061059957fe5b6000918252602090912001546001600160a01b0316905090565b606080600360009054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801561060457600080fd5b505afa158015610618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561064157600080fd5b8101908080516040519392919084600160201b82111561066057600080fd5b90830190602082018581111561067557600080fd5b8251600160201b81118282018810171561068e57600080fd5b82525081516020918201929091019080838360005b838110156106bb5781810151838201526020016106a3565b50505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b5060408181526004805463054fd4d560e41b845291519698506001600160a01b03909116956354fd4d50955081830194506000935091829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561076f57600080fd5b8101908080516040519392919084600160201b82111561078e57600080fd5b9083019060208201858111156107a357600080fd5b8251600160201b8111828201881017156107bc57600080fd5b82525081516020918201929091019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b5060405250505090509091565b60025415610865576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146108b8576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381166000908152600760205260409020805460ff1680156108e857508054610100900460ff16155b610932576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b805461ff0019166101001781556040516001600160a01b038316907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a250506000600255565b6004546001600160a01b031681565b6000546001600160a01b031633146109d9576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60058181548110610a3057fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031681565b6000546001600160a01b031681565b6001600160a01b0316600090815260076020526040902054610100900460ff1690565b6001600160a01b031660009081526007602052604090205460ff1690565b6001546001600160a01b031681565b60025415610afa576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610b4d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610b9c576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b610ba581610a68565b610bef576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805461ff0019169055517ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe9190a2506000600255565b60025415610c80576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610cd3576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610d2c576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b610d3581610a68565b610d7f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0dce6c7e4b7c18563c67d50415c83afaa4c165d8452c6b51659c1bfa2435f3cb90600090a350506000600255565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b03163314610e4a576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b03811615801590610e7057506000546001600160a01b03828116911614155b610eb3576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116610f29576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015610f6457600080fd5b505afa158015610f78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fa157600080fd5b8101908080516040519392919084600160201b821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251600160201b811182820188101715610fee57600080fd5b82525081516020918201929091019080838360005b8381101561101b578181015183820152602001611003565b50505050905090810190601f1680156110485780820380516001836020036101000a031916815260200191505b50604052505050905060038151101561109a576040805162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fab22a929a4a7a760891b604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b602083106110d75780518252601f1990920191602091820191016110b8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b03169290921491506111549050576040805162461bcd60e51b815260206004820152600c60248201526b15915494d253d397d554d15160a21b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156111b7576040805162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b6020831061127e5780518252601f19909201916020918201910161125f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b83811015611321578181015183820152602001611309565b50505050905090810190601f16801561134e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505056fea265627a7a72315820ebe8f498a2a9a6d5143737847f60a44a37e4e4722213694801d5a3021cf87aec64736f6c634300050b0032608060405234801561001057600080fd5b506040516103db3803806103db8339818101604052602081101561003357600080fd5b505180610048816001600160e01b0361004f16565b50506100e6565b6001600160a01b0381166100c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600060405180806103ba60219139604051908190036021019020929092555050565b6102c5806100f56000396000f3fe6080604052600436106100345760003560e01c80635c60da1b146100785780637b103999146100a95780638ce74426146100be575b600061003e6100d3565b90506001600160a01b03811661005357600080fd5b60405136600082376000803683855af43d806000843e818015610074578184f35b8184fd5b34801561008457600080fd5b5061008d6100d3565b604080516001600160a01b039092168252519081900360200190f35b3480156100b557600080fd5b5061008d6101c8565b3480156100ca57600080fd5b5061008d6101eb565b6000806100de6101c8565b60408051633a731b2f60e11b815230600482015281519293506000926001600160a01b038516926374e6365e9260248082019391829003018186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d604081101561015057600080fd5b506020908101516040805163631ffbf360e01b815290519193506001600160a01b0384169263631ffbf392600480840193829003018186803b15801561019557600080fd5b505afa1580156101a9573d6000803e3d6000fd5b505050506040513d60208110156101bf57600080fd5b50519250505090565b600080604051808061027060219139604051908190036021019020549392505050565b6000806101f66101c8565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561023d57600080fd5b505afa158015610251573d6000803e3d6000fd5b505050506040513d604081101561026757600080fd5b50519291505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a72315820e42b816ccaf235c960e6fa24f5a0031ab5057b5dcfeec5fb5811fc465f2a9e3b64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161068f38038061068f8339818101604052604081101561003357600080fd5b5080516020909101518161004f816001600160e01b0361006916565b50610062816001600160e01b0361010016565b5050610122565b6001600160a01b0381166100de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6000604051808061066e60219139604051908190036021019020929092555050565b6000604051808061064760279139604051908190036027019020929092555050565b610516806101316000396000f3fe60806040526004361061003f5760003560e01c80633659cfe6146100835780635c60da1b146100b85780637b103999146100e95780638ce74426146100fe575b6000610049610113565b90506001600160a01b03811661005e57600080fd5b60405136600082376000803683855af43d806000843e81801561007f578184f35b8184fd5b34801561008f57600080fd5b506100b6600480360360208110156100a657600080fd5b50356001600160a01b0316610136565b005b3480156100c457600080fd5b506100cd610113565b604080516001600160a01b039092168252519081900360200190f35b3480156100f557600080fd5b506100cd6103ae565b34801561010a57600080fd5b506100cd6103d1565b600080604051808061049a60279139604051908190036027019020549392505050565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561017157600080fd5b505afa158015610185573d6000803e3d6000fd5b505050506040513d602081101561019b57600080fd5b505190506001600160a01b0381166101e5576040805162461bcd60e51b81526020600482015260086024820152672727afa7aba722a960c11b604482015290519081900360640190fd5b6001600160a01b0381163314610231576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b816001600160a01b0316610243610113565b6001600160a01b03161415610295576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b600061029f6103ae565b9050806001600160a01b031663c4897cd56102b86103d1565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b15801561030557600080fd5b505afa158015610319573d6000803e3d6000fd5b505050506040513d602081101561032f57600080fd5b505161036c5760405162461bcd60e51b81526004018080602001828103825260228152602001806104786022913960400191505060405180910390fd5b61037583610455565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2505050565b60008060405180806104c160219139604051908190036021019020549392505050565b6000806103dc6103ae565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d604081101561044d57600080fd5b505192915050565b6000604051808061049a6027913960405190819003602701902092909255505056fe494e56414c49445f50524f544f434f4c5f4f525f494d504c454d454e544154494f4e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a723158206acaacfc4d1703159e6ea7ffa104958090c83e81bc8b4d1c1887a5b9b1f3f4fd64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161018a38038061018a8339818101604052602081101561003357600080fd5b50516040516000908060226101688239604051908190036022019020929092555050610104806100646000396000f3fe608060405260043610601c5760003560e01c80635c60da1b14605c575b60006024608a565b90506001600160a01b038116603857600080fd5b60405136600082376000803683855af43d806000843e8180156058578184f35b8184fd5b348015606757600080fd5b50606e608a565b604080516001600160a01b039092168252519081900360200190f35b60008060405180806100ae6022913960405190819003602201902054939250505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a72315820e4b97c71f12dd7e59216bd5fe82f370a4ede95bdb3a8f0b59f0836a47582a0eb64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a7231582058a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d064736f6c634300050b0032000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001485760003560e01c8063821f6c0f11620000bd578063c4897cd5116200007b578063c4897cd514620004d2578063e30c39781462000503578063e9407b2b146200050d578063f2bdeea61462000536578063f2fde38b14620005e05762000148565b8063821f6c0f14620003f15780638c396220146200041a5780638da5cb5b146200043a578063942fef131462000444578063bf60411814620004a95762000148565b80634e6b6376116200010b5780634e6b6376146200022a5780634e71e0c81462000255578063529a579a146200025f578063715018a6146200039857806374e6365e14620003a25762000148565b80632839fc29146200014d57806328a09ba014620001895780633bbcf73e14620001ba5780633d6cf72214620001f75780634df1e5cd1462000201575b600080fd5b6200016d600480360360208110156200016557600080fd5b503562000609565b604080516001600160a01b039092168252519081900360200190f35b6200016d60048036036040811015620001a157600080fd5b506001600160a01b038135811691602001351662000631565b620001e360048036036020811015620001d257600080fd5b50356001600160a01b031662000eb5565b604080519115158252519081900360200190f35b6200016d62000ed5565b620001e3600480360360208110156200021957600080fd5b50356001600160a01b031662000ee4565b62000253600480360360208110156200024257600080fd5b50356001600160a01b031662000f09565b005b620002536200111c565b62000269620011cf565b60405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620002f4578181015183820152602001620002da565b50505050905090810190601f168015620003225780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620003575781810151838201526020016200033d565b50505050905090810190601f168015620003855780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6200025362001456565b620003cb60048036036020811015620003ba57600080fd5b50356001600160a01b0316620014ef565b604080516001600160a01b03938416815291909216602082015281519081900390910190f35b62000253600480360360208110156200040957600080fd5b50356001600160a01b0316620015c6565b6200016d600480360360208110156200043257600080fd5b503562001782565b6200016d62001790565b62000486600480360360808110156200045c57600080fd5b5060ff8135169060208101351515906001600160a01b03604082013581169160600135166200179f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6200025360048036036020811015620004c157600080fd5b50356001600160a01b031662001af5565b620001e360048036036040811015620004ea57600080fd5b506001600160a01b038135811691602001351662001c45565b6200016d62001cf8565b620001e3600480360360208110156200052557600080fd5b50356001600160a01b031662001d07565b6200016d600480360360208110156200054e57600080fd5b810190602081018135600160201b8111156200056957600080fd5b8201836020820111156200057c57600080fd5b803590602001918460018302840111600160201b831117156200059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062001d2c945050505050565b6200025360048036036020811015620005f857600080fd5b50356001600160a01b031662001d52565b600481815481106200061757fe5b6000918252602090912001546001600160a01b0316905081565b600060025460001462000678576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314620006cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038316600090815260086020526040902054600160a01b900460ff161562000738576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b6000839050306001600160a01b0316816001600160a01b03166325ebe7eb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200078157600080fd5b505afa15801562000796573d6000803e3d6000fd5b505050506040513d6020811015620007ad57600080fd5b50516001600160a01b031614620007ff576040805162461bcd60e51b81526020600482015260116024820152700a48a8e92a6a8a4b2be9a92a69a82a8869607b1b604482015290519081900360640190fd5b60005460408051638da5cb5b60e01b815290516001600160a01b0392831692841691638da5cb5b916004808301926020929190829003018186803b1580156200084757600080fd5b505afa1580156200085c573d6000803e3d6000fd5b505050506040513d60208110156200087357600080fd5b50516001600160a01b031614620008c2576040805162461bcd60e51b815260206004820152600e60248201526d09eae9c8aa4be9a92a69a82a886960931b604482015290519081900360640190fd5b60035460408051631eb67b9160e11b815290516001600160a01b0392831692841691633d6cf722916004808301926020929190829003018186803b1580156200090a57600080fd5b505afa1580156200091f573d6000803e3d6000fd5b505050506040513d60208110156200093657600080fd5b50516001600160a01b0316146200098b576040805162461bcd60e51b8152602060048201526014602482015273098a486be828888a48aa6a6be9a92a69a82a886960631b604482015290519081900360640190fd5b600080546040516001600160a01b039091169086908690620009ad90620021bd565b6001600160a01b03938416815291831660208301529091166040808301919091525190819003606001906000f080158015620009ed573d6000803e3d6000fd5b5090508092506060826001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801562000a2f57600080fd5b505afa15801562000a44573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101562000a6e57600080fd5b8101908080516040519392919084600160201b82111562000a8e57600080fd5b90830190602082018581111562000aa457600080fd5b8251600160201b81118282018810171562000abe57600080fd5b82525081516020918201929091019080838360005b8381101562000aed57818101518382015260200162000ad3565b50505050905090810190601f16801562000b1b5780820380516001836020036101000a031916815260200191505b50604052505050905060006001600160a01b03166006826040518082805190602001908083835b6020831062000b635780518252601f19909201916020918201910162000b42565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214915062000be79050576040805162461bcd60e51b815260206004820152601260248201527115915494d253d397d49151d254d51154915160721b604482015290519081900360640190fd5b6001600160a01b038616600090815260086020526040902054600160a01b900460ff161562000c53576040805162461bcd60e51b8152602060048201526013602482015272141493d513d0d3d317d49151d254d511549151606a1b604482015290519081900360640190fd5b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03881617905560405181518791600691849190819060208401908083835b6020831062000cd75780518252601f19909201916020918201910162000cb6565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b03199081166001600160a01b039889161790915560a0860182528c871680875260018785018181528885018281528e8b1660608b0190815260808b018d8152600095865260088952969094208a51815493519251938716908d161760ff60a01b1916600160a01b921515929092029190911760ff60a81b1916600160a81b9215159290920291909117815591519082018054909316981697909717905551805194959462000dc49450600286019350910190620021cb565b50506009546001600160a01b03161515905062000df757600980546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b03167f1b4568a587d9e2e57686ed25c91d408b5a35e919686f643f081ee017f4ea542c836040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000e6c57818101518382015260200162000e52565b50505050905090810190601f16801562000e9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3505060006002555092915050565b6001600160a01b0390811660009081526007602052604090205416151590565b6003546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a81b900460ff1690565b6002541562000f4c576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462000fa0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6009546001600160a01b038281169116141562000ff4576040805162461bcd60e51b815260206004820152600d60248201526c14d0535157d41493d513d0d3d3609a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff166200105a576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16620010c3576040805162461bcd60e51b8152602060048201526011602482015270141493d513d0d3d317d11254d050931151607a1b604482015290519081900360640190fd5b600980546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f43159b3d893e5120a3c82b7c4701c08e2f426b046c3f420dcee43d5ae18b5b5690600090a350506000600255565b6001546001600160a01b031633146200116b576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6009546001600160a01b0390811660008181526008602090815260408083206001810154825163631ffbf360e01b815292519596169460609384938792839263631ffbf39260048082019391829003018186803b1580156200123057600080fd5b505afa15801562001245573d6000803e3d6000fd5b505050506040513d60208110156200125c57600080fd5b50516040805163054fd4d560e41b815290519196506001600160a01b038316916354fd4d5091600480820192600092909190829003018186803b158015620012a357600080fd5b505afa158015620012b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015620012e257600080fd5b8101908080516040519392919084600160201b8211156200130257600080fd5b9083019060208201858111156200131857600080fd5b8251600160201b8111828201881017156200133257600080fd5b82525081516020918201929091019080838360005b838110156200136157818101518382015260200162001347565b50505050905090810190601f1680156200138f5780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084600160201b821115620013b257600080fd5b908301906020820185811115620013c857600080fd5b8251600160201b811182820188101715620013e257600080fd5b82525081516020918201929091019080838360005b8381101562001411578181015183820152602001620013f7565b50505050905090810190601f1680156200143f5780820380516001836020036101000a031916815260200191505b5060405250999a9899509697919650945092505050565b6000546001600160a01b03163314620014a5576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806001600160a01b0383166200153d576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b6001600160a01b0380841660009081526007602052604090205416915081620015a0576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f45584348414e474560801b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154919391169150565b6002541562001609576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146200165d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a01b900460ff16620016c3576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d49151d254d51154915160921b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff16156200172b576040805162461bcd60e51b815260206004820152600f60248201526e1053149150511657d1539050931151608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b1916600160a81b179055517fc6dddbd701f38521605face97e4a42c12d0458040f3e33b7c3c3e14c6bc55d959190a2506000600255565b600581815481106200061757fe5b6000546001600160a01b031681565b600080600254600014620017e7576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b6001600255600080620017fb868662001e2e565b9150915060008290506000816001600160a01b0316637207d1886040518163ffffffff1660e01b815260040160206040518083038186803b1580156200184057600080fd5b505afa15801562001855573d6000803e3d6000fd5b505050506040513d60208110156200186c57600080fd5b5051905080156200193b576003546040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc6790916044808201926020929091908290030181600087803b158015620018cc57600080fd5b505af1158015620018e1573d6000803e3d6000fd5b505050506040513d6020811015620018f857600080fd5b50516200193b576040805162461bcd60e51b815260206004820152600c60248201526b4255524e5f4641494c55524560a01b604482015290519081900360640190fd5b620019478a8462002017565b6001600160a01b0380821660009081526007602052604090205491975016156200196d57fe5b6001600160a01b038087166000818152600760205260408082208054858a166001600160a01b031991821617909155600480546001810182558185527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805490921685179091558054825163f2fc7d6760e01b81529182019490945260248101849052336044820181905260648201528d1515608482015290519298509285169263f2fc7d679260a4808301939282900301818387803b15801562001a3257600080fd5b505af115801562001a47573d6000803e3d6000fd5b50505050856001600160a01b0316836001600160a01b0316856001600160a01b03167fef332a01dc11ee04eab2405c2f60c65d8e33b933136b7b085aae6e7a77e8eb99338e8e8b8860405180866001600160a01b03166001600160a01b0316815260200185600381111562001ab857fe5b60ff1681529315156020850152506040808401929092526060830152519081900360800192509050a4505060006002555091969095509350505050565b6002541562001b38576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b0316331462001b8c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116600090815260086020526040902054600160a81b900460ff1662001bf4576040805162461bcd60e51b815260206004820152601060248201526f1053149150511657d11254d05093115160821b604482015290519081900360640190fd5b6001600160a01b038116600081815260086020526040808220805460ff60a81b19169055517f4eefa26623f720c6c56f2a3ecbe4e895171df2f804bb6a917d30d394743256239190a2506000600255565b600062001c528362000ee4565b62001c605750600062001cf2565b6001600160a01b03808416600090815260086020908152604091829020600101548251639015d37160e01b81528685166004820152925193169283928392639015d37192602480840193829003018186803b15801562001cbf57600080fd5b505afa15801562001cd4573d6000803e3d6000fd5b505050506040513d602081101562001ceb57600080fd5b5051925050505b92915050565b6001546001600160a01b031681565b6001600160a01b0316600090815260086020526040902054600160a01b900460ff1690565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b0316331462001da1576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159062001dc857506000546001600160a01b03828116911614155b62001e0c576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8160006001600160a01b03821662001e54576009546001600160a01b0316915062001ea4565b62001e5f8262000ee4565b62001ea4576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d41493d513d0d3d360821b604482015290519081900360640190fd5b506001600160a01b03808216600090815260086020526040902060010154839190811690821662001f3f57806001600160a01b031663631ffbf36040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f0957600080fd5b505afa15801562001f1e573d6000803e3d6000fd5b505050506040513d602081101562001f3557600080fd5b505191506200200f565b806001600160a01b0316639015d371836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801562001f9657600080fd5b505afa15801562001fab573d6000803e3d6000fd5b505050506040513d602081101562001fc257600080fd5b50516200200f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b509250929050565b6000808360038111156200202757fe5b14156200207457306040516200203d9062002250565b6001600160a01b03909116815260405190819003602001906000f0801580156200206b573d6000803e3d6000fd5b50905062001cf2565b60018360038111156200208357fe5b1415620020ce5730826040516200209a906200225e565b6001600160a01b03928316815291166020820152604080519182900301906000f0801580156200206b573d6000803e3d6000fd5b6002836003811115620020dd57fe5b1415620020f357816040516200203d906200226c565b60038360038111156200210257fe5b14156200217b57816001600160a01b03166309ed46076040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200214557600080fd5b505af11580156200215a573d6000803e3d6000fd5b505050506040513d60208110156200217157600080fd5b5051905062001cf2565b6040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f464f5247455f4d4f444560701b604482015290519081900360640190fd5b611a7d806200229b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200220e57805160ff19168380011785556200223e565b828001600101855582156200223e579182015b828111156200223e57825182559160200191906001019062002221565b506200224c9291506200227a565b5090565b6103db8062003d1883390190565b61068f80620040f383390190565b61018a806200478283390190565b6200229791905b808211156200224c576000815560010162002281565b9056fe60806040523480156200001157600080fd5b5060405162001a7d38038062001a7d833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b038316620000d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166200014657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5a45524f5f50524f544f434f4c00000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b038086166001600160a01b03199283161790925560038054858416908316179055600480549284169290911691909117905562000197816001600160e01b03620001a016565b505050620006d9565b6001600160a01b0381166200021657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200029157600080fd5b8101908080516040519392919084640100000000821115620002b257600080fd5b908301906020820185811115620002c857600080fd5b8251640100000000811182820188101715620002e357600080fd5b82525081516020918201929091019080838360005b8381101562000312578181015183820152602001620002f8565b50505050905090810190601f168015620003405780820380516001836020036101000a031916815260200191505b506040525050509050600381511015620003bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f56455253494f4e0000000000000000000000000000000000604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b60208310620003fa5780518252601f199092019160209182019101620003d9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b0316929092149150620004a3905057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f56455253494f4e5f555345440000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156200052c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f414c52454144595f524547495354455245440000000000000000000000000000604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b60208310620005f55780518252601f199092019160209182019101620005d4565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b838110156200069a57818101518382015260200162000680565b50505050905090810190601f168015620006c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61139480620006e96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638ce74426116100a2578063e30c397811610071578063e30c39781461030d578063e6c09edf14610315578063e823d5cf1461033b578063f2bdeea614610361578063f2fde38b146104055761010b565b80638ce744261461029d5780638da5cb5b146102a55780639015d371146102ad578063c3c5a547146102e75761010b565b80635bfa1b68116100de5780635bfa1b681461024a578063631ffbf314610270578063715018a614610278578063845affc8146102805761010b565b80634420e486146101105780634e71e0c81461013857806352bfe7891461014057806354fd4d5014610164575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661042b565b005b6101366104d1565b610148610583565b604080516001600160a01b039092168252519081900360200190f35b61016c6105b3565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156101ad578181015183820152602001610195565b50505050905090810190601f1680156101da5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6101366004803603602081101561026057600080fd5b50356001600160a01b0316610823565b61014861097c565b61013661098b565b6101486004803603602081101561029657600080fd5b5035610a23565b610148610a4a565b610148610a59565b6102d3600480360360208110156102c357600080fd5b50356001600160a01b0316610a68565b604080519115158252519081900360200190f35b6102d3600480360360208110156102fd57600080fd5b50356001600160a01b0316610a8b565b610148610aa9565b6101366004803603602081101561032b57600080fd5b50356001600160a01b0316610ab8565b6101366004803603602081101561035157600080fd5b50356001600160a01b0316610c3e565b6101486004803603602081101561037757600080fd5b810190602081018135600160201b81111561039157600080fd5b8201836020820111156103a357600080fd5b803590602001918460018302840111600160201b831117156103c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dd6945050505050565b6101366004803603602081101561041b57600080fd5b50356001600160a01b0316610dfc565b6002541561046d576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146104c0576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6104c981610ed5565b506000600255565b6001546001600160a01b0316331461051f576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6005805460009190600019810190811061059957fe5b6000918252602090912001546001600160a01b0316905090565b606080600360009054906101000a90046001600160a01b03166001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b15801561060457600080fd5b505afa158015610618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561064157600080fd5b8101908080516040519392919084600160201b82111561066057600080fd5b90830190602082018581111561067557600080fd5b8251600160201b81118282018810171561068e57600080fd5b82525081516020918201929091019080838360005b838110156106bb5781810151838201526020016106a3565b50505050905090810190601f1680156106e85780820380516001836020036101000a031916815260200191505b5060408181526004805463054fd4d560e41b845291519698506001600160a01b03909116956354fd4d50955081830194506000935091829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561076f57600080fd5b8101908080516040519392919084600160201b82111561078e57600080fd5b9083019060208201858111156107a357600080fd5b8251600160201b8111828201881017156107bc57600080fd5b82525081516020918201929091019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b5060405250505090509091565b60025415610865576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b031633146108b8576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381166000908152600760205260409020805460ff1680156108e857508054610100900460ff16155b610932576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b805461ff0019166101001781556040516001600160a01b038316907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a250506000600255565b6004546001600160a01b031681565b6000546001600160a01b031633146109d9576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60058181548110610a3057fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031681565b6000546001600160a01b031681565b6001600160a01b0316600090815260076020526040902054610100900460ff1690565b6001600160a01b031660009081526007602052604090205460ff1690565b6001546001600160a01b031681565b60025415610afa576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610b4d576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610b9c576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b610ba581610a68565b610bef576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805461ff0019169055517ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe9190a2506000600255565b60025415610c80576040805162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b604482015290519081900360640190fd5b60016002556000546001600160a01b03163314610cd3576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6004546001600160a01b0382811691161415610d2c576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b610d3581610a68565b610d7f576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0dce6c7e4b7c18563c67d50415c83afaa4c165d8452c6b51659c1bfa2435f3cb90600090a350506000600255565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6000546001600160a01b03163314610e4a576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b03811615801590610e7057506000546001600160a01b03828116911614155b610eb3576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116610f29576040805162461bcd60e51b815260206004820152601660248201527524a72b20a624a22fa4a6a82622a6a2a72a20aa24a7a760511b604482015290519081900360640190fd5b6060816001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015610f6457600080fd5b505afa158015610f78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fa157600080fd5b8101908080516040519392919084600160201b821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251600160201b811182820188101715610fee57600080fd5b82525081516020918201929091019080838360005b8381101561101b578181015183820152602001611003565b50505050905090810190601f1680156110485780820380516001836020036101000a031916815260200191505b50604052505050905060038151101561109a576040805162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fab22a929a4a7a760891b604482015290519081900360640190fd5b60006001600160a01b03166006826040518082805190602001908083835b602083106110d75780518252601f1990920191602091820191016110b8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b03169290921491506111549050576040805162461bcd60e51b815260206004820152600c60248201526b15915494d253d397d554d15160a21b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16156111b7576040805162461bcd60e51b81526020600482015260126024820152711053149150511657d49151d254d51154915160721b604482015290519081900360640190fd5b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0385166001600160a01b0319909116811790915560408051808201825283815260208181019485526000938452600781529282902090518154945115156101000261ff001991151560ff19909616959095171693909317909255905182518492600692859290918291908401908083835b6020831061127e5780518252601f19909201916020918201910161125f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852080546001600160a01b0319166001600160a01b039788161790558185528651858301528651958816957fb3eccf73f39b1c07947c780b2b39df2a1bb058b4037b0a42d0881ca1a028a13295889550935083929183019185019080838360005b83811015611321578181015183820152602001611309565b50505050905090810190601f16801561134e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505056fea265627a7a72315820ebe8f498a2a9a6d5143737847f60a44a37e4e4722213694801d5a3021cf87aec64736f6c634300050b0032608060405234801561001057600080fd5b506040516103db3803806103db8339818101604052602081101561003357600080fd5b505180610048816001600160e01b0361004f16565b50506100e6565b6001600160a01b0381166100c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b600060405180806103ba60219139604051908190036021019020929092555050565b6102c5806100f56000396000f3fe6080604052600436106100345760003560e01c80635c60da1b146100785780637b103999146100a95780638ce74426146100be575b600061003e6100d3565b90506001600160a01b03811661005357600080fd5b60405136600082376000803683855af43d806000843e818015610074578184f35b8184fd5b34801561008457600080fd5b5061008d6100d3565b604080516001600160a01b039092168252519081900360200190f35b3480156100b557600080fd5b5061008d6101c8565b3480156100ca57600080fd5b5061008d6101eb565b6000806100de6101c8565b60408051633a731b2f60e11b815230600482015281519293506000926001600160a01b038516926374e6365e9260248082019391829003018186803b15801561012657600080fd5b505afa15801561013a573d6000803e3d6000fd5b505050506040513d604081101561015057600080fd5b506020908101516040805163631ffbf360e01b815290519193506001600160a01b0384169263631ffbf392600480840193829003018186803b15801561019557600080fd5b505afa1580156101a9573d6000803e3d6000fd5b505050506040513d60208110156101bf57600080fd5b50519250505090565b600080604051808061027060219139604051908190036021019020549392505050565b6000806101f66101c8565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561023d57600080fd5b505afa158015610251573d6000803e3d6000fd5b505050506040513d604081101561026757600080fd5b50519291505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a72315820e42b816ccaf235c960e6fa24f5a0031ab5057b5dcfeec5fb5811fc465f2a9e3b64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161068f38038061068f8339818101604052604081101561003357600080fd5b5080516020909101518161004f816001600160e01b0361006916565b50610062816001600160e01b0361010016565b5050610122565b6001600160a01b0381166100de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f414444524553530000000000000000000000000000000000000000604482015290519081900360640190fd5b6000604051808061066e60219139604051908190036021019020929092555050565b6000604051808061064760279139604051908190036027019020929092555050565b610516806101316000396000f3fe60806040526004361061003f5760003560e01c80633659cfe6146100835780635c60da1b146100b85780637b103999146100e95780638ce74426146100fe575b6000610049610113565b90506001600160a01b03811661005e57600080fd5b60405136600082376000803683855af43d806000843e81801561007f578184f35b8184fd5b34801561008f57600080fd5b506100b6600480360360208110156100a657600080fd5b50356001600160a01b0316610136565b005b3480156100c457600080fd5b506100cd610113565b604080516001600160a01b039092168252519081900360200190f35b3480156100f557600080fd5b506100cd6103ae565b34801561010a57600080fd5b506100cd6103d1565b600080604051808061049a60279139604051908190036027019020549392505050565b6000306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561017157600080fd5b505afa158015610185573d6000803e3d6000fd5b505050506040513d602081101561019b57600080fd5b505190506001600160a01b0381166101e5576040805162461bcd60e51b81526020600482015260086024820152672727afa7aba722a960c11b604482015290519081900360640190fd5b6001600160a01b0381163314610231576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b816001600160a01b0316610243610113565b6001600160a01b03161415610295576040805162461bcd60e51b815260206004820152601360248201527229a0a6a2afa4a6a82622a6a2a72a20aa24a7a760691b604482015290519081900360640190fd5b600061029f6103ae565b9050806001600160a01b031663c4897cd56102b86103d1565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b15801561030557600080fd5b505afa158015610319573d6000803e3d6000fd5b505050506040513d602081101561032f57600080fd5b505161036c5760405162461bcd60e51b81526004018080602001828103825260228152602001806104786022913960400191505060405180910390fd5b61037583610455565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2505050565b60008060405180806104c160219139604051908190036021019020549392505050565b6000806103dc6103ae565b60408051633a731b2f60e11b815230600482015281519293506001600160a01b038416926374e6365e92602480840193919291829003018186803b15801561042357600080fd5b505afa158015610437573d6000803e3d6000fd5b505050506040513d604081101561044d57600080fd5b505192915050565b6000604051808061049a6027913960405190819003602701902092909255505056fe494e56414c49445f50524f544f434f4c5f4f525f494d504c454d454e544154494f4e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279a265627a7a723158206acaacfc4d1703159e6ea7ffa104958090c83e81bc8b4d1c1887a5b9b1f3f4fd64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e696d706c656d656e746174696f6e6f72672e6c6f6f7072696e672e70726f746f636f6c2e76332e7265676973747279608060405234801561001057600080fd5b5060405161018a38038061018a8339818101604052602081101561003357600080fd5b50516040516000908060226101688239604051908190036022019020929092555050610104806100646000396000f3fe608060405260043610601c5760003560e01c80635c60da1b14605c575b60006024608a565b90506001600160a01b038116603857600080fd5b60405136600082376000803683855af43d806000843e8180156058578184f35b8184fd5b348015606757600080fd5b50606e608a565b604080516001600160a01b039092168252519081900360200190f35b60008060405180806100ae6022913960405190819003602201902054939250505056fe6f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a72315820e4b97c71f12dd7e59216bd5fe82f370a4ede95bdb3a8f0b59f0836a47582a0eb64736f6c634300050b00326f72672e6c6f6f7072696e672e70726f746f636f6c2e73696d706c652e70726f7879a265627a7a7231582058a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d064736f6c634300050b0032

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

000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd

-----Decoded View---------------
Arg [0] : _lrcAddress (address): 0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000bbbbca6a901c926f240b89eacb641d8aec7aeafd


Swarm Source

bzzr://58a14c5d8bb77be76c1db74e3193864be695c251ab387d10d480cfe4bd0801d0

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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