// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; /** * @title Initializable * * @dev Contract module which provides access control mechanism, where * there is the initializer account that can be granted exclusive access to * specific functions. * * The initializer account will be tx.origin during contract deployment and will be removed on first use. * Use `onlyInitializer` modifier on contract initialize process. * * @author Stanisław Głogowski */ contract Initializable { address private initializer; // events /** * @dev Emitted after `onlyInitializer` * @param initializer initializer address */ event Initialized( address initializer ); // modifiers /** * @dev Throws if tx.origin is not the initializer */ modifier onlyInitializer() { require( // solhint-disable-next-line avoid-tx-origin tx.origin == initializer, "Initializable: tx.origin is not the initializer" ); /// @dev removes initializer initializer = address(0); _; emit Initialized( // solhint-disable-next-line avoid-tx-origin tx.origin ); } /** * @dev Internal constructor */ constructor() internal { // solhint-disable-next-line avoid-tx-origin initializer = tx.origin; } // external functions (views) /** * @notice Check if contract is initialized * @return true when contract is initialized */ function isInitialized() external view returns (bool) { return initializer == address(0); } }