Token ArbiSocks ZK Edition
Overview ERC-721
Total Supply:
5,000 ZKSOCKS
Holders:
1,095 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x9d938a88094296ff207966671bBCAF14Bf28286f
Contract Name:
Diamond
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Standard Json-Input format)
// 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: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol) pragma solidity ^0.8.0; import "./Address.sol"; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), data[i]); } return results; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^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}. */ interface IERC165 { /** * @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. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./IERC173Events.sol"; /** * @title Contract ownership standard interface * @dev see https://eips.ethereum.org/EIPS/eip-173 */ interface IERC173 is IERC173Events { /** * @notice get the ERC173 contract owner * @return conrtact owner */ function owner() external view returns (address); /** * @notice transfer contract ownership to new account * @param account address of new owner */ function transferOwnership(address account) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * @title Contract ownership standard interface (event only) * @dev see https://eips.ethereum.org/EIPS/eip-173 */ interface IERC173Events { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library OwnableStorage { struct Layout { address owner; } bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.Ownable"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function setOwner(Layout storage l, address owner) internal { l.owner = owner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../access/ownable/OwnableStorage.sol"; import "../access/ownable/IERC173.sol"; import "../introspection/ERC165.sol"; import "../metatx/ERC2771Context.sol"; import "../diamond/IDiamondCut.sol"; import "../diamond/IDiamondLoupe.sol"; import "@openzeppelin/contracts/utils/Multicall.sol"; import "./DiamondStorage.sol"; contract Diamond is Multicall { using ERC165Storage for ERC165Storage.Layout; using OwnableStorage for OwnableStorage.Layout; struct Initialization { address initContract; bytes initData; } struct CoreFacets { address diamondCutFacet; address diamondLoupeFacet; address erc165Facet; address erc173Facet; } constructor( address owner, CoreFacets memory _coreFacets, IDiamondCut.FacetCut[] memory _facets, Initialization[] memory _initializations ) { ERC165Storage.Layout storage erc165 = ERC165Storage.layout(); // register DiamondCut bytes4[] memory selectorsDiamondCut = new bytes4[](1); selectorsDiamondCut[0] = IDiamondCut.diamondCut.selector; erc165.setSupportedInterface(type(IDiamondCut).interfaceId, true); // register DiamondLoupe bytes4[] memory selectorsDiamondLoupe = new bytes4[](4); selectorsDiamondLoupe[0] = IDiamondLoupe.facets.selector; selectorsDiamondLoupe[1] = IDiamondLoupe.facetFunctionSelectors.selector; selectorsDiamondLoupe[2] = IDiamondLoupe.facetAddresses.selector; selectorsDiamondLoupe[3] = IDiamondLoupe.facetAddress.selector; erc165.setSupportedInterface(type(IDiamondLoupe).interfaceId, true); // register ERC165 (supportsInterface) bytes4[] memory selectorsERC165 = new bytes4[](1); selectorsERC165[0] = IERC165.supportsInterface.selector; erc165.setSupportedInterface(type(IERC165).interfaceId, true); // register ERC173 (Ownable) bytes4[] memory selectorsERC173 = new bytes4[](2); selectorsERC173[0] = IERC173.owner.selector; selectorsERC173[1] = IERC173.transferOwnership.selector; erc165.setSupportedInterface(type(IERC173).interfaceId, true); // execute the first ever diamond cut, // we are calling the addFunctions directly to save ~ %50 gas DiamondStorage.addFunctions(_coreFacets.diamondCutFacet, selectorsDiamondCut); DiamondStorage.addFunctions(_coreFacets.diamondLoupeFacet, selectorsDiamondLoupe); DiamondStorage.addFunctions(_coreFacets.erc165Facet, selectorsERC165); DiamondStorage.addFunctions(_coreFacets.erc173Facet, selectorsERC173); // set owner OwnableStorage.layout().setOwner(owner); // initialization for (uint256 i = 0; i < _facets.length; i++) { DiamondStorage.addFunctions(_facets[i].facetAddress, _facets[i].functionSelectors); } for (uint256 i = 0; i < _initializations.length; i++) { DiamondStorage.initializeDiamondCut(_initializations[i].initContract, _initializations[i].initData); } } // Find facet for function that is called and execute the // function if a facet is found and return any value. fallback() external payable { DiamondStorage.Layout storage l; bytes32 position = DiamondStorage.DIAMOND_STORAGE_POSITION; // get diamond storage assembly { l.slot := position } // get facet from function selector address facet = l.selectorToFacetAndPosition[msg.sig].facetAddress; require(facet != address(0), "BAD_FUNC"); // Execute external function from facet using delegatecall and return any value. assembly { // copy function selector and any arguments calldatacopy(0, 0, calldatasize()) // execute function call using the facet let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) // get any return value returndatacopy(0, 0, returndatasize()) // return any return value or error back to the caller switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import "../diamond/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard error ErrDiamondFacetAlreadyExists(address facet, bytes4 selector); error ErrDiamondFacetSameFunction(address facet, bytes4 selector); library DiamondStorage { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndPosition { address facetAddress; uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array } struct FacetFunctionSelectors { bytes4[] functionSelectors; uint256 facetAddressPosition; // position of facetAddress in facetAddresses array } struct Layout { // maps function selector to the facet address and // the position of the selector in the facetFunctionSelectors.selectors array mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; // maps facet addresses to function selectors mapping(address => FacetFunctionSelectors) facetFunctionSelectors; // facet addresses address[] facetAddresses; } function layout() internal pure returns (Layout storage l) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { l.slot := position } } event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut function diamondCut( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; if (action == IDiamondCut.FacetCutAction.Add) { addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Replace) { replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else if (action == IDiamondCut.FacetCutAction.Remove) { removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors); } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { // require( // _functionSelectors.length > 0, // "LibDiamondCut: No selectors in facet to cut" // ); Layout storage l = layout(); // require( // _facetAddress != address(0), // "LibDiamondCut: Add facet can't be address(0)" // ); uint96 selectorPosition = uint96(l.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(l, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = l.selectorToFacetAndPosition[selector].facetAddress; if (oldFacetAddress != address(0)) { revert ErrDiamondFacetAlreadyExists(oldFacetAddress, selector); } addFunction(l, selector, selectorPosition, _facetAddress); selectorPosition++; } } function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { // require( // _functionSelectors.length > 0, // "LibDiamondCut: No selectors in facet to cut" // ); Layout storage l = layout(); // require( // _facetAddress != address(0), // "LibDiamondCut: Add facet can't be address(0)" // ); uint96 selectorPosition = uint96(l.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(l, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = l.selectorToFacetAndPosition[selector].facetAddress; if (oldFacetAddress == _facetAddress) { revert ErrDiamondFacetSameFunction(oldFacetAddress, selector); } removeFunction(l, oldFacetAddress, selector); addFunction(l, selector, selectorPosition, _facetAddress); selectorPosition++; } } function removeFunctions(address, bytes4[] memory _functionSelectors) internal { // require( // _functionSelectors.length > 0, // "LibDiamondCut: No selectors in facet to cut" // ); Layout storage l = layout(); // if function does not exist then do nothing and return // require( // _facetAddress == address(0), // "LibDiamondCut: Remove facet address must be address(0)" // ); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = l.selectorToFacetAndPosition[selector].facetAddress; removeFunction(l, oldFacetAddress, selector); } } function addFacet(Layout storage l, address _facetAddress) internal { enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); l.facetFunctionSelectors[_facetAddress].facetAddressPosition = l.facetAddresses.length; l.facetAddresses.push(_facetAddress); } function addFunction( Layout storage l, bytes4 _selector, uint96 _selectorPosition, address _facetAddress ) internal { l.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; l.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); l.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } function removeFunction( Layout storage l, address _facetAddress, bytes4 _selector ) internal { // require( // _facetAddress != address(0), // "LibDiamondCut: Can't remove function that doesn't exist" // ); // an immutable function is a function defined directly in a diamond // require( // _facetAddress != address(this), // "LibDiamondCut: Can't remove immutable function" // ); // replace selector with last selector, then delete last selector uint256 selectorPosition = l.selectorToFacetAndPosition[_selector].functionSelectorPosition; uint256 lastSelectorPosition = l.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; // if not the same then replace _selector with lastSelector if (selectorPosition != lastSelectorPosition) { bytes4 lastSelector = l.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; l.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; l.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition); } // delete the last selector l.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); delete l.selectorToFacetAndPosition[_selector]; // if no more selectors for facet address then delete the facet address if (lastSelectorPosition == 0) { // replace facet address with last facet address and delete last facet address uint256 lastFacetAddressPosition = l.facetAddresses.length - 1; uint256 facetAddressPosition = l.facetFunctionSelectors[_facetAddress].facetAddressPosition; if (facetAddressPosition != lastFacetAddressPosition) { address lastFacetAddress = l.facetAddresses[lastFacetAddressPosition]; l.facetAddresses[facetAddressPosition] = lastFacetAddress; l.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; } l.facetAddresses.pop(); delete l.facetFunctionSelectors[_facetAddress].facetAddressPosition; } } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { require(_calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty"); } else { require(_calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)"); if (_init != address(this)) { enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); } (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("LibDiamondCut: _init function reverted"); } } } } function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } require(contractSize > 0, _errorMessage); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamondCut { enum FacetCutAction { Add, Replace, Remove } // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ // A loupe is a small magnifying glass used to look at diamonds. // These functions look at diamonds interface IDiamondLoupe { /// These functions are expected to be called frequently /// by tools. struct Facet { address facetAddress; bytes4[] functionSelectors; } /// @notice Gets all facet addresses and their four byte function selectors. /// @return facets_ Facet function facets() external view returns (Facet[] memory facets_); /// @notice Gets all the function selectors supported by a specific facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view returns (address[] memory facetAddresses_); /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "./ERC165Storage.sol"; /** * @title ERC165 * @notice Standard EIP-165 facet which would be already included as a core facet in Flair's Diamond contract. * * @custom:type eip-2535-facet * @custom:category Introspection * @custom:provides-interfaces IERC165 */ contract ERC165 is IERC165 { using ERC165Storage for ERC165Storage.Layout; /** * @inheritdoc IERC165 */ function supportsInterface(bytes4 interfaceId) public view returns (bool) { return ERC165Storage.layout().isSupportedInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library ERC165Storage { struct Layout { mapping(bytes4 => bool) supportedInterfaces; } bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.ERC165"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } function isSupportedInterface(Layout storage l, bytes4 interfaceId) internal view returns (bool) { return l.supportedInterfaces[interfaceId]; } function setSupportedInterface( Layout storage l, bytes4 interfaceId, bool status ) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); l.supportedInterfaces[interfaceId] = status; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./ERC2771ContextStorage.sol"; import "./ERC2771ContextInternal.sol"; import "./IERC2771Context.sol"; /** * @title ERC2771 Context * @notice Provides view functions about configured trusted forwarder according to EIP-2771. * * @custom:type eip-2535-facet * @custom:category Meta Transactions * @custom:provides-interfaces IERC2771Context */ contract ERC2771Context is IERC2771Context, ERC2771ContextInternal { using ERC2771ContextStorage for ERC2771ContextStorage.Layout; function trustedForwarder() external view override returns (address) { return ERC2771ContextStorage.layout().trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return _isTrustedForwarder(forwarder); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/utils/Context.sol"; import "./ERC2771ContextStorage.sol"; abstract contract ERC2771ContextInternal is Context { function _isTrustedForwarder(address operator) internal view returns (bool) { return ERC2771ContextStorage.layout().trustedForwarder == operator; } function _msgSender() internal view virtual override returns (address sender) { if (_isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. /// @solidity memory-safe-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (_isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library ERC2771ContextStorage { struct Layout { address trustedForwarder; } bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.ERC2771Context"); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; interface IERC2771Context { function trustedForwarder() external view returns (address); function isTrustedForwarder(address forwarder) external view returns (bool); }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1337 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"internalType":"address","name":"diamondCutFacet","type":"address"},{"internalType":"address","name":"diamondLoupeFacet","type":"address"},{"internalType":"address","name":"erc165Facet","type":"address"},{"internalType":"address","name":"erc173Facet","type":"address"}],"internalType":"struct Diamond.CoreFacets","name":"_coreFacets","type":"tuple"},{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_facets","type":"tuple[]"},{"components":[{"internalType":"address","name":"initContract","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}],"internalType":"struct Diamond.Initialization[]","name":"_initializations","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ErrDiamondFacetAlreadyExists","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001c3438038062001c34833981016040819052620000349162000e1f565b60006200004b620004bc60201b620002111760201c565b6040805160018082528183019092529192506000919060208083019080368337019050509050631f931c1c60e01b816000815181106200008f576200008f62000f09565b6001600160e01b0319909216602092830291909101820152620000c99083906307e4c70760e21b9060019062000235620004e0821b17901c565b60408051600480825260a0820190925260009160208201608080368337019050509050637a0ed62760e01b816000815181106200010a576200010a62000f09565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b908290600190811062000144576200014462000f09565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b90829060029081106200017e576200017e62000f09565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b9082906003908110620001b857620001b862000f09565b6001600160e01b0319909216602092830291909101820152620001f29084906348e2b09360e01b9060019062000235620004e0821b17901c565b604080516001808252818301909252600091602080830190803683370190505090506301ffc9a760e01b8160008151811062000232576200023262000f09565b6001600160e01b03199092166020928302919091018201526200026c9085906301ffc9a760e01b9060019062000235620004e0821b17901c565b604080516002808252606082018352600092602083019080368337019050509050638da5cb5b60e01b81600081518110620002ab57620002ab62000f09565b6001600160e01b031990921660209283029190910190910152805163f2fde38b60e01b9082906001908110620002e557620002e562000f09565b6001600160e01b03199092166020928302919091018201526200031f9086906307f5828d60e41b9060019062000235620004e0821b17901c565b6200033a8860000151856200056e60201b620002bd1760201c565b620003558860200151846200056e60201b620002bd1760201c565b620003708860400151836200056e60201b620002bd1760201c565b6200038b8860600151826200056e60201b620002bd1760201c565b620003b989620003a56200073d60201b620004bf1760201c565b6200076160201b620004e31790919060201c565b60005b875181101562000432576200041d888281518110620003df57620003df62000f09565b60200260200101516000015189838151811062000400576200040062000f09565b6020026020010151604001516200056e60201b620002bd1760201c565b80620004298162000f35565b915050620003bc565b5060005b8651811015620004ac576200049787828151811062000459576200045962000f09565b6020026020010151600001518883815181106200047a576200047a62000f09565b6020026020010151602001516200077e60201b6200050d1760201c565b80620004a38162000f35565b91505062000436565b5050505050505050505062000fd5565b7fff923f4a67695a9cdd5da4b8580a5a20edf2183c42aa111dd7fc15dc7bed264090565b6001600160e01b03198083169003620005405760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064015b60405180910390fd5b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b6001600160a01b03821660009081527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131d60205260408120547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c916001600160601b0382169003620005e557620005e58285620009a3565b60005b83518110156200073657600084828151811062000609576200060962000f09565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b031680156200067757604051631a2f0c8360e11b81526001600160a01b03821660048201526001600160e01b03198316602482015260440162000537565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b031916179055836200071b8162000f51565b945050505080806200072d9062000f35565b915050620005e8565b5050505050565b7fc0ea367cb0174dd5521cd2372c76f8c13e6c1f832c71f1d6e0cbc185c9cc8ed490565b81546001600160a01b0319166001600160a01b0391909116179055565b6001600160a01b0382166200080857805115620008045760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000606482015260840162000537565b5050565b6000815111620008815760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f742061646472657373283029000000606482015260840162000537565b6001600160a01b0382163014620008b757620008b78260405180606001604052806028815260200162001be86028913962000a10565b600080836001600160a01b031683604051620008d4919062000f82565b600060405180830381855af49150503d806000811462000911576040519150601f19603f3d011682016040523d82523d6000602084013e62000916565b606091505b5091509150816200099d5780511562000945578060405162461bcd60e51b815260040162000537919062000fa0565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b606482015260840162000537565b50505050565b620009c88160405180606001604052806024815260200162001c106024913962000a10565b6002820180546001600160a01b0390921660008181526001948501602090815260408220860185905594840183559182529290200180546001600160a01b0319169091179055565b813b81816200099d5760405162461bcd60e51b815260040162000537919062000fa0565b80516001600160a01b038116811462000a4c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000a8c5762000a8c62000a51565b60405290565b604080519081016001600160401b038111828210171562000a8c5762000a8c62000a51565b604051608081016001600160401b038111828210171562000a8c5762000a8c62000a51565b604051601f8201601f191681016001600160401b038111828210171562000b075762000b0762000a51565b604052919050565b60006001600160401b0382111562000b2b5762000b2b62000a51565b5060051b60200190565b600082601f83011262000b4757600080fd5b8151602062000b6062000b5a8362000b0f565b62000adc565b828152600592831b850182019282820191908785111562000b8057600080fd5b8387015b8581101562000ca05780516001600160401b038082111562000ba65760008081fd5b908901906060828c03601f190181131562000bc15760008081fd5b62000bcb62000a67565b62000bd889850162000a34565b81526040808501516003811062000bef5760008081fd5b828b015291840151918383111562000c075760008081fd5b82850194508d603f86011262000c1f57600093508384fd5b89850151935062000c3462000b5a8562000b0f565b84815293871b85018101938a810193508e85111562000c535760008081fd5b948101945b8486101562000c8b5785516001600160e01b03198116811462000c7b5760008081fd5b8452948a0194928a019262000c58565b90820152875250505092840192840162000b84565b5090979650505050505050565b60005b8381101562000cca57818101518382015260200162000cb0565b838111156200099d5750506000910152565b6000601f838184011262000cef57600080fd5b8251602062000d0262000b5a8362000b0f565b82815260059290921b8501810191818101908784111562000d2257600080fd5b8287015b8481101562000e135780516001600160401b038082111562000d485760008081fd5b908901906040601f19838d03810182131562000d645760008081fd5b62000d6e62000a92565b62000d7b89860162000a34565b8152828501518481111562000d905760008081fd5b8086019550508d603f86011262000da75760008081fd5b888501518481111562000dbe5762000dbe62000a51565b62000dcf8a848e8401160162000adc565b94508085528e8482880101111562000de957600092508283fd5b62000dfa818b870186890162000cad565b5080890193909352505084525091830191830162000d26565b50979650505050505050565b60008060008084860360e081121562000e3757600080fd5b62000e428662000a34565b94506080601f198201121562000e5757600080fd5b5062000e6262000ab7565b62000e706020870162000a34565b815262000e806040870162000a34565b602082015262000e936060870162000a34565b604082015262000ea66080870162000a34565b606082015260a08601519093506001600160401b038082111562000ec957600080fd5b62000ed78883890162000b35565b935060c087015191508082111562000eee57600080fd5b5062000efd8782880162000cdc565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000f4a5762000f4a62000f1f565b5060010190565b60006001600160601b038281166002600160601b0319810162000f785762000f7862000f1f565b6001019392505050565b6000825162000f9681846020870162000cad565b9190910192915050565b602081526000825180602084015262000fc181604085016020870162000cad565b601f01601f19169190910160400192915050565b610c038062000fe56000396000f3fe6080604052600436106100225760003560e01c8063ac9650d8146100e657610029565b3661002957005b600080356001600160e01b03191681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c602081905260409091205481906001600160a01b0316806100c25760405162461bcd60e51b815260206004820152600860248201527f4241445f46554e4300000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e8080156100e1573d6000f35b3d6000fd5b3480156100f257600080fd5b50610106610101366004610928565b61011c565b60405161011391906109f5565b60405180910390f35b60608167ffffffffffffffff81111561013757610137610a57565b60405190808252806020026020018201604052801561016a57816020015b60608152602001906001900390816101555790505b50905060005b8281101561020a576101da3085858481811061018e5761018e610a6d565b90506020028101906101a09190610a83565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061073792505050565b8282815181106101ec576101ec610a6d565b6020026020010181905250808061020290610ae7565b915050610170565b5092915050565b7fff923f4a67695a9cdd5da4b8580a5a20edf2183c42aa111dd7fc15dc7bed264090565b6001600160e01b0319808316900361028f5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064016100b9565b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b6001600160a01b03821660009081527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131d60205260408120547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c916bffffffffffffffffffffffff82169003610336576103368285610763565b60005b83518110156104b857600084828151811061035657610356610a6d565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b031680156103db576040517f345e19060000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526001600160e01b0319831660248201526044016100b9565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c949094029390931790925593909252879052815473ffffffffffffffffffffffffffffffffffffffff1916179055836104a081610b00565b945050505080806104b090610ae7565b915050610339565b5050505050565b7fc0ea367cb0174dd5521cd2372c76f8c13e6c1f832c71f1d6e0cbc185c9cc8ed490565b815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0391909116179055565b6001600160a01b038216610594578051156105905760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016100b9565b5050565b600081511161060b5760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016100b9565b6001600160a01b038216301461063d5761063d82604051806060016040528060288152602001610b5b602891396107da565b600080836001600160a01b0316836040516106589190610b2b565b600060405180830381855af49150503d8060008114610693576040519150601f19603f3d011682016040523d82523d6000602084013e610698565b606091505b509150915081610731578051156106c3578060405162461bcd60e51b81526004016100b99190610b47565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f766572746564000000000000000000000000000000000000000000000000000060648201526084016100b9565b50505050565b606061075c8383604051806060016040528060278152602001610ba7602791396107fb565b9392505050565b61078581604051806060016040528060248152602001610b83602491396107da565b6002820180546001600160a01b03909216600081815260019485016020908152604082208601859055948401835591825292902001805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b813b81816107315760405162461bcd60e51b81526004016100b99190610b47565b60606001600160a01b0384163b61087a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016100b9565b600080856001600160a01b0316856040516108959190610b2b565b600060405180830381855af49150503d80600081146108d0576040519150601f19603f3d011682016040523d82523d6000602084013e6108d5565b606091505b50915091506108e58282866108ef565b9695505050505050565b606083156108fe57508161075c565b82511561090e5782518084602001fd5b8160405162461bcd60e51b81526004016100b99190610b47565b6000806020838503121561093b57600080fd5b823567ffffffffffffffff8082111561095357600080fd5b818501915085601f83011261096757600080fd5b81358181111561097657600080fd5b8660208260051b850101111561098b57600080fd5b60209290920196919550909350505050565b60005b838110156109b85781810151838201526020016109a0565b838111156107315750506000910152565b600081518084526109e181602086016020860161099d565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610a4a57603f19888603018452610a388583516109c9565b94509285019290850190600101610a1c565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610a9a57600080fd5b83018035915067ffffffffffffffff821115610ab557600080fd5b602001915036819003821315610aca57600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b600060018201610af957610af9610ad1565b5060010190565b60006bffffffffffffffffffffffff808316818103610b2157610b21610ad1565b6001019392505050565b60008251610b3d81846020870161099d565b9190910192915050565b60208152600061075c60208301846109c956fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220cc5f3443a147a2ce6f313c96c0842d8010bfaa5bf48d48fb772ff5d7d723e2ff64736f6c634300080f00334c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a95222e729bee6e32e23d2aa97ced56cc9b719ca0000000000000000000000004597efd61417c940af99a73127c89187b63539f500000000000000000000000021e829baff29509e87e94d59d57d200b50eaeb7f000000000000000000000000e916b8ad209f43b06be7b4596c87deb6f7911bd000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000