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