false
true
0

Contract Address Details

0x768CAf810Ea58F32054DA66BA951c14Ca998d19F

Contract Name
RouterAllowlist
Creator
0xd4627e–90c83d at 0x725c30–d70cf9
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
27553647
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
RouterAllowlist




Optimization enabled
false
Compiler version
v0.8.19+commit.7dd6d404




EVM Version




Verified at
2026-05-08T07:02:15.621410Z

Constructor Arguments

0000000000000000000000005ce9c2e3e803712e6fec5368968b61a55d851cdf000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206

Arg [0] (address) : 0x5ce9c2e3e803712e6fec5368968b61a55d851cdf
Arg [1] (address) : 0xbde48624f9e1dd4107df324d1ba3c07004640206

              

contracts/security/RouterAllowlist.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { GuardianAdmin } from "contracts/base/GuardianAdmin.sol";
import { IRouterAllowlist } from "contracts/interfaces/IRouterAllowlist.sol";

/// @title RouterAllowlist
/// @notice On-chain registry of allowed DEX routers for MultiSwapRouter
contract RouterAllowlist is GuardianAdmin, IRouterAllowlist {
    /// ERRORS ///
    error RouterNotAllowed(address router);
    error FactoryNotAllowed(address factory);
    error CustomDeployerNotAllowed(address factory, address deployer);
    error HookNotAllowed(address hook);
    error BridgeNotAllowed(address bridge);
    error SelectorNotAllowed(address bridge, bytes4 selector);
    error BridgeRequiresSelectors();
    error DataLengthMismatch();
    error NotAContract(address addr);

    /// EVENTS ///

    event RouterAllowed(address indexed router);
    event RouterBlocked(address indexed router);
    event FactoryAllowed(address indexed factory);
    event FactoryBlocked(address indexed factory);
    event CustomDeployerAllowed(
        address indexed factory, address indexed deployer
    );
    event CustomDeployerBlocked(
        address indexed factory, address indexed deployer
    );
    event HookAllowed(address indexed hook);
    event HookBlocked(address indexed hook);
    event BridgeAllowed(address indexed bridge);
    event BridgeBlocked(address indexed bridge);
    event SelectorAllowed(address indexed bridge, bytes4 indexed selector);
    event SelectorBlocked(address indexed bridge, bytes4 indexed selector);

    /// STORAGE ///

    /// @inheritdoc IRouterAllowlist
    mapping(address => bool) public override isAllowed;
    address[] public allowedRouters;
    mapping(address => uint256) private _routerIndex;

    /// @inheritdoc IRouterAllowlist
    mapping(address => bool) public override isAllowedFactory;
    address[] public allowedFactories;
    mapping(address => uint256) private _factoryIndex;

    /// @inheritdoc IRouterAllowlist
    mapping(address => mapping(address => bool))
        public
        override isAllowedCustomDeployer;
    /// @inheritdoc IRouterAllowlist
    mapping(address => bool) public override isAllowedHook;
    address[] public allowedHooks;
    mapping(address => uint256) private _hookIndex;

    /// @inheritdoc IRouterAllowlist
    mapping(address => bool) public override isAllowedBridge;
    address[] public allowedBridges;
    mapping(address => uint256) private _bridgeIndex;

    /// @inheritdoc IRouterAllowlist
    mapping(address => mapping(bytes4 => bool))
        public
        override isAllowedSelector;
    mapping(address => bytes4[]) private _bridgeSelectors;
    mapping(address => mapping(bytes4 => uint256)) private
        _selectorIndexPlusOne;

    /// CONSTRUCTOR ///

    /// @param admin_ Address of the admin
    /// @param guardian_ Address of the initial guardian (may be zero)
    constructor(
        address admin_,
        address guardian_
    ) GuardianAdmin(admin_, guardian_) { }

    /// READ FUNCTIONS ///

    /// @inheritdoc IRouterAllowlist
    function requireAllowed(
        address router
    ) external view override {
        if (!isAllowed[router]) revert RouterNotAllowed(router);
    }

    /// @inheritdoc IRouterAllowlist
    function requireAllowedFactory(
        address factory
    ) external view override {
        if (!isAllowedFactory[factory]) revert FactoryNotAllowed(factory);
    }

    /// @inheritdoc IRouterAllowlist
    function requireAllowedCustomDeployer(
        address factory,
        address deployer
    ) external view override {
        if (!isAllowedCustomDeployer[factory][deployer]) {
            revert CustomDeployerNotAllowed(factory, deployer);
        }
    }

    /// @inheritdoc IRouterAllowlist
    function requireAllowedHook(
        address hook
    ) external view override {
        if (!isAllowedHook[hook]) revert HookNotAllowed(hook);
    }

    /// @inheritdoc IRouterAllowlist
    function requireAllowedBridge(
        address bridge
    ) external view override {
        if (!isAllowedBridge[bridge]) revert BridgeNotAllowed(bridge);
    }

    /// @inheritdoc IRouterAllowlist
    function requireAllowedSelector(
        address bridge,
        bytes4 selector
    ) external view override {
        if (!isAllowedSelector[bridge][selector]) {
            revert SelectorNotAllowed(bridge, selector);
        }
    }

    /// @inheritdoc IRouterAllowlist
    function bridgeSelectors(
        address bridge
    ) external view override returns (bytes4[] memory) {
        return _bridgeSelectors[bridge];
    }

    /// @notice Get the number of allowed routers
    /// @return The number of allowed routers
    function allowedRoutersLength() external view returns (uint256) {
        return allowedRouters.length;
    }

    /// @notice Get the number of allowed factories
    /// @return The number of allowed factories
    function allowedFactoriesLength() external view returns (uint256) {
        return allowedFactories.length;
    }

    /// WRITE FUNCTIONS ///

    /// @notice Set the allowed status for a single router
    /// @param router The router address
    /// @param allowed Whether the router is allowed
    function setRouter(
        address router,
        bool allowed
    ) external onlyAdmin {
        _setRouter(router, allowed);
    }

    /// @notice Set the allowed status for a single factory
    /// @param factory The factory address
    /// @param allowed Whether the factory is allowed
    function setFactory(
        address factory,
        bool allowed
    ) external onlyAdmin {
        _setFactory(factory, allowed);
    }

    /// @notice Set the allowed status for multiple routers
    /// @param routers Array of router addresses
    /// @param allowed Array of allowed statuses
    function setRouters(
        address[] calldata routers,
        bool[] calldata allowed
    ) external onlyAdmin {
        uint256 length = routers.length;
        if (length != allowed.length) revert DataLengthMismatch();
        for (uint256 i; i < length;) {
            _setRouter(routers[i], allowed[i]);
            unchecked {
                ++i;
            }
        }
    }

    /// @notice Set the allowed status for multiple factories
    /// @param factories Array of factory addresses
    /// @param allowed Array of allowed statuses
    function setFactories(
        address[] calldata factories,
        bool[] calldata allowed
    ) external onlyAdmin {
        uint256 length = factories.length;
        if (length != allowed.length) revert DataLengthMismatch();
        for (uint256 i; i < length;) {
            _setFactory(factories[i], allowed[i]);
            unchecked {
                ++i;
            }
        }
    }

    /// @notice Set the allowed status for a custom pool deployer
    /// @param factory The factory address
    /// @param deployer The custom pool deployer address
    /// @param allowed Whether the custom deployer is allowed
    function setCustomDeployer(
        address factory,
        address deployer,
        bool allowed
    ) external onlyAdmin {
        _setCustomDeployer(factory, deployer, allowed);
    }

    /// @notice Set the allowed status for multiple custom pool deployers
    /// @param factory The factory address
    /// @param deployers Array of custom deployer addresses
    /// @param allowed Array of allowed statuses
    function setCustomDeployers(
        address factory,
        address[] calldata deployers,
        bool[] calldata allowed
    ) external onlyAdmin {
        uint256 length = deployers.length;
        if (length != allowed.length) revert DataLengthMismatch();
        for (uint256 i; i < length;) {
            _setCustomDeployer(factory, deployers[i], allowed[i]);
            unchecked {
                ++i;
            }
        }
    }

    /// @notice Set the allowed status for a v4 hook
    /// @param hook The hook address
    /// @param allowed Whether the hook is allowed
    function setHook(
        address hook,
        bool allowed
    ) external onlyAdmin {
        _setHook(hook, allowed);
    }

    /// @notice Set the allowed status for multiple v4 hooks
    /// @param hooks Array of hook addresses
    /// @param allowed Array of allowed statuses
    function setHooks(
        address[] calldata hooks,
        bool[] calldata allowed
    ) external onlyAdmin {
        uint256 length = hooks.length;
        if (length != allowed.length) revert DataLengthMismatch();
        for (uint256 i; i < length;) {
            _setHook(hooks[i], allowed[i]);
            unchecked {
                ++i;
            }
        }
    }

    /// @notice Get the number of allowed hooks
    /// @return The number of allowed hooks
    function allowedHooksLength() external view returns (uint256) {
        return allowedHooks.length;
    }

    /// @notice Get the number of allowed bridges
    /// @return The number of allowed bridges
    function allowedBridgesLength() external view returns (uint256) {
        return allowedBridges.length;
    }

    /// @notice Allow a bridge with at least one function selector
    /// @param bridge The bridge address
    /// @param selectors Array of allowed function selectors (must be non-empty)
    function setBridge(
        address bridge,
        bytes4[] calldata selectors
    ) external onlyAdmin {
        if (selectors.length == 0) revert BridgeRequiresSelectors();
        _setBridge(bridge, true);
        _replaceBridgeSelectors(bridge, selectors);
    }

    /// @notice Remove a bridge from the allowlist
    /// @param bridge The bridge address
    function removeBridge(
        address bridge
    ) external onlyAdmin {
        _clearBridgeSelectors(bridge);
        _setBridge(bridge, false);
    }

    /// @notice Emergency-disable a bridge without waiting on governance.
    /// Can only block an already-configured bridge; re-enabling still
    /// requires the admin path.
    function emergencyRemoveBridge(
        address bridge
    ) external onlyGuardianOrAdmin {
        _clearBridgeSelectors(bridge);
        _setBridge(bridge, false);
    }

    /// @notice Set the allowed status for a bridge function selector
    /// @param bridge The bridge contract address
    /// @param selector The function selector
    /// @param allowed Whether the selector is allowed
    function setSelector(
        address bridge,
        bytes4 selector,
        bool allowed
    ) external onlyAdmin {
        _setSelector(bridge, selector, allowed);
    }

    /// @notice Set the allowed status for multiple bridge function selectors
    /// @param bridge The bridge contract address
    /// @param selectors Array of function selectors
    /// @param allowed Array of allowed statuses
    function setSelectors(
        address bridge,
        bytes4[] calldata selectors,
        bool[] calldata allowed
    ) external onlyAdmin {
        uint256 length = selectors.length;
        if (length != allowed.length) revert DataLengthMismatch();
        for (uint256 i; i < length;) {
            _setSelector(bridge, selectors[i], allowed[i]);
            unchecked {
                ++i;
            }
        }
    }

    /// INTERNAL FUNCTIONS ///

    function _setRouter(
        address router,
        bool allowed
    ) internal {
        if (allowed && router.code.length == 0) revert NotAContract(router);
        bool currentlyAllowed = isAllowed[router];
        if (currentlyAllowed == allowed) return;

        isAllowed[router] = allowed;
        if (allowed) {
            _routerIndex[router] = allowedRouters.length;
            allowedRouters.push(router);
            emit RouterAllowed(router);
        } else {
            uint256 index = _routerIndex[router];
            uint256 lastIndex = allowedRouters.length - 1;
            if (index != lastIndex) {
                address lastRouter = allowedRouters[lastIndex];
                allowedRouters[index] = lastRouter;
                _routerIndex[lastRouter] = index;
            }
            allowedRouters.pop();
            delete _routerIndex[router];
            emit RouterBlocked(router);
        }
    }

    function _setFactory(
        address factory,
        bool allowed
    ) internal {
        bool currentlyAllowed = isAllowedFactory[factory];
        if (currentlyAllowed == allowed) return;

        isAllowedFactory[factory] = allowed;
        if (allowed) {
            _factoryIndex[factory] = allowedFactories.length;
            allowedFactories.push(factory);
            emit FactoryAllowed(factory);
        } else {
            uint256 index = _factoryIndex[factory];
            uint256 lastIndex = allowedFactories.length - 1;
            if (index != lastIndex) {
                address lastFactory = allowedFactories[lastIndex];
                allowedFactories[index] = lastFactory;
                _factoryIndex[lastFactory] = index;
            }
            allowedFactories.pop();
            delete _factoryIndex[factory];
            emit FactoryBlocked(factory);
        }
    }

    function _setCustomDeployer(
        address factory,
        address deployer,
        bool allowed
    ) internal {
        bool currentlyAllowed = isAllowedCustomDeployer[factory][deployer];
        if (currentlyAllowed == allowed) return;

        isAllowedCustomDeployer[factory][deployer] = allowed;
        if (allowed) {
            emit CustomDeployerAllowed(factory, deployer);
        } else {
            emit CustomDeployerBlocked(factory, deployer);
        }
    }

    function _setHook(
        address hook,
        bool allowed
    ) internal {
        bool currentlyAllowed = isAllowedHook[hook];
        if (currentlyAllowed == allowed) return;

        isAllowedHook[hook] = allowed;
        if (allowed) {
            _hookIndex[hook] = allowedHooks.length;
            allowedHooks.push(hook);
            emit HookAllowed(hook);
        } else {
            uint256 index = _hookIndex[hook];
            uint256 lastIndex = allowedHooks.length - 1;
            if (index != lastIndex) {
                address lastHook = allowedHooks[lastIndex];
                allowedHooks[index] = lastHook;
                _hookIndex[lastHook] = index;
            }
            allowedHooks.pop();
            delete _hookIndex[hook];
            emit HookBlocked(hook);
        }
    }

    function _setBridge(
        address bridge,
        bool allowed
    ) internal {
        if (allowed && bridge.code.length == 0) revert NotAContract(bridge);
        bool currentlyAllowed = isAllowedBridge[bridge];
        if (currentlyAllowed == allowed) return;

        isAllowedBridge[bridge] = allowed;
        if (allowed) {
            _bridgeIndex[bridge] = allowedBridges.length;
            allowedBridges.push(bridge);
            emit BridgeAllowed(bridge);
        } else {
            uint256 index = _bridgeIndex[bridge];
            uint256 lastIndex = allowedBridges.length - 1;
            if (index != lastIndex) {
                address lastBridge = allowedBridges[lastIndex];
                allowedBridges[index] = lastBridge;
                _bridgeIndex[lastBridge] = index;
            }
            allowedBridges.pop();
            delete _bridgeIndex[bridge];
            emit BridgeBlocked(bridge);
        }
    }

    function _setSelector(
        address bridge,
        bytes4 selector,
        bool allowed
    ) internal {
        bool currentlyAllowed = isAllowedSelector[bridge][selector];
        if (currentlyAllowed == allowed) return;

        isAllowedSelector[bridge][selector] = allowed;
        if (allowed) {
            _selectorIndexPlusOne[bridge][selector] =
                _bridgeSelectors[bridge].length + 1;
            _bridgeSelectors[bridge].push(selector);
            emit SelectorAllowed(bridge, selector);
        } else {
            uint256 indexPlusOne = _selectorIndexPlusOne[bridge][selector];
            if (indexPlusOne != 0) {
                uint256 index = indexPlusOne - 1;
                uint256 lastIndex = _bridgeSelectors[bridge].length - 1;
                if (index != lastIndex) {
                    bytes4 lastSelector = _bridgeSelectors[bridge][lastIndex];
                    _bridgeSelectors[bridge][index] = lastSelector;
                    _selectorIndexPlusOne[bridge][lastSelector] = index + 1;
                }
                _bridgeSelectors[bridge].pop();
                delete _selectorIndexPlusOne[bridge][selector];
            }
            emit SelectorBlocked(bridge, selector);
        }
    }

    function _replaceBridgeSelectors(
        address bridge,
        bytes4[] calldata selectors
    ) internal {
        _clearBridgeSelectors(bridge);
        for (uint256 i; i < selectors.length;) {
            _setSelector(bridge, selectors[i], true);
            unchecked {
                ++i;
            }
        }
    }

    function _clearBridgeSelectors(
        address bridge
    ) internal {
        while (_bridgeSelectors[bridge].length > 0) {
            _setSelector(
                bridge,
                _bridgeSelectors[bridge][_bridgeSelectors[bridge].length - 1],
                false
            );
        }
    }
}
        

contracts/base/GuardianAdmin.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { Admin } from "contracts/base/Admin.sol";

/// @title GuardianAdmin
/// @author vfat.tools
/// @notice Extends Admin with an optional guardian that can perform
/// emergency disable-only actions on inheriting bridge contracts.
abstract contract GuardianAdmin is Admin {
    /// ERRORS ///

    /// @notice Thrown when the caller is neither guardian nor admin
    error NotGuardianOrAdminError();

    /// EVENTS ///

    /// @notice Emitted when a new guardian is set
    /// @param oldGuardian Address of the old guardian
    /// @param newGuardian Address of the new guardian
    event GuardianSet(address oldGuardian, address newGuardian);

    /// STORAGE ///

    /// @notice Address of the current emergency guardian
    address public guardian;

    /// MODIFIERS ///

    /// @dev Restricts a function to the guardian or admin
    modifier onlyGuardianOrAdmin() {
        _onlyGuardianOrAdmin();
        _;
    }

    constructor(
        address admin_,
        address guardian_
    ) Admin(admin_) {
        if (guardian_ != address(0)) {
            emit GuardianSet(address(0), guardian_);
            guardian = guardian_;
        }
    }

    /// @notice Sets a new guardian
    /// @param newGuardian Address of the new guardian
    /// @custom:access Restricted to protocol admin.
    function setGuardian(
        address newGuardian
    ) external onlyAdmin {
        if (newGuardian == guardian) return;
        emit GuardianSet(guardian, newGuardian);
        guardian = newGuardian;
    }

    function _onlyGuardianOrAdmin() internal view {
        if (msg.sender != guardian && msg.sender != admin) {
            revert NotGuardianOrAdminError();
        }
    }
}
          

contracts/interfaces/IRouterAllowlist.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IRouterAllowlist {
    /// @notice Check if a router is allowed
    /// @param router The router address to check
    /// @return True if the router is allowed
    function isAllowed(address router) external view returns (bool);

    /// @notice Revert if the router is not allowed
    /// @param router The router address to check
    function requireAllowed(address router) external view;

    /// @notice Check if a factory is allowed
    /// @param factory The factory address to check
    /// @return True if the factory is allowed
    function isAllowedFactory(address factory) external view returns (bool);

    /// @notice Revert if the factory is not allowed
    /// @param factory The factory address to check
    function requireAllowedFactory(address factory) external view;

    /// @notice Check if a custom pool deployer is allowed for a factory
    /// @param factory The factory address to check
    /// @param deployer The custom pool deployer address to check
    /// @return True if the custom deployer is allowed for the factory
    function isAllowedCustomDeployer(address factory, address deployer) external view returns (bool);

    /// @notice Revert if the custom pool deployer is not allowed for a factory
    /// @param factory The factory address to check
    /// @param deployer The custom pool deployer address to check
    function requireAllowedCustomDeployer(address factory, address deployer) external view;

    /// @notice Check if a v4 hook is allowed
    /// @param hook The hook address to check
    /// @return True if the hook is allowed
    function isAllowedHook(address hook) external view returns (bool);

    /// @notice Revert if the v4 hook is not allowed
    /// @param hook The hook address to check
    function requireAllowedHook(address hook) external view;

    /// @notice Check if a bridge contract is allowed
    /// @param bridge The bridge contract address
    /// @return True if the bridge is allowed
    function isAllowedBridge(address bridge) external view returns (bool);

    /// @notice Revert if the bridge contract is not allowed
    /// @param bridge The bridge contract address
    function requireAllowedBridge(address bridge) external view;

    /// @notice Check if a function selector is allowed for a bridge contract
    /// @param bridge The bridge contract address
    /// @param selector The function selector
    /// @return True if the selector is allowed
    function isAllowedSelector(address bridge, bytes4 selector) external view returns (bool);

    /// @notice Revert if the function selector is not allowed for a bridge contract
    /// @param bridge The bridge contract address
    /// @param selector The function selector
    function requireAllowedSelector(address bridge, bytes4 selector) external view;

    /// @notice Enumerate the currently-allowed function selectors for a bridge
    /// @param bridge The bridge contract address
    /// @return selectors The set of selectors currently marked allowed for the bridge
    function bridgeSelectors(address bridge) external view returns (bytes4[] memory selectors);
}
          

contracts/base/Admin.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/// @title Admin contract
/// @author vfat.tools
/// @notice Provides an administration mechanism allowing restricted functions
abstract contract Admin {
    /// ERRORS ///

    /// @notice Thrown when the caller is not the admin
    error NotAdminError(); //0xb5c42b3b

    /// EVENTS ///

    /// @notice Emitted when a new admin is set
    /// @param oldAdmin Address of the old admin
    /// @param newAdmin Address of the new admin
    event AdminSet(address oldAdmin, address newAdmin);

    /// STORAGE ///

    /// @notice Address of the current admin
    address public admin;

    /// MODIFIERS ///

    /// @dev Restricts a function to the admin
    modifier onlyAdmin() {
        if (msg.sender != admin) revert NotAdminError();
        _;
    }

    /// WRITE FUNCTIONS ///

    /// @param admin_ Address of the admin
    constructor(
        address admin_
    ) {
        emit AdminSet(address(0), admin_);
        admin = admin_;
    }

    /// @notice Sets a new admin
    /// @param newAdmin Address of the new admin
    /// @custom:access Restricted to protocol admin.
    function setAdmin(
        address newAdmin
    ) external onlyAdmin {
        emit AdminSet(admin, newAdmin);
        admin = newAdmin;
    }
}
          

Compiler Settings

{"viaIR":false,"remappings":["solmate/=lib/solmate/src/","@openzeppelin/=lib/openzeppelin-contracts/","@morpho-blue/=lib/morpho-blue/src/","ds-test/=lib/solmate/lib/ds-test/src/","forge-std/=lib/forge-std/src/","morpho-blue/=lib/morpho-blue/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin_","internalType":"address"},{"type":"address","name":"guardian_","internalType":"address"}]},{"type":"error","name":"BridgeNotAllowed","inputs":[{"type":"address","name":"bridge","internalType":"address"}]},{"type":"error","name":"BridgeRequiresSelectors","inputs":[]},{"type":"error","name":"CustomDeployerNotAllowed","inputs":[{"type":"address","name":"factory","internalType":"address"},{"type":"address","name":"deployer","internalType":"address"}]},{"type":"error","name":"DataLengthMismatch","inputs":[]},{"type":"error","name":"FactoryNotAllowed","inputs":[{"type":"address","name":"factory","internalType":"address"}]},{"type":"error","name":"HookNotAllowed","inputs":[{"type":"address","name":"hook","internalType":"address"}]},{"type":"error","name":"NotAContract","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"error","name":"NotAdminError","inputs":[]},{"type":"error","name":"NotGuardianOrAdminError","inputs":[]},{"type":"error","name":"RouterNotAllowed","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"error","name":"SelectorNotAllowed","inputs":[{"type":"address","name":"bridge","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"}]},{"type":"event","name":"AdminSet","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"BridgeAllowed","inputs":[{"type":"address","name":"bridge","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"BridgeBlocked","inputs":[{"type":"address","name":"bridge","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"CustomDeployerAllowed","inputs":[{"type":"address","name":"factory","internalType":"address","indexed":true},{"type":"address","name":"deployer","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"CustomDeployerBlocked","inputs":[{"type":"address","name":"factory","internalType":"address","indexed":true},{"type":"address","name":"deployer","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"FactoryAllowed","inputs":[{"type":"address","name":"factory","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"FactoryBlocked","inputs":[{"type":"address","name":"factory","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"GuardianSet","inputs":[{"type":"address","name":"oldGuardian","internalType":"address","indexed":false},{"type":"address","name":"newGuardian","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"HookAllowed","inputs":[{"type":"address","name":"hook","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"HookBlocked","inputs":[{"type":"address","name":"hook","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RouterAllowed","inputs":[{"type":"address","name":"router","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RouterBlocked","inputs":[{"type":"address","name":"router","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SelectorAllowed","inputs":[{"type":"address","name":"bridge","internalType":"address","indexed":true},{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":true}],"anonymous":false},{"type":"event","name":"SelectorBlocked","inputs":[{"type":"address","name":"bridge","internalType":"address","indexed":true},{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allowedBridges","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowedBridgesLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allowedFactories","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowedFactoriesLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allowedHooks","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowedHooksLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allowedRouters","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowedRoutersLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4[]","name":"","internalType":"bytes4[]"}],"name":"bridgeSelectors","inputs":[{"type":"address","name":"bridge","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyRemoveBridge","inputs":[{"type":"address","name":"bridge","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"guardian","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowedBridge","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowedCustomDeployer","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowedFactory","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowedHook","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAllowedSelector","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"bytes4","name":"","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeBridge","inputs":[{"type":"address","name":"bridge","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowed","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowedBridge","inputs":[{"type":"address","name":"bridge","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowedCustomDeployer","inputs":[{"type":"address","name":"factory","internalType":"address"},{"type":"address","name":"deployer","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowedFactory","inputs":[{"type":"address","name":"factory","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowedHook","inputs":[{"type":"address","name":"hook","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireAllowedSelector","inputs":[{"type":"address","name":"bridge","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBridge","inputs":[{"type":"address","name":"bridge","internalType":"address"},{"type":"bytes4[]","name":"selectors","internalType":"bytes4[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCustomDeployer","inputs":[{"type":"address","name":"factory","internalType":"address"},{"type":"address","name":"deployer","internalType":"address"},{"type":"bool","name":"allowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCustomDeployers","inputs":[{"type":"address","name":"factory","internalType":"address"},{"type":"address[]","name":"deployers","internalType":"address[]"},{"type":"bool[]","name":"allowed","internalType":"bool[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFactories","inputs":[{"type":"address[]","name":"factories","internalType":"address[]"},{"type":"bool[]","name":"allowed","internalType":"bool[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFactory","inputs":[{"type":"address","name":"factory","internalType":"address"},{"type":"bool","name":"allowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGuardian","inputs":[{"type":"address","name":"newGuardian","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHook","inputs":[{"type":"address","name":"hook","internalType":"address"},{"type":"bool","name":"allowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHooks","inputs":[{"type":"address[]","name":"hooks","internalType":"address[]"},{"type":"bool[]","name":"allowed","internalType":"bool[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouter","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"bool","name":"allowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouters","inputs":[{"type":"address[]","name":"routers","internalType":"address[]"},{"type":"bool[]","name":"allowed","internalType":"bool[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSelector","inputs":[{"type":"address","name":"bridge","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"},{"type":"bool","name":"allowed","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSelectors","inputs":[{"type":"address","name":"bridge","internalType":"address"},{"type":"bytes4[]","name":"selectors","internalType":"bytes4[]"},{"type":"bool[]","name":"allowed","internalType":"bool[]"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b50604051620022f7380380620022f7833981016040819052620000349162000125565b60408051600081526001600160a01b03841660208201528391839183917fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97910160405180910390a1600080546001600160a01b0319166001600160a01b03928316179055811615620000fe5760408051600081526001600160a01b03831660208201527fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc14138910160405180910390a1600180546001600160a01b0319166001600160a01b0383161790555b505050506200015d565b80516001600160a01b03811681146200012057600080fd5b919050565b600080604083850312156200013957600080fd5b620001448362000108565b9150620001546020840162000108565b90509250929050565b61218a806200016d6000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063704b6c0211610130578063c3c64674116100b8578063dbca09d21161007c578063dbca09d21461053e578063eaec91c514610551578063f236b0f514610564578063f83f443214610577578063f851a4401461058a57600080fd5b8063c3c64674146104bf578063c8998783146104d2578063cda600a1146104e5578063d53f8ff914610513578063d6e6bb4b1461053657600080fd5b80638a0dac4a116100ff5780638a0dac4a14610450578063965106d314610463578063983b56e314610476578063acc0844c14610489578063babcc5391461049c57600080fd5b8063704b6c021461040457806371013c10146104175780637547dbc31461042a578063833e8db11461043d57600080fd5b80632901c25a116101be57806339222b891161018257806339222b89146103a5578063452a9320146103b8578063457dc7b7146103cb578063597a9743146103de578063674acc2f146103f157600080fd5b80632901c25a1461033157806329e899d914610339578063344ba6fd1461034c5780633482d4641461036f5780633910ba951461037757600080fd5b8063198a8fa111610205578063198a8fa1146102d35780631b29b07e146102e65780631cafddfd146102f95780631f2d0dac1461030c57806320b7bd1c1461031e57600080fd5b806304df017d146102375780630b3539841461024c57806312477324146102755780631302e31a146102a8575b600080fd5b61024a610245366004611d7d565b61059d565b005b61025f61025a366004611d7d565b6105df565b60405161026c9190611d9f565b60405180910390f35b610298610283366004611d7d565b60056020526000908152604090205460ff1681565b604051901515815260200161026c565b6102bb6102b6366004611ded565b610678565b6040516001600160a01b03909116815260200161026c565b61024a6102e1366004611e1e565b6106a2565b61024a6102f4366004611e9d565b610714565b61024a610307366004611f09565b6107d1565b600a545b60405190815260200161026c565b61024a61032c366004611d7d565b610839565b600654610310565b61024a610347366004611d7d565b61087d565b61029861035a366004611d7d565b60096020526000908152604090205460ff1681565b600354610310565b610298610385366004611f5c565b600860209081526000928352604080842090915290825290205460ff1681565b61024a6103b3366004611f86565b6108c1565b6001546102bb906001600160a01b031681565b61024a6103d9366004611f5c565b610980565b61024a6103ec366004611e9d565b6109d9565b61024a6103ff366004611e9d565b610a8e565b61024a610412366004611d7d565b610b43565b61024a610425366004612017565b610bd7565b61024a610438366004611d7d565b610c0c565b61024a61044b366004612017565b610c50565b61024a61045e366004611d7d565b610c85565b61024a610471366004611d7d565b610d2c565b6102bb610484366004611ded565b610d70565b61024a610497366004612041565b610d80565b6102986104aa366004611d7d565b60026020526000908152604090205460ff1681565b61024a6104cd366004612017565b610db6565b6102bb6104e0366004611ded565b610deb565b6102986104f3366004611e1e565b600f60209081526000928352604080842090915290825290205460ff1681565b610298610521366004611d7d565b600c6020526000908152604090205460ff1681565b600d54610310565b61024a61054c366004611d7d565b610dfb565b6102bb61055f366004611ded565b610e03565b61024a610572366004611f86565b610e13565b61024a610585366004612084565b610ec9565b6000546102bb906001600160a01b031681565b6000546001600160a01b031633146105c85760405163b5c42b3b60e01b815260040160405180910390fd5b6105d181610eff565b6105dc816000610f88565b50565b6001600160a01b03811660009081526010602090815260409182902080548351818402810184019094528084526060939283018282801561066c57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b0319168152602001906004019060208260030104928301926001038202915080841161062e5790505b50505050509050919050565b6006818154811061068857600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0382166000908152600f602090815260408083206001600160e01b03198516845290915290205460ff16610710576040516375e81e2960e11b81526001600160a01b03831660048201526001600160e01b0319821660248201526044015b60405180910390fd5b5050565b6000546001600160a01b0316331461073f5760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610760576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c9576107c1868683818110610780576107806120b0565b90506020020160208101906107959190611d7d565b8585848181106107a7576107a76120b0565b90506020020160208101906107bc91906120c6565b6111d8565b600101610763565b505050505050565b6000546001600160a01b031633146107fc5760405163b5c42b3b60e01b815260040160405180910390fd5b600081900361081e5760405163715f254d60e01b815260040160405180910390fd5b610829836001610f88565b6108348383836113ea565b505050565b6001600160a01b0381166000908152600c602052604090205460ff166105dc5760405163e1a2530b60e01b81526001600160a01b0382166004820152602401610707565b6001600160a01b03811660009081526009602052604090205460ff166105dc576040516357b9f0bd60e11b81526001600160a01b0382166004820152602401610707565b6000546001600160a01b031633146108ec5760405163b5c42b3b60e01b815260040160405180910390fd5b8281811461090d576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156109775761096f8787878481811061092e5761092e6120b0565b90506020020160208101906109439190611d7d565b868685818110610955576109556120b0565b905060200201602081019061096a91906120c6565b61143e565b600101610910565b50505050505050565b6001600160a01b0380831660009081526008602090815260408083209385168352929052205460ff166107105760405163c14e560960e01b81526001600160a01b03808416600483015282166024820152604401610707565b6000546001600160a01b03163314610a045760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610a25576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c957610a86868683818110610a4557610a456120b0565b9050602002016020810190610a5a9190611d7d565b858584818110610a6c57610a6c6120b0565b9050602002016020810190610a8191906120c6565b61153d565b600101610a28565b6000546001600160a01b03163314610ab95760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610ada576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c957610b3b868683818110610afa57610afa6120b0565b9050602002016020810190610b0f9190611d7d565b858584818110610b2157610b216120b0565b9050602002016020810190610b3691906120c6565b61178d565b600101610add565b6000546001600160a01b03163314610b6e5760405163b5c42b3b60e01b815260040160405180910390fd5b600054604080516001600160a01b03928316815291831660208301527fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c025760405163b5c42b3b60e01b815260040160405180910390fd5b61071082826111d8565b6001600160a01b03811660009081526002602052604090205460ff166105dc5760405163c665406f60e01b81526001600160a01b0382166004820152602401610707565b6000546001600160a01b03163314610c7b5760405163b5c42b3b60e01b815260040160405180910390fd5b610710828261178d565b6000546001600160a01b03163314610cb05760405163b5c42b3b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146105dc57600154604080516001600160a01b03928316815291831660208301527fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc14138910160405180910390a1600180546001600160a01b0383166001600160a01b031990911617905550565b6001600160a01b03811660009081526005602052604090205460ff166105dc576040516318f26acf60e11b81526001600160a01b0382166004820152602401610707565b6003818154811061068857600080fd5b6000546001600160a01b03163314610dab5760405163b5c42b3b60e01b815260040160405180910390fd5b61083483838361143e565b6000546001600160a01b03163314610de15760405163b5c42b3b60e01b815260040160405180910390fd5b610710828261153d565b600a818154811061068857600080fd5b6105c861199f565b600d818154811061068857600080fd5b6000546001600160a01b03163314610e3e5760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610e5f576040516373c17a2160e01b815260040160405180910390fd5b60005b8181101561097757610ec187878784818110610e8057610e806120b0565b9050602002016020810190610e9591906120e1565b868685818110610ea757610ea76120b0565b9050602002016020810190610ebc91906120c6565b6119e5565b600101610e62565b6000546001600160a01b03163314610ef45760405163b5c42b3b60e01b815260040160405180910390fd5b6108348383836119e5565b6001600160a01b038116600090815260106020526040902054156105dc576001600160a01b03811660009081526010602052604090208054610f83918391610f4990600190612112565b81548110610f5957610f596120b0565b90600052602060002090600891828204019190066004029054906101000a900460e01b60006119e5565b610eff565b808015610f9d57506001600160a01b0382163b155b15610fc6576040516322a2d07b60e21b81526001600160a01b0383166004820152602401610707565b6001600160a01b0382166000908152600c602052604090205460ff1681151581151503610ff257505050565b6001600160a01b0383166000908152600c60205260409020805460ff191683158015919091179091556110a757600d80546001600160a01b0385166000818152600e60205260408082208490556001840185559381527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590920180546001600160a01b0319168217905591517f3be1dd78b5f18a20ece6062a5b14392621254e84d6cf34f784210545bc7f4e679190a2505050565b6001600160a01b0383166000908152600e6020526040812054600d549091906110d290600190612112565b905080821461115a576000600d82815481106110f0576110f06120b0565b600091825260209091200154600d80546001600160a01b03909216925082918590811061111f5761111f6120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600e909152604090208290555b600d80548061116b5761116b61212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600e90915260408083208390555190917f19373826fed7c1d46c0c847a513f863b97bf2f05443fc5437e8eb0024ade514c91a25050505050565b6001600160a01b03821660009081526005602052604090205460ff168115158115150361120457505050565b6001600160a01b0383166000908152600560205260409020805460ff191683158015919091179091556112b957600680546001600160a01b0385166000818152600760205260408082208490556001840185559381527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b0319168217905591517f4a2c5f739521346b05dddbb36ff105cb531f072cfd42a75daf563eca4f7216009190a2505050565b6001600160a01b0383166000908152600760205260408120546006549091906112e490600190612112565b905080821461136c57600060068281548110611302576113026120b0565b600091825260209091200154600680546001600160a01b039092169250829185908110611331576113316120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526007909152604090208290555b600680548061137d5761137d61212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600790915260408083208390555190917f253368ab02a4dfdb43d5dc4706e047a442a1e4d1f7669c71d483c5a9b7e0794c91a25050505050565b6113f383610eff565b60005b818110156114385761143084848484818110611414576114146120b0565b905060200201602081019061142991906120e1565b60016119e5565b6001016113f6565b50505050565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff16811515811515036114785750505050565b6001600160a01b038481166000908152600860209081526040808320938716835292905220805460ff191683158015919091179091556114f757826001600160a01b0316846001600160a01b03167fc0b2ceb99fb2a4c9b88e22a8a4be261ec47dfd4d7ee7c8fde4bc3f00b51a87cb60405160405180910390a3611438565b826001600160a01b0316846001600160a01b03167f4bba8c1b25cbaf9c0346c27e70d534c34bd561c50ad78aaf4dc714cf2a07cdc760405160405180910390a350505050565b80801561155257506001600160a01b0382163b155b1561157b576040516322a2d07b60e21b81526001600160a01b0383166004820152602401610707565b6001600160a01b03821660009081526002602052604090205460ff16811515811515036115a757505050565b6001600160a01b0383166000908152600260205260409020805460ff1916831580159190911790915561165c57600380546001600160a01b0385166000818152600460205260408082208490556001840185559381527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90920180546001600160a01b0319168217905591517f6f8eaabfaab22f210f7ed4615279fc9d3bf0fe5695f2bbf88b1b55f641bd31579190a2505050565b6001600160a01b03831660009081526004602052604081205460035490919061168790600190612112565b905080821461170f576000600382815481106116a5576116a56120b0565b600091825260209091200154600380546001600160a01b0390921692508291859081106116d4576116d46120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526004909152604090208290555b60038054806117205761172061212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600490915260408083208390555190917fdef689c9ae98d62af0e32f4fbf8067ef2e60a297386b3cedb3634c779b8e721691a25050505050565b6001600160a01b03821660009081526009602052604090205460ff16811515811515036117b957505050565b6001600160a01b0383166000908152600960205260409020805460ff1916831580159190911790915561186e57600a80546001600160a01b0385166000818152600b60205260408082208490556001840185559381527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890920180546001600160a01b0319168217905591517fb8ae5eecdc75ae68c0e35ac03a55a32f68dba627733ef6f22a4dcc5a82de024f9190a2505050565b6001600160a01b0383166000908152600b6020526040812054600a5490919061189990600190612112565b9050808214611921576000600a82815481106118b7576118b76120b0565b600091825260209091200154600a80546001600160a01b0390921692508291859081106118e6576118e66120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600b909152604090208290555b600a8054806119325761193261212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600b90915260408083208390555190917fea0430c6bb011c820c8e060b963b5ef2dee23bd80f2a2b1adc6022ec53dad63391a25050505050565b6001546001600160a01b031633148015906119c557506000546001600160a01b03163314155b156119e35760405163014694a560e21b815260040160405180910390fd5b565b6001600160a01b0383166000908152600f602090815260408083206001600160e01b03198616845290915290205460ff1681151581151503611a275750505050565b6001600160a01b0384166000908152600f602090815260408083206001600160e01b0319871684529091529020805460ff19168315801591909117909155611b2f576001600160a01b038416600090815260106020526040902054611a8d906001612141565b6001600160a01b03851660008181526011602090815260408083206001600160e01b03198916808552908352818420959095558383526010825280832080546001810182559084529183206008830401805463ffffffff60079094166004026101000a938402191660e08a901c9390930292909217909155517f13d31518131778559059179e0c891d69ee1de739115ffbf3cfa78d20005c06ed9190a3611438565b6001600160a01b03841660009081526011602090815260408083206001600160e01b0319871684529091529020548015611d1a576000611b70600183612112565b6001600160a01b03871660009081526010602052604081205491925090611b9990600190612112565b9050808214611c97576001600160a01b0387166000908152601060205260408120805483908110611bcc57611bcc6120b0565b90600052602060002090600891828204019190066004029054906101000a900460e01b905080601060008a6001600160a01b03166001600160a01b031681526020019081526020016000208481548110611c2857611c286120b0565b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c0217905550826001611c659190612141565b6001600160a01b03891660009081526011602090815260408083206001600160e01b0319909516835293905291909120555b6001600160a01b0387166000908152601060205260409020805480611cbe57611cbe61212b565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160a01b03891682526011815260408083206001600160e01b03198a16845290915281205550505b6040516001600160e01b03198516906001600160a01b038716907f8b9a4a3302c2664a5a92bacb0cf4caf19ab7e70ccfae945f052e9e219d0080ad90600090a35050505050565b80356001600160a01b0381168114611d7857600080fd5b919050565b600060208284031215611d8f57600080fd5b611d9882611d61565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015611de15783516001600160e01b03191683529284019291840191600101611dbb565b50909695505050505050565b600060208284031215611dff57600080fd5b5035919050565b80356001600160e01b031981168114611d7857600080fd5b60008060408385031215611e3157600080fd5b611e3a83611d61565b9150611e4860208401611e06565b90509250929050565b60008083601f840112611e6357600080fd5b50813567ffffffffffffffff811115611e7b57600080fd5b6020830191508360208260051b8501011115611e9657600080fd5b9250929050565b60008060008060408587031215611eb357600080fd5b843567ffffffffffffffff80821115611ecb57600080fd5b611ed788838901611e51565b90965094506020870135915080821115611ef057600080fd5b50611efd87828801611e51565b95989497509550505050565b600080600060408486031215611f1e57600080fd5b611f2784611d61565b9250602084013567ffffffffffffffff811115611f4357600080fd5b611f4f86828701611e51565b9497909650939450505050565b60008060408385031215611f6f57600080fd5b611f7883611d61565b9150611e4860208401611d61565b600080600080600060608688031215611f9e57600080fd5b611fa786611d61565b9450602086013567ffffffffffffffff80821115611fc457600080fd5b611fd089838a01611e51565b90965094506040880135915080821115611fe957600080fd5b50611ff688828901611e51565b969995985093965092949392505050565b80358015158114611d7857600080fd5b6000806040838503121561202a57600080fd5b61203383611d61565b9150611e4860208401612007565b60008060006060848603121561205657600080fd5b61205f84611d61565b925061206d60208501611d61565b915061207b60408501612007565b90509250925092565b60008060006060848603121561209957600080fd5b6120a284611d61565b925061206d60208501611e06565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156120d857600080fd5b611d9882612007565b6000602082840312156120f357600080fd5b611d9882611e06565b634e487b7160e01b600052601160045260246000fd5b81810381811115612125576121256120fc565b92915050565b634e487b7160e01b600052603160045260246000fd5b80820180821115612125576121256120fc56fea2646970667358221220214b27df7e3d0190de103481571528ba97afec9a384d89e4bc524c0d5c29465164736f6c634300081300330000000000000000000000005ce9c2e3e803712e6fec5368968b61a55d851cdf000000000000000000000000bde48624f9e1dd4107df324d1ba3c07004640206

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063704b6c0211610130578063c3c64674116100b8578063dbca09d21161007c578063dbca09d21461053e578063eaec91c514610551578063f236b0f514610564578063f83f443214610577578063f851a4401461058a57600080fd5b8063c3c64674146104bf578063c8998783146104d2578063cda600a1146104e5578063d53f8ff914610513578063d6e6bb4b1461053657600080fd5b80638a0dac4a116100ff5780638a0dac4a14610450578063965106d314610463578063983b56e314610476578063acc0844c14610489578063babcc5391461049c57600080fd5b8063704b6c021461040457806371013c10146104175780637547dbc31461042a578063833e8db11461043d57600080fd5b80632901c25a116101be57806339222b891161018257806339222b89146103a5578063452a9320146103b8578063457dc7b7146103cb578063597a9743146103de578063674acc2f146103f157600080fd5b80632901c25a1461033157806329e899d914610339578063344ba6fd1461034c5780633482d4641461036f5780633910ba951461037757600080fd5b8063198a8fa111610205578063198a8fa1146102d35780631b29b07e146102e65780631cafddfd146102f95780631f2d0dac1461030c57806320b7bd1c1461031e57600080fd5b806304df017d146102375780630b3539841461024c57806312477324146102755780631302e31a146102a8575b600080fd5b61024a610245366004611d7d565b61059d565b005b61025f61025a366004611d7d565b6105df565b60405161026c9190611d9f565b60405180910390f35b610298610283366004611d7d565b60056020526000908152604090205460ff1681565b604051901515815260200161026c565b6102bb6102b6366004611ded565b610678565b6040516001600160a01b03909116815260200161026c565b61024a6102e1366004611e1e565b6106a2565b61024a6102f4366004611e9d565b610714565b61024a610307366004611f09565b6107d1565b600a545b60405190815260200161026c565b61024a61032c366004611d7d565b610839565b600654610310565b61024a610347366004611d7d565b61087d565b61029861035a366004611d7d565b60096020526000908152604090205460ff1681565b600354610310565b610298610385366004611f5c565b600860209081526000928352604080842090915290825290205460ff1681565b61024a6103b3366004611f86565b6108c1565b6001546102bb906001600160a01b031681565b61024a6103d9366004611f5c565b610980565b61024a6103ec366004611e9d565b6109d9565b61024a6103ff366004611e9d565b610a8e565b61024a610412366004611d7d565b610b43565b61024a610425366004612017565b610bd7565b61024a610438366004611d7d565b610c0c565b61024a61044b366004612017565b610c50565b61024a61045e366004611d7d565b610c85565b61024a610471366004611d7d565b610d2c565b6102bb610484366004611ded565b610d70565b61024a610497366004612041565b610d80565b6102986104aa366004611d7d565b60026020526000908152604090205460ff1681565b61024a6104cd366004612017565b610db6565b6102bb6104e0366004611ded565b610deb565b6102986104f3366004611e1e565b600f60209081526000928352604080842090915290825290205460ff1681565b610298610521366004611d7d565b600c6020526000908152604090205460ff1681565b600d54610310565b61024a61054c366004611d7d565b610dfb565b6102bb61055f366004611ded565b610e03565b61024a610572366004611f86565b610e13565b61024a610585366004612084565b610ec9565b6000546102bb906001600160a01b031681565b6000546001600160a01b031633146105c85760405163b5c42b3b60e01b815260040160405180910390fd5b6105d181610eff565b6105dc816000610f88565b50565b6001600160a01b03811660009081526010602090815260409182902080548351818402810184019094528084526060939283018282801561066c57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b0319168152602001906004019060208260030104928301926001038202915080841161062e5790505b50505050509050919050565b6006818154811061068857600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0382166000908152600f602090815260408083206001600160e01b03198516845290915290205460ff16610710576040516375e81e2960e11b81526001600160a01b03831660048201526001600160e01b0319821660248201526044015b60405180910390fd5b5050565b6000546001600160a01b0316331461073f5760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610760576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c9576107c1868683818110610780576107806120b0565b90506020020160208101906107959190611d7d565b8585848181106107a7576107a76120b0565b90506020020160208101906107bc91906120c6565b6111d8565b600101610763565b505050505050565b6000546001600160a01b031633146107fc5760405163b5c42b3b60e01b815260040160405180910390fd5b600081900361081e5760405163715f254d60e01b815260040160405180910390fd5b610829836001610f88565b6108348383836113ea565b505050565b6001600160a01b0381166000908152600c602052604090205460ff166105dc5760405163e1a2530b60e01b81526001600160a01b0382166004820152602401610707565b6001600160a01b03811660009081526009602052604090205460ff166105dc576040516357b9f0bd60e11b81526001600160a01b0382166004820152602401610707565b6000546001600160a01b031633146108ec5760405163b5c42b3b60e01b815260040160405180910390fd5b8281811461090d576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156109775761096f8787878481811061092e5761092e6120b0565b90506020020160208101906109439190611d7d565b868685818110610955576109556120b0565b905060200201602081019061096a91906120c6565b61143e565b600101610910565b50505050505050565b6001600160a01b0380831660009081526008602090815260408083209385168352929052205460ff166107105760405163c14e560960e01b81526001600160a01b03808416600483015282166024820152604401610707565b6000546001600160a01b03163314610a045760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610a25576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c957610a86868683818110610a4557610a456120b0565b9050602002016020810190610a5a9190611d7d565b858584818110610a6c57610a6c6120b0565b9050602002016020810190610a8191906120c6565b61153d565b600101610a28565b6000546001600160a01b03163314610ab95760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610ada576040516373c17a2160e01b815260040160405180910390fd5b60005b818110156107c957610b3b868683818110610afa57610afa6120b0565b9050602002016020810190610b0f9190611d7d565b858584818110610b2157610b216120b0565b9050602002016020810190610b3691906120c6565b61178d565b600101610add565b6000546001600160a01b03163314610b6e5760405163b5c42b3b60e01b815260040160405180910390fd5b600054604080516001600160a01b03928316815291831660208301527fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c025760405163b5c42b3b60e01b815260040160405180910390fd5b61071082826111d8565b6001600160a01b03811660009081526002602052604090205460ff166105dc5760405163c665406f60e01b81526001600160a01b0382166004820152602401610707565b6000546001600160a01b03163314610c7b5760405163b5c42b3b60e01b815260040160405180910390fd5b610710828261178d565b6000546001600160a01b03163314610cb05760405163b5c42b3b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146105dc57600154604080516001600160a01b03928316815291831660208301527fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc14138910160405180910390a1600180546001600160a01b0383166001600160a01b031990911617905550565b6001600160a01b03811660009081526005602052604090205460ff166105dc576040516318f26acf60e11b81526001600160a01b0382166004820152602401610707565b6003818154811061068857600080fd5b6000546001600160a01b03163314610dab5760405163b5c42b3b60e01b815260040160405180910390fd5b61083483838361143e565b6000546001600160a01b03163314610de15760405163b5c42b3b60e01b815260040160405180910390fd5b610710828261153d565b600a818154811061068857600080fd5b6105c861199f565b600d818154811061068857600080fd5b6000546001600160a01b03163314610e3e5760405163b5c42b3b60e01b815260040160405180910390fd5b82818114610e5f576040516373c17a2160e01b815260040160405180910390fd5b60005b8181101561097757610ec187878784818110610e8057610e806120b0565b9050602002016020810190610e9591906120e1565b868685818110610ea757610ea76120b0565b9050602002016020810190610ebc91906120c6565b6119e5565b600101610e62565b6000546001600160a01b03163314610ef45760405163b5c42b3b60e01b815260040160405180910390fd5b6108348383836119e5565b6001600160a01b038116600090815260106020526040902054156105dc576001600160a01b03811660009081526010602052604090208054610f83918391610f4990600190612112565b81548110610f5957610f596120b0565b90600052602060002090600891828204019190066004029054906101000a900460e01b60006119e5565b610eff565b808015610f9d57506001600160a01b0382163b155b15610fc6576040516322a2d07b60e21b81526001600160a01b0383166004820152602401610707565b6001600160a01b0382166000908152600c602052604090205460ff1681151581151503610ff257505050565b6001600160a01b0383166000908152600c60205260409020805460ff191683158015919091179091556110a757600d80546001600160a01b0385166000818152600e60205260408082208490556001840185559381527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb590920180546001600160a01b0319168217905591517f3be1dd78b5f18a20ece6062a5b14392621254e84d6cf34f784210545bc7f4e679190a2505050565b6001600160a01b0383166000908152600e6020526040812054600d549091906110d290600190612112565b905080821461115a576000600d82815481106110f0576110f06120b0565b600091825260209091200154600d80546001600160a01b03909216925082918590811061111f5761111f6120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600e909152604090208290555b600d80548061116b5761116b61212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600e90915260408083208390555190917f19373826fed7c1d46c0c847a513f863b97bf2f05443fc5437e8eb0024ade514c91a25050505050565b6001600160a01b03821660009081526005602052604090205460ff168115158115150361120457505050565b6001600160a01b0383166000908152600560205260409020805460ff191683158015919091179091556112b957600680546001600160a01b0385166000818152600760205260408082208490556001840185559381527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b0319168217905591517f4a2c5f739521346b05dddbb36ff105cb531f072cfd42a75daf563eca4f7216009190a2505050565b6001600160a01b0383166000908152600760205260408120546006549091906112e490600190612112565b905080821461136c57600060068281548110611302576113026120b0565b600091825260209091200154600680546001600160a01b039092169250829185908110611331576113316120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526007909152604090208290555b600680548061137d5761137d61212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600790915260408083208390555190917f253368ab02a4dfdb43d5dc4706e047a442a1e4d1f7669c71d483c5a9b7e0794c91a25050505050565b6113f383610eff565b60005b818110156114385761143084848484818110611414576114146120b0565b905060200201602081019061142991906120e1565b60016119e5565b6001016113f6565b50505050565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff16811515811515036114785750505050565b6001600160a01b038481166000908152600860209081526040808320938716835292905220805460ff191683158015919091179091556114f757826001600160a01b0316846001600160a01b03167fc0b2ceb99fb2a4c9b88e22a8a4be261ec47dfd4d7ee7c8fde4bc3f00b51a87cb60405160405180910390a3611438565b826001600160a01b0316846001600160a01b03167f4bba8c1b25cbaf9c0346c27e70d534c34bd561c50ad78aaf4dc714cf2a07cdc760405160405180910390a350505050565b80801561155257506001600160a01b0382163b155b1561157b576040516322a2d07b60e21b81526001600160a01b0383166004820152602401610707565b6001600160a01b03821660009081526002602052604090205460ff16811515811515036115a757505050565b6001600160a01b0383166000908152600260205260409020805460ff1916831580159190911790915561165c57600380546001600160a01b0385166000818152600460205260408082208490556001840185559381527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90920180546001600160a01b0319168217905591517f6f8eaabfaab22f210f7ed4615279fc9d3bf0fe5695f2bbf88b1b55f641bd31579190a2505050565b6001600160a01b03831660009081526004602052604081205460035490919061168790600190612112565b905080821461170f576000600382815481106116a5576116a56120b0565b600091825260209091200154600380546001600160a01b0390921692508291859081106116d4576116d46120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526004909152604090208290555b60038054806117205761172061212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600490915260408083208390555190917fdef689c9ae98d62af0e32f4fbf8067ef2e60a297386b3cedb3634c779b8e721691a25050505050565b6001600160a01b03821660009081526009602052604090205460ff16811515811515036117b957505050565b6001600160a01b0383166000908152600960205260409020805460ff1916831580159190911790915561186e57600a80546001600160a01b0385166000818152600b60205260408082208490556001840185559381527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890920180546001600160a01b0319168217905591517fb8ae5eecdc75ae68c0e35ac03a55a32f68dba627733ef6f22a4dcc5a82de024f9190a2505050565b6001600160a01b0383166000908152600b6020526040812054600a5490919061189990600190612112565b9050808214611921576000600a82815481106118b7576118b76120b0565b600091825260209091200154600a80546001600160a01b0390921692508291859081106118e6576118e66120b0565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600b909152604090208290555b600a8054806119325761193261212b565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716808352600b90915260408083208390555190917fea0430c6bb011c820c8e060b963b5ef2dee23bd80f2a2b1adc6022ec53dad63391a25050505050565b6001546001600160a01b031633148015906119c557506000546001600160a01b03163314155b156119e35760405163014694a560e21b815260040160405180910390fd5b565b6001600160a01b0383166000908152600f602090815260408083206001600160e01b03198616845290915290205460ff1681151581151503611a275750505050565b6001600160a01b0384166000908152600f602090815260408083206001600160e01b0319871684529091529020805460ff19168315801591909117909155611b2f576001600160a01b038416600090815260106020526040902054611a8d906001612141565b6001600160a01b03851660008181526011602090815260408083206001600160e01b03198916808552908352818420959095558383526010825280832080546001810182559084529183206008830401805463ffffffff60079094166004026101000a938402191660e08a901c9390930292909217909155517f13d31518131778559059179e0c891d69ee1de739115ffbf3cfa78d20005c06ed9190a3611438565b6001600160a01b03841660009081526011602090815260408083206001600160e01b0319871684529091529020548015611d1a576000611b70600183612112565b6001600160a01b03871660009081526010602052604081205491925090611b9990600190612112565b9050808214611c97576001600160a01b0387166000908152601060205260408120805483908110611bcc57611bcc6120b0565b90600052602060002090600891828204019190066004029054906101000a900460e01b905080601060008a6001600160a01b03166001600160a01b031681526020019081526020016000208481548110611c2857611c286120b0565b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c0217905550826001611c659190612141565b6001600160a01b03891660009081526011602090815260408083206001600160e01b0319909516835293905291909120555b6001600160a01b0387166000908152601060205260409020805480611cbe57611cbe61212b565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160a01b03891682526011815260408083206001600160e01b03198a16845290915281205550505b6040516001600160e01b03198516906001600160a01b038716907f8b9a4a3302c2664a5a92bacb0cf4caf19ab7e70ccfae945f052e9e219d0080ad90600090a35050505050565b80356001600160a01b0381168114611d7857600080fd5b919050565b600060208284031215611d8f57600080fd5b611d9882611d61565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015611de15783516001600160e01b03191683529284019291840191600101611dbb565b50909695505050505050565b600060208284031215611dff57600080fd5b5035919050565b80356001600160e01b031981168114611d7857600080fd5b60008060408385031215611e3157600080fd5b611e3a83611d61565b9150611e4860208401611e06565b90509250929050565b60008083601f840112611e6357600080fd5b50813567ffffffffffffffff811115611e7b57600080fd5b6020830191508360208260051b8501011115611e9657600080fd5b9250929050565b60008060008060408587031215611eb357600080fd5b843567ffffffffffffffff80821115611ecb57600080fd5b611ed788838901611e51565b90965094506020870135915080821115611ef057600080fd5b50611efd87828801611e51565b95989497509550505050565b600080600060408486031215611f1e57600080fd5b611f2784611d61565b9250602084013567ffffffffffffffff811115611f4357600080fd5b611f4f86828701611e51565b9497909650939450505050565b60008060408385031215611f6f57600080fd5b611f7883611d61565b9150611e4860208401611d61565b600080600080600060608688031215611f9e57600080fd5b611fa786611d61565b9450602086013567ffffffffffffffff80821115611fc457600080fd5b611fd089838a01611e51565b90965094506040880135915080821115611fe957600080fd5b50611ff688828901611e51565b969995985093965092949392505050565b80358015158114611d7857600080fd5b6000806040838503121561202a57600080fd5b61203383611d61565b9150611e4860208401612007565b60008060006060848603121561205657600080fd5b61205f84611d61565b925061206d60208501611d61565b915061207b60408501612007565b90509250925092565b60008060006060848603121561209957600080fd5b6120a284611d61565b925061206d60208501611e06565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156120d857600080fd5b611d9882612007565b6000602082840312156120f357600080fd5b611d9882611e06565b634e487b7160e01b600052601160045260246000fd5b81810381811115612125576121256120fc565b92915050565b634e487b7160e01b600052603160045260246000fd5b80820180821115612125576121256120fc56fea2646970667358221220214b27df7e3d0190de103481571528ba97afec9a384d89e4bc524c0d5c29465164736f6c63430008130033