NFT
Overview
TokenID
4102
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
TheSaudisDiamond
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * * Implementation of a diamond. /******************************************************************************/ import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol"; import { IERC721 } from "@openzeppelin/contracts/interfaces/IERC721.sol"; import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; contract TheSaudisDiamond { constructor(address _contractOwner, address _diamondCutFacet, address _diamondLoupeFacet) payable { LibDiamond.setContractOwner(_contractOwner); LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); ds.supportedInterfaces[type(IERC721).interfaceId] = true; // Add the diamondCut external function from the diamondCutFacet IDiamondCut.FacetCut[] memory cuts = new IDiamondCut.FacetCut[](2); bytes4[] memory diamondCutFunctionSelectors = new bytes4[](1); diamondCutFunctionSelectors[0] = IDiamondCut.diamondCut.selector; cuts[0] = IDiamondCut.FacetCut({ facetAddress: _diamondCutFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: diamondCutFunctionSelectors }); bytes4[] memory erc165FunctionSelectors = new bytes4[](1); erc165FunctionSelectors[0] = IERC165.supportsInterface.selector; cuts[1] = IDiamondCut.FacetCut({ facetAddress: _diamondLoupeFacet, action: IDiamondCut.FacetCutAction.Add, functionSelectors: erc165FunctionSelectors }); LibDiamond.diamondCut(cuts, address(0), ""); } // 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; // get diamond storage assembly { ds.slot := position } // get facet from function selector address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress; require(facet != address(0), "Diamond: Function does not exist"); // 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: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Base64.sol"; import "../libraries/BaseContract.sol"; contract ArtworkFacet is BaseContract { function setAttributeType( uint8 attributeTypeId, string memory name, string memory description, uint8 zIndex ) public onlyOwner { getState().attributeTypes[attributeTypeId].name = name; getState().attributeTypes[attributeTypeId].description = description; getState().attributeTypes[attributeTypeId].zIndex = zIndex; } function setAttributeSelection( uint8 attributeTypeId, uint8 attributeSelectionId, string memory name, string memory description, string memory dataUri ) public onlyOwner { getState().attributeTypes[attributeTypeId].selections[attributeSelectionId].name = name; getState().attributeTypes[attributeTypeId].selections[attributeSelectionId].description = description; getState().attributeTypes[attributeTypeId].selections[attributeSelectionId].dataUri = dataUri; } // ================================= // SVG // ================================= function generateSvg(uint256 tokenId) external view returns (string memory) { return Base64.encode( bytes( string( abi.encodePacked( '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" image-rendering="pixelated" height="24" width="24">', '<image xlink:href="', getState().attributeTypes[0].selections[getState().attributesActive[tokenId][0]].dataUri, '"/>', '<image xlink:href="', getState().attributeTypes[1].selections[getState().attributesActive[tokenId][1]].dataUri, '"/>', '<image xlink:href="', getState().attributeTypes[2].selections[getState().attributesActive[tokenId][2]].dataUri, '"/>', '</svg>' ) ) ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./LibDiamond.sol"; import "./AppStorage.sol"; abstract contract BaseContract { function getState() internal pure returns (AppStorage.State storage s) { return AppStorage.getState(); } modifier onlyOwner() { LibDiamond.enforceIsContractOwner(); _; } modifier whenPaused() { require(getState().paused, "Pausable: not paused"); _; } modifier whenNotPaused() { require(!getState().paused, "Pausable: paused"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard library LibDiamond { 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 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; // 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(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } 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"); DiamondStorage storage ds = diamondStorage(); require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)"); uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists"); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function replaceFunctions(address _facetAddress, bytes4[] 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)"); uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function"); removeFunction(ds, oldFacetAddress, selector); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function removeFunctions(address _facetAddress, bytes4[] 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]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; removeFunction(ds, oldFacetAddress, selector); } } function addFacet(DiamondStorage storage ds, address _facetAddress) internal { enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code"); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length; ds.facetAddresses.push(_facetAddress); } function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal { ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } function removeFunction(DiamondStorage storage ds, 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 = 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 = uint96(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 = facetAddressPosition; } ds.facetAddresses.pop(); delete ds.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: UNLICENSED pragma solidity ^0.8.0; import "./Attributes.sol"; library AppStorage { struct State { // ============================================================================= // Pausable // ============================================================================= bool paused; // ============================================================================= // ERC721A // ============================================================================= // The tokenId of the next token to be minted. uint256 currentIndex; // The number of tokens burned. uint256 burnCounter; // Token name string name; // Token symbol string symbol; // Token Version string version; // Token description string description; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) operatorApprovals; // ============================================================================= // Artwork // ============================================================================= // attributeTypeId => attributeType mapping(uint8 => AttributeType) attributeTypes; // tokenId => (attributeTypeId => Bitfield of attribute available) mapping( uint256 => mapping( uint8 => uint256 ) ) attributesAvailable; // tokenId => (attributeTypeId => attributeId active) mapping( uint256 => mapping( uint8 => uint8 ) ) attributesActive; // ============================================================================= // Metadata // ============================================================================= string tokenBaseExternalUrl; string contractLevelImageUrl; string contractLevelExternalUrl; bool wlMinting; // ============================================================================= // Royalty // ============================================================================= address royaltyWalletAddress; uint96 royaltyBasisPoints; } bytes32 constant APP_STORAGE_POSITION = keccak256("diamond.standard.the.saudis.storage"); function getState() internal pure returns (State storage s) { bytes32 position = APP_STORAGE_POSITION; assembly { s.slot := position } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * 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: UNLICENSED pragma solidity ^0.8.0; struct AttributeSelection { string name; string description; string dataUri; } struct AttributeType { string name; string description; uint8 zIndex; bool visible; mapping(uint8 => AttributeSelection) selections; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; import "../facets/ArtworkFacet.sol"; import "../libraries/ERC721A.sol"; import "../libraries/AppStorage.sol"; import "../libraries/LibDiamond.sol"; import "../libraries/Constants.sol"; import "../libraries/IOpenseaSeaportConduitController.sol"; import "hardhat/console.sol"; contract TokenFacet is ERC721A, EIP712, Context { IOpenseaSeaportConduitController public constant OPENSEA_SEAPORT_CONDUIT_CONTROLLER = IOpenseaSeaportConduitController(0x00000000F9490004C11Cef243f5400493c00Ad63); address public constant OPENSEA_SEAPORT = 0x00000000006c3852cbEf3e08E8dF289169EdE581; constructor() ERC721A(Constants.NAME, Constants.SYMBOL) EIP712(Constants.NAME, Constants.VERSION) {} // ================================= // Minting // ================================= function mint(uint256 tokenCount, bytes calldata signature) external whenNotPaused { // WL if (signature.length > 0) { require(getState().wlMinting, "E05"); require(SignatureChecker.isValidSignatureNow( // TODO: change to separate wallet LibDiamond.contractOwner(), _hashTypedDataV4( keccak256(abi.encode( keccak256("SAUD(address a,uint256 c)"), _msgSender(), tokenCount )) ), signature ), "E04"); require(_numberMinted(_msgSender()) < tokenCount, "E02"); // non-WL } else { require(!getState().wlMinting, "E06"); require(_msgSender().balance >= Constants.MIN_ETH_BALANCE, "E01"); require(_numberMinted(_msgSender()) + tokenCount <= Constants.MAX_MINT_PER_WALLET, "E02"); } require(totalSupply() + tokenCount <= Constants.MAX_SUPPLY, "E03"); _safeMint(_msgSender(), tokenCount); } // TODO: Add to Init // function safeMint(address to, uint256 tokenCount) // public // onlyOwner // { // _safeMint(to, tokenCount); // } // ================================= // Metadata // ================================= function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { require(_exists(tokenId), 'E10'); return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( abi.encodePacked( '{', '"name": "', getState().name, ' #', Strings.toString(tokenId), '", ', // The Saudis #1234 '"description": ', getState().description, ' ,', '"image_data": "data:image/svg+xml;base64,', ArtworkFacet(address(this)).generateSvg(tokenId), '", ', '"external_url": "', getState().tokenBaseExternalUrl, Strings.toString(tokenId), '", ', '}' ) ) ) ); } function contractURI() public view returns (string memory) { return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( abi.encodePacked( '{', '"name": ', getState().name, ', ', '"description": ', getState().description, ' ,', '"image": "', getState().contractLevelImageUrl, '", ', '"external_url": "', getState().contractLevelExternalUrl, '", ', '"seller_fee_basis_points": ', getState().royaltyBasisPoints, ', ', '"fee_recipient": "', getState().royaltyWalletAddress, '"', '}' ) ) ) ); } /** * Override isApprovedForAll to whitelist Seaport's conduit contract to enable gas-less listings. */ function isNFTApprovedForAll(address owner, address operator) external view returns (bool) { try OPENSEA_SEAPORT_CONDUIT_CONTROLLER.getChannelStatus(operator, OPENSEA_SEAPORT) returns (bool isOpen) { if (isOpen) { return true; } } catch {} return super.isApprovedForAll(owner, operator); } // ================================= // Config // ================================= function setWlMinting(bool state) public onlyOwner { getState().wlMinting = state; } function setTokenBaseExternalUrl(string memory url) public onlyOwner { getState().tokenBaseExternalUrl = url; } function setContractLevelImageUrl(string memory url) public onlyOwner { getState().contractLevelImageUrl = url; } function setContractLevelExternalUrl(string memory url) public onlyOwner { getState().contractLevelExternalUrl = url; } }
// 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/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; import "../Address.sol"; import "../../interfaces/IERC1271.sol"; /** * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like * Argent and Gnosis Safe. * * _Available since v4.1._ */ library SignatureChecker { /** * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. * * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); if (error == ECDSA.RecoverError.NoError && recovered == signer) { return true; } (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import "erc721a/contracts/IERC721A.sol"; import "./AppStorage.sol"; import "./BaseContract.sol"; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A, BaseContract { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; constructor(string memory name_, string memory symbol_) { getState().name = name_; getState().symbol = symbol_; getState().currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return getState().currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return getState().currentIndex - getState().burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return getState().currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return getState().burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return getState().packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (getState().packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (getState().packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(getState().packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = getState().packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); getState().packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < getState().currentIndex) { uint256 packed = getState().packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = getState().packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(getState().packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (getState().packedOwnerships[index] == 0) { getState().packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return getState().name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return getState().symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } getState().tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return getState().tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); getState().operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return getState().operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < getState().currentIndex && // If within bounds, getState().packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = getState().currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (getState().currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = getState().currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. getState().packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. getState().packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); getState().currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = getState().currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. getState().packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. getState().packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); getState().currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = getState().tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --getState().packedAddressData[from]; // Updates: `balance -= 1`. ++getState().packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. getState().packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (getState().packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != getState().currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. getState().packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. getState().packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. getState().packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (getState().packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != getState().currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. getState().packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { getState().burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = getState().packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); getState().packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; library Constants { // uint256 public constant MAX_SUPPLY = 5555; uint256 public constant MAX_SUPPLY = 10; uint256 public constant MAX_MINT_PER_WALLET = 1; uint256 public constant MIN_ETH_BALANCE = 0.05555 ether; string public constant NAME = "The Saudis"; string public constant SYMBOL = "SAUD"; string public constant VERSION = "1.0.0"; string public constant DESCRIPTION = "Max Bidding"; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IOpenseaSeaportConduitController { function getConduit(bytes32 conduitKey) external view returns (address conduit, bool exists); function getChannelStatus(address conduit, address channel) external view returns (bool isOpen); }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// 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 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { 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); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 * * Implementation of a diamond. /******************************************************************************/ import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondLoupe } from "./interfaces/IDiamondLoupe.sol"; import { IDiamondCut } from "./interfaces/IDiamondCut.sol"; import { IERC173 } from "./interfaces/IERC173.sol"; import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol"; import { IERC721Metadata } from "@openzeppelin/contracts/interfaces/IERC721Metadata.sol"; import { IERC721 } from "@openzeppelin/contracts/interfaces/IERC721.sol"; import { IERC2981 } from "@openzeppelin/contracts/interfaces/IERC2981.sol"; import { IERC721A } from "erc721a/contracts/IERC721A.sol"; import "./libraries/Constants.sol"; import "./libraries/BaseContract.sol"; import "./libraries/AppStorage.sol"; import "./libraries/Hex.sol"; import "hardhat/console.sol"; // It is expected that this contract is customized if you want to deploy your diamond // with data from a deployment script. Use the init function to initialize state variables // of your diamond. Add parameters to the init funciton if you need to. contract DiamondInit is BaseContract { // You can add parameters to this function in order to pass in // data to set your own state variables function init() external onlyOwner { // adding ERC165 data LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); ds.supportedInterfaces[type(IERC165).interfaceId] = true; ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; ds.supportedInterfaces[type(IERC173).interfaceId] = true; ds.supportedInterfaces[type(IERC721A).interfaceId] = true; ds.supportedInterfaces[type(IERC721).interfaceId] = true; ds.supportedInterfaces[type(IERC721Metadata).interfaceId] = true; ds.supportedInterfaces[type(IERC2981).interfaceId] = true; AppStorage.State storage s = AppStorage.getState(); s.name = Constants.NAME; s.symbol = Constants.SYMBOL; s.version = Constants.VERSION; s.description = Constants.DESCRIPTION; s.paused = true; s.tokenBaseExternalUrl = "https://token.thesaudisnft.com/"; s.contractLevelImageUrl = "https://assets.thesaudisnft.com/logo.png"; s.contractLevelExternalUrl = "https://www.thesaudisnft.com"; s.wlMinting = false; s.royaltyWalletAddress = 0x7C114bfb123cE75196c4fCb3dF84856cDf04c394; s.royaltyBasisPoints = 750; // _setDefaultRoyalty(royaltyWalletAddress, royaltyBasisPoints); s.attributeTypes[0].name = "Head"; s.attributeTypes[0].description = "Head of the NFT"; s.attributeTypes[0].zIndex = 0; s.attributeTypes[0].selections[0].name = "head-dark-1"; s.attributeTypes[0].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtklEQVRIiWNgGAXDHjASoeY/JfoJKfi/rjsRp2RQ6XyCZjARYziHiCJWBVB5fD7EawHc8B9v7hNSRr4FlBhOlAWUAhZiFJ04f4eBgYGBwcJQBUOMEMDlA5TU07XsMIOmPB+KAmxi2ABRPsCWVPElX2SAMw6gaZxigMsCnJknqHQ+SZYTFUTIgNiggYHBkUxhADloiPUJSRaQGjwMDBQGETGlKdE+wJFyCNYHpKYiYiooFEDzVAQAUHYtbfcz0SIAAAAASUVORK5CYII="; s.attributeTypes[0].selections[1].name = "head-dark-2"; s.attributeTypes[0].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtUlEQVRIiWNgGAXDHjASoeY/JfoJKfi/rjsRp2RQ6XyCZjARYziHiCJWBVB5fD7EawHc8B9v7hNSRr4FlBhOlAWUAhZiFC3efJKBgYGBIdbXHEOMEMDlA5TUs/7QNQY/a9SIxiaGDRDlA2xJFV/yRQY44wCaxikGuCzAmXmCSueTZDlRQYQMiA0aGBgcyRQGkIOGWJ+QZAGpwcPAQGEQEVOaEu0DHCmHYH1AaioipoJCATRPRQB5rC5p549cPAAAAABJRU5ErkJggg=="; s.attributeTypes[0].selections[2].name = "head-darker-1"; s.attributeTypes[0].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtUlEQVRIiWNgGAXDHjASoeY/JfoJKfhfaC+LU7L/4GOCZjARY7iUCD9WBVB5fD7EawHc8GdvPhJSRr4FlBhOlAWUAhZiFD19/piBgYGBQVpSFkOMEMDlA5TUs+oWA4OMICeKAmxi2ACuJIY3eSIDQkkVZxxANVIMcFmA00X9Bx+TZDlRkYwMiA06GBgcyRQGkIOGWJ+QZAGpwcPAQGEQEVOaEu0DHCmHYH1AaioipoJCATRPRQBLiy1Uef9tkwAAAABJRU5ErkJggg=="; s.attributeTypes[0].selections[3].name = "head-darker-2"; s.attributeTypes[0].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtUlEQVRIiWNgGAXDHjASoeY/JfoJKfhfaC+LU7L/4GOCZjARY7iUCD9WBVB5fD7EawHc8GdvPhJSRr4FlBhOlAWUAhZiFJ26/ZiBgYGBwUxVFkOMEMDlA5TUc/QZA4O5LCeKAmxi2ACuJIY3eSIDQkkVZxxANVIMcFmA00X9Bx+TZDlRkYwMiA06GBgcyRQGkIOGWJ+QZAGpwcPAQGEQEVOaEu0DHCmHYH1AaioipoJCATRPRQA6VS3JBLgqewAAAABJRU5ErkJggg=="; s.attributeTypes[0].selections[4].name = "head-light-1"; s.attributeTypes[0].selections[4].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtklEQVRIiWNgGAXDHjASoeY/JfoJKfh/e2MDTklV/waCZjARYziPlCZWBVB5fD7EawHc8C/PrhNSRr4FlBhOlAWUAhZiFK3fdYqBgYGBIdDNDEOMEMDlA5TUUzZ1G4OHkRiKAmxi2ABRPsCWVPElX2SAMw6gaZxigMsCnJlH1b+BJMuJCiJkQGzQwMDgSKYwgBw0xPqEJAtIDR4GBgqDiJjSlGgf4Eg5BOsDUlMRMRUUCqB5KgIAHCwuITa/cDMAAAAASUVORK5CYII="; s.attributeTypes[0].selections[5].name = "head-light-2"; s.attributeTypes[0].selections[5].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAtklEQVRIiWNgGAXDHjASoeY/JfoJKfh/e2MDTklV/waCZjARYziPlCZWBVB5fD7EawHc8C/PrhNSRr4FlBhOlAWUAhZiFLXM2MzAwMDAUJPhiyFGCODyAUrqWbj9LENxiC6KAmxi2ABRPsCWVPElX2SAMw6gaZxigMsCnJlH1b+BJMuJCiJkQGzQwMDgSKYwgBw0xPqEJAtIDR4GBgqDiJjSlGgf4Eg5BOsDUlMRMRUUCqB5KgIAEEcvTXc8NnAAAAAASUVORK5CYII="; s.attributeTypes[1].name = "Hair"; s.attributeTypes[1].description = "Hair of the NFT"; s.attributeTypes[1].zIndex = 1; s.attributeTypes[1].selections[0].name = "buzzcut"; s.attributeTypes[1].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAcElEQVRIiWP8//8/Ay0BE01NH7Vg1IJRC0YtGCkWsOCTZGRk/M/AwMBIyBB8RT4xPvgPxaTKMTAwEPABFsNIBqRYwJCpzwFnT7/4gyg9jPjCDxoHBMH///9xxhOhOCAYwYTUDIp8gM+FBH2INw6oAQAdSRkqe15k+wAAAABJRU5ErkJggg=="; s.attributeTypes[1].selections[1].name = "long"; s.attributeTypes[1].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAf0lEQVRIiWP8//8/Ay0BE01NH7Vg1IJRC0YtGCkWsOCTDDMQ+8/AwMC4+uJrnGoIFffE+OB/qL4oVolQfVGClQleHyBbQqQ6ki1ghBkeqi/KcPnNF7iErggPVSxAAcQaigzwxgE0chnxKMEnR9gCNIPQDSNoOAMDAwPjkG9VAAACRBiyHxhQkwAAAABJRU5ErkJggg=="; s.attributeTypes[1].selections[2].name = "messy"; s.attributeTypes[1].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAcElEQVRIie2VwQ2AMAwDbcQczMUsDNBZmItFzIfydCJEH4j4VampT07UlpIwUtNQ9wIUoAAF+AtgdpskBYCuJnruMwlkTMLPxCboupI8UgrQ1dblXm/7kTpD10OSQNAGSXZGmRk4A2sOBAne0Pcv2gmCKRoq7plQsAAAAABJRU5ErkJggg=="; s.attributeTypes[1].selections[3].name = "widowspeak"; s.attributeTypes[1].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbUlEQVRIie2WwQqAMAxDUxHy/5/bU3dxgsNunbKD2BwbyGvoDhMzw0ptS9MTkIAEJOAvgL1nqqoBEAAgCVW9+HVG0s2INLADdrfA6XvqNmghTxQFVMksdASQJmi6SeQG8saPPlMvZASHfP5XUQDRNBwHkyo/CAAAAABJRU5ErkJggg=="; s.attributeTypes[2].name = "Facial Hair"; s.attributeTypes[2].description = "Facial hair of the NFT"; s.attributeTypes[2].zIndex = 2; s.attributeTypes[2].selections[0].name = "clean-shaven"; s.attributeTypes[2].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAJklEQVRIie3NMQEAAAjDMMC/52ECvlRA00nqs3m9AwAAAAAAAJy1C7oDLddyCRYAAAAASUVORK5CYII="; s.attributeTypes[2].selections[1].name = "light-black-beard"; s.attributeTypes[2].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAWklEQVRIiWNgGAWjYBSMglEwBAAjAfn/DAwMjP///8dtACN+I5hIdxNpgCgfILFJ1U9YATLQkOZEtoTxxtPvBPUQG0QwgxmRMLI4ToDXB7DIhUYkWUE0CggCAFKiEAptnzDCAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[2].name = "luxurious-black-beard"; s.attributeTypes[2].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAV0lEQVRIiWNgGAWjYBSMglEwDMB/Sg1gJMECbGr/45FjYGBgYGAhwTFk+YYUCxgy9Tng7OkXfxClh5QgIsscQhYQYwleM5iIsIAiQIwPGBhw+4JY/bQDAH/ICg2UlJRMAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[3].name = "luxurious-brown-beard"; s.attributeTypes[2].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAb0lEQVRIie2SwQ3AIAwDTcUIGSO7ZFZ2YQx2oB8e9IEJUvuolJN4OdgIBwiCIAh+QGKiqfTdDACU2pba5XhEH+dUAwBkR8BsdsxJwOMrTOX9AK/pDO2AleedoQGmkphBqQ2mQrdsu4KDVcHe+99xA7xgGIOdUSP1AAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[4].name = "luxurious-white-beard"; s.attributeTypes[2].selections[4].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAXElEQVRIie2RsQ6AQAhDn8aB//9atrvFQQePNsbBhJcwlVCg0DRN0/yAbSVm5qh6ACLiUduFJcZZrgbAIRhch9k4BnB/l2ToGthXVBmUAVc9SsivUAxWGyoXfssE2vkLFOM3eo0AAAAASUVORK5CYII="; s.attributeTypes[2].selections[5].name = "messy-black-beard"; s.attributeTypes[2].selections[5].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAUElEQVRIie3OMQ3AMAxE0W8iwRUsBVAswRUi16XtlMgeM9yTvNjSncHMzOwEkpAEoMV8t62oFESEAO7e/v01ZikjLeD9NLHNqRRkJdUMW3sARbsW9stvItIAAAAASUVORK5CYII="; s.attributeTypes[2].selections[6].name = "messy-brown-beard"; s.attributeTypes[2].selections[6].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAT0lEQVRIiWNgGAWjYBSMglEwCugAGAkp8NcRgTH/49K/8cobnPqZiHQIzHBGJIzLUhTAQoLhuAz8z4AnJIjxAaFgxCtPbBDhMoRgHA59AAAOaAkP1WdX/QAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[7].name = "messy-white-beard"; s.attributeTypes[2].selections[7].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAXElEQVRIie2RSwrAMAhENRT0/qfVlV2UQAIxpptCYR4Igjr+iAAAAIAP4CrBzLobWb2qpvXtcJAuzoNlTSeuF+KZYNDmEicbVGfcxssfRDxDu/vyByJCzKXMj7kBQtwQDHofincAAAAASUVORK5CYII="; s.attributeTypes[2].selections[8].name = "mustache"; s.attributeTypes[2].selections[8].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAANUlEQVRIiWNgGAWjYBSMglEwCugAGElQ+58c/URb8P//fwZNGS64JdeffGNkZCTFfaNg2AIAG1wIA3z2UBoAAAAASUVORK5CYII="; s.attributeTypes[2].selections[9].name = "normal-black-beard"; s.attributeTypes[2].selections[9].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATklEQVRIiWNgGAWjYBSMglEwDMB/Sg1gIsaS//9x2kPQAYyEDCfCAXjNYCHCADhoi5CDs6tWPCJKDyEfMDAQ9gVeM4ixAJ8lxOofBbgBAHzcDARfx9EJAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[10].name = "normal-brown-beard+mustache"; s.attributeTypes[2].selections[10].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAYElEQVRIiWNgGAWjYBSMglEwBAAjPkl/HZH/MDUbr7whywImItT8J+AAvICFSIcQNIhSCxj8dUQYbr7/CuerC3JTxQJGBiTXE2soMiAmDvAlBLyJhFgLYAahG0bQ8OEBAJ/aDHffpuzIAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[11].name = "normal-brown-beard"; s.attributeTypes[2].selections[11].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAXklEQVRIiWNgGAWjYBSMglEwBAAjPkl/HZH/2NRsvPKGwV9HBM7GB5iIcMR/LBbjlEMHLERYQJRBlFoAA8jBRZSlhCxgRDOIZJ8QEwf4EgLeREKsBTCD0A0jaPjwAADYZA2kSnCpuwAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[12].name = "normal-white-beard"; s.attributeTypes[2].selections[12].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAaElEQVRIie2SSw6AMAhEp8YE7n9aWNWNNf0oJXWl4S1hMo8FQBAEQfABkrUUkVwyRHSbUVUw82PH7jgiA0iq2gyJCOfsOmJVUEoaeuFbQaG+dJCuCFJX5Cqt2RwZ8xFme4/AKpnJf8ABUW4V7jT70ZsAAAAASUVORK5CYII="; s.attributeTypes[2].selections[13].name = "shadow-beard+mustache"; s.attributeTypes[2].selections[13].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATElEQVRIiWNgGAWjYBSMglEwDIAvpQYwUWgJQQcQYwHMoP9YMEHAQqQFDAwMDH5tEXJwTtWKR0RpYiRCDaFg2EypBfgswWv4KCAKAACQpwuI9rNocQAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[14].name = "shadow-beard"; s.attributeTypes[2].selections[14].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAR0lEQVRIie2PMQ4AIAgDW+P3fC0PxMkVGt1MbyKB9ApgjDHmA9ZrwHiUtAWmWOT6E1UAAMjMODNJSUrhpguKaqkIKkkZbiQ26RMHQWPmna4AAAAASUVORK5CYII="; s.attributeTypes[2].selections[15].name = "short-grey-beard"; s.attributeTypes[2].selections[15].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAWElEQVRIie2RMQrAMAwD3dLBz86z5clZGujQuAqZCjoIOAh0YJsJIYT4OwAaABsvM+35B/DZcRKeNoaImGYzLkJAFe0K3kSU9KjCe8dlkbuX+dINFjPB0QFh+SU2GiukKQAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[16].name = "short-white-beard"; s.attributeTypes[2].selections[16].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAW0lEQVRIie2SwQoAIQhEbVnQ//9aPbWnwA3WZukUzDsFyrwsRQghhBxAq4ru3nOPqkpEvHrMrBRcwCX6OMzhufbFDQigoF3BID8pJF0J2hT0exLkD6pFKJeEQDz1Vw/7DjytYQAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[17].name = "sideburns"; s.attributeTypes[2].selections[17].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAJElEQVRIiWNgGAWjYBSMglEwCgiD/5QawERrS4ixYBSMAvwAAHjSAgOKnbIlAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[18].name = "stylish-mustache"; s.attributeTypes[2].selections[18].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAASUlEQVRIiWNgGAWjYBSMglEwCgYL+P//PwMDA8N/LJggYCHBHkYNaU64oTeefmckQS9+APUBWYBYV/xnYGBgRLeIkZF6nhjBAACZWRL8XsTmNAAAAABJRU5ErkJggg=="; s.attributeTypes[2].selections[19].name = "stytlish-black-sideburns"; s.attributeTypes[2].selections[19].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARUlEQVRIiWNgGAWjYBSMglEwChgYGAnI/2dgYGD8//8/ds2MhLQTZwFMHTZbCNrAQtAJSIZpSHMiW8J44+l3ErSPgmELAN2tCgjgVOLMAAAAAElFTkSuQmCC"; s.attributeTypes[2].selections[20].name = "sytlish-brown-sideburns"; s.attributeTypes[2].selections[20].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAT0lEQVRIiWNgGAWjYBSMglEwChgYGPFJ6kry/GdgYGC89Owzds2MeLUzMDAwMLAQ4Yj/mjJcjKz/mP+T6kBiLWBgYGBg+M30l7BzR8HIBAAutglaHYvmRgAAAABJRU5ErkJggg=="; // s.attributeTypes[3].name = "Headgear"; // s.attributeTypes[3].description = "Things NFTs wear on the head"; // s.attributeTypes[3].zIndex = 3; // s.attributeTypes[3].selections[0].name = "brown-shemagh+agal"; // s.attributeTypes[3].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAmUlEQVRIie2TWxJAMAxFb4yNsA02wIJ1A7oNXUp9eExL2k5QH8b5MkROcwXw83kIAKy1wQKjVfghQFXTLRdEbEERsyeaA4A1WkULyouNOQk7AhsREUkEXq8j7ATTOIi7123P3mcF6wv8VxNyisjJXySQTkAAsK3gHbw1FW6PXODyxOljguQPJBbkiMcT5OIdQa54dkFOfkGSGXvmMfEUVW5uAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[1].name = "brown-shemagh+crown"; // s.attributeTypes[3].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAyklEQVRIie2TsQ7CIBCG/zO+gUuXJvocToy+cDt2aR/AF2iHmujk4uJ2LtIAATwUOvklDFC47ziuwBow8zJizF0V3+Bh4wsydxXzfW8F03Pfuj4jEtTqRm7QEOZ381xUoLmcn7HY4n1egXsLX1kk2QcFOSEAVvcQ0VfdkvwGtboCAHbqIZqHKH4DaIE5xr5JFoR+0q27MA0tA8DYN6kOmeANAcDhePpZYD2yzj4nwS7KkX1MwNPQ5hWUKI8lKMU6glLlWQQl+Qs+8gIjIXwAmZk8FwAAAABJRU5ErkJggg=="; // s.attributeTypes[3].selections[2].name = "red-shemagh+agal"; // s.attributeTypes[3].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAqUlEQVRIie1UQQ7DIAxLYF8p9+7/b4B795bOu6yTYA6Fih6m1VIUKUJ2TCAiF/4DAMyIbgIAsBzd9Dl3SKBGXor0ClRJWba4dRPIiqo7LdlcJZzlaLPemqtgd3/AAcWtLCQfMK+LRB+6iO7PB62zGSD5oCIi87o0C6jSEXzNAOndeQ95DZlA8mEYcQb2/mu/m0WLgLkGhgiQH/pbDtiOGSewt4ovB6c6eAEZZo6zhsvaXwAAAABJRU5ErkJggg=="; // s.attributeTypes[3].selections[3].name = "red-shemagh+crown"; // s.attributeTypes[3].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA3klEQVRIie2UsQ6DIBiED+gbdHEx6SJ7H8En9w0kXbvaxE5dunRprosaUKDQaJMm/RJiQP4775cAfAOS04jRNUV8gwfpE+magrwdHLFx7lsfa5IMyvoq5qIh7Pd2XdRg5HJ6xLST93kN5il8bUn5+qDBmggAzukRQnx0WrL/QVn3AIB9fU+ah9g8wW6+QBJG6ck8FbKHEMuSRYuM0jw+zznaURYtAkCjtACAXKOUBBzaky0ewjEwSq8m7GDdpmxlxQHkjncGk3grK7ayWtfAFh+ev5WAmybwiP8TfC/BC9UDQ1RUVVXlAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[4].name = "red-shemagh"; // s.attributeTypes[3].selections[4].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAnElEQVRIie2UwQoCMQxE0+Zbmrv+/zc0d/0WHU8rbpmNG6kHcQdCoC3zGGgicug/BGCzem0AANZ7bc93HwEi8xGSBYSmrKcAWfNeWw4wM0FZAK9yNSx3e3W+X+l5HQ9cDafbJeMdiiWAqxURkQyoFB54TABXk6x5pBXA1aYZr8R+TzTdrPYANtfAFAD537+VgE3oPMC7VXwk+GqCB5POyzSgVCG6AAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[5].name = "white-shemagh+agal"; // s.attributeTypes[3].selections[5].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAcklEQVRIie2RQQrAMAgE15L/f9neSiir1qA9hMwpoGFWBQ7bIwCgql6PV5TnIUIbriCAa/5Qx1j9SHrpCFRgjbsCFQQ3oVihrBUBxshZ2JHz8ZMCoCg9E5SmZ4JyLEHZJLOgfD1vQQu/CVrWMwvaOIKQGwRhECvRC0yWAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[6].name = "white-shemagh+gold-agal"; // s.attributeTypes[3].selections[6].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAiklEQVRIie2S0Q2AMAhED+MILuNgTuFgLuMO+KUxeoCN1A/T+2oK9MFRoOn3EgBQVS/HC8pxEKEJXdCAS34QR88uRUQBYJmGqB7jvO4QOkI0wWtZOwhHvz1kLIFa5BWUigEUCH8Wa4jeWztI6Z4Bir0vBaTLAqRNcgak23MFVNFngCr2nAHV1AChNv9TFyvQnEPfAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[7].name = "white-shemagh+stylish-gold-agal"; // s.attributeTypes[3].selections[7].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAk0lEQVRIie2RwQ2AIAxFf40j6DAOpks4mA7jDvWEIaWlkoAHwzsZLbz/K9D5PQQAzJybyX2k54FIHRjVU0QMAMc6eQF52a9EliSQDYLAaRZmswK1QeDcZlfgBgDUpH50eZHxE8wG1oFSNMHr/YtA6vvBmi+6PYMUFO++VFAdS1CtSSyovh4paMJngibriQXN6AKXGy2VHYE1/rxiAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[8].name = "white-shemagh-crown"; // s.attributeTypes[3].selections[8].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAsUlEQVRIie2SMQ7CMAxFv7lCly6VuEpO3jNwhiLBxMLCZpYGpaltHOR04kkd0sR+thPgCJj581ks82gfEDhJSZZ5ZH6cN8nyWvqfY1yCKd2pTqpR7pdxpiBzvbys3O5zoqDuQhqLp3pVEAkB2LweIvrptTTfwZRuAIAhPV1rje4d7AQrnPdaINqHSCNqrt5Cu4Pm6r2C0OolQTiaIKyTUhA+nlrQhcMEXcZTCrrxF3zlDe6NXkzwLacCAAAAAElFTkSuQmCC"; // s.attributeTypes[3].selections[9].name = "white-shemagh"; // s.attributeTypes[3].selections[9].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAbElEQVRIie2QQQ7AIAgEl6b//zK9NaZZoCp4MM7JBMywCxy2RwBAVb0dbyjvQ4QuXMEBrvnHHPfoR7JLI0QJpikXWBUBRuReWIKe/ocEQNL1TJB6PROkYwnSkrSC9Hq+ghKWCUrqaQVlHEHIAw+SDSQbz7hoAAAAAElFTkSuQmCC"; // s.attributeTypes[4].name = "Eyewear"; // s.attributeTypes[4].description = "Things NFTs wear on the eyes"; // s.attributeTypes[4].zIndex = 4; // s.attributeTypes[4].selections[0].name = "3d-glasses"; // s.attributeTypes[4].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAUUlEQVRIiWNgGAWjYBQMfcCIS+LDhw//STFIQEAAq1k4LUC2xGkuL1xsX/JnBgYGBgZeJye42Od9+3BawESOq0gBBA0gNqio4ZhRMApGwWAFAEc1Ejeq220gAAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[1].name = "big-round-shades"; // s.attributeTypes[4].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAUUlEQVRIie2RSwoAMQxCde5/Z7sqk5b+sikUfEsjShLAGPM+HImSfgOpMGKd9XqqAIAmOiSxC19mTZt3RadZXyJgGZQyhzsD7RbRf/QDY8wFCtsjEwidCTWDAAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[2].name = "big-shades"; // s.attributeTypes[4].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARklEQVRIie3NMQ4AIAwCwOL//4yTU0tNJ2PCbdIIEWb2P1zuTAEJAClXXd1AVdIpu5ZsJ8sPKlfkADDqmQ+cHfFWuZm9sAEFNwwMvtjHMQAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[3].name = "classic-shades"; // s.attributeTypes[4].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATUlEQVRIiWNgGAWjYBQMfcCIR+4/NcxhIqCJkYGBgSHGkp8hxpIfxTA0MZyAhRjnZduwMjAwMDAsOY5fjBLwnwEzyLCJjYJRMAqGJQAAfgwLxb2GAqQAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[4].name = "gold-classic-shades"; // s.attributeTypes[4].selections[4].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQElEQVRIie3OMQ4AIAhD0Y/3Pw+Xc8DVGMXFmGj6xpICICLvs2QWJ/aUTckAqhvVrc/HbCk7cFUAMXw8y0TkSw2vZQ8xGBu/HgAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[5].name = "green-big-shades"; // s.attributeTypes[4].selections[5].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAW0lEQVRIiWNgGAWjYBQMfcBIQP4/Dj24xEmyAGJIjilCZMppBBtTHKtZLDhN//+fkZGR8T+DECc2R2ETxwpwWsDICHWQFC92BbjEyQD/4XiGNzHio2AUjAJ6AwAtLBRS8+LsIwAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[6].name = "green-classic-shades"; // s.attributeTypes[4].selections[6].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQklEQVRIiWNgGAWjYBQMfcCIR+4/NcxhIqAJojHHFIKRDUMVwwlYiHKfggBxYhSA/wwMDP8ZelwJiY2CUTAKhiUAADNaCY3TvN4hAAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[7].name = "horn-rimmed-glasses"; // s.attributeTypes[4].selections[7].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAPElEQVRIiWNgGAWjYBQMfcCIR+4/NcxiIaTr1PN/hTC2mSRTPy4xXICJgIvQXUWsGFEWjIJRMApGARQAAHD5CRC/FaSZAAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[8].name = "laser-eyes-gold"; // s.attributeTypes[4].selections[8].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATklEQVRIiWNgGAWjYBQMDvDsMsN/UsSRARP1nUMieHaZ4f//7zP/o7sWlzhJhsLx//8ohsHloeIwTJFlVPUBNktIEUcGAx/Jo2AUjAAAALCvXiUZVCr/AAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[9].name = "laser-eyes"; // s.attributeTypes[4].selections[9].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAdElEQVRIie3RyQ1AUBDG8b/tiZO7HjShDr3oTBN60ILlRcaJiC2IwzvM7/hNMksGlFJusJmRN/mW//86LwfYzMhUJIdtr/K98K4pwATEVc5Ag62RqB29pb7kPYkABHVH1I7e0+vWYX2ZytkFZ/knTj9ZKQUzVcU3kjmeWXEAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[10].name = "nerd-glasses"; // s.attributeTypes[4].selections[10].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQElEQVRIiWNgGAWjYBQMfcBIhJr/WPRgEyPZArghDbdvQWhVNQYcYjjNYcJjASMOjcT4miTFFAXRKBgFo2A4AACcqwsJ54Si9AAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[11].name = "no-eyewear"; // s.attributeTypes[4].selections[11].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAJklEQVRIie3NMQEAAAjDMMC/52ECvlRA00nqs3m9AwAAAAAAAJy1C7oDLddyCRYAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[12].name = "pixel-big-shades"; // s.attributeTypes[4].selections[12].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATklEQVRIie3OywrAIBBDUdP//+frSqjMw3ZVCjkgQsTMjGFm/6fDOyEASQp51dUNyEo6adf19AOw7jSvdAO2EikuWOVvsQ5w33jLzexDE9XdI/GsgjX+AAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[13].name = "pixel-regular-shades"; // s.attributeTypes[4].selections[13].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAATElEQVRIie2PwQoAIAhDXf//z+tQgYnWoVOwdxHm2NRMCPE/qBYkDQBfs1rpDuEk10SmV5QFPmh+k3lSfTv0UDAM7hNfGvVbkRDiZzpfrCH/gTYLqwAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[14].name = "purple-big-shades"; // s.attributeTypes[4].selections[14].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAZUlEQVRIiWNgGAWjYBQMfcBIQP4/Dj24xEmy4D8DAwNDJo8rXGD6l91wNhZxrGax4DT9/39GRkbG/8qMYtgchU0cK8BpASMjxEGKIqwIwc8IJi5xbK4hBJDDm5EI8VEwCkYBvQEAMigS3fpBCRkAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[15].name = "reflective-regular-shades"; // s.attributeTypes[4].selections[15].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAASklEQVRIie3NMQ6AMAxDUYdT+f4X+yxUQqgZChOV3xQ5kSNFxP9VtwBUVXztOtrrR7nt8bhm+TJAkpCEbcbc5a8e3MuuwjaPiJ2dNrAt0onoBJkAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[16].name = "reflective-square-shades"; // s.attributeTypes[4].selections[16].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARklEQVRIie3QSwoAIAxDwfZWvf/F4lKMFX+rQgbcPEWxZiJSn2cRQD/gDtp2AGm/eRi8ImJq1J/x5bs+OPnWahRfIxKRShoMWyGO08BWQAAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[17].name = "regular-shades"; // s.attributeTypes[4].selections[17].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAL0lEQVRIiWNgGAWjYBSMAoKAEYf4f2qZhcsCfJYxEhAnC/zHYiA+8VEwCkbBsAIAZRwG/3nqKWUAAAAASUVORK5CYII="; // s.attributeTypes[4].selections[18].name = "rimless-glasses"; // s.attributeTypes[4].selections[18].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAWElEQVRIie3Qyw2AIBCE4X+NRdiIfUkn9EUjdDGeTLjAmhhv8x33MWQBM7NULHoCQlIeEvOYLXlcq+U39qQfgFpXeQrnERWgdV3DXJ0FTC8YvubbCWb2vxuBDRC+NvhJ3QAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[19].name = "round-shades"; // s.attributeTypes[4].selections[19].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAMklEQVRIiWNgGAWjYBSMHPAfiokVhwNGPAaSCrCahcsCfJYxEhAnC5AdRKNgFIyC4QAAsegK+01gFc0AAAAASUVORK5CYII="; // s.attributeTypes[4].selections[20].name = "small-shades"; // s.attributeTypes[4].selections[20].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAL0lEQVRIiWNgGAWjYBSMAoKAkYD8fyqYQZTh/7FYhk0MAzDhkSPbZaNgFIyC4QYAovwGAIP/A58AAAAASUVORK5CYII="; // s.attributeTypes[4].selections[21].name = "square-shades"; // s.attributeTypes[4].selections[21].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAPUlEQVRIie3NMQ4AIAxCUfD+d8bR2DS1jkbeiDUfMLP3MRslrQNS4ZmS0r0dABA/d1wFqhgP+2Y0Amb2vQnbuwsGU218pwAAAABJRU5ErkJggg=="; // s.attributeTypes[4].selections[22].name = "stylish-nerd-glasses"; // s.attributeTypes[4].selections[22].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAARUlEQVRIiWNgGAWjYBQMfcBIhJr/WPRgEyPZArghn1YXMzAwMDDwhfYy4BDDaQ4THgsYcWgkxtckKaYoiEbBKBgFwwEAAJpbCwl+/AqTAAAAAElFTkSuQmCC"; // s.attributeTypes[4].selections[23].name = "vr"; // s.attributeTypes[4].selections[23].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAWElEQVRIiWNgGAWjYBTQHDASoeY/JeYQsuD/woULGZSUlHAquHfvHkN8fDwxZmEavmjRov+HDx/+zwDxBVaMJI8VMOG14T8xoYMf0DyIaB7Jo2AUjAI6AABkXyVwTmw1BAAAAABJRU5ErkJggg=="; // s.attributeTypes[5].name = "Mouthpiece"; // s.attributeTypes[5].description = "Things NFTs put on/in their mouths"; // s.attributeTypes[5].zIndex = 5; // s.attributeTypes[5].selections[0].name = "bubble-gum"; // s.attributeTypes[5].selections[0].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAXklEQVRIiWNgGAWjYBSMglEwBAAjpQb8b1j1H8XAhjAUMymy4H/Dqv8MYvyogq8+oljCRLHhmW6oEmL8KL4iywIUw6fvwquWLAsYG8IYGV59JGg4AwMd4oDmqWjoAwDWyySle1Ot6wAAAABJRU5ErkJggg=="; // s.attributeTypes[5].selections[1].name = "cigar"; // s.attributeTypes[5].selections[1].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAPklEQVRIiWNgGAWjYBSMAvqDu3fvNiDzmWht4agFAw8YKdD7nxhzWcg13UBODKv4hUevsNtEBiDKB6Ng4AEAaw0IJrHp4okAAAAASUVORK5CYII="; // s.attributeTypes[5].selections[2].name = "cigarette-1"; // s.attributeTypes[5].selections[2].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAQ0lEQVRIiWNgGAWjYBSMAhRw7969BnQxJlpbOmrBwFtAc8BIgd7/xJhJrgX/jx07hiEoMzWBQW7pLRRzae6DUTDwAADdDQsodjv/MgAAAABJRU5ErkJggg=="; // s.attributeTypes[5].selections[3].name = "cigarette-2"; // s.attributeTypes[5].selections[3].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAO0lEQVRIiWNgGAWjYBSMAhRw7969BnQxJlpbOmrBwFsw9AEjmfr+Hzt2DENQZmoCg9zSW+SaOQqGKgAAxHkJJmqeTccAAAAASUVORK5CYII="; // s.attributeTypes[5].selections[4].name = "no-mouthpiece"; // s.attributeTypes[5].selections[4].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAJklEQVRIie3NMQEAAAjDMMC/52ECvlRA00nqs3m9AwAAAAAAAJy1C7oDLddyCRYAAAAASUVORK5CYII="; // s.attributeTypes[5].selections[5].name = "pear-wood-pipe"; // s.attributeTypes[5].selections[5].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAh0lEQVRIie2TQQqAIBBFXx3Fa7QXPIGnEYJu4iUC9x6ioLNMK0OiRZQFhQ8+4iD/MzgDlUql8j4hhD6/N0+Za617gLZkwD/Y/8H3KNmBnHl0dYokOrMPkQPd2gOJztANY/JJoQBb/fIeRGeabhjJO1nmify8TTKPzmzyVgkg3qqyIbm8VaSAFcI9PlqIqn+nAAAAAElFTkSuQmCC"; // s.attributeTypes[5].selections[6].name = "rose-wood-pipe"; // s.attributeTypes[5].selections[6].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAf0lEQVRIiWNgGAWjYBSMAvqDXbt2NSDzGWlluJubWwMDAwMDEzUtGB4APQ6GHqCmD/4To4jcVPS/NVAE3ZL/WDBF+eB/a6AIQ/X6NzBzYJYyMDAwwMUpyQeM1evfMCD75PHrLwzINMxmSgGKyx+//sIw48gPuNnUKirQIxxuLgCh0C579GpTowAAAABJRU5ErkJggg=="; // s.attributeTypes[5].selections[7].name = "vape-1"; // s.attributeTypes[5].selections[7].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAANElEQVRIiWNgGAWjYBSMglEwCugAGCnQ+58Yc1nINTwyMhJDcPnzZQwMB1DdTHMfjIKBBwApIAcGzyI6egAAAABJRU5ErkJggg=="; // s.attributeTypes[5].selections[8].name = "vape-2"; // s.attributeTypes[5].selections[8].dataUri = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAALUlEQVRIiWNgGAWjYBSMglEwCoYDYCRT3//IyEgMweXPlzEwHGAk18xRMFQBAAuwBQIJXf2yAAAAAElFTkSuQmCC"; // add your own state variables // EIP-2535 specifies that the `diamondCut` function takes two optional // arguments: address _init and bytes calldata _calldata // These arguments are used to execute an arbitrary function using delegatecall // in order to set state variables in the diamond during deployment or an upgrade // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * 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.0; /// @title ERC-173 Contract Ownership Standard /// Note: the ERC-165 identifier for this interface is 0x7f5828d0 /* is ERC165 */ interface IERC173 { /// @dev This emits when ownership of a contract changes. event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @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 // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../token/ERC721/extensions/IERC721Metadata.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Hex { function toHexDigit(uint8 d) pure internal returns (bytes1) { if (0 <= d && d <= 9) { return bytes1(uint8(bytes1('0')) + d); } else if (10 <= uint8(d) && uint8(d) <= 15) { return bytes1(uint8(bytes1('a')) + d - 10); } revert(); } function fromCode(bytes4 code) public pure returns (string memory) { bytes memory result = new bytes(10); result[0] = bytes1('0'); result[1] = bytes1('x'); for (uint i = 0; i < 4; ++i) { result[2 * i + 2] = toHexDigit(uint8(code[i]) / 16); result[2 * i + 3] = toHexDigit(uint8(code[i]) % 16); } return string(result); } }
// 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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "../libraries/BaseContract.sol"; contract RoyaltyFacet is IERC2981, ERC165, BaseContract { function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { tokenId; uint256 royaltyAmount = (salePrice * getState().royaltyBasisPoints) / 10_000; return (getState().royaltyWalletAddress, royaltyAmount); } function setRoyaltyWallet(address walletAddress) public onlyOwner { getState().royaltyWalletAddress = walletAddress; } function setRoyaltyBasisPoints(uint96 basisPoints) public onlyOwner { getState().royaltyBasisPoints = basisPoints; } function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamondCut } from "../interfaces/IDiamondCut.sol"; import { LibDiamond } from "../libraries/LibDiamond.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard 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.0; 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 override view returns (address owner_) { owner_ = LibDiamond.contractOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { LibDiamond } from "../libraries/LibDiamond.sol"; import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol"; import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol"; // The functions in DiamondLoupeFacet MUST be added to a diamond. // The EIP-2535 Diamond standard requires these functions. 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 override view 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 override view 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 override view 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 override view returns (address facetAddress_) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress; } // This implements ERC-165. function supportsInterface(bytes4 _interfaceId) external override view returns (bool) { LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); return ds.supportedInterfaces[_interfaceId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Context.sol"; import "../libraries/BaseContract.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract PausableFacet is Context, BaseContract { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev Initializes the contract in unpaused state. */ constructor() { _pause(); } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return getState().paused; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { getState().paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { getState().paused = false; emit Unpaused(_msgSender()); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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"}],"stateMutability":"payable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526040516200525e3803806200525e833981810160405281019062000029919062001ed7565b6200003f836200050960201b620001681760201c565b600062000056620005e860201b6200023f1760201c565b905060018160030160007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff81111562000128577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156200016557816020015b6200015162001e50565b815260200190600190039081620001475790505b5090506000600167ffffffffffffffff811115620001ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620001db5781602001602082028036833780820191505090505b509050631f931c1c60e01b8160008151811062000221577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060405180606001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200160006002811115620002cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001828152508260008151811062000313577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052506000600167ffffffffffffffff81111562000362577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620003915781602001602082028036833780820191505090505b5090506301ffc9a760e01b81600081518110620003d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060405180606001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020016000600281111562000485577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020018281525083600181518110620004c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250620004fc836000604051806020016040528060008152506200061560201b6200026c1760201c565b5050505050505062002ba4565b60006200051b620005e860201b60201c565b905060008160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b60005b835181101562000a1b5760008482815181106200065e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160200151905060006002811115620006a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115620006e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156200078a576200078485838151811062000726577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106200076c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015162000a7060201b60201c565b62000a04565b60016002811115620007c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115620007ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415620008a857620008a285838151811062000844577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106200088a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015162000d3860201b60201c565b62000a03565b600280811115620008e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160028111156200091c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415620009c557620009bf85838151811062000961577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151868481518110620009a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516200101360201b60201c565b62000a02565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009f99062002458565b60405180910390fd5b5b5b50808062000a129062002717565b91505062000618565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405162000a519392919062002361565b60405180910390a162000a6b8282620011df60201b60201c565b505050565b600081511162000ab7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aae9062002414565b60405180910390fd5b600062000ac9620005e860201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b35906200247a565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff16141562000bb55762000bb482856200140e60201b60201c565b5b60005b835181101562000d3157600084828151811062000bfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cec90620024e0565b60405180910390fd5b62000d098583868a620014f260201b60201c565b838062000d169062002765565b9450505050808062000d289062002717565b91505062000bb8565b5050505050565b600081511162000d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d769062002414565b60405180910390fd5b600062000d91620005e860201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000e06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dfd906200247a565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff16141562000e7d5762000e7c82856200140e60201b60201c565b5b60005b83518110156200100c57600084828151811062000ec6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000fbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fb49062002502565b60405180910390fd5b62000fd08582846200169f60201b60201c565b62000fe48583868a620014f260201b60201c565b838062000ff19062002765565b94505050508080620010039062002717565b91505062000e80565b5050505050565b60008151116200105a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010519062002414565b60405180910390fd5b60006200106c620005e860201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620010e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010d79062002524565b60405180910390fd5b60005b8251811015620011d957600083828151811062001129577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050620011c18482846200169f60201b60201c565b50508080620011d09062002717565b915050620010e3565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620012625760008151146200125c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200125390620023d0565b60405180910390fd5b6200140a565b6000815111620012a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012a0906200249c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462001309576200130882604051806060016040528060288152602001620052126028913962001dfb60201b60201c565b5b6000808373ffffffffffffffffffffffffffffffffffffffff168360405162001333919062002348565b600060405180830381855af49150503d806000811462001370576040519150601f19603f3d011682016040523d82523d6000602084013e62001375565b606091505b5091509150816200140757600081511115620013ca57806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013c19190620023ac565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013fe90620023f2565b60405180910390fd5b50505b5050565b62001439816040518060600160405280602481526020016200523a6024913962001dfb60201b60201c565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017099062002436565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001784576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200177b90620024be565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490506200185d9190620025fb565b905080821462001a405760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110620018e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001848154811062001989577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548062001abb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050600081141562001df45760006001866002018054905062001ba99190620025fb565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905081811462001d3957600087600201838154811062001c3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508088600201838154811062001ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b8660020180548062001d74577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b905060008111829062001e4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001e419190620023ac565b60405180910390fd5b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000600281111562001eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001606081525090565b60008151905062001ed18162002b8a565b92915050565b60008060006060848603121562001eed57600080fd5b600062001efd8682870162001ec0565b935050602062001f108682870162001ec0565b925050604062001f238682870162001ec0565b9150509250925092565b600062001f3b83836200206a565b60208301905092915050565b600062001f558383620022f2565b905092915050565b62001f688162002636565b82525050565b62001f798162002636565b82525050565b600062001f8c8262002566565b62001f988185620025ac565b935062001fa58362002546565b8060005b8381101562001fdc57815162001fc0888262001f2d565b975062001fcd8362002592565b92505060018101905062001fa9565b5085935050505092915050565b600062001ff68262002571565b620020028185620025bd565b935083602082028501620020168562002556565b8060005b8581101562002058578484038952815162002036858262001f47565b945062002043836200259f565b925060208a019950506001810190506200201a565b50829750879550505050505092915050565b62002075816200264a565b82525050565b600062002088826200257c565b620020948185620025ce565b9350620020a6818560208601620026e1565b620020b181620027fd565b840191505092915050565b6000620020c9826200257c565b620020d58185620025df565b9350620020e7818560208601620026e1565b80840191505092915050565b620020fe81620026cd565b82525050565b6000620021118262002587565b6200211d8185620025ea565b93506200212f818560208601620026e1565b6200213a81620027fd565b840191505092915050565b600062002154603c83620025ea565b915062002161826200280e565b604082019050919050565b60006200217b602683620025ea565b915062002188826200285d565b604082019050919050565b6000620021a2602b83620025ea565b9150620021af82620028ac565b604082019050919050565b6000620021c9603783620025ea565b9150620021d682620028fb565b604082019050919050565b6000620021f0602783620025ea565b9150620021fd826200294a565b604082019050919050565b600062002217602c83620025ea565b9150620022248262002999565b604082019050919050565b60006200223e603d83620025ea565b91506200224b82620029e8565b604082019050919050565b600062002265602e83620025ea565b9150620022728262002a37565b604082019050919050565b60006200228c603583620025ea565b9150620022998262002a86565b604082019050919050565b6000620022b3603883620025ea565b9150620022c08262002ad5565b604082019050919050565b6000620022da603683620025ea565b9150620022e78262002b24565b604082019050919050565b60006060830160008301516200230c600086018262001f5d565b506020830151620023216020860182620020f3565b50604083015184820360408601526200233b828262001f7f565b9150508091505092915050565b6000620023568284620020bc565b915081905092915050565b600060608201905081810360008301526200237d818662001fe9565b90506200238e602083018562001f6e565b8181036040830152620023a281846200207b565b9050949350505050565b60006020820190508181036000830152620023c8818462002104565b905092915050565b60006020820190508181036000830152620023eb8162002145565b9050919050565b600060208201905081810360008301526200240d816200216c565b9050919050565b600060208201905081810360008301526200242f8162002193565b9050919050565b600060208201905081810360008301526200245181620021ba565b9050919050565b600060208201905081810360008301526200247381620021e1565b9050919050565b60006020820190508181036000830152620024958162002208565b9050919050565b60006020820190508181036000830152620024b7816200222f565b9050919050565b60006020820190508181036000830152620024d98162002256565b9050919050565b60006020820190508181036000830152620024fb816200227d565b9050919050565b600060208201905081810360008301526200251d81620022a4565b9050919050565b600060208201905081810360008301526200253f81620022cb565b9050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006200260882620026ab565b91506200261583620026ab565b9250828210156200262b576200262a6200279f565b5b828203905092915050565b600062002643826200268b565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050620026868262002b73565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b6000620026da8262002676565b9050919050565b60005b8381101562002701578082015181840152602081019050620026e4565b8381111562002711576000848401525b50505050565b60006200272482620026ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200275a57620027596200279f565b5b600182019050919050565b60006200277282620026b5565b91506bffffffffffffffffffffffff8214156200279457620027936200279f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b6003811062002b875762002b86620027ce565b5b50565b62002b958162002636565b811462002ba157600080fd5b50565b61265e8062002bb46000396000f3fe60806040523661000b57005b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013990611ecc565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610163573d6000f35b3d6000fd5b600061017261023f565b905060008160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b60005b83518110156106415760008482815181106102b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001519050600060028111156102fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610334577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156103d1576103cc858381518110610376577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106103bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015161068c565b61062d565b6001600281111561040b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610444577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156104e1576104dc858381518110610486577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106104cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015161092b565b61062c565b60028081111561051a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610553577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156105f0576105eb858381518110610595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106105da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400151610bd5565b61062b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062290611e8c565b60405180910390fd5b5b5b5080806106399061214d565b91505061026f565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161067593929190611da5565b60405180910390a16106878282610d86565b505050565b60008151116106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790611e4c565b60405180910390fd5b60006106da61023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390611eac565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff1614156107ba576107b98285610f99565b5b60005b8351811015610924576000848281518110610801577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90611f2c565b60405180910390fd5b6109018583868a611074565b838061090c90612196565b9450505050808061091c9061214d565b9150506107bd565b5050505050565b600081511161096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690611e4c565b60405180910390fd5b600061097961023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290611eac565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415610a5957610a588285610f99565b5b60005b8351811015610bce576000848281518110610aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90611f4c565b60405180910390fd5b610b9f858284611221565b610bab8583868a611074565b8380610bb690612196565b94505050508080610bc69061214d565b915050610a5c565b5050505050565b6000815111610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090611e4c565b60405180910390fd5b6000610c2361023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90611f6c565b60405180910390fd5b60005b8251811015610d80576000838281518110610cdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610d6b848284611221565b50508080610d789061214d565b915050610c97565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e04576000815114610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690611e0c565b60405180910390fd5b610f95565b6000815111610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90611eec565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e9e57610e9d826040518060600160405280602881526020016125dd6028913961196a565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610ec69190611d8e565b600060405180830381855af49150503d8060008114610f01576040519150601f19603f3d011682016040523d82523d6000602084013e610f06565b606091505b509150915081610f9257600081511115610f5757806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9190611dea565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990611e2c565b60405180910390fd5b50505b5050565b610fbb816040518060600160405280602481526020016126056024913961196a565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890611e6c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790611f0c565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490506113d79190612041565b90508082146115b75760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110611500577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480611631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505060008114156119635760006001866002018054905061171c9190612041565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508181146118a95760008760020183815481106117ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080886002018381548110611816577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b866002018054806118e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b90506000811182906119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad9190611dea565b60405180910390fd5b50505050565b60006119c88383611ad9565b60208301905092915050565b60006119e08383611d3e565b905092915050565b6119f181612075565b82525050565b611a0081612075565b82525050565b6000611a1182611fac565b611a1b8185611ff2565b9350611a2683611f8c565b8060005b83811015611a57578151611a3e88826119bc565b9750611a4983611fd8565b925050600181019050611a2a565b5085935050505092915050565b6000611a6f82611fb7565b611a798185612003565b935083602082028501611a8b85611f9c565b8060005b85811015611ac75784840389528151611aa885826119d4565b9450611ab383611fe5565b925060208a01995050600181019050611a8f565b50829750879550505050505092915050565b611ae281612087565b82525050565b6000611af382611fc2565b611afd8185612014565b9350611b0d81856020860161211a565b611b1681612229565b840191505092915050565b6000611b2c82611fc2565b611b368185612025565b9350611b4681856020860161211a565b80840191505092915050565b611b5b81612108565b82525050565b6000611b6c82611fcd565b611b768185612030565b9350611b8681856020860161211a565b611b8f81612229565b840191505092915050565b6000611ba7603c83612030565b9150611bb28261223a565b604082019050919050565b6000611bca602683612030565b9150611bd582612289565b604082019050919050565b6000611bed602b83612030565b9150611bf8826122d8565b604082019050919050565b6000611c10603783612030565b9150611c1b82612327565b604082019050919050565b6000611c33602783612030565b9150611c3e82612376565b604082019050919050565b6000611c56602c83612030565b9150611c61826123c5565b604082019050919050565b6000611c79602083612030565b9150611c8482612414565b602082019050919050565b6000611c9c603d83612030565b9150611ca78261243d565b604082019050919050565b6000611cbf602e83612030565b9150611cca8261248c565b604082019050919050565b6000611ce2603583612030565b9150611ced826124db565b604082019050919050565b6000611d05603883612030565b9150611d108261252a565b604082019050919050565b6000611d28603683612030565b9150611d3382612579565b604082019050919050565b6000606083016000830151611d5660008601826119e8565b506020830151611d696020860182611b52565b5060408301518482036040860152611d818282611a06565b9150508091505092915050565b6000611d9a8284611b21565b915081905092915050565b60006060820190508181036000830152611dbf8186611a64565b9050611dce60208301856119f7565b8181036040830152611de08184611ae8565b9050949350505050565b60006020820190508181036000830152611e048184611b61565b905092915050565b60006020820190508181036000830152611e2581611b9a565b9050919050565b60006020820190508181036000830152611e4581611bbd565b9050919050565b60006020820190508181036000830152611e6581611be0565b9050919050565b60006020820190508181036000830152611e8581611c03565b9050919050565b60006020820190508181036000830152611ea581611c26565b9050919050565b60006020820190508181036000830152611ec581611c49565b9050919050565b60006020820190508181036000830152611ee581611c6c565b9050919050565b60006020820190508181036000830152611f0581611c8f565b9050919050565b60006020820190508181036000830152611f2581611cb2565b9050919050565b60006020820190508181036000830152611f4581611cd5565b9050919050565b60006020820190508181036000830152611f6581611cf8565b9050919050565b60006020820190508181036000830152611f8581611d1b565b9050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061204c826120e6565b9150612057836120e6565b92508282101561206a576120696121cb565b5b828203905092915050565b6000612080826120c6565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506120c1826125c8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b6000612113826120b3565b9050919050565b60005b8381101561213857808201518184015260208101905061211d565b83811115612147576000848401525b50505050565b6000612158826120e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561218b5761218a6121cb565b5b600182019050919050565b60006121a1826120f0565b91506bffffffffffffffffffffffff8214156121c0576121bf6121cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374600082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b600381106125d9576125d86121fa565b5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212206bb84e115e7a98654dc1e26defaa29624d26f08a1f27d2519ac2580de4da210f64736f6c634300080400334c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465000000000000000000000000ab4ec544285e2dc711c23e8dd7264fe3c0c2877300000000000000000000000011fa1305a3a4a1bc000ef67fabde2aa0f3d5df7900000000000000000000000058f2afda41ac58f397ae408a261691fc23560ca5
Deployed Bytecode
0x60806040523661000b57005b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013990611ecc565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610163573d6000f35b3d6000fd5b600061017261023f565b905060008160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b60005b83518110156106415760008482815181106102b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001519050600060028111156102fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610334577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156103d1576103cc858381518110610376577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106103bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015161068c565b61062d565b6001600281111561040b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610444577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156104e1576104dc858381518110610486577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106104cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040015161092b565b61062c565b60028081111561051a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816002811115610553577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156105f0576105eb858381518110610595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518684815181106105da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400151610bd5565b61062b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062290611e8c565b60405180910390fd5b5b5b5080806106399061214d565b91505061026f565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161067593929190611da5565b60405180910390a16106878282610d86565b505050565b60008151116106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790611e4c565b60405180910390fd5b60006106da61023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390611eac565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff1614156107ba576107b98285610f99565b5b60005b8351811015610924576000848281518110610801577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90611f2c565b60405180910390fd5b6109018583868a611074565b838061090c90612196565b9450505050808061091c9061214d565b9150506107bd565b5050505050565b600081511161096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690611e4c565b60405180910390fd5b600061097961023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290611eac565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415610a5957610a588285610f99565b5b60005b8351811015610bce576000848281518110610aa0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90611f4c565b60405180910390fd5b610b9f858284611221565b610bab8583868a611074565b8380610bb690612196565b94505050508080610bc69061214d565b915050610a5c565b5050505050565b6000815111610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090611e4c565b60405180910390fd5b6000610c2361023f565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90611f6c565b60405180910390fd5b60005b8251811015610d80576000838281518110610cdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610d6b848284611221565b50508080610d789061214d565b915050610c97565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e04576000815114610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690611e0c565b60405180910390fd5b610f95565b6000815111610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90611eec565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e9e57610e9d826040518060600160405280602881526020016125dd6028913961196a565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610ec69190611d8e565b600060405180830381855af49150503d8060008114610f01576040519150601f19603f3d011682016040523d82523d6000602084013e610f06565b606091505b509150915081610f9257600081511115610f5757806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9190611dea565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8990611e2c565b60405180910390fd5b50505b5050565b610fbb816040518060600160405280602481526020016126056024913961196a565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890611e6c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790611f0c565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490506113d79190612041565b90508082146115b75760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110611500577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480611631577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505060008114156119635760006001866002018054905061171c9190612041565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508181146118a95760008760020183815481106117ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080886002018381548110611816577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b866002018054806118e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b90506000811182906119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad9190611dea565b60405180910390fd5b50505050565b60006119c88383611ad9565b60208301905092915050565b60006119e08383611d3e565b905092915050565b6119f181612075565b82525050565b611a0081612075565b82525050565b6000611a1182611fac565b611a1b8185611ff2565b9350611a2683611f8c565b8060005b83811015611a57578151611a3e88826119bc565b9750611a4983611fd8565b925050600181019050611a2a565b5085935050505092915050565b6000611a6f82611fb7565b611a798185612003565b935083602082028501611a8b85611f9c565b8060005b85811015611ac75784840389528151611aa885826119d4565b9450611ab383611fe5565b925060208a01995050600181019050611a8f565b50829750879550505050505092915050565b611ae281612087565b82525050565b6000611af382611fc2565b611afd8185612014565b9350611b0d81856020860161211a565b611b1681612229565b840191505092915050565b6000611b2c82611fc2565b611b368185612025565b9350611b4681856020860161211a565b80840191505092915050565b611b5b81612108565b82525050565b6000611b6c82611fcd565b611b768185612030565b9350611b8681856020860161211a565b611b8f81612229565b840191505092915050565b6000611ba7603c83612030565b9150611bb28261223a565b604082019050919050565b6000611bca602683612030565b9150611bd582612289565b604082019050919050565b6000611bed602b83612030565b9150611bf8826122d8565b604082019050919050565b6000611c10603783612030565b9150611c1b82612327565b604082019050919050565b6000611c33602783612030565b9150611c3e82612376565b604082019050919050565b6000611c56602c83612030565b9150611c61826123c5565b604082019050919050565b6000611c79602083612030565b9150611c8482612414565b602082019050919050565b6000611c9c603d83612030565b9150611ca78261243d565b604082019050919050565b6000611cbf602e83612030565b9150611cca8261248c565b604082019050919050565b6000611ce2603583612030565b9150611ced826124db565b604082019050919050565b6000611d05603883612030565b9150611d108261252a565b604082019050919050565b6000611d28603683612030565b9150611d3382612579565b604082019050919050565b6000606083016000830151611d5660008601826119e8565b506020830151611d696020860182611b52565b5060408301518482036040860152611d818282611a06565b9150508091505092915050565b6000611d9a8284611b21565b915081905092915050565b60006060820190508181036000830152611dbf8186611a64565b9050611dce60208301856119f7565b8181036040830152611de08184611ae8565b9050949350505050565b60006020820190508181036000830152611e048184611b61565b905092915050565b60006020820190508181036000830152611e2581611b9a565b9050919050565b60006020820190508181036000830152611e4581611bbd565b9050919050565b60006020820190508181036000830152611e6581611be0565b9050919050565b60006020820190508181036000830152611e8581611c03565b9050919050565b60006020820190508181036000830152611ea581611c26565b9050919050565b60006020820190508181036000830152611ec581611c49565b9050919050565b60006020820190508181036000830152611ee581611c6c565b9050919050565b60006020820190508181036000830152611f0581611c8f565b9050919050565b60006020820190508181036000830152611f2581611cb2565b9050919050565b60006020820190508181036000830152611f4581611cd5565b9050919050565b60006020820190508181036000830152611f6581611cf8565b9050919050565b60006020820190508181036000830152611f8581611d1b565b9050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061204c826120e6565b9150612057836120e6565b92508282101561206a576120696121cb565b5b828203905092915050565b6000612080826120c6565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506120c1826125c8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b6000612113826120b3565b9050919050565b60005b8381101561213857808201518184015260208101905061211d565b83811115612147576000848401525b50505050565b6000612158826120e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561218b5761218a6121cb565b5b600182019050919050565b60006121a1826120f0565b91506bffffffffffffffffffffffff8214156121c0576121bf6121cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374600082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b600381106125d9576125d86121fa565b5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212206bb84e115e7a98654dc1e26defaa29624d26f08a1f27d2519ac2580de4da210f64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ab4ec544285e2dc711c23e8dd7264fe3c0c2877300000000000000000000000011fa1305a3a4a1bc000ef67fabde2aa0f3d5df7900000000000000000000000058f2afda41ac58f397ae408a261691fc23560ca5
-----Decoded View---------------
Arg [0] : _contractOwner (address): 0xAb4Ec544285E2Dc711c23E8Dd7264fe3c0c28773
Arg [1] : _diamondCutFacet (address): 0x11fa1305a3a4A1BC000Ef67fabde2AA0f3d5DF79
Arg [2] : _diamondLoupeFacet (address): 0x58f2aFdA41ac58f397Ae408A261691Fc23560CA5
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab4ec544285e2dc711c23e8dd7264fe3c0c28773
Arg [1] : 00000000000000000000000011fa1305a3a4a1bc000ef67fabde2aa0f3d5df79
Arg [2] : 00000000000000000000000058f2afda41ac58f397ae408a261691fc23560ca5
Deployed Bytecode Sourcemap
661:2504:18:-:0;;;;;;;;2019:36;2065:16;640:45:37;2065:54:18;;2194:8;2183:19;;2265:13;2281:2;:29;;:38;2311:7;;;;2281:38;;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;2265:67;;2367:1;2350:19;;:5;:19;;;;2342:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2603:14;2600:1;2597;2584:34;2747:1;2744;2728:14;2725:1;2718:5;2711;2698:51;2819:16;2816:1;2813;2798:38;2923:6;2951:1;2946:74;;;;3077:16;3074:1;3067:27;2946:74;2985:16;2982:1;2975:27;1999:264:37;2063:25;2091:16;:14;:16::i;:::-;2063:44;;2117:21;2141:2;:16;;;;;;;;;;;;2117:40;;2186:9;2167:2;:16;;;:28;;;;;;;;;;;;;;;;;;2246:9;2210:46;;2231:13;2210:46;;;;;;;;;;;;1999:264;;;:::o;1706:197::-;1755:25;1792:16;640:45;1792:43;;1879:8;1868:19;;1854:43;;:::o;2711:1067::-;2867:18;2862:806;2900:11;:18;2887:10;:31;2862:806;;;2948:33;2984:11;2996:10;2984:23;;;;;;;;;;;;;;;;;;;;;;:30;;;2948:66;;3042:30;3032:40;;;;;;;;;;;;;;;;:6;:40;;;;;;;;;;;;;;;;;3028:630;;;3092:93;3105:11;3117:10;3105:23;;;;;;;;;;;;;;;;;;;;;;:36;;;3143:11;3155:10;3143:23;;;;;;;;;;;;;;;;;;;;;;:41;;;3092:12;:93::i;:::-;3028:630;;;3220:34;3210:44;;;;;;;;;;;;;;;;:6;:44;;;;;;;;;;;;;;;;;3206:452;;;3274:97;3291:11;3303:10;3291:23;;;;;;;;;;;;;;;;;;;;;;:36;;;3329:11;3341:10;3329:23;;;;;;;;;;;;;;;;;;;;;;:41;;;3274:16;:97::i;:::-;3206:452;;;3406:33;3396:43;;;;;;;;;;;;;;;;:6;:43;;;;;;;;;;;;;;;;;3392:266;;;3459:96;3475:11;3487:10;3475:23;;;;;;;;;;;;;;;;;;;;;;:36;;;3513:11;3525:10;3513:23;;;;;;;;;;;;;;;;;;;;;;:41;;;3459:15;:96::i;:::-;3392:266;;;3594:49;;;;;;;;;;:::i;:::-;;;;;;;;3392:266;3206:452;3028:630;2862:806;2920:12;;;;;:::i;:::-;;;;2862:806;;;;3682:41;3693:11;3706:5;3713:9;3682:41;;;;;;;;:::i;:::-;;;;;;;;3733:38;3754:5;3761:9;3733:20;:38::i;:::-;2711:1067;;;:::o;3784:1089::-;3920:1;3892:18;:25;:29;3884:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3979:25;4007:16;:14;:16::i;:::-;3979:44;;4074:1;4049:27;;:13;:27;;;;4041:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4135:23;4168:2;:25;;:40;4194:13;4168:40;;;;;;;;;;;;;;;:58;;:65;;;;4135:99;;4322:1;4302:16;:21;;;4298:91;;;4339:27;4348:2;4352:13;4339:8;:27::i;:::-;4298:91;4403:21;4398:469;4442:18;:25;4426:13;:41;4398:469;;;4500:15;4518:18;4537:13;4518:33;;;;;;;;;;;;;;;;;;;;;;4500:51;;4565:23;4591:2;:29;;:39;4621:8;4591:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;4565:78;;4692:1;4665:29;;:15;:29;;;4657:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;4766:58;4778:2;4782:8;4792:16;4810:13;4766:11;:58::i;:::-;4838:18;;;;;:::i;:::-;;;;4398:469;;4469:15;;;;;:::i;:::-;;;;4398:469;;;;3784:1089;;;;:::o;4879:1138::-;5019:1;4991:18;:25;:29;4983:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;5078:25;5106:16;:14;:16::i;:::-;5078:44;;5165:1;5140:27;;:13;:27;;;;5132:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;5226:23;5259:2;:25;;:40;5285:13;5259:40;;;;;;;;;;;;;;;:58;;:65;;;;5226:99;;5413:1;5393:16;:21;;;5389:79;;;5430:27;5439:2;5443:13;5430:8;:27::i;:::-;5389:79;5482:21;5477:534;5521:18;:25;5505:13;:41;5477:534;;;5579:15;5597:18;5616:13;5597:33;;;;;;;;;;;;;;;;;;;;;;5579:51;;5644:23;5670:2;:29;;:39;5700:8;5670:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;5644:78;;5763:13;5744:32;;:15;:32;;;;5736:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;5851:45;5866:2;5870:15;5887:8;5851:14;:45::i;:::-;5910:58;5922:2;5926:8;5936:16;5954:13;5910:11;:58::i;:::-;5982:18;;;;;:::i;:::-;;;;5477:534;;5548:15;;;;;:::i;:::-;;;;5477:534;;;;4879:1138;;;;:::o;6023:742::-;6162:1;6134:18;:25;:29;6126:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6221:25;6249:16;:14;:16::i;:::-;6221:44;;6373:1;6348:27;;:13;:27;;;6340:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6449:21;6444:315;6488:18;:25;6472:13;:41;6444:315;;;6546:15;6564:18;6583:13;6564:33;;;;;;;;;;;;;;;;;;;;;;6546:51;;6611:23;6637:2;:29;;:39;6667:8;6637:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;6611:78;;6703:45;6718:2;6722:15;6739:8;6703:14;:45::i;:::-;6444:315;;6515:15;;;;;:::i;:::-;;;;6444:315;;;;6023:742;;;:::o;9689:871::-;9798:1;9781:19;;:5;:19;;;9777:777;;;9844:1;9824:9;:16;:21;9816:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;9777:777;;;9968:1;9949:9;:16;:20;9941:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;10070:4;10053:22;;:5;:22;;;10049:134;;10095:73;10118:5;10095:73;;;;;;;;;;;;;;;;;:22;:73::i;:::-;10049:134;10197:12;10211:18;10233:5;:18;;10252:9;10233:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10196:66;;;;10281:7;10276:268;;10327:1;10312:5;:12;:16;10308:222;;;10409:5;10395:21;;;;;;;;;;;:::i;:::-;;;;;;;;10308:222;10463:48;;;;;;;;;;:::i;:::-;;;;;;;;10276:268;9777:777;;;9689:871;;:::o;6771:316::-;6858:77;6881:13;6858:77;;;;;;;;;;;;;;;;;:22;:77::i;:::-;7009:2;:17;;:24;;;;6945:2;:25;;:40;6971:13;6945:40;;;;;;;;;;;;;;;:61;;:88;;;;7043:2;:17;;7066:13;7043:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6771:316;;:::o;7098:389::-;7300:17;7232:2;:29;;:40;7262:9;7232:40;;;;;;;;;;;;;;;;;:65;;;:85;;;;;;;;;;;;;;;;;;7327:2;:25;;:40;7353:13;7327:40;;;;;;;;;;;;;;;:58;;7391:9;7327:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7467:13;7411:2;:29;;:40;7441:9;7411:40;;;;;;;;;;;;;;;;;:53;;;:69;;;;;;;;;;;;;;;;;;7098:389;;;;:::o;7493:2190::-;7645:1;7620:27;;:13;:27;;;;7612:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;7827:4;7802:30;;:13;:30;;;;7794:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;7967:24;7994:2;:29;;:40;8024:9;7994:40;;;;;;;;;;;;;;;;;:65;;;;;;;;;;;;7967:92;;;;8069:28;8168:1;8100:2;:25;;:40;8126:13;8100:40;;;;;;;;;;;;;;;:58;;:65;;;;:69;;;;:::i;:::-;8069:100;;8271:20;8251:16;:40;8247:387;;8307:19;8329:2;:25;;:40;8355:13;8329:40;;;;;;;;;;;;;;;:58;;8388:20;8329:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8307:102;;8502:12;8423:2;:25;;:40;8449:13;8423:40;;;;;;;;;;;;;;;:58;;8482:16;8423:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;8606:16;8528:2;:29;;:43;8558:12;8528:43;;;;;;;;;;;;;;;;;:68;;;:95;;;;;;;;;;;;;;;;;;8247:387;;8679:2;:25;;:40;8705:13;8679:40;;;;;;;;;;;;;;;:58;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8760:2;:29;;:40;8790:9;8760:40;;;;;;;;;;;;;;;;;;8753:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8919:1;8895:20;:25;8891:786;;;9027:32;9089:1;9062:2;:17;;:24;;;;:28;;;;:::i;:::-;9027:63;;9104:28;9135:2;:25;;:40;9161:13;9135:40;;;;;;;;;;;;;;;:61;;;9104:92;;9238:24;9214:20;:48;9210:338;;9282:24;9309:2;:17;;9327:24;9309:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9282:70;;9412:16;9370:2;:17;;9388:20;9370:39;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;9513:20;9446:2;:25;;:43;9472:16;9446:43;;;;;;;;;;;;;;;:64;;:87;;;;9210:338;;9561:2;:17;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9605:2;:25;;:40;9631:13;9605:40;;;;;;;;;;;;;;;:61;;9598:68;;;8891:786;;;7493:2190;;;;;:::o;10566:261::-;10670:20;10751:9;10739:22;10723:38;;10803:1;10788:12;:16;10806:13;10780:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10566:261;;;:::o;7:175:38:-;74:10;95:44;135:3;127:6;95:44;:::i;:::-;171:4;166:3;162:14;148:28;;85:97;;;;:::o;188:264::-;311:10;346:100;442:3;434:6;346:100;:::i;:::-;332:114;;322:130;;;;:::o;458:108::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;513:53;;:::o;572:118::-;659:24;677:5;659:24;:::i;:::-;654:3;647:37;637:53;;:::o;724:704::-;831:3;860:53;907:5;860:53;:::i;:::-;929:75;997:6;992:3;929:75;:::i;:::-;922:82;;1028:55;1077:5;1028:55;:::i;:::-;1106:7;1137:1;1122:281;1147:6;1144:1;1141:13;1122:281;;;1223:6;1217:13;1250:61;1307:3;1292:13;1250:61;:::i;:::-;1243:68;;1334:59;1386:6;1334:59;:::i;:::-;1324:69;;1182:221;1169:1;1166;1162:9;1157:14;;1122:281;;;1126:14;1419:3;1412:10;;836:592;;;;;;;:::o;1504:1127::-;1677:3;1706:81;1781:5;1706:81;:::i;:::-;1803:113;1909:6;1904:3;1803:113;:::i;:::-;1796:120;;1942:3;1987:4;1979:6;1975:17;1970:3;1966:27;2017:83;2094:5;2017:83;:::i;:::-;2123:7;2154:1;2139:447;2164:6;2161:1;2158:13;2139:447;;;2235:9;2229:4;2225:20;2220:3;2213:33;2286:6;2280:13;2314:118;2427:4;2412:13;2314:118;:::i;:::-;2306:126;;2455:87;2535:6;2455:87;:::i;:::-;2445:97;;2571:4;2566:3;2562:14;2555:21;;2199:387;2186:1;2183;2179:9;2174:14;;2139:447;;;2143:14;2602:4;2595:11;;2622:3;2615:10;;1682:949;;;;;;;;;:::o;2637:105::-;2712:23;2729:5;2712:23;:::i;:::-;2707:3;2700:36;2690:52;;:::o;2748:360::-;2834:3;2862:38;2894:5;2862:38;:::i;:::-;2916:70;2979:6;2974:3;2916:70;:::i;:::-;2909:77;;2995:52;3040:6;3035:3;3028:4;3021:5;3017:16;2995:52;:::i;:::-;3072:29;3094:6;3072:29;:::i;:::-;3067:3;3063:39;3056:46;;2838:270;;;;;:::o;3114:373::-;3218:3;3246:38;3278:5;3246:38;:::i;:::-;3300:88;3381:6;3376:3;3300:88;:::i;:::-;3293:95;;3397:52;3442:6;3437:3;3430:4;3423:5;3419:16;3397:52;:::i;:::-;3474:6;3469:3;3465:16;3458:23;;3222:265;;;;;:::o;3493:157::-;3588:55;3637:5;3588:55;:::i;:::-;3583:3;3576:68;3566:84;;:::o;3656:364::-;3744:3;3772:39;3805:5;3772:39;:::i;:::-;3827:71;3891:6;3886:3;3827:71;:::i;:::-;3820:78;;3907:52;3952:6;3947:3;3940:4;3933:5;3929:16;3907:52;:::i;:::-;3984:29;4006:6;3984:29;:::i;:::-;3979:3;3975:39;3968:46;;3748:272;;;;;:::o;4026:366::-;4168:3;4189:67;4253:2;4248:3;4189:67;:::i;:::-;4182:74;;4265:93;4354:3;4265:93;:::i;:::-;4383:2;4378:3;4374:12;4367:19;;4172:220;;;:::o;4398:366::-;4540:3;4561:67;4625:2;4620:3;4561:67;:::i;:::-;4554:74;;4637:93;4726:3;4637:93;:::i;:::-;4755:2;4750:3;4746:12;4739:19;;4544:220;;;:::o;4770:366::-;4912:3;4933:67;4997:2;4992:3;4933:67;:::i;:::-;4926:74;;5009:93;5098:3;5009:93;:::i;:::-;5127:2;5122:3;5118:12;5111:19;;4916:220;;;:::o;5142:366::-;5284:3;5305:67;5369:2;5364:3;5305:67;:::i;:::-;5298:74;;5381:93;5470:3;5381:93;:::i;:::-;5499:2;5494:3;5490:12;5483:19;;5288:220;;;:::o;5514:366::-;5656:3;5677:67;5741:2;5736:3;5677:67;:::i;:::-;5670:74;;5753:93;5842:3;5753:93;:::i;:::-;5871:2;5866:3;5862:12;5855:19;;5660:220;;;:::o;5886:366::-;6028:3;6049:67;6113:2;6108:3;6049:67;:::i;:::-;6042:74;;6125:93;6214:3;6125:93;:::i;:::-;6243:2;6238:3;6234:12;6227:19;;6032:220;;;:::o;6258:366::-;6400:3;6421:67;6485:2;6480:3;6421:67;:::i;:::-;6414:74;;6497:93;6586:3;6497:93;:::i;:::-;6615:2;6610:3;6606:12;6599:19;;6404:220;;;:::o;6630:366::-;6772:3;6793:67;6857:2;6852:3;6793:67;:::i;:::-;6786:74;;6869:93;6958:3;6869:93;:::i;:::-;6987:2;6982:3;6978:12;6971:19;;6776:220;;;:::o;7002:366::-;7144:3;7165:67;7229:2;7224:3;7165:67;:::i;:::-;7158:74;;7241:93;7330:3;7241:93;:::i;:::-;7359:2;7354:3;7350:12;7343:19;;7148:220;;;:::o;7374:366::-;7516:3;7537:67;7601:2;7596:3;7537:67;:::i;:::-;7530:74;;7613:93;7702:3;7613:93;:::i;:::-;7731:2;7726:3;7722:12;7715:19;;7520:220;;;:::o;7746:366::-;7888:3;7909:67;7973:2;7968:3;7909:67;:::i;:::-;7902:74;;7985:93;8074:3;7985:93;:::i;:::-;8103:2;8098:3;8094:12;8087:19;;7892:220;;;:::o;8118:366::-;8260:3;8281:67;8345:2;8340:3;8281:67;:::i;:::-;8274:74;;8357:93;8446:3;8357:93;:::i;:::-;8475:2;8470:3;8466:12;8459:19;;8264:220;;;:::o;8556:843::-;8669:3;8705:4;8700:3;8696:14;8800:4;8793:5;8789:16;8783:23;8819:63;8876:4;8871:3;8867:14;8853:12;8819:63;:::i;:::-;8720:172;8976:4;8969:5;8965:16;8959:23;8995:81;9070:4;9065:3;9061:14;9047:12;8995:81;:::i;:::-;8902:184;9181:4;9174:5;9170:16;9164:23;9234:3;9228:4;9224:14;9217:4;9212:3;9208:14;9201:38;9260:101;9356:4;9342:12;9260:101;:::i;:::-;9252:109;;9096:276;9389:4;9382:11;;8674:725;;;;;:::o;9405:271::-;9535:3;9557:93;9646:3;9637:6;9557:93;:::i;:::-;9550:100;;9667:3;9660:10;;9539:137;;;;:::o;9682:788::-;9953:4;9991:2;9980:9;9976:18;9968:26;;10040:9;10034:4;10030:20;10026:1;10015:9;10011:17;10004:47;10068:162;10225:4;10216:6;10068:162;:::i;:::-;10060:170;;10240:72;10308:2;10297:9;10293:18;10284:6;10240:72;:::i;:::-;10359:9;10353:4;10349:20;10344:2;10333:9;10329:18;10322:48;10387:76;10458:4;10449:6;10387:76;:::i;:::-;10379:84;;9958:512;;;;;;:::o;10476:313::-;10589:4;10627:2;10616:9;10612:18;10604:26;;10676:9;10670:4;10666:20;10662:1;10651:9;10647:17;10640:47;10704:78;10777:4;10768:6;10704:78;:::i;:::-;10696:86;;10594:195;;;;:::o;10795:419::-;10961:4;10999:2;10988:9;10984:18;10976:26;;11048:9;11042:4;11038:20;11034:1;11023:9;11019:17;11012:47;11076:131;11202:4;11076:131;:::i;:::-;11068:139;;10966:248;;;:::o;11220:419::-;11386:4;11424:2;11413:9;11409:18;11401:26;;11473:9;11467:4;11463:20;11459:1;11448:9;11444:17;11437:47;11501:131;11627:4;11501:131;:::i;:::-;11493:139;;11391:248;;;:::o;11645:419::-;11811:4;11849:2;11838:9;11834:18;11826:26;;11898:9;11892:4;11888:20;11884:1;11873:9;11869:17;11862:47;11926:131;12052:4;11926:131;:::i;:::-;11918:139;;11816:248;;;:::o;12070:419::-;12236:4;12274:2;12263:9;12259:18;12251:26;;12323:9;12317:4;12313:20;12309:1;12298:9;12294:17;12287:47;12351:131;12477:4;12351:131;:::i;:::-;12343:139;;12241:248;;;:::o;12495:419::-;12661:4;12699:2;12688:9;12684:18;12676:26;;12748:9;12742:4;12738:20;12734:1;12723:9;12719:17;12712:47;12776:131;12902:4;12776:131;:::i;:::-;12768:139;;12666:248;;;:::o;12920:419::-;13086:4;13124:2;13113:9;13109:18;13101:26;;13173:9;13167:4;13163:20;13159:1;13148:9;13144:17;13137:47;13201:131;13327:4;13201:131;:::i;:::-;13193:139;;13091:248;;;:::o;13345:419::-;13511:4;13549:2;13538:9;13534:18;13526:26;;13598:9;13592:4;13588:20;13584:1;13573:9;13569:17;13562:47;13626:131;13752:4;13626:131;:::i;:::-;13618:139;;13516:248;;;:::o;13770:419::-;13936:4;13974:2;13963:9;13959:18;13951:26;;14023:9;14017:4;14013:20;14009:1;13998:9;13994:17;13987:47;14051:131;14177:4;14051:131;:::i;:::-;14043:139;;13941:248;;;:::o;14195:419::-;14361:4;14399:2;14388:9;14384:18;14376:26;;14448:9;14442:4;14438:20;14434:1;14423:9;14419:17;14412:47;14476:131;14602:4;14476:131;:::i;:::-;14468:139;;14366:248;;;:::o;14620:419::-;14786:4;14824:2;14813:9;14809:18;14801:26;;14873:9;14867:4;14863:20;14859:1;14848:9;14844:17;14837:47;14901:131;15027:4;14901:131;:::i;:::-;14893:139;;14791:248;;;:::o;15045:419::-;15211:4;15249:2;15238:9;15234:18;15226:26;;15298:9;15292:4;15288:20;15284:1;15273:9;15269:17;15262:47;15326:131;15452:4;15326:131;:::i;:::-;15318:139;;15216:248;;;:::o;15470:419::-;15636:4;15674:2;15663:9;15659:18;15651:26;;15723:9;15717:4;15713:20;15709:1;15698:9;15694:17;15687:47;15751:131;15877:4;15751:131;:::i;:::-;15743:139;;15641:248;;;:::o;15895:131::-;15961:4;15984:3;15976:11;;16014:4;16009:3;16005:14;15997:22;;15966:60;;;:::o;16032:159::-;16126:4;16149:3;16141:11;;16179:4;16174:3;16170:14;16162:22;;16131:60;;;:::o;16197:113::-;16263:6;16297:5;16291:12;16281:22;;16270:40;;;:::o;16316:141::-;16410:6;16444:5;16438:12;16428:22;;16417:40;;;:::o;16463:98::-;16514:6;16548:5;16542:12;16532:22;;16521:40;;;:::o;16567:99::-;16619:6;16653:5;16647:12;16637:22;;16626:40;;;:::o;16672:112::-;16741:4;16773;16768:3;16764:14;16756:22;;16746:38;;;:::o;16790:140::-;16887:4;16919;16914:3;16910:14;16902:22;;16892:38;;;:::o;16936:173::-;17024:11;17058:6;17053:3;17046:19;17098:4;17093:3;17089:14;17074:29;;17036:73;;;;:::o;17115:211::-;17241:11;17275:6;17270:3;17263:19;17315:4;17310:3;17306:14;17291:29;;17253:73;;;;:::o;17332:168::-;17415:11;17449:6;17444:3;17437:19;17489:4;17484:3;17480:14;17465:29;;17427:73;;;;:::o;17506:147::-;17607:11;17644:3;17629:18;;17619:34;;;;:::o;17659:169::-;17743:11;17777:6;17772:3;17765:19;17817:4;17812:3;17808:14;17793:29;;17755:73;;;;:::o;17834:191::-;17874:4;17894:20;17912:1;17894:20;:::i;:::-;17889:25;;17928:20;17946:1;17928:20;:::i;:::-;17923:25;;17967:1;17964;17961:8;17958:2;;;17972:18;;:::i;:::-;17958:2;18017:1;18014;18010:9;18002:17;;17879:146;;;;:::o;18031:96::-;18068:7;18097:24;18115:5;18097:24;:::i;:::-;18086:35;;18076:51;;;:::o;18133:149::-;18169:7;18209:66;18202:5;18198:78;18187:89;;18177:105;;;:::o;18288:151::-;18345:7;18374:5;18363:16;;18380:53;18427:5;18380:53;:::i;:::-;18353:86;;;:::o;18445:126::-;18482:7;18522:42;18515:5;18511:54;18500:65;;18490:81;;;:::o;18577:77::-;18614:7;18643:5;18632:16;;18622:32;;;:::o;18660:109::-;18696:7;18736:26;18729:5;18725:38;18714:49;;18704:65;;;:::o;18775:151::-;18843:9;18876:44;18914:5;18876:44;:::i;:::-;18863:57;;18853:73;;;:::o;18932:307::-;19000:1;19010:113;19024:6;19021:1;19018:13;19010:113;;;19109:1;19104:3;19100:11;19094:18;19090:1;19085:3;19081:11;19074:39;19046:2;19043:1;19039:10;19034:15;;19010:113;;;19141:6;19138:1;19135:13;19132:2;;;19221:1;19212:6;19207:3;19203:16;19196:27;19132:2;18981:258;;;;:::o;19245:233::-;19284:3;19307:24;19325:5;19307:24;:::i;:::-;19298:33;;19353:66;19346:5;19343:77;19340:2;;;19423:18;;:::i;:::-;19340:2;19470:1;19463:5;19459:13;19452:20;;19288:190;;;:::o;19484:191::-;19522:3;19545:23;19562:5;19545:23;:::i;:::-;19536:32;;19590:26;19583:5;19580:37;19577:2;;;19620:18;;:::i;:::-;19577:2;19667:1;19660:5;19656:13;19649:20;;19526:149;;;:::o;19681:180::-;19729:77;19726:1;19719:88;19826:4;19823:1;19816:15;19850:4;19847:1;19840:15;19867:180;19915:77;19912:1;19905:88;20012:4;20009:1;20002:15;20036:4;20033:1;20026:15;20053:102;20094:6;20145:2;20141:7;20136:2;20129:5;20125:14;20121:28;20111:38;;20101:54;;;:::o;20161:247::-;20301:34;20297:1;20289:6;20285:14;20278:58;20370:30;20365:2;20357:6;20353:15;20346:55;20267:141;:::o;20414:225::-;20554:34;20550:1;20542:6;20538:14;20531:58;20623:8;20618:2;20610:6;20606:15;20599:33;20520:119;:::o;20645:230::-;20785:34;20781:1;20773:6;20769:14;20762:58;20854:13;20849:2;20841:6;20837:15;20830:38;20751:124;:::o;20881:242::-;21021:34;21017:1;21009:6;21005:14;20998:58;21090:25;21085:2;21077:6;21073:15;21066:50;20987:136;:::o;21129:226::-;21269:34;21265:1;21257:6;21253:14;21246:58;21338:9;21333:2;21325:6;21321:15;21314:34;21235:120;:::o;21361:231::-;21501:34;21497:1;21489:6;21485:14;21478:58;21570:14;21565:2;21557:6;21553:15;21546:39;21467:125;:::o;21598:182::-;21738:34;21734:1;21726:6;21722:14;21715:58;21704:76;:::o;21786:248::-;21926:34;21922:1;21914:6;21910:14;21903:58;21995:31;21990:2;21982:6;21978:15;21971:56;21892:142;:::o;22040:233::-;22180:34;22176:1;22168:6;22164:14;22157:58;22249:16;22244:2;22236:6;22232:15;22225:41;22146:127;:::o;22279:240::-;22419:34;22415:1;22407:6;22403:14;22396:58;22488:23;22483:2;22475:6;22471:15;22464:48;22385:134;:::o;22525:243::-;22665:34;22661:1;22653:6;22649:14;22642:58;22734:26;22729:2;22721:6;22717:15;22710:51;22631:137;:::o;22774:241::-;22914:34;22910:1;22902:6;22898:14;22891:58;22983:24;22978:2;22970:6;22966:15;22959:49;22880:135;:::o;23021:125::-;23114:1;23107:5;23104:12;23094:2;;23120:18;;:::i;:::-;23094:2;23084:62;:::o
Swarm Source
ipfs://6bb84e115e7a98654dc1e26defaa29624d26f08a1f27d2519ac2580de4da210f
Loading...
Loading
Loading...
Loading
[ 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.