¡El código fuente de este contrato está verificado!
Metadatos del Contrato
Compilador
0.8.17+commit.8df45f5f
Idioma
Solidity
Código Fuente del Contrato
Archivo 1 de 13: Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragmasolidity ^0.8.0;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
}
Código Fuente del Contrato
Archivo 2 de 13: ENS.sol
pragmasolidity >=0.8.4;interfaceENS{
// Logged when the owner of a node assigns a new owner to a subnode.eventNewOwner(bytes32indexed node, bytes32indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.eventTransfer(bytes32indexed node, address owner);
// Logged when the resolver for a node changes.eventNewResolver(bytes32indexed node, address resolver);
// Logged when the TTL of a node changeseventNewTTL(bytes32indexed node, uint64 ttl);
// Logged when an operator is added or removed.eventApprovalForAll(addressindexed owner,
addressindexed operator,
bool approved
);
functionsetRecord(bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
functionsetSubnodeRecord(bytes32 node,
bytes32 label,
address owner,
address resolver,
uint64 ttl
) external;
functionsetSubnodeOwner(bytes32 node,
bytes32 label,
address owner
) externalreturns (bytes32);
functionsetResolver(bytes32 node, address resolver) external;
functionsetOwner(bytes32 node, address owner) external;
functionsetTTL(bytes32 node, uint64 ttl) external;
functionsetApprovalForAll(address operator, bool approved) external;
functionowner(bytes32 node) externalviewreturns (address);
functionresolver(bytes32 node) externalviewreturns (address);
functionttl(bytes32 node) externalviewreturns (uint64);
functionrecordExists(bytes32 node) externalviewreturns (bool);
functionisApprovedForAll(address owner,
address operator
) externalviewreturns (bool);
}
Código Fuente del Contrato
Archivo 3 de 13: EnsVision-BatchRenew.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.17;import"./interfaces/IEnsRenewer.sol";
import"ens-contracts/ethregistrar/IBaseRegistrar.sol";
import"@openzeppelin/contracts/access/Ownable.sol";
import"@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {INameWrapper, CAN_EXTEND_EXPIRY} from"ens-contracts/wrapper/INameWrapper.sol";
contractEnsBatchRenewisOwnable{
IEnsRenewer publicimmutable ens;
IBaseRegistrar publicimmutable baseRegistrar;
INameWrapper publicimmutable nameWrapper;
constructor(
IEnsRenewer _ens,
IBaseRegistrar _baseRegistrar,
INameWrapper _nameWrapper
) {
ens = _ens;
baseRegistrar = _baseRegistrar;
nameWrapper = _nameWrapper;
}
/**
* Function called "batchRenew" that allows the caller to renew multiple ENS names in a single transaction
* @param _names: an array of strings representing the ENS names to be renewed
* @param _durations: an array of uint256 values representing the number of seconds for which each corresponding ENS name in "names" should be renewed
*/functionbatchRenew(string[] calldata _names,
uint256[] calldata _durations
) publicpayable{
//no price check in here. but ENS will revert if the price is not correctfor (uint256 i; i < _names.length; ) {
ens.renew{value: ens.rentPrice(_names[i], _durations[i])}(
_names[i],
_durations[i]
);
unchecked {
++i;
}
}
//return any excess funds to the caller if anyif (address(this).balance>0) {
payable(msg.sender).transfer(address(this).balance);
}
}
/**
@notice Function called "batchRenewAny" that can renew both ENS names and subdomains in a single transaction
@param _names: an array of labels for TLDs
@param _durations: an array of uint256 values representing the number of seconds for which each corresponding ENS name in "names" should be renewed
@param _parentNodes: array of parent nodes for subdomains
@param _subLabelHashes: array of subdomain label hashes
@param _subExpiries: array of expires for subdomains
*/functionbatchRenewAny(string[] calldata _names,
uint256[] calldata _durations,
bytes32[] calldata _parentNodes,
bytes32[] calldata _subLabelHashes,
uint64[] calldata _subExpiries
) externalpayable{
batchRenew(_names, _durations);
batchRenewSubdomains(_parentNodes, _subLabelHashes, _subExpiries);
}
/**
* @notice Function called "batchRenewSubdomains" that allows the caller to renew multiple subdomains in a single transaction
* @dev Only can be renewed by owner of subdomain if CAN_EXTEND_EXPIRY fuse is set
* @dev Only can be renewed by owner of parent domain if CAN_EXTEND_EXPIRY fuse is not set
* @param _parentNodes: array of parent nodes for subdomains
* @param _subLabelHashes: array of subdomain label hashes
* @param _subExpiries: array of expiries for subdomains
*/functionbatchRenewSubdomains(bytes32[] calldata _parentNodes,
bytes32[] calldata _subLabelHashes,
uint64[] calldata _subExpiries
) public{
require(
_parentNodes.length== _subLabelHashes.length,
"length mismatch"
);
for (uint256 i; i < _parentNodes.length; ) {
bytes32 subdomainHash =keccak256(
abi.encodePacked(_parentNodes[i], _subLabelHashes[i])
);
(address owner, uint32 fuses, ) = nameWrapper.getData(
uint256(subdomainHash)
);
if (
(fuses & CAN_EXTEND_EXPIRY !=0&& owner ==msg.sender) ||
(nameWrapper.ownerOf(uint256(_parentNodes[i])) ==msg.sender)
) {
nameWrapper.extendExpiry(
_parentNodes[i],
_subLabelHashes[i],
_subExpiries[i]
);
}
unchecked {
++i;
}
}
}
// withdraw any tokens that may be sent to this contractfunctionwithdrawTokens(address _token) publiconlyOwner{
IERC20 token = IERC20(_token);
token.transfer(msg.sender, token.balanceOf(address(this)));
}
/**
* @notice Function called "getPrice" that allows the caller to calculate the total price for renewing a list of ENS names for specified durations
* @param _names: an array of strings representing the ENS names to be renewed
* @param _durations: an array of uint256 values representing the number of seconds for which each corresponding ENS name in "names" should be renewed
* @return _price the total price for renewing all the names in "names" for the corresponding durations in "durations"
*/functiongetPrice(string[] calldata _names,
uint256[] memory _durations
) publicviewreturns (uint256 _price) {
require(_names.length== _durations.length, "length mismatch");
for (uint256 i; i < _names.length; ) {
//you can overflow it if you want.. not going to achive much though.unchecked {
_price += ens.rentPrice(_names[i], _durations[i]);
++i;
}
}
}
/**
* @notice
* This function retrieves the expiry time for each name in the given array.
*
* @param _names An array of names to get the expiry time for.
* @return _expiries An array of expiry times for the given names.
*/functiongetExpiryArrayFromLabels(string[] calldata _names
) publicviewreturns (uint256[] memory _expiries) {
// Initialize the array to hold the expiry times to the same length as the names array.
_expiries =newuint256[](_names.length);
// Loop through each name in the array.for (uint256 i; i < _names.length; ) {
// Get the expiry time for the name by hashing the name and looking up the expiry time using the hash as the ID.
_expiries[i] = baseRegistrar.nameExpires(
uint256(keccak256(abi.encodePacked(_names[i])))
);
// Increment the counter without checking for integer overflow.unchecked {
++i;
}
}
}
/**
* @notice
* This function retrieves the price for aggregated renewals.
*
* @param _names An array of names to get the expiry time for.
* @return _price A sum of the prices for each name.
*/functiongetSyncPriceFromLabels(string[] calldata _names,
uint256 _syncdate
) externalviewreturns (uint256 _price) {
uint256[] memory durations = getSyncArrayFromLabels(_names, _syncdate);
_price = getPrice(_names, durations);
}
functionvisionRenew(string[] calldata _names,
uint256 _duration
) externalpayable{
for (uint256 i; i < _names.length; ) {
ens.renew{value: ens.rentPrice(_names[i], _duration)}(
_names[i],
_duration
);
unchecked {
++i;
}
}
//return any excess funds to the caller if anyif (address(this).balance>0) {
payable(msg.sender).transfer(address(this).balance);
}
}
functionsyncExpirations(string[] calldata _names,
uint256 _syncdate
) externalpayable{
uint256[] memory durations = getSyncArrayFromLabels(_names, _syncdate);
for (uint256 i; i < _names.length; ) {
ens.renew{value: ens.rentPrice(_names[i], durations[i])}(
_names[i],
durations[i]
);
unchecked {
++i;
}
}
//return any excess funds to the caller if anyif (address(this).balance>0) {
payable(msg.sender).transfer(address(this).balance);
}
}
/**
* @notice
* This function retrieves the expiry time for each ID in the given array.
*
* @param _ids An array of IDs to get the expiry time for.
* @return _expiries An array of expiry times for the given IDs.
*/functiongetExpiryArray(uint256[] calldata _ids
) externalviewreturns (uint256[] memory _expiries) {
// Initialize the array to hold the expiry times to the same length as the ID array.
_expiries =newuint256[](_ids.length);
// Loop through each ID in the array.for (uint256 i; i < _ids.length; ) {
// Get the expiry time for the ID.
_expiries[i] = baseRegistrar.nameExpires(_ids[i]);
// Increment the counter without checking for integer overflow.unchecked {
++i;
}
}
}
/**
* @notice
* This function calculates the duration between a new expiry time and the current expiry time for each ID in the given array.
* If the new expiry time is earlier than the current expiry time, the duration will be set to 0.
*
* @param _ids An array of IDs to calculate the duration for.
* @param _newExpiry The new expiry time to use for the calculation.
*/functiongetSyncArray(uint256[] calldata _ids,
uint256 _newExpiry
) externalviewreturns (uint256[] memory _durations) {
// Initialize the array to hold the durations to the same length as the ID array.
_durations =newuint256[](_ids.length);
// Loop through each ID in the array.for (uint256 i; i < _ids.length; ) {
// Get the current expiry time for the ID.uint256 expiry = baseRegistrar.nameExpires(_ids[i]);
// If the new expiry time is later than the current expiry time, set the duration to the difference between the two.// Otherwise, set the duration to 0.
_durations[i] = _newExpiry > expiry ? _newExpiry - expiry : 0;
unchecked {
++i;
}
}
}
/**
* @notice
* This function calculates the duration between a new expiry time and the current expiry time for each label in the given array.
* If the new expiry time is earlier than the current expiry time, the duration will be set to 0.
*
* @param _labels An array of labels to calculate the duration for.
* @param _newExpiry The new expiry time to use for the calculation.
*/functiongetSyncArrayFromLabels(string[] calldata _labels,
uint256 _newExpiry
) publicviewreturns (uint256[] memory _durations) {
// Initialize the array to hold the durations to the same length as the label array.
_durations =newuint256[](_labels.length);
// Loop through each label in the array.for (uint256 i; i < _labels.length; ) {
// Get the current expiry time for the label by hashing the label and looking up the expiry time using the hash as the ID.uint256 expiry = baseRegistrar.nameExpires(
uint256(keccak256(abi.encodePacked(_labels[i])))
);
// If the new expiry time is later than the current expiry time, set the duration to the difference between the two.// Otherwise, set the duration to 0.
_durations[i] = _newExpiry > expiry ? _newExpiry - expiry : 0;
unchecked {
++i;
}
}
}
}
Código Fuente del Contrato
Archivo 4 de 13: IBaseRegistrar.sol
import"../registry/ENS.sol";
import"./IBaseRegistrar.sol";
import"@openzeppelin/contracts/token/ERC721/IERC721.sol";
interfaceIBaseRegistrarisIERC721{
eventControllerAdded(addressindexed controller);
eventControllerRemoved(addressindexed controller);
eventNameMigrated(uint256indexed id,
addressindexed owner,
uint256 expires
);
eventNameRegistered(uint256indexed id,
addressindexed owner,
uint256 expires
);
eventNameRenewed(uint256indexed id, uint256 expires);
// Authorises a controller, who can register and renew domains.functionaddController(address controller) external;
// Revoke controller permission for an address.functionremoveController(address controller) external;
// Set the resolver for the TLD this registrar manages.functionsetResolver(address resolver) external;
// Returns the expiration timestamp of the specified label hash.functionnameExpires(uint256 id) externalviewreturns (uint256);
// Returns true iff the specified name is available for registration.functionavailable(uint256 id) externalviewreturns (bool);
/**
* @dev Register a name.
*/functionregister(uint256 id,
address owner,
uint256 duration
) externalreturns (uint256);
functionrenew(uint256 id, uint256 duration) externalreturns (uint256);
/**
* @dev Reclaim ownership of a name in ENS, if you own it in the registrar.
*/functionreclaim(uint256 id, address owner) external;
}
Código Fuente del Contrato
Archivo 5 de 13: IERC1155.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)pragmasolidity ^0.8.0;import"../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/interfaceIERC1155isIERC165{
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/eventTransferSingle(addressindexed operator, addressindexedfrom, addressindexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/eventTransferBatch(addressindexed operator,
addressindexedfrom,
addressindexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/eventApprovalForAll(addressindexed account, addressindexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/eventURI(string value, uint256indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/functionbalanceOf(address account, uint256 id) externalviewreturns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/functionbalanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
externalviewreturns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/functionsetApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/functionisApprovedForAll(address account, address operator) externalviewreturns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/functionsafeTransferFrom(addressfrom,
address to,
uint256 id,
uint256 amount,
bytescalldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/functionsafeBatchTransferFrom(addressfrom,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytescalldata data
) external;
}
Código Fuente del Contrato
Archivo 6 de 13: IERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragmasolidity ^0.8.0;/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/interfaceIERC165{
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/functionsupportsInterface(bytes4 interfaceId) externalviewreturns (bool);
}
Código Fuente del Contrato
Archivo 7 de 13: IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)pragmasolidity ^0.8.0;/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/interfaceIERC20{
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/eventTransfer(addressindexedfrom, addressindexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/eventApproval(addressindexed owner, addressindexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/functiontotalSupply() externalviewreturns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/functionbalanceOf(address account) externalviewreturns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransfer(address to, uint256 amount) externalreturns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/functionallowance(address owner, address spender) externalviewreturns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/functionapprove(address spender, uint256 amount) externalreturns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom,
address to,
uint256 amount
) externalreturns (bool);
}
Código Fuente del Contrato
Archivo 8 de 13: IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)pragmasolidity ^0.8.0;import"../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/interfaceIERC721isIERC165{
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/eventTransfer(addressindexedfrom, addressindexed to, uint256indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/eventApproval(addressindexed owner, addressindexed approved, uint256indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/eventApprovalForAll(addressindexed owner, addressindexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/functionbalanceOf(address owner) externalviewreturns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/functionownerOf(uint256 tokenId) externalviewreturns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/functionsafeTransferFrom(addressfrom,
address to,
uint256 tokenId,
bytescalldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/functionsafeTransferFrom(addressfrom,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/functionapprove(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/functionsetApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/functiongetApproved(uint256 tokenId) externalviewreturns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/functionisApprovedForAll(address owner, address operator) externalviewreturns (bool);
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)pragmasolidity ^0.8.0;import"../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/abstractcontractOwnableisContext{
addressprivate _owner;
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
require(newOwner !=address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}