ERC-721
Overview
Max Total Supply
368 MOMENTUM
Holders
334
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MOMENTUMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Diamond
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; /******************************************************************************\ * Authors: Nick Mudge (https://twitter.com/mudgen) * * Implementation of a diamond. /******************************************************************************/ import {LibDiamond} from "./libraries/LibDiamond.sol"; import {DiamondCutFacet} from "./facets/DiamondCutFacet.sol"; import {DiamondLoupeFacet} from "./facets/DiamondLoupeFacet.sol"; import {OwnershipFacet} from "./facets/OwnershipFacet.sol"; import {AccessControl} from "./libraries/LibAccessControl.sol"; contract Diamond { constructor(address _contractOwner, address _diamondCutFacet, address _diamondLoupeFacet, address _ownershipFacet) { LibDiamond.setContractOwner(_contractOwner); LibDiamond.addDiamondFunctions(_diamondCutFacet, _diamondLoupeFacet, _ownershipFacet); AccessControl.initialize(_contractOwner); } receive() external payable {} // Find facet for function that is called and execute the // function if a facet is found and return any value. fallback() external payable { LibDiamond.DiamondStorage storage ds; bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress; bytes32[] memory roles = ds.selectorToAccessControl[msg.sig]; bool isAuthorized = roles.length == 0; for (uint256 i = 0; i < roles.length; i++) { if(AccessControl.hasRole(roles[i], msg.sender)) { isAuthorized = true; break; } } require(isAuthorized, "RBAC: unauthorized"); require(facet != address(0), "Diamond: Function does not exist"); assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; import {IERC165} from "../interfaces/IERC165.sol"; import {IERC173} from "../interfaces/IERC173.sol"; import {LibMeta} from "./LibMeta.sol"; library LibDiamond { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct FacetAddressAndPosition { address facetAddress; uint16 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array } struct FacetFunctionSelectors { bytes4[] functionSelectors; uint16 facetAddressPosition; // position of facetAddress in facetAddresses array } struct DiamondStorage { // 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; // maps function selector to role based access control mapping(bytes4 => bytes32[]) selectorToAccessControl; // facet addresses address[] facetAddresses; // Used to query if a contract implements an interface. // Used to implement ERC-165. mapping(bytes4 => bool) supportedInterfaces; // Owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { require(LibMeta.msgSender() == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); function addDiamondFunctions( address _diamondCutFacet, address _diamondLoupeFacet, address _ownershipFacet ) internal { IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](3); IDiamondCut.FunctionSelector[] memory functionSelectors = new IDiamondCut.FunctionSelector[](1); bytes32[] memory roles = new bytes32[](0); functionSelectors[0] = IDiamondCut.FunctionSelector(IDiamondCut.diamondCut.selector, roles); cut[0] = IDiamondCut.FacetCut({facetAddress: _diamondCutFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors}); functionSelectors = new IDiamondCut.FunctionSelector[](5); functionSelectors[0] = IDiamondCut.FunctionSelector(IDiamondLoupe.facets.selector, roles); functionSelectors[1] = IDiamondCut.FunctionSelector(IDiamondLoupe.facetFunctionSelectors.selector, roles); functionSelectors[2] = IDiamondCut.FunctionSelector(IDiamondLoupe.facetAddresses.selector, roles); functionSelectors[3] = IDiamondCut.FunctionSelector(IDiamondLoupe.facetAddress.selector, roles); functionSelectors[4] = IDiamondCut.FunctionSelector(IERC165.supportsInterface.selector, roles); cut[1] = IDiamondCut.FacetCut({ facetAddress: _diamondLoupeFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors }); functionSelectors = new IDiamondCut.FunctionSelector[](2); functionSelectors[0] = IDiamondCut.FunctionSelector(IERC173.transferOwnership.selector, roles); functionSelectors[1] = IDiamondCut.FunctionSelector(IERC173.owner.selector, roles); cut[2] = IDiamondCut.FacetCut({facetAddress: _ownershipFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: functionSelectors}); diamondCut(cut, address(0), ""); } // 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, IDiamondCut.FunctionSelector[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); DiamondStorage storage ds = diamondStorage(); // uint16 selectorCount = uint16(diamondStorage().selectors.length); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint16 selectorPosition = uint16(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = uint16(ds.facetAddresses.length); ds.facetAddresses.push(_facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex].selector; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(selector); ds.selectorToFacetAndPosition[selector].facetAddress = _facetAddress; ds.selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition; ds.selectorToAccessControl[selector] = _functionSelectors[selectorIndex].roles; selectorPosition++; } } function replaceFunctions(address _facetAddress, IDiamondCut.FunctionSelector[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); DiamondStorage storage ds = diamondStorage(); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint16 selectorPosition = uint16(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = uint16(ds.facetAddresses.length); ds.facetAddresses.push(_facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex].selector; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); removeFunction(oldFacetAddress, selector); // add function ds.selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(selector); ds.selectorToFacetAndPosition[selector].facetAddress = _facetAddress; ds.selectorToAccessControl[selector] = _functionSelectors[selectorIndex].roles; selectorPosition++; } } function removeFunctions(address _facetAddress, IDiamondCut.FunctionSelector[] memory _functionSelectors) internal { require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); DiamondStorage storage ds = diamondStorage(); // 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].selector; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; removeFunction(oldFacetAddress, selector); } } function removeFunction(address _facetAddress, bytes4 _selector) internal { DiamondStorage storage ds = diamondStorage(); 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 = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition; uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1; // if not the same then replace _selector with lastSelector if (selectorPosition != lastSelectorPosition) { bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition]; ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint16(selectorPosition); } // delete the last selector ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); delete ds.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 = ds.facetAddresses.length - 1; uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; if (facetAddressPosition != lastFacetAddressPosition) { address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition]; ds.facetAddresses[facetAddressPosition] = lastFacetAddress; ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = uint16(facetAddressPosition); } ds.facetAddresses.pop(); delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; } // delete role based access control of selector delete ds.selectorToAccessControl[_selector]; } 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 == false) { 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 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; import {LibDiamond} from "../libraries/LibDiamond.sol"; contract DiamondCutFacet is IDiamondCut { /// @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 override { LibDiamond.enforceIsContractOwner(); LibDiamond.diamondCut(_diamondCut, _init, _calldata); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {LibDiamond} from "../libraries/LibDiamond.sol"; import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; import {IERC165} from "../interfaces/IERC165.sol"; contract DiamondLoupeFacet is IDiamondLoupe, IERC165 { // Diamond Loupe Functions //////////////////////////////////////////////////////////////////// /// These functions are expected to be called frequently by tools. // // struct Facet { // address facetAddress; // bytes4[] functionSelectors; // } /// @notice Gets all facets and their selectors. /// @return facets_ Facet function facets() external view override returns (Facet[] memory facets_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); uint256 numFacets = ds.facetAddresses.length; facets_ = new Facet[](numFacets); for (uint256 i; i < numFacets; i++) { address facetAddress_ = ds.facetAddresses[i]; facets_[i].facetAddress = facetAddress_; facets_[i].functionSelectors = ds.facetFunctionSelectors[facetAddress_].functionSelectors; } } /// @notice Gets all the function selectors provided by a facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors(address _facet) external view override returns (bytes4[] memory facetFunctionSelectors_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); facetFunctionSelectors_ = ds.facetFunctionSelectors[_facet].functionSelectors; } /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view override returns (address[] memory facetAddresses_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); facetAddresses_ = ds.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 override returns (address facetAddress_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress; } // This implements ERC-165. function supportsInterface(bytes4 _interfaceId) external view override returns (bool) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); return ds.supportedInterfaces[_interfaceId]; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; import {LibDiamond} from "../libraries/LibDiamond.sol"; import {IERC173} from "../interfaces/IERC173.sol"; contract OwnershipFacet is IERC173 { function transferOwnership(address _newOwner) external override { LibDiamond.enforceIsContractOwner(); LibDiamond.setContractOwner(_newOwner); } function owner() external view override returns (address owner_) { owner_ = LibDiamond.contractOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; import {IAccessControl} from "../interfaces/IAccessControl.sol"; import {LibStrings} from "./LibStrings.sol"; library AccessControl { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } struct AccessControlStorage { mapping(bytes32 => RoleData) roles; } bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); bytes32 public constant SEC_MULTISIG_ROLE = keccak256("SEC_MULTISIG_ROLE"); bytes32 public constant PAYEE_ROLE = keccak256("PAYEE_ROLE"); bytes32 public constant ACCESS_CONTROL_STORAGE = keccak256("lol.momentum.access_control"); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /// @notice Modifier that checks that an account has a specific role. Reverts /// with a standardized message including the required role. /// @dev The format of the revert reason is given by the following regular expression: /// /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ /// @param role a role referred to by their `bytes32` identifier. modifier onlyRole(bytes32 role) { _checkRole(role); _; } /// @notice Grants `role` to `member`. /// @dev the caller must have ``role``'s admin role. /// @param role Roles are referred to by their `bytes32` identifier. /// @param account If `member` had not been already granted `role`, emits a {RoleGranted} /// event. function grantRole(bytes32 role, address account) public onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /// @notice Revokes `role` from `account`. /// @dev the caller must have ``role``'s admin role. /// @param role the `bytes32` identifier of the role. /// @param account If `account` had been granted `role`, emits a {RoleRevoked} event. function revokeRole(bytes32 role, address account) public onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /// @notice Revokes `role` from the calling account. /// @dev Roles are often managed via {grantRole} and {revokeRole}: this function's /// purpose is to provide a mechanism for accounts to lose their privileges /// if they are compromised (such as when a trusted device is misplaced). /// @param role the `bytes32` identifier of the role. /// @param account the caller must be `account`, emits a {RoleRevoked} event. function renounceRole(bytes32 role, address account) public { require(account == msg.sender, "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /// @notice Check that account has role /// @param role a role referred to by their `bytes32` identifier. /// @param account the account to check /// @return Returns `true` if `account` has been granted `role`. function hasRole(bytes32 role, address account) public view returns (bool) { AccessControlStorage storage acs = accessControlStorage(); return acs.roles[role].members[account]; } /// @notice Returns the admin role that controls `role` /// @dev See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}. /// @param role the `bytes32` identifier of the role. /// @return Returns the admin role that controls `role` function getRoleAdmin(bytes32 role) public view returns (bytes32) { AccessControlStorage storage acs = accessControlStorage(); return acs.roles[role].adminRole; } function initialize(address defaultAdmin) internal { AccessControlStorage storage ac = accessControlStorage(); ac.roles[DEFAULT_ADMIN_ROLE].members[defaultAdmin] = true; emit RoleGranted(DEFAULT_ADMIN_ROLE, defaultAdmin, msg.sender); } /*function _setupRole(bytes32 role, address account) internal { _grantRole(role, account); }*/ /// @notice Sets `adminRole` as ``role``'s admin role. /// @dev Emits a {RoleAdminChanged} event. /// @param role the `bytes32` identifier of the role. /// @param adminRole the `bytes32` identifier of the adminRole. function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal { AccessControlStorage storage acs = accessControlStorage(); bytes32 previousAdminRole = getRoleAdmin(role); acs.roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /// @notice Grants `role` to `member`. /// @dev the caller must have ``role``'s admin role. /// @param role Roles are referred to by their `bytes32` identifier. /// @param account If `member` had not been already granted `role`, emits a {RoleGranted} /// event. function _grantRole(bytes32 role, address account) internal { AccessControlStorage storage acs = accessControlStorage(); if (!hasRole(role, account)) { acs.roles[role].members[account] = true; emit RoleGranted(role, account, msg.sender); } } /// @notice Revokes `role` from `account`. /// @dev the caller must have ``role``'s admin role. /// @param role the `bytes32` identifier of the role. /// @param account If `account` had been granted `role`, emits a {RoleRevoked} event. function _revokeRole(bytes32 role, address account) internal { if (hasRole(role, account)) { AccessControlStorage storage acs = accessControlStorage(); acs.roles[role].members[account] = false; emit RoleRevoked(role, account, msg.sender); } } /// @notice Revert with a standard message if `_msgSender()` is missing `role`. /// Overriding this function changes the behavior of the {onlyRole} modifier. /// @dev Format of the revert message is described in {_checkRole}. /// @param role a role referred to by their `bytes32` identifier. function _checkRole(bytes32 role) internal view { _checkRole(role, msg.sender); } /// @notice Check that accout has the role /// @dev The format of the revert reason is given by the following regular expression: /// /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ /// @param role a role referred to by their `bytes32` identifier. /// @param account Revert with a standard message if `account` is missing `role`. function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", LibStrings.toHexString(account), " is missing role ", LibStrings.toHexString(uint256(role), 32) ) ) ); } } /// @notice Get the Storage used for this facet /// @return acs the AccessControlStorage function accessControlStorage() internal pure returns (AccessControlStorage storage acs) { bytes32 position = ACCESS_CONTROL_STORAGE; assembly { acs.slot := position } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) /******************************************************************************/ interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} struct FunctionSelector { bytes4 selector; bytes32[] roles; } struct FacetCut { address facetAddress; FacetCutAction action; FunctionSelector[] 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; // 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; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceId The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; /// @title ERC-173 Contract Ownership Standard /// Note: the ERC-165 identifier for this interface is 0x7f5828d0 /* is ERC165 */ interface IERC173 { /// @notice Get the address of the owner /// @return owner_ The address of the owner. function owner() external view returns (address owner_); /// @notice Set the address of the new owner of the contract /// @dev Set _newOwner to address(0) to renounce any ownership. /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; library LibMeta { bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(bytes("EIP712Domain(string name,string version,uint256 salt,address verifyingContract)")); function domainSeparator(string memory name, string memory version) internal view returns (bytes32 domainSeparator_) { domainSeparator_ = keccak256( abi.encode(EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), getChainID(), address(this)) ); } function getChainID() internal view returns (uint256 id) { assembly { id := chainid() } } function msgSender() internal view returns (address sender_) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender_ := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff) } } else { sender_ = msg.sender; } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; library LibStrings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
{ "remappings": [ "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "script/=script/", "src/=src/", "test/=test/", "src/=src/", "test/=test/", "script/=script/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": { "script/helpers/Access.sol": { "AccessHelper": "0x87f0fc6cf92e2af2a5dad88cf8d9d5065d050d64" }, "src/libraries/LibAccessControl.sol": { "AccessControl": "0xafececdd144f9c44813c0621551a22db423bef66" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"},{"internalType":"address","name":"_diamondLoupeFacet","type":"address"},{"internalType":"address","name":"_ownershipFacet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200364d3803806200364d833981016040819052620000349162001779565b6200004a846200008260201b620002521760201c565b620000628383836200010660201b620002d51760201c565b62000078846200057060201b620007091760201c565b5050505062001a86565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132180546001600160a01b031981166001600160a01b03848116918217909355604051600080516020620035a1833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60408051600380825260808201909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200011e57505060408051600180825281830190925291925060009190602082015b60408051808201909152600081526060602082015281526020019060019003908162000168575050604080516000808252606082018352635f3b70e560e11b6020830190815292820182905283519394509092849190620001cd57620001cd620017d6565b60200260200101819052506040518060600160405280876001600160a01b0316815260200160006002811115620002085762000208620017ec565b81526020018381525083600081518110620002275762000227620017d6565b602090810291909101015260408051600580825260c0820190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816200024857505060408051808201909152637a0ed62760e01b8152602081018390528151919350908390600090620002a557620002a5620017d6565b6020026020010181905250604051806040016040528063adfca15e60e01b6001600160e01b03191681526020018281525082600181518110620002ec57620002ec620017d6565b602002602001018190525060405180604001604052806352ef6b2c60e01b6001600160e01b03191681526020018281525082600281518110620003335762000333620017d6565b6020026020010181905250604051806040016040528063cdffacc660e01b6001600160e01b031916815260200182815250826003815181106200037a576200037a620017d6565b602002602001018190525060405180604001604052806301ffc9a760e01b6001600160e01b03191681526020018281525082600481518110620003c157620003c1620017d6565b60200260200101819052506040518060600160405280866001600160a01b0316815260200160006002811115620003fc57620003fc620017ec565b815260200183815250836001815181106200041b576200041b620017d6565b60209081029190910101526040805160028082526060820190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816200043c5750506040805180820190915263f2fde38b60e01b8152602081018390528151919350908390600090620004995762000499620017d6565b60200260200101819052506040518060400160405280638da5cb5b60e01b6001600160e01b03191681526020018281525082600181518110620004e057620004e0620017d6565b60200260200101819052506040518060600160405280856001600160a01b03168152602001600060028111156200051b576200051b620017ec565b815260200183815250836002815181106200053a576200053a620017d6565b602002602001018190525062000568836000604051806020016040528060008152506200060360201b60201c565b505050505050565b6001600160a01b03811660008181527fa0af4a3eba9ba50eca896dcbd1a05449534672e5e57349b659024f25cf234c5f6020526040808220805460ff19166001179055517ff9e0e9387af2bf552908ce3fe9be38015acc172d1effa55567a975615c31cc5e92339290917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908290a45050565b60005b83518110156200080f576000848281518110620006275762000627620017d6565b6020026020010151602001519050600060028111156200064b576200064b620017ec565b816002811115620006605762000660620017ec565b03620006be57620006b88583815181106200067f576200067f620017d6565b602002602001015160000151868481518110620006a057620006a0620017d6565b6020026020010151604001516200085e60201b60201c565b620007f9565b6001816002811115620006d557620006d5620017ec565b036200072d57620006b8858381518110620006f457620006f4620017d6565b602002602001015160000151868481518110620007155762000715620017d6565b60200260200101516040015162000b9e60201b60201c565b6002816002811115620007445762000744620017ec565b036200079c57620006b8858381518110620007635762000763620017d6565b602002602001015160000151868481518110620007845762000784620017d6565b60200260200101516040015162000efa60201b60201c565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b60648201526084015b60405180910390fd5b5080620008068162001818565b91505062000606565b507f4ad05d1e028a7a8c4118a93eede78a5aa2a8f2984afea095783a5908f2fab12b838383604051620008459392919062001891565b60405180910390a162000859828262001060565b505050565b6000815111620008b45760405162461bcd60e51b815260206004820152602b60248201526000805160206200362d83398151915260448201526a1858d95d081d1bc818dd5d60aa1b6064820152608401620007f0565b600080516020620035a18339815191526001600160a01b038316620009205760405162461bcd60e51b815260206004820152602c6024820152600080516020620035e983398151915260448201526b65206164647265737328302960a01b6064820152608401620007f0565b6001600160a01b03831660009081526001820160205260408120549061ffff82169003620009c9576200096d84604051806060016040528060248152602001620036096024913962001285565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b835181101562000b97576000848281518110620009ed57620009ed620017d6565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b0316801562000a965760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608401620007f0565b6001600160a01b03871660008181526001878101602090815260408084208054938401815584528184206008840401805463ffffffff60079095166004026101000a948502191660e089901c94909402939093179092556001600160e01b031986168352889052902080546001600160b01b031916909117600160a01b61ffff871602179055855186908490811062000b335762000b33620017d6565b6020908102919091018101518101516001600160e01b03198416600090815260028801835260409020815162000b6f93919290910190620016d2565b508362000b7c81620019f8565b9450505050808062000b8e9062001818565b915050620009cc565b5050505050565b600081511162000bf45760405162461bcd60e51b815260206004820152602b60248201526000805160206200362d83398151915260448201526a1858d95d081d1bc818dd5d60aa1b6064820152608401620007f0565b600080516020620035a18339815191526001600160a01b03831662000c605760405162461bcd60e51b815260206004820152602c6024820152600080516020620035e983398151915260448201526b65206164647265737328302960a01b6064820152608401620007f0565b6001600160a01b03831660009081526001820160205260408120549061ffff8216900362000d095762000cad84604051806060016040528060248152602001620036096024913962001285565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b835181101562000b9757600084828151811062000d2d5762000d2d620017d6565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b03908116908716810362000ddb5760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608401620007f0565b62000de78183620012a9565b6001600160e01b03198216600081815260208781526040808320805461ffff60a01b1916600160a01b61ffff8b16021781556001600160a01b038c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b031916179055855186908490811062000e965762000e96620017d6565b6020908102919091018101518101516001600160e01b03198416600090815260028801835260409020815162000ed293919290910190620016d2565b508362000edf81620019f8565b9450505050808062000ef19062001818565b91505062000d0c565b600081511162000f505760405162461bcd60e51b815260206004820152602b60248201526000805160206200362d83398151915260448201526a1858d95d081d1bc818dd5d60aa1b6064820152608401620007f0565b600080516020620035a18339815191526001600160a01b0383161562000fdf5760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608401620007f0565b60005b82518110156200105a576000838281518110620010035762001003620017d6565b602090810291909101810151516001600160e01b031981166000908152918590526040909120549091506001600160a01b0316620010428183620012a9565b50508080620010519062001818565b91505062000fe2565b50505050565b6001600160a01b038216620010ea57805115620010e65760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d707479000000006064820152608401620007f0565b5050565b6000815111620011635760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f7420616464726573732830290000006064820152608401620007f0565b6001600160a01b038216301462001199576200119982604051806060016040528060288152602001620035c16028913962001285565b600080836001600160a01b031683604051620011b6919062001a1c565b600060405180830381855af49150503d8060008114620011f3576040519150601f19603f3d011682016040523d82523d6000602084013e620011f8565b606091505b5090925090508115156000036200105a578051156200122d578060405162461bcd60e51b8152600401620007f0919062001a3a565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b6064820152608401620007f0565b813b81816200105a5760405162461bcd60e51b8152600401620007f0919062001a3a565b600080516020620035a18339815191526001600160a01b038316620013375760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608401620007f0565b306001600160a01b03841603620013a85760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b6064820152608401620007f0565b6001600160e01b03198216600090815260208281526040808320546001600160a01b0387168452600180860190935290832054600160a01b90910461ffff169291620013f49162001a56565b9050808214620014e7576001600160a01b038516600090815260018401602052604081208054839081106200142d576200142d620017d6565b600091825260208083206008830401546001600160a01b038a168452600188019091526040909220805460079092166004026101000a90920460e01b925082919085908110620014815762001481620017d6565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b031992909216825284905260409020805461ffff60a01b1916600160a01b61ffff8516021790555b6001600160a01b0385166000908152600184016020526040902080548062001513576200151362001a70565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319861682528490526040812080546001600160b01b0319169055819003620016ac576003830154600090620015849060019062001a56565b6001600160a01b038716600090815260018087016020526040909120015490915061ffff168082146200164a576000856003018381548110620015cb57620015cb620017d6565b6000918252602090912001546003870180546001600160a01b039092169250829184908110620015ff57620015ff620017d6565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018781019092526040902001805461ffff191661ffff83161790555b8460030180548062001660576200166062001a70565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03891682526001878101909152604090912001805461ffff1916905550505b6001600160e01b031984166000908152600284016020526040812062000b979162001722565b82805482825590600052602060002090810192821562001710579160200282015b8281111562001710578251825591602001919060010190620016f3565b506200171e92915062001745565b5090565b508054600082559060005260206000209081019062001742919062001745565b50565b5b808211156200171e576000815560010162001746565b80516001600160a01b03811681146200177457600080fd5b919050565b600080600080608085870312156200179057600080fd5b6200179b856200175c565b9350620017ab602086016200175c565b9250620017bb604086016200175c565b9150620017cb606086016200175c565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200182d576200182d62001802565b5060010190565b60005b838110156200185157818101518382015260200162001837565b838111156200105a5750506000910152565b600081518084526200187d81602086016020860162001834565b601f01601f19169290920160200192915050565b6000606082016060835280865180835260808501915060808160051b8601019250602080890160005b83811015620019c857607f1988870381018652825180516001600160a01b03168852848101516060890190600381106200190457634e487b7160e01b600052602160045260246000fd5b80878b01525060408201519150606060408a015280825180835260808b01915060808160051b8c01019250878401935060005b81811015620019af578b840386018352845180516001600160e01b031916855289015160408a86018190528151908601819052908a019060009060608701905b80831015620019995783518252928c019260019290920191908c019062001977565b50968b0196955050509188019160010162001937565b50919950505095840195505090820190600101620018ba565b50506001600160a01b0388169086015250508281036040840152620019ee818562001863565b9695505050505050565b600061ffff80831681810362001a125762001a1262001802565b6001019392505050565b6000825162001a3081846020870162001834565b9190910192915050565b60208152600062001a4f602083018462001863565b9392505050565b60008282101562001a6b5762001a6b62001802565b500390565b634e487b7160e01b600052603160045260246000fd5b611b0b8062001a966000396000f3fe60806040523661000b57005b600080356001600160e01b0319168152600080516020611a6a83398151915260208181526040808420547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131e83528185208054835181860281018601909452808452949586956001600160a01b0390931694909392908301828280156100af57602002820191906000526020600020905b81548152602001906001019080831161009b575b5050505050905060008151600014905060005b82518110156101905773afececdd144f9c44813c0621551a22db423bef666391d148548483815181106100f7576100f761171b565b6020026020010151336040518363ffffffff1660e01b815260040161012f9291909182526001600160a01b0316602082015260400190565b602060405180830381865af415801561014c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101709190611731565b1561017e5760019150610190565b8061018881611770565b9150506100c2565b50806101d85760405162461bcd60e51b815260206004820152601260248201527114909050ce881d5b985d5d1a1bdc9a5e995960721b60448201526064015b60405180910390fd5b6001600160a01b03831661022e5760405162461bcd60e51b815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064016101cf565b3660008037600080366000865af43d6000803e80801561024d573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132180546001600160a01b031981166001600160a01b03848116918217909355604051600080516020611a6a833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60408051600380825260808201909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816102ed57505060408051600180825281830190925291925060009190602082015b604080518082019091526000815260606020820152815260200190600190039081610336575050604080516000808252606082018352635f3b70e560e11b60208301908152928201829052835193945090928491906103975761039761171b565b60200260200101819052506040518060600160405280876001600160a01b03168152602001600060028111156103cf576103cf611789565b815260200183815250836000815181106103eb576103eb61171b565b602090810291909101015260408051600580825260c0820190925290816020015b60408051808201909152600081526060602082015281526020019060019003908161040c57505060408051808201909152637a0ed62760e01b81526020810183905281519193509083906000906104655761046561171b565b6020026020010181905250604051806040016040528063adfca15e60e01b6001600160e01b031916815260200182815250826001815181106104a9576104a961171b565b602002602001018190525060405180604001604052806352ef6b2c60e01b6001600160e01b031916815260200182815250826002815181106104ed576104ed61171b565b6020026020010181905250604051806040016040528063cdffacc660e01b6001600160e01b031916815260200182815250826003815181106105315761053161171b565b602002602001018190525060405180604001604052806301ffc9a760e01b6001600160e01b031916815260200182815250826004815181106105755761057561171b565b60200260200101819052506040518060600160405280866001600160a01b03168152602001600060028111156105ad576105ad611789565b815260200183815250836001815181106105c9576105c961171b565b60209081029190910101526040805160028082526060820190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816105ea5750506040805180820190915263f2fde38b60e01b81526020810183905281519193509083906000906106435761064361171b565b60200260200101819052506040518060400160405280638da5cb5b60e01b6001600160e01b031916815260200182815250826001815181106106875761068761171b565b60200260200101819052506040518060600160405280856001600160a01b03168152602001600060028111156106bf576106bf611789565b815260200183815250836002815181106106db576106db61171b565b60200260200101819052506107018360006040518060200160405280600081525061079c565b505050505050565b6001600160a01b03811660008181527fa0af4a3eba9ba50eca896dcbd1a05449534672e5e57349b659024f25cf234c5f6020526040808220805460ff19166001179055517ff9e0e9387af2bf552908ce3fe9be38015acc172d1effa55567a975615c31cc5e92339290917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908290a45050565b60005b83518110156109625760008482815181106107bc576107bc61171b565b6020026020010151602001519050600060028111156107dd576107dd611789565b8160028111156107ef576107ef611789565b0361083d576108388583815181106108095761080961171b565b6020026020010151600001518684815181106108275761082761171b565b6020026020010151604001516109ad565b61094f565b600181600281111561085157610851611789565b0361089a5761083885838151811061086b5761086b61171b565b6020026020010151600001518684815181106108895761088961171b565b602002602001015160400151610c65565b60028160028111156108ae576108ae611789565b036108f7576108388583815181106108c8576108c861171b565b6020026020010151600001518684815181106108e6576108e661171b565b602002602001015160400151610f3f565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b60648201526084016101cf565b508061095a81611770565b91505061079f565b507f4ad05d1e028a7a8c4118a93eede78a5aa2a8f2984afea095783a5908f2fab12b838383604051610996939291906117f7565b60405180910390a16109a8828261105d565b505050565b60008151116109ce5760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b038316610a035760405162461bcd60e51b81526004016101cf906119a0565b6001600160a01b03831660009081526001820160205260408120549061ffff82169003610aa857610a4c84604051806060016040528060248152602001611ab260249139611270565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b8351811015610c5e576000848281518110610ac857610ac861171b565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b03168015610b675760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f6044820152746e207468617420616c72656164792065786973747360581b60648201526084016101cf565b6001600160a01b03871660008181526001878101602090815260408084208054938401815584528184206008840401805463ffffffff60079095166004026101000a948502191660e089901c94909402939093179092556001600160e01b031986168352889052902080546001600160b01b031916909117600160a01b61ffff8716021790558551869084908110610c0157610c0161171b565b6020908102919091018101518101516001600160e01b031984166000908152600288018352604090208151610c3b9391929091019061169a565b5083610c46816119ec565b94505050508080610c5690611770565b915050610aab565b5050505050565b6000815111610c865760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b038316610cbb5760405162461bcd60e51b81526004016101cf906119a0565b6001600160a01b03831660009081526001820160205260408120549061ffff82169003610d6057610d0484604051806060016040528060248152602001611ab260249139611270565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b8351811015610c5e576000848281518110610d8057610d8061171b565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b039081169087168103610e2c5760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016101cf565b610e368183611291565b6001600160e01b03198216600081815260208781526040808320805461ffff60a01b1916600160a01b61ffff8b16021781556001600160a01b038c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b0319161790558551869084908110610ee257610ee261171b565b6020908102919091018101518101516001600160e01b031984166000908152600288018352604090208151610f1c9391929091019061169a565b5083610f27816119ec565b94505050508080610f3790611770565b915050610d63565b6000815111610f605760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b03831615610fe55760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f76652066616365742061646472604482015275657373206d757374206265206164647265737328302960501b60648201526084016101cf565b60005b82518110156110575760008382815181106110055761100561171b565b602090810291909101810151516001600160e01b031981166000908152918590526040909120549091506001600160a01b03166110428183611291565b5050808061104f90611770565b915050610fe8565b50505050565b6001600160a01b0382166110e4578051156110e05760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016101cf565b5050565b600081511161115b5760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016101cf565b6001600160a01b038216301461118d5761118d82604051806060016040528060288152602001611a8a60289139611270565b600080836001600160a01b0316836040516111a89190611a0d565b600060405180830381855af49150503d80600081146111e3576040519150601f19603f3d011682016040523d82523d6000602084013e6111e8565b606091505b50909250905081151560000361105757805115611219578060405162461bcd60e51b81526004016101cf9190611a29565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b60648201526084016101cf565b813b81816110575760405162461bcd60e51b81526004016101cf9190611a29565b600080516020611a6a8339815191526001600160a01b03831661131c5760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016101cf565b306001600160a01b0384160361138b5760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b60648201526084016101cf565b6001600160e01b03198216600090815260208281526040808320546001600160a01b0387168452600180860190935290832054600160a01b90910461ffff1692916113d591611a3c565b90508082146114c1576001600160a01b0385166000908152600184016020526040812080548390811061140a5761140a61171b565b600091825260208083206008830401546001600160a01b038a168452600188019091526040909220805460079092166004026101000a90920460e01b92508291908590811061145b5761145b61171b565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b031992909216825284905260409020805461ffff60a01b1916600160a01b61ffff8516021790555b6001600160a01b038516600090815260018401602052604090208054806114ea576114ea611a53565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319861682528490526040812080546001600160b01b031916905581900361167657600383015460009061155890600190611a3c565b6001600160a01b038716600090815260018087016020526040909120015490915061ffff1680821461161757600085600301838154811061159b5761159b61171b565b6000918252602090912001546003870180546001600160a01b0390921692508291849081106115cc576115cc61171b565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018781019092526040902001805461ffff191661ffff83161790555b8460030180548061162a5761162a611a53565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03891682526001878101909152604090912001805461ffff1916905550505b6001600160e01b0319841660009081526002840160205260408120610c5e916116e5565b8280548282559060005260206000209081019282156116d5579160200282015b828111156116d55782518255916020019190600101906116ba565b506116e1929150611706565b5090565b50805460008255906000526020600020908101906117039190611706565b50565b5b808211156116e15760008155600101611707565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561174357600080fd5b8151801515811461175357600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016117825761178261175a565b5060010190565b634e487b7160e01b600052602160045260246000fd5b60005b838110156117ba5781810151838201526020016117a2565b838111156110575750506000910152565b600081518084526117e381602086016020860161179f565b601f01601f19169290920160200192915050565b6000606082016060835280865180835260808501915060808160051b8601019250602080890160005b8381101561192757607f1988870381018652825180516001600160a01b031688528481015160608901906003811061186857634e487b7160e01b600052602160045260246000fd5b80878b01525060408201519150606060408a015280825180835260808b01915060808160051b8c01019250878401935060005b8181101561190f578b840386018352845180516001600160e01b031916855289015160408a86018190528151908601819052908a019060009060608701905b808310156118fa5783518252928c019260019290920191908c01906118da565b50968b0196955050509188019160010161189b565b50919950505095840195505090820190600101611820565b50506001600160a01b038816908601525050828103604084015261194b81856117cb565b9695505050505050565b6020808252602b908201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660408201526a1858d95d081d1bc818dd5d60aa1b606082015260800190565b6020808252602c908201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260408201526b65206164647265737328302960a01b606082015260800190565b600061ffff808316818103611a0357611a0361175a565b6001019392505050565b60008251611a1f81846020870161179f565b9190910192915050565b60208152600061175360208301846117cb565b600082821015611a4e57611a4e61175a565b500390565b634e487b7160e01b600052603160045260246000fdfec8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a2646970667358221220bd9e2f9955f02af52351507ba494e15e558acdf9b604df556aa532b83597a35264736f6c634300080f0033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204164642066616365742063616e277420624c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f64654c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206600000000000000000000000057212e15318320a6b36ebabf7d9830f30b38058d000000000000000000000000953b44c60f2883ad9e1f818926b8faacffadb906000000000000000000000000f033d740959be31c285efc8fadf49f387014462d0000000000000000000000003f57c1c4cfbfcab8cb06c52d3cbe4e15202b1c71
Deployed Bytecode
0x60806040523661000b57005b600080356001600160e01b0319168152600080516020611a6a83398151915260208181526040808420547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131e83528185208054835181860281018601909452808452949586956001600160a01b0390931694909392908301828280156100af57602002820191906000526020600020905b81548152602001906001019080831161009b575b5050505050905060008151600014905060005b82518110156101905773afececdd144f9c44813c0621551a22db423bef666391d148548483815181106100f7576100f761171b565b6020026020010151336040518363ffffffff1660e01b815260040161012f9291909182526001600160a01b0316602082015260400190565b602060405180830381865af415801561014c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101709190611731565b1561017e5760019150610190565b8061018881611770565b9150506100c2565b50806101d85760405162461bcd60e51b815260206004820152601260248201527114909050ce881d5b985d5d1a1bdc9a5e995960721b60448201526064015b60405180910390fd5b6001600160a01b03831661022e5760405162461bcd60e51b815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064016101cf565b3660008037600080366000865af43d6000803e80801561024d573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132180546001600160a01b031981166001600160a01b03848116918217909355604051600080516020611a6a833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60408051600380825260808201909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816102ed57505060408051600180825281830190925291925060009190602082015b604080518082019091526000815260606020820152815260200190600190039081610336575050604080516000808252606082018352635f3b70e560e11b60208301908152928201829052835193945090928491906103975761039761171b565b60200260200101819052506040518060600160405280876001600160a01b03168152602001600060028111156103cf576103cf611789565b815260200183815250836000815181106103eb576103eb61171b565b602090810291909101015260408051600580825260c0820190925290816020015b60408051808201909152600081526060602082015281526020019060019003908161040c57505060408051808201909152637a0ed62760e01b81526020810183905281519193509083906000906104655761046561171b565b6020026020010181905250604051806040016040528063adfca15e60e01b6001600160e01b031916815260200182815250826001815181106104a9576104a961171b565b602002602001018190525060405180604001604052806352ef6b2c60e01b6001600160e01b031916815260200182815250826002815181106104ed576104ed61171b565b6020026020010181905250604051806040016040528063cdffacc660e01b6001600160e01b031916815260200182815250826003815181106105315761053161171b565b602002602001018190525060405180604001604052806301ffc9a760e01b6001600160e01b031916815260200182815250826004815181106105755761057561171b565b60200260200101819052506040518060600160405280866001600160a01b03168152602001600060028111156105ad576105ad611789565b815260200183815250836001815181106105c9576105c961171b565b60209081029190910101526040805160028082526060820190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816105ea5750506040805180820190915263f2fde38b60e01b81526020810183905281519193509083906000906106435761064361171b565b60200260200101819052506040518060400160405280638da5cb5b60e01b6001600160e01b031916815260200182815250826001815181106106875761068761171b565b60200260200101819052506040518060600160405280856001600160a01b03168152602001600060028111156106bf576106bf611789565b815260200183815250836002815181106106db576106db61171b565b60200260200101819052506107018360006040518060200160405280600081525061079c565b505050505050565b6001600160a01b03811660008181527fa0af4a3eba9ba50eca896dcbd1a05449534672e5e57349b659024f25cf234c5f6020526040808220805460ff19166001179055517ff9e0e9387af2bf552908ce3fe9be38015acc172d1effa55567a975615c31cc5e92339290917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908290a45050565b60005b83518110156109625760008482815181106107bc576107bc61171b565b6020026020010151602001519050600060028111156107dd576107dd611789565b8160028111156107ef576107ef611789565b0361083d576108388583815181106108095761080961171b565b6020026020010151600001518684815181106108275761082761171b565b6020026020010151604001516109ad565b61094f565b600181600281111561085157610851611789565b0361089a5761083885838151811061086b5761086b61171b565b6020026020010151600001518684815181106108895761088961171b565b602002602001015160400151610c65565b60028160028111156108ae576108ae611789565b036108f7576108388583815181106108c8576108c861171b565b6020026020010151600001518684815181106108e6576108e661171b565b602002602001015160400151610f3f565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b60648201526084016101cf565b508061095a81611770565b91505061079f565b507f4ad05d1e028a7a8c4118a93eede78a5aa2a8f2984afea095783a5908f2fab12b838383604051610996939291906117f7565b60405180910390a16109a8828261105d565b505050565b60008151116109ce5760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b038316610a035760405162461bcd60e51b81526004016101cf906119a0565b6001600160a01b03831660009081526001820160205260408120549061ffff82169003610aa857610a4c84604051806060016040528060248152602001611ab260249139611270565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b8351811015610c5e576000848281518110610ac857610ac861171b565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b03168015610b675760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f6044820152746e207468617420616c72656164792065786973747360581b60648201526084016101cf565b6001600160a01b03871660008181526001878101602090815260408084208054938401815584528184206008840401805463ffffffff60079095166004026101000a948502191660e089901c94909402939093179092556001600160e01b031986168352889052902080546001600160b01b031916909117600160a01b61ffff8716021790558551869084908110610c0157610c0161171b565b6020908102919091018101518101516001600160e01b031984166000908152600288018352604090208151610c3b9391929091019061169a565b5083610c46816119ec565b94505050508080610c5690611770565b915050610aab565b5050505050565b6000815111610c865760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b038316610cbb5760405162461bcd60e51b81526004016101cf906119a0565b6001600160a01b03831660009081526001820160205260408120549061ffff82169003610d6057610d0484604051806060016040528060248152602001611ab260249139611270565b6003820180546001600160a01b038616600081815260018087016020908152604083208201805461ffff191661ffff90961695909517909455845490810185559381529190912090910180546001600160a01b03191690911790555b60005b8351811015610c5e576000848281518110610d8057610d8061171b565b602090810291909101810151516001600160e01b031981166000908152918690526040909120549091506001600160a01b039081169087168103610e2c5760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016101cf565b610e368183611291565b6001600160e01b03198216600081815260208781526040808320805461ffff60a01b1916600160a01b61ffff8b16021781556001600160a01b038c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b0319161790558551869084908110610ee257610ee261171b565b6020908102919091018101518101516001600160e01b031984166000908152600288018352604090208151610f1c9391929091019061169a565b5083610f27816119ec565b94505050508080610f3790611770565b915050610d63565b6000815111610f605760405162461bcd60e51b81526004016101cf90611955565b600080516020611a6a8339815191526001600160a01b03831615610fe55760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f76652066616365742061646472604482015275657373206d757374206265206164647265737328302960501b60648201526084016101cf565b60005b82518110156110575760008382815181106110055761100561171b565b602090810291909101810151516001600160e01b031981166000908152918590526040909120549091506001600160a01b03166110428183611291565b5050808061104f90611770565b915050610fe8565b50505050565b6001600160a01b0382166110e4578051156110e05760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016101cf565b5050565b600081511161115b5760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016101cf565b6001600160a01b038216301461118d5761118d82604051806060016040528060288152602001611a8a60289139611270565b600080836001600160a01b0316836040516111a89190611a0d565b600060405180830381855af49150503d80600081146111e3576040519150601f19603f3d011682016040523d82523d6000602084013e6111e8565b606091505b50909250905081151560000361105757805115611219578060405162461bcd60e51b81526004016101cf9190611a29565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b60648201526084016101cf565b813b81816110575760405162461bcd60e51b81526004016101cf9190611a29565b600080516020611a6a8339815191526001600160a01b03831661131c5760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016101cf565b306001600160a01b0384160361138b5760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b60648201526084016101cf565b6001600160e01b03198216600090815260208281526040808320546001600160a01b0387168452600180860190935290832054600160a01b90910461ffff1692916113d591611a3c565b90508082146114c1576001600160a01b0385166000908152600184016020526040812080548390811061140a5761140a61171b565b600091825260208083206008830401546001600160a01b038a168452600188019091526040909220805460079092166004026101000a90920460e01b92508291908590811061145b5761145b61171b565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b031992909216825284905260409020805461ffff60a01b1916600160a01b61ffff8516021790555b6001600160a01b038516600090815260018401602052604090208054806114ea576114ea611a53565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319861682528490526040812080546001600160b01b031916905581900361167657600383015460009061155890600190611a3c565b6001600160a01b038716600090815260018087016020526040909120015490915061ffff1680821461161757600085600301838154811061159b5761159b61171b565b6000918252602090912001546003870180546001600160a01b0390921692508291849081106115cc576115cc61171b565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018781019092526040902001805461ffff191661ffff83161790555b8460030180548061162a5761162a611a53565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03891682526001878101909152604090912001805461ffff1916905550505b6001600160e01b0319841660009081526002840160205260408120610c5e916116e5565b8280548282559060005260206000209081019282156116d5579160200282015b828111156116d55782518255916020019190600101906116ba565b506116e1929150611706565b5090565b50805460008255906000526020600020908101906117039190611706565b50565b5b808211156116e15760008155600101611707565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561174357600080fd5b8151801515811461175357600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016117825761178261175a565b5060010190565b634e487b7160e01b600052602160045260246000fd5b60005b838110156117ba5781810151838201526020016117a2565b838111156110575750506000910152565b600081518084526117e381602086016020860161179f565b601f01601f19169290920160200192915050565b6000606082016060835280865180835260808501915060808160051b8601019250602080890160005b8381101561192757607f1988870381018652825180516001600160a01b031688528481015160608901906003811061186857634e487b7160e01b600052602160045260246000fd5b80878b01525060408201519150606060408a015280825180835260808b01915060808160051b8c01019250878401935060005b8181101561190f578b840386018352845180516001600160e01b031916855289015160408a86018190528151908601819052908a019060009060608701905b808310156118fa5783518252928c019260019290920191908c01906118da565b50968b0196955050509188019160010161189b565b50919950505095840195505090820190600101611820565b50506001600160a01b038816908601525050828103604084015261194b81856117cb565b9695505050505050565b6020808252602b908201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660408201526a1858d95d081d1bc818dd5d60aa1b606082015260800190565b6020808252602c908201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260408201526b65206164647265737328302960a01b606082015260800190565b600061ffff808316818103611a0357611a0361175a565b6001019392505050565b60008251611a1f81846020870161179f565b9190910192915050565b60208152600061175360208301846117cb565b600082821015611a4e57611a4e61175a565b500390565b634e487b7160e01b600052603160045260246000fdfec8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a2646970667358221220bd9e2f9955f02af52351507ba494e15e558acdf9b604df556aa532b83597a35264736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000057212e15318320a6b36ebabf7d9830f30b38058d000000000000000000000000953b44c60f2883ad9e1f818926b8faacffadb906000000000000000000000000f033d740959be31c285efc8fadf49f387014462d0000000000000000000000003f57c1c4cfbfcab8cb06c52d3cbe4e15202b1c71
-----Decoded View---------------
Arg [0] : _contractOwner (address): 0x57212e15318320a6b36EbABF7d9830f30B38058D
Arg [1] : _diamondCutFacet (address): 0x953B44C60f2883Ad9e1F818926B8FaAcFFAdb906
Arg [2] : _diamondLoupeFacet (address): 0xf033d740959bE31c285EFC8Fadf49f387014462d
Arg [3] : _ownershipFacet (address): 0x3F57c1c4cfbfCAb8cB06C52D3CBe4E15202B1C71
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000057212e15318320a6b36ebabf7d9830f30b38058d
Arg [1] : 000000000000000000000000953b44c60f2883ad9e1f818926b8faacffadb906
Arg [2] : 000000000000000000000000f033d740959be31c285efc8fadf49f387014462d
Arg [3] : 0000000000000000000000003f57c1c4cfbfcab8cb06c52d3cbe4e15202b1c71
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.