Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register | 18540116 | 342 days ago | IN | 0 ETH | 0.0022586 | ||||
Register | 18272440 | 380 days ago | IN | 0 ETH | 0.00117149 | ||||
Deprecate | 17620735 | 471 days ago | IN | 0 ETH | 0.00084768 | ||||
Register | 17620734 | 471 days ago | IN | 0 ETH | 0.00174862 | ||||
Deprecate | 17620004 | 471 days ago | IN | 0 ETH | 0.00067402 | ||||
Register | 17620004 | 471 days ago | IN | 0 ETH | 0.00139915 | ||||
Register | 17588205 | 475 days ago | IN | 0 ETH | 0.00206626 | ||||
Register | 16437613 | 637 days ago | IN | 0 ETH | 0.00113076 | ||||
Register | 16437603 | 637 days ago | IN | 0 ETH | 0.00181871 | ||||
Register | 16437595 | 637 days ago | IN | 0 ETH | 0.00197116 | ||||
Register | 16437589 | 637 days ago | IN | 0 ETH | 0.0018109 | ||||
Register | 16437579 | 637 days ago | IN | 0 ETH | 0.0012936 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16437571 | 637 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.3+commit.8d00100c
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import './IRegistry.sol'; /** * @title Registry * @dev Registry of contracts that acts as a curated list of implementations and instances to be trusted by the Mimic * protocol. Here consumers can find either implementation contracts (to be cloned through proxies) and contract * instances (from cloned implementations). * * The registry follows the Authorizer mixin and only authorized parties are allowed to register implementations. */ contract Registry is IRegistry, Authorizer { struct ImplementationData { bool stateless; bool deprecated; bytes32 namespace; } // List of implementations indexed by address mapping (address => ImplementationData) public override implementationData; /** * @dev Initializes the Registry contract * @param admin Address to be granted with register, deprecate, authorize, and unauthorize permissions */ constructor(address admin) { _authorize(admin, Registry.register.selector); _authorize(admin, Registry.deprecate.selector); _authorize(admin, Authorizer.authorize.selector); _authorize(admin, Authorizer.unauthorize.selector); } /** * @dev Tells if a specific implementation is registered under a certain namespace and it's not deprecated * @param namespace Namespace asking for * @param implementation Address of the implementation to be checked */ function isActive(bytes32 namespace, address implementation) external view override returns (bool) { ImplementationData storage data = implementationData[implementation]; return !data.deprecated && data.namespace == namespace; } /** * @dev Registers a new implementation for a given namespace. Sender must be authorized. * @param namespace Namespace to be used for the implementation * @param implementation Address of the implementation to be registered * @param stateless Whether the implementation is stateless or not */ function register(bytes32 namespace, address implementation, bool stateless) external override auth { require(namespace != bytes32(0), 'INVALID_NAMESPACE'); require(implementation != address(0), 'INVALID_IMPLEMENTATION'); ImplementationData storage data = implementationData[implementation]; require(data.namespace == bytes32(0), 'REGISTERED_IMPLEMENTATION'); data.deprecated = false; data.stateless = stateless; data.namespace = namespace; emit Registered(namespace, implementation, stateless); } /** * @dev Deprecates a registered implementation. Sender must be authorized. * @param implementation Address of the implementation to be deprecated. It must be registered and not deprecated. */ function deprecate(address implementation) external override auth { require(implementation != address(0), 'IMPLEMENTATION_ADDRESS_ZERO'); ImplementationData storage data = implementationData[implementation]; require(data.namespace != bytes32(0), 'UNREGISTERED_IMPLEMENTATION'); require(!data.deprecated, 'DEPRECATED_IMPLEMENTATION'); data.deprecated = true; emit Deprecated(data.namespace, implementation); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import './IAuthorizer.sol'; /** * @title Authorizer * @dev Authorization module to be used by contracts that need to implement permissions for their methods. * It provides a permissions model to list who is allowed to call what function in a contract. And only accounts * authorized to manage those permissions are the ones that are allowed to authorize or unauthorize accounts. */ contract Authorizer is IAuthorizer { // Constant used to denote that a permission is open to anyone address public constant ANY_ADDRESS = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF); // Internal mapping to tell who is allowed to do what indexed by (account, function selector) mapping (address => mapping (bytes4 => bool)) private authorized; /** * @dev Modifier that should be used to tag protected functions */ modifier auth() { _authenticate(msg.sender, msg.sig); _; } /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) public view override returns (bool) { return authorized[ANY_ADDRESS][what] || authorized[who][what]; } /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external override auth { _authorize(who, what); } /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external override auth { _unauthorize(who, what); } /** * @dev Internal function to authenticate someone over a function. * It reverts if the given account is not authorized to call the requested function. * @param who Address to be authenticated * @param what Function selector to be authenticated */ function _authenticate(address who, bytes4 what) internal view { require(isAuthorized(who, what), 'AUTH_SENDER_NOT_ALLOWED'); } /** * @dev Internal function to authorize someone to call a function * @param who Address to be authorized * @param what Function selector to be granted */ function _authorize(address who, bytes4 what) internal { authorized[who][what] = true; emit Authorized(who, what); } /** * @dev Internal function to unauthorize someone to call a function * @param who Address to be unauthorized * @param what Function selector to be revoked */ function _unauthorize(address who, bytes4 what) internal { authorized[who][what] = false; emit Unauthorized(who, what); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; /** * @title IAuthorizer */ interface IAuthorizer { /** * @dev Emitted when an account is authorized to call a function */ event Authorized(address indexed who, bytes4 what); /** * @dev Emitted when an account is unauthorized to call a function */ event Unauthorized(address indexed who, bytes4 what); /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external; /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external; /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/Address.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import './BaseImplementation.sol'; /** * @title BaseAuthorizedImplementation * @dev BaseImplementation using the Authorizer mixin. Base implementations that want to use the Authorizer * permissions mechanism should inherit from this contract instead. */ abstract contract BaseAuthorizedImplementation is BaseImplementation, Authorizer { /** * @dev Creates a new BaseAuthorizedImplementation * @param admin Address to be granted authorize and unauthorize permissions * @param registry Address of the Mimic Registry */ constructor(address admin, address registry) BaseImplementation(registry) { _authorize(admin, Authorizer.authorize.selector); _authorize(admin, Authorizer.unauthorize.selector); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './IImplementation.sol'; import '../registry/IRegistry.sol'; /** * @title BaseImplementation * @dev This implementation contract comes with an immutable reference to an implementations registry where it should * be registered as well (checked during initialization). It allows requesting new instances of other registered * implementations to as another safety check to make sure valid instances are referenced in case it's needed. */ abstract contract BaseImplementation is IImplementation { // Immutable implementations registry reference address public immutable override registry; /** * @dev Creates a new BaseImplementation * @param _registry Address of the Mimic Registry where dependencies will be validated against */ constructor(address _registry) { registry = _registry; } /** * @dev Internal function to validate a new dependency that must be registered as stateless. * It checks the new dependency is registered, not deprecated, and stateless. * @param dependency New stateless dependency to be set */ function _validateStatelessDependency(address dependency) internal view { require(_validateDependency(dependency), 'DEPENDENCY_NOT_STATELESS'); } /** * @dev Internal function to validate a new dependency that cannot be registered as stateless. * It checks the new dependency is registered, not deprecated, and not stateful. * @param dependency New stateful dependency to be set */ function _validateStatefulDependency(address dependency) internal view { require(!_validateDependency(dependency), 'DEPENDENCY_NOT_STATEFUL'); } /** * @dev Internal function to validate a new dependency. It checks the dependency is registered and not deprecated. * @param dependency New dependency to be set * @return Whether the dependency is stateless or not */ function _validateDependency(address dependency) private view returns (bool) { (bool stateless, bool deprecated, bytes32 namespace) = IRegistry(registry).implementationData(dependency); require(namespace != bytes32(0), 'DEPENDENCY_NOT_REGISTERED'); require(!deprecated, 'DEPENDENCY_DEPRECATED'); return stateless; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; // solhint-disable func-name-mixedcase /** * @title IImplementation * @dev Implementation interface that must be followed for implementations to be registered in the Mimic Registry */ interface IImplementation { /** * @dev Tells the namespace under which the implementation is registered in the Mimic Registry */ function NAMESPACE() external view returns (bytes32); /** * @dev Tells the address of the Mimic Registry */ function registry() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import './InitializableImplementation.sol'; /** * @title InitializableAuthorizedImplementation * @dev InitializableImplementation using the Authorizer mixin. Initializable implementations that want to use the * Authorizer permissions mechanism should inherit from this contract instead. */ abstract contract InitializableAuthorizedImplementation is InitializableImplementation, Authorizer { /** * @dev Creates a new InitializableAuthorizedImplementation * @param registry Address of the Mimic Registry */ constructor(address registry) InitializableImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } /** * @dev Initialization function that authorizes an admin account to authorize and unauthorize accounts. * Note this function can only be called from a function marked with the `initializer` modifier. * @param admin Address to be granted authorize and unauthorize permissions */ function _initialize(address admin) internal onlyInitializing { _initialize(); _authorize(admin, Authorizer.authorize.selector); _authorize(admin, Authorizer.unauthorize.selector); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './BaseImplementation.sol'; /** * @title InitializableImplementation * @dev Implementation contract to be used through proxies. Inheriting contracts are meant to be initialized through * initialization functions instead of constructor functions. It allows re-using the same logic contract while making * deployments cheaper. */ abstract contract InitializableImplementation is BaseImplementation, Initializable { /** * @dev Creates a new BaseImplementation. Note that initializers are disabled at creation time. */ constructor(address registry) BaseImplementation(registry) { _disableInitializers(); } /** * @dev Initialization function. * Note this function can only be called from a function marked with the `initializer` modifier. */ function _initialize() internal view onlyInitializing { // solhint-disable-previous-line no-empty-blocks } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/IAuthorizer.sol'; /** * @title IRegistry * @dev Registry interface, it must follow the IAuthorizer interface. */ interface IRegistry is IAuthorizer { /** * @dev Emitted every time a new implementation is registered */ event Registered(bytes32 indexed namespace, address indexed implementation, bool stateless); /** * @dev Emitted every time an implementation is deprecated */ event Deprecated(bytes32 indexed namespace, address indexed implementation); /** * @dev Tells the data of an implementation: * @param implementation Address of the implementation to request it's data */ function implementationData(address implementation) external view returns (bool stateless, bool deprecated, bytes32 namespace); /** * @dev Tells if a specific implementation is registered under a certain namespace and it's not deprecated * @param namespace Namespace asking for * @param implementation Address of the implementation to be checked */ function isActive(bytes32 namespace, address implementation) external view returns (bool); /** * @dev Registers a new implementation for a given namespace * @param namespace Namespace to be used for the implementation * @param implementation Address of the implementation to be registered * @param stateless Whether the implementation is stateless or not */ function register(bytes32 namespace, address implementation, bool stateless) external; /** * @dev Deprecates a registered implementation * @param implementation Address of the implementation to be deprecated */ function deprecate(address implementation) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../implementations/BaseImplementation.sol'; contract BaseImplementationMock is BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('BASE_IMPLEMENTATION_MOCK'); constructor(address registry) BaseImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } function validateStatefulDependency(address dependency) external view { _validateStatefulDependency(dependency); } function validateStatelessDependency(address dependency) external view { _validateStatelessDependency(dependency); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../implementations/InitializableAuthorizedImplementation.sol'; contract InitializableAuthorizedImplementationMock is InitializableAuthorizedImplementation { bytes32 public constant override NAMESPACE = keccak256('INITIALIZABLE_AUTHORIZED_IMPLEMENTATION_MOCK'); constructor(address registry) InitializableAuthorizedImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } function initialize(address admin) external initializer { _initialize(admin); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../implementations/InitializableImplementation.sol'; contract InitializableImplementationMock is InitializableImplementation { bytes32 public constant override NAMESPACE = keccak256('INITIALIZABLE_IMPLEMENTATION_MOCK'); constructor(address registry) InitializableImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } function initialize() external initializer { // solhint-disable-previous-line no-empty-blocks } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"namespace","type":"bytes32"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Deprecated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"namespace","type":"bytes32"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":false,"internalType":"bool","name":"stateless","type":"bool"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Unauthorized","type":"event"},{"inputs":[],"name":"ANY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"deprecate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"implementationData","outputs":[{"internalType":"bool","name":"stateless","type":"bool"},{"internalType":"bool","name":"deprecated","type":"bool"},{"internalType":"bytes32","name":"namespace","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"namespace","type":"bytes32"},{"internalType":"address","name":"implementation","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"namespace","type":"bytes32"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bool","name":"stateless","type":"bool"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051610b93380380610b9383398101604081905261002f916100e5565b610040816319e1127560e21b610079565b610051816301d4f0c360e21b610079565b610062816324cfc3cf60e21b610079565b61007381633323521b60e11b610079565b50610113565b6001600160a01b0382166000818152602081815260408083206001600160e01b0319861680855290835292819020805460ff19166001179055519182527f7f06c1c34ad47198873da9dcde2e40904035d41b23da3a9132df674a75022df7910160405180910390a25050565b6000602082840312156100f6578081fd5b81516001600160a01b038116811461010c578182fd5b9392505050565b610a71806101226000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639235dcf81161005b5780639235dcf81461010d578063933f0f3c1461015e578063ca0f8f3b14610171578063d9972b961461019457610088565b80630753c30c1461008d5780633f81a192146100a25780636646a436146100e7578063678449d4146100fa575b600080fd5b6100a061009b366004610959565b6101a7565b005b6100bd73ffffffffffffffffffffffffffffffffffffffff81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a06100f5366004610973565b6103cf565b6100a06101083660046109f8565b61040b565b61014161011b366004610959565b6001602081905260009182526040909120805491015460ff808316926101009004169083565b6040805193151584529115156020840152908201526060016100de565b6100a061016c366004610973565b610636565b61018461017f3660046109cd565b61066e565b60405190151581526020016100de565b6101846101a2366004610973565b6106b5565b6101d5336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b73ffffffffffffffffffffffffffffffffffffffff8116610257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f494d504c454d454e544154494f4e5f414444524553535f5a45524f000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160208190526040909120908101546102e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f554e524547495354455245445f494d504c454d454e544154494f4e0000000000604482015260640161024e565b8054610100900460ff161561035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f444550524543415445445f494d504c454d454e544154494f4e00000000000000604482015260640161024e565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155600181015460405173ffffffffffffffffffffffffffffffffffffffff841691907f9dedfb457c94655f88c417e108167137f3f2458254592c596f04441cb4c351fe90600090a35050565b6103fd336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b61040782826107db565b5050565b610439336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b826104a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f4e414d455350414345000000000000000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff821661051d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020819052604090912090810154156105b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f524547495354455245445f494d504c454d454e544154494f4e00000000000000604482015260640161024e565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682151590811782556001820185905560405190815273ffffffffffffffffffffffffffffffffffffffff84169085907f9757e66b5a012762865eeeeaa7190b148500cbc2631d0a90dde0cc7946a92bc09060200160405180910390a350505050565b610664336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b6104078282610888565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081208054610100900460ff161580156106ad5750838160010154145b949350505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad602052604081205460ff1680610764575073ffffffffffffffffffffffffffffffffffffffff83166000908152602081815260408083207fffffffff000000000000000000000000000000000000000000000000000000008616845290915290205460ff165b9392505050565b61077582826106b5565b610407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f415554485f53454e4445525f4e4f545f414c4c4f574544000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff82166000818152602081815260408083207fffffffff0000000000000000000000000000000000000000000000000000000086168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527fa2e97b9eea8d1168700e334304edd057dff89c0384ca6f920c73cc3e48c8e52391015b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff82166000818152602081815260408083207fffffffff0000000000000000000000000000000000000000000000000000000086168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519182527f7f06c1c34ad47198873da9dcde2e40904035d41b23da3a9132df674a75022df7910161087c565b803573ffffffffffffffffffffffffffffffffffffffff8116811461095457600080fd5b919050565b60006020828403121561096a578081fd5b61076482610930565b60008060408385031215610985578081fd5b61098e83610930565b915060208301357fffffffff00000000000000000000000000000000000000000000000000000000811681146109c2578182fd5b809150509250929050565b600080604083850312156109df578182fd5b823591506109ef60208401610930565b90509250929050565b600080600060608486031215610a0c578081fd5b83359250610a1c60208501610930565b915060408401358015158114610a30578182fd5b80915050925092509256fea2646970667358221220275553922f8c525e24d360e8370444d09d37907ca78ca24efe9b395f357a765d64736f6c6343000803003300000000000000000000000082109cc00922a515d5fa14ee05a6880c6fab5e19
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80639235dcf81161005b5780639235dcf81461010d578063933f0f3c1461015e578063ca0f8f3b14610171578063d9972b961461019457610088565b80630753c30c1461008d5780633f81a192146100a25780636646a436146100e7578063678449d4146100fa575b600080fd5b6100a061009b366004610959565b6101a7565b005b6100bd73ffffffffffffffffffffffffffffffffffffffff81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100a06100f5366004610973565b6103cf565b6100a06101083660046109f8565b61040b565b61014161011b366004610959565b6001602081905260009182526040909120805491015460ff808316926101009004169083565b6040805193151584529115156020840152908201526060016100de565b6100a061016c366004610973565b610636565b61018461017f3660046109cd565b61066e565b60405190151581526020016100de565b6101846101a2366004610973565b6106b5565b6101d5336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b73ffffffffffffffffffffffffffffffffffffffff8116610257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f494d504c454d454e544154494f4e5f414444524553535f5a45524f000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600160208190526040909120908101546102e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f554e524547495354455245445f494d504c454d454e544154494f4e0000000000604482015260640161024e565b8054610100900460ff161561035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f444550524543415445445f494d504c454d454e544154494f4e00000000000000604482015260640161024e565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100178155600181015460405173ffffffffffffffffffffffffffffffffffffffff841691907f9dedfb457c94655f88c417e108167137f3f2458254592c596f04441cb4c351fe90600090a35050565b6103fd336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b61040782826107db565b5050565b610439336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b826104a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f4e414d455350414345000000000000000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff821661051d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e56414c49445f494d504c454d454e544154494f4e00000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020819052604090912090810154156105b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f524547495354455245445f494d504c454d454e544154494f4e00000000000000604482015260640161024e565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001682151590811782556001820185905560405190815273ffffffffffffffffffffffffffffffffffffffff84169085907f9757e66b5a012762865eeeeaa7190b148500cbc2631d0a90dde0cc7946a92bc09060200160405180910390a350505050565b610664336000357fffffffff000000000000000000000000000000000000000000000000000000001661076b565b6104078282610888565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081208054610100900460ff161580156106ad5750838160010154145b949350505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad602052604081205460ff1680610764575073ffffffffffffffffffffffffffffffffffffffff83166000908152602081815260408083207fffffffff000000000000000000000000000000000000000000000000000000008616845290915290205460ff165b9392505050565b61077582826106b5565b610407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f415554485f53454e4445525f4e4f545f414c4c4f574544000000000000000000604482015260640161024e565b73ffffffffffffffffffffffffffffffffffffffff82166000818152602081815260408083207fffffffff0000000000000000000000000000000000000000000000000000000086168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527fa2e97b9eea8d1168700e334304edd057dff89c0384ca6f920c73cc3e48c8e52391015b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff82166000818152602081815260408083207fffffffff0000000000000000000000000000000000000000000000000000000086168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519182527f7f06c1c34ad47198873da9dcde2e40904035d41b23da3a9132df674a75022df7910161087c565b803573ffffffffffffffffffffffffffffffffffffffff8116811461095457600080fd5b919050565b60006020828403121561096a578081fd5b61076482610930565b60008060408385031215610985578081fd5b61098e83610930565b915060208301357fffffffff00000000000000000000000000000000000000000000000000000000811681146109c2578182fd5b809150509250929050565b600080604083850312156109df578182fd5b823591506109ef60208401610930565b90509250929050565b600080600060608486031215610a0c578081fd5b83359250610a1c60208501610930565b915060408401358015158114610a30578182fd5b80915050925092509256fea2646970667358221220275553922f8c525e24d360e8370444d09d37907ca78ca24efe9b395f357a765d64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000082109cc00922a515d5fa14ee05a6880c6fab5e19
-----Decoded View---------------
Arg [0] : admin (address): 0x82109Cc00922A515D5FA14eE05a6880c6FAB5E19
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000082109cc00922a515d5fa14ee05a6880c6fab5e19
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.