Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
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:
SignedZoneV16Royalty
Compiler Version
v0.8.17+commit.8df45f5f
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {ZoneParameters, Schema} from "../lib/ConsiderationStructs.sol"; import {ZoneInterfaceV16} from "../interfaces/ZoneInterfaceV16.sol"; import {SignedZoneV16RoyaltyEventsAndErrors} from "./interfaces/SignedZoneV16RoyaltyEventsAndErrors.sol"; import {SIP5Interface} from "./interfaces/SIP5Interface.sol"; import {SignedZoneControllerInterface} from "./interfaces/SignedZoneControllerInterface.sol"; import {IAuthorizedTransferSecurityRegistry} from "./interfaces/IAuthorizedTransferSecurityRegistry.sol"; import "./lib/SignedZoneV16RoyaltyConstants.sol"; /** * @title SignedZoneV16Royalty * @author ryanio, BCLeFevre * @notice SignedZoneV16Royalty is an implementation of SIP-7 that requires orders * to be signed by an approved signer. * https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-7.md */ contract SignedZoneV16Royalty is SignedZoneV16RoyaltyEventsAndErrors, ZoneInterfaceV16, SIP5Interface { /// @dev The zone's controller that is set during deployment. address private immutable _controller; /// @dev The authorized signers, and if they are active. mapping(address => bool) private _signers; /// @dev The EIP-712 digest parameters. bytes32 internal immutable _NAME_HASH; bytes32 internal immutable _VERSION_HASH = keccak256(bytes("2.0")); // prettier-ignore bytes32 internal immutable _EIP_712_DOMAIN_TYPEHASH = keccak256( abi.encodePacked( "EIP712Domain(", "string name,", "string version,", "uint256 chainId,", "address verifyingContract", ")" ) ); // prettier-ignore bytes32 internal immutable _SIGNED_ORDER_TYPEHASH = keccak256( abi.encodePacked( "SignedOrder(", "address fulfiller,", "uint64 expiration,", "bytes32 orderHash,", "bytes context", ")" ) ); uint256 internal immutable _CHAIN_ID = block.chainid; bytes32 internal immutable _DOMAIN_SEPARATOR; address private immutable SEAPORT = 0x0000000000000068F116a894984e2DB1123eB395; /** * @notice Constructor to deploy the contract. * * @param zoneName The name for the zone used in the domain separator * derivation. */ constructor(string memory zoneName) { // Set the deployer as the controller. _controller = msg.sender; // Set the name hash. _NAME_HASH = keccak256(bytes(zoneName)); // Derive and set the domain separator. _DOMAIN_SEPARATOR = _deriveDomainSeparator(); // Emit an event to signal a SIP-5 contract has been deployed. emit SeaportCompatibleContractDeployed(); } /** * @notice The fallback function is used as a dispatcher for the * `updateSigner`, `isActiveSigner`, `getActiveSigners` and * `supportsInterface` functions. */ // prettier-ignore fallback(bytes calldata) external returns (bytes memory output) { // Get the function selector. bytes4 selector = msg.sig; if (selector == UPDATE_SIGNER_SELECTOR) { // abi.encodeWithSignature("updateSigner(address,bool)", signer, // active) // Get the signer, and active status. address signer = abi.decode(msg.data[4:], (address)); bool active = abi.decode(msg.data[36:], (bool)); // Call to update the signer. _updateSigner(signer, active); } else if (selector == GET_ACTIVE_SIGNERS_SELECTOR) { // abi.encodeWithSignature("getActiveSigners()") // Call the internal function to get the active signers. return abi.encode(_getActiveSigners()); } else if (selector == IS_ACTIVE_SIGNER_SELECTOR) { // abi.encodeWithSignature("isActiveSigner(address)", signer) // Get the signer. address signer = abi.decode(msg.data[4:], (address)); // Call the internal function to determine if the signer is active. return abi.encode(_isActiveSigner(signer)); } else { // Revert if the function selector is not supported. assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, UnsupportedFunctionSelector_error_selector) // revert(abi.encodeWithSignature( // "UnsupportedFunctionSelector()" // )) revert(0x1c, UnsupportedFunctionSelector_error_length) } } } /** * @notice Check if a given order including extraData is currently valid. * * @dev This function is called by Seaport whenever any extraData is * provided by the caller. * * @return authorizedOrderMagicValue A magic value indicating if the order * is currently valid. */ function authorizeOrder( ZoneParameters calldata zoneParameters ) external override returns (bytes4 authorizedOrderMagicValue) { if (msg.sender != SEAPORT) { // Revert if the caller is not Seaport. revert CallerNotSeaport(); } // Check Zone Parameters validity. _assertValidZoneParameters(); // Put the extraData and orderHash on the stack for cheaper access. bytes calldata extraData = zoneParameters.extraData; bytes32 orderHash = zoneParameters.orderHash; // Declare a variable to hold the expiration. uint64 expiration; // Declare a variable to hold the substandard version byte. uint256 subStandardVersionByte; // Validate the extraData. assembly { // Get the length of the extraData. let extraDataPtr := add(0x24, calldataload(Zone_extraData_cdPtr)) let extraDataLength := calldataload(extraDataPtr) // Validate the extra data length. if lt(extraDataLength, InvalidExtraDataLength_expected_length_substandard_1) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidExtraDataLength_error_selector) mstore(InvalidExtraDataLength_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidExtraDataLength(bytes32)", orderHash) // ) revert(0x1c, InvalidExtraDataLength_error_length) } // extraData bytes 0-1: SIP-6 version byte (MUST be 0x00) let versionByte := shr(248, calldataload(add(extraDataPtr, 0x20))) // Validate the SIP6 Version byte. if iszero(eq(versionByte, 0x00)) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidSIP6Version_error_selector) mstore(InvalidSIP6Version_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidSIP6Version(bytes32)", orderHash) // ) revert(0x1c, InvalidSIP6Version_error_length) } // extraData bytes 93-94: Substandard #1 // (MUST be 0x00, 0x01, 0x07, 0x08, or 0x09) subStandardVersionByte := shr( 248, calldataload(add(extraDataPtr, ExtraData_substandard_version_byte_offset)) ) // Validate the substandard version byte. if or( gt(subStandardVersionByte, 0x09), and(gt(subStandardVersionByte, 0x01), lt(subStandardVersionByte, 0x07)) ) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidSubstandardVersion_error_selector) mstore(InvalidSubstandardVersion_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidSubstandardVersion(bytes32)", orderHash) // ) revert(0x1c, InvalidSubstandardVersion_error_length) } // extraData bytes 21-29: expiration timestamp (uint64) expiration := shr(192, calldataload(add(extraDataPtr, ExtraData_expiration_offset))) // Revert if expired. if lt(expiration, timestamp()) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, SignatureExpired_error_selector) mstore(SignatureExpired_error_expiration_ptr, expiration) mstore(SignatureExpired_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "SignatureExpired(uint256,bytes32)", expiration, orderHash) // ) revert(0x1c, SignatureExpired_error_length) } // Get the length of the consideration array. let considerationLength := calldataload( add(0x24, calldataload(Zone_consideration_head_cdPtr)) ) // Revert if the order does not have any consideration items due to // the Substandard #1 requirement. if iszero(considerationLength) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidSubstandardSupport_error_selector) mstore(InvalidSubstandardSupport_error_reason_offset_ptr, 0x60) mstore(InvalidSubstandardSupport_error_substandard_version_ptr, 1) mstore(InvalidSubstandardSupport_error_orderHash_ptr, orderHash) mstore(InvalidSubstandardSupport_error_reason_length_ptr, 0x2a) mstore(InvalidSubstandardSupport_error_reason_ptr, "Consideration must have at least") mstore(InvalidSubstandardSupport_error_reason_2_ptr, " one item.") // revert(abi.encodeWithSignature( // "InvalidSubstandardSupport(string,uint256,bytes32)", // reason, // substandardVersion, // orderHash // )) revert(0x1c, InvalidSubstandardSupport_error_length) } } // Check the validity of the Substandard #1 extraData and get the // expected fulfiller address. address expectedFulfiller = (_assertValidSubstandardAndGetExpectedFulfiller(orderHash)); // extraData bytes 29-93: signature // (strictly requires 64 byte compact sig, EIP-2098) bytes calldata signature = extraData[29:93]; // extraData bytes 93-126: context (fixed length, 32 bytes + 1 byte) bytes calldata context; if (subStandardVersionByte < 2) { context = extraData[93:126]; } else if (subStandardVersionByte == 7) { if (extraData.length < 166) { assembly { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidExtraDataLength_error_selector) mstore(InvalidExtraDataLength_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidExtraDataLength(bytes32)", orderHash) // ) revert(0x1c, InvalidExtraDataLength_error_length) } } context = extraData[93:166]; } else { if (extraData.length < 146) { assembly { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidExtraDataLength_error_selector) mstore(InvalidExtraDataLength_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidExtraDataLength(bytes32)", orderHash) // ) revert(0x1c, InvalidExtraDataLength_error_length) } } context = extraData[93:146]; } // Derive the signedOrder hash. bytes32 signedOrderHash = _deriveSignedOrderHash( expectedFulfiller, expiration, orderHash, context ); // Derive the EIP-712 digest using the domain separator and signedOrder // hash. bytes32 digest = _deriveEIP712Digest(_domainSeparator(), signedOrderHash); // Recover the signer address from the digest and signature. address recoveredSigner = _recoverSigner(digest, signature); // Revert if the signer is not active. if (!_signers[recoveredSigner]) { revert SignerNotActive(recoveredSigner, orderHash); } // Set the transfer status of the tokens to true. _setTransferStatus(zoneParameters, true); // Return the selector of authorizeOrder as the magic value. authorizedOrderMagicValue = ZoneInterfaceV16.authorizeOrder.selector; } /** * @notice Check if a given order including extraData is currently valid. * * @dev This function is called by Seaport whenever any extraData is * provided by the caller. * * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ function validateOrder( ZoneParameters calldata zoneParameters ) external override returns (bytes4 validOrderMagicValue) { if (msg.sender != SEAPORT) { // Revert if the caller is not Seaport. revert CallerNotSeaport(); } // Set the transfer status of the tokens to false. _setTransferStatus(zoneParameters, false); // Return the selector of validateOrder as the magic value. validOrderMagicValue = ZoneInterfaceV16.validateOrder.selector; } /** * @dev Returns Seaport metadata for this contract, returning the * contract name and supported schemas. * * @return name The contract name * @return schemas The supported SIPs */ function getSeaportMetadata() external view override(SIP5Interface, ZoneInterfaceV16) returns (string memory name, Schema[] memory schemas) { // Return the supported SIPs. schemas = new Schema[](1); schemas[0].id = 7; // Get the SIP-7 information. ( bytes32 domainSeparator, string memory zoneName, string memory apiEndpoint, uint256[] memory substandards, string memory documentationURI ) = _sip7Information(); // Return the zone name. name = zoneName; // Encode the SIP-7 information. schemas[0].metadata = abi.encode(domainSeparator, apiEndpoint, substandards, documentationURI); } /** * @dev Sets the transfer status of the token based on the consideration * items or offer items. * * @param zoneParameters The zone parameters. * @param active The transfer status of the token. */ function _setTransferStatus(ZoneParameters calldata zoneParameters, bool active) internal { uint8 subStandardVersionByte = uint8(bytes1(zoneParameters.extraData[93])); if (subStandardVersionByte < 2) { return; } address registry = address(bytes20(zoneParameters.extraData[126:146])); address token; uint256 identifier; uint256 amount; if (uint256(zoneParameters.consideration[0].itemType) > 1) { // Call on first consideration token = zoneParameters.consideration[0].token; identifier = zoneParameters.consideration[0].identifier; amount = zoneParameters.consideration[0].amount; } else { // Call on first offer token = zoneParameters.offer[0].token; identifier = zoneParameters.offer[0].identifier; amount = zoneParameters.offer[0].amount; } if (subStandardVersionByte == 7) { address operator = address(bytes20(zoneParameters.extraData[146:166])); if (active) { IAuthorizedTransferSecurityRegistry(registry).beforeAuthorizedTransfer(operator, token); } else { IAuthorizedTransferSecurityRegistry(registry).afterAuthorizedTransfer(token); } } else if (subStandardVersionByte == 8) { if (active) { IAuthorizedTransferSecurityRegistry(registry).beforeAuthorizedTransfer(token, identifier); } else { IAuthorizedTransferSecurityRegistry(registry).afterAuthorizedTransfer(token, identifier); } } /* subStandardVersionByte == 9 */ else { if (active) { IAuthorizedTransferSecurityRegistry(registry).beforeAuthorizedTransferWithAmount( token, identifier, amount ); } else { IAuthorizedTransferSecurityRegistry(registry).afterAuthorizedTransferWithAmount( token, identifier ); } } } /** * @notice Add or remove a signer to the zone. * Only the controller can call this function. * * @param signer The signer address to add or remove. */ function _updateSigner(address signer, bool active) internal { // Only the controller can call this function. _assertCallerIsController(); // Add or remove the signer. active ? _addSigner(signer) : _removeSigner(signer); } /** * @notice Add a new signer to the zone. * Only the controller or an active signer can call this function. * * @param signer The new signer address to add. */ function _addSigner(address signer) internal { // Set the signer's active status to true. _signers[signer] = true; // Emit an event that the signer was added. emit SignerAdded(signer); } /** * @notice Remove an active signer from the zone. * Only the controller or an active signer can call this function. * * @param signer The signer address to remove. */ function _removeSigner(address signer) internal { // Set the signer's active status to false. _signers[signer] = false; // Emit an event that the signer was removed. emit SignerRemoved(signer); } /** * @notice Returns the active signers for the zone. Note that the array of * active signers could grow to a size that this function could not * return, the array of active signers is expected to be small, * and is managed by the controller. * * @return signers The active signers. */ function _getActiveSigners() internal view returns (address[] memory signers) { // Return the active signers for the zone by calling the controller. signers = SignedZoneControllerInterface(_controller).getActiveSigners(address(this)); } /** * @notice Returns if the given address is an active signer for the zone. * * @param signer The address to check if it is an active signer. * * @return The address is an active signer, false otherwise. */ function _isActiveSigner(address signer) internal view returns (bool) { // Return the active status of the caller. return _signers[signer]; } /** * @notice Returns whether the interface is supported. * * @param interfaceId The interface id to check against. */ function _supportsInterface(bytes4 interfaceId) internal pure returns (bool) { // Determine if the interface is supported. return (interfaceId == type(SIP5Interface).interfaceId || // SIP-5 interfaceId == type(ZoneInterfaceV16).interfaceId || // ZoneInterface interfaceId == 0x01ffc9a7); // ERC-165 } /** * @notice Internal call to return the signing information, substandards, * and documentation about the zone. * * @return domainSeparator The domain separator used for signing. * @return zoneName The zone name. * @return apiEndpoint The API endpoint for the zone. * @return substandards The substandards supported by the zone. * @return documentationURI The documentation URI for the zone. */ function _sip7Information() internal view returns ( bytes32 domainSeparator, string memory zoneName, string memory apiEndpoint, uint256[] memory substandards, string memory documentationURI ) { // Return the SIP-7 information. domainSeparator = _domainSeparator(); // Get the SIP-7 information from the controller. (, zoneName, apiEndpoint, substandards, documentationURI) = SignedZoneControllerInterface( _controller ).getAdditionalZoneInformation(address(this)); } /** * @dev Derive the signedOrder hash from the orderHash and expiration. * * @param fulfiller The expected fulfiller address. * @param expiration The signature expiration timestamp. * @param orderHash The order hash. * @param context The optional variable-length context. * * @return signedOrderHash The signedOrder hash. * */ function _deriveSignedOrderHash( address fulfiller, uint64 expiration, bytes32 orderHash, bytes calldata context ) internal view returns (bytes32 signedOrderHash) { // Derive the signed order hash. signedOrderHash = keccak256( abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context)) ); } /** * @dev Internal view function to return the signer of a signature. * * @param digest The digest to verify the signature against. * @param signature A signature from the signer indicating that the order * has been approved. * * @return recoveredSigner The recovered signer. */ function _recoverSigner( bytes32 digest, bytes memory signature ) internal view returns (address recoveredSigner) { // Utilize assembly to perform optimized signature verification check. assembly { // Ensure that first word of scratch space is empty. mstore(0, 0) // Declare value for v signature parameter. let v // Get the length of the signature. let signatureLength := mload(signature) // Get the pointer to the value preceding the signature length. // This will be used for temporary memory overrides - either the // signature head for isValidSignature or the digest for ecrecover. let wordBeforeSignaturePtr := sub(signature, OneWord) // Cache the current value behind the signature to restore it later. let cachedWordBeforeSignature := mload(wordBeforeSignaturePtr) // Declare lenDiff + recoveredSigner scope to manage stack pressure. { // Take the difference between the max ECDSA signature length // and the actual signature length. Overflow desired for any // values > 65. If the diff is not 0 or 1, it is not a valid // ECDSA signature - move on to EIP1271 check. let lenDiff := sub(ECDSA_MaxLength, signatureLength) // If diff is 0 or 1, it may be an ECDSA signature. // Try to recover signer. if iszero(gt(lenDiff, 1)) { // Read the signature `s` value. let originalSignatureS := mload(add(signature, ECDSA_signature_s_offset)) // Read the first byte of the word after `s`. If the // signature is 65 bytes, this will be the real `v` value. // If not, it will need to be modified - doing it this way // saves an extra condition. v := byte(0, mload(add(signature, ECDSA_signature_v_offset))) // If lenDiff is 1, parse 64-byte signature as ECDSA. if lenDiff { // Extract yParity from highest bit of vs and add 27 to // get v. v := add(shr(MaxUint8, originalSignatureS), Signature_lower_v) // Extract canonical s from vs, all but the highest bit. // Temporarily overwrite the original `s` value in the // signature. mstore( add(signature, ECDSA_signature_s_offset), and(originalSignatureS, EIP2098_allButHighestBitMask) ) } // Temporarily overwrite the signature length with `v` to // conform to the expected input for ecrecover. mstore(signature, v) // Temporarily overwrite the word before the length with // `digest` to conform to the expected input for ecrecover. mstore(wordBeforeSignaturePtr, digest) // Attempt to recover the signer for the given signature. Do // not check the call status as ecrecover will return a null // address if the signature is invalid. pop( staticcall( gas(), Ecrecover_precompile, // Call ecrecover precompile. wordBeforeSignaturePtr, // Use data memory location. Ecrecover_args_size, // Size of digest, v, r, and s. 0, // Write result to scratch space. OneWord // Provide size of returned result. ) ) // Restore cached word before signature. mstore(wordBeforeSignaturePtr, cachedWordBeforeSignature) // Restore cached signature length. mstore(signature, signatureLength) // Restore cached signature `s` value. mstore(add(signature, ECDSA_signature_s_offset), originalSignatureS) // Read the recovered signer from the buffer given as return // space for ecrecover. recoveredSigner := mload(0) } } // Restore the cached values overwritten by selector, digest and // signature head. mstore(wordBeforeSignaturePtr, cachedWordBeforeSignature) } } /** * @dev Internal view function to get the EIP-712 domain separator. If the * chainId matches the chainId set on deployment, the cached domain * separator will be returned; otherwise, it will be derived from * scratch. * * @return The domain separator. */ function _domainSeparator() internal view returns (bytes32) { // prettier-ignore return block.chainid == _CHAIN_ID ? _DOMAIN_SEPARATOR : _deriveDomainSeparator(); } /** * @dev Internal view function to derive the EIP-712 domain separator. * * @return domainSeparator The derived domain separator. */ function _deriveDomainSeparator() internal view returns (bytes32 domainSeparator) { bytes32 typehash = _EIP_712_DOMAIN_TYPEHASH; bytes32 nameHash = _NAME_HASH; bytes32 versionHash = _VERSION_HASH; // Leverage scratch space and other memory to perform an efficient hash. assembly { // Retrieve the free memory pointer; it will be replaced afterwards. let freeMemoryPointer := mload(FreeMemoryPointerSlot) // Retrieve value at 0x80; it will also be replaced afterwards. let slot0x80 := mload(Slot0x80) // Place typehash, name hash, and version hash at start of memory. mstore(0, typehash) mstore(OneWord, nameHash) mstore(TwoWords, versionHash) // Place chainId in the next memory location. mstore(ThreeWords, chainid()) // Place the address of this contract in the next memory location. mstore(FourWords, address()) // Hash relevant region of memory to derive the domain separator. domainSeparator := keccak256(0, FiveWords) // Restore the free memory pointer. mstore(FreeMemoryPointerSlot, freeMemoryPointer) // Restore the zero slot to zero. mstore(ZeroSlot, 0) // Restore the value at 0x80. mstore(Slot0x80, slot0x80) } } /** * @dev Internal pure function to efficiently derive an digest to sign for * an order in accordance with EIP-712. * * @param domainSeparator The domain separator. * @param signedOrderHash The signedOrder hash. * * @return digest The digest hash. */ function _deriveEIP712Digest( bytes32 domainSeparator, bytes32 signedOrderHash ) internal pure returns (bytes32 digest) { // Leverage scratch space to perform an efficient hash. assembly { // Place the EIP-712 prefix at the start of scratch space. mstore(0, EIP_712_PREFIX) // Place the domain separator in the next region of scratch space. mstore(EIP712_DomainSeparator_offset, domainSeparator) // Place the signed order hash in scratch space, spilling into the // first two bytes of the free memory pointer — this should never be // set as memory cannot be expanded to that size, and will be // zeroed out after the hash is performed. mstore(EIP712_SignedOrderHash_offset, signedOrderHash) // Hash the relevant region digest := keccak256(0, EIP712_DigestPayload_size) // Clear out the dirtied bits in the memory pointer. mstore(EIP712_SignedOrderHash_offset, 0) } } /** * @dev Internal view function to revert if the caller is not the * controller. */ function _assertCallerIsController() internal view { // Get the controller address to use in the assembly block. address controller = _controller; assembly { // Revert if the caller is not the controller. if iszero(eq(caller(), controller)) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidController_error_selector) // revert(abi.encodeWithSignature( // "InvalidController()") // ) revert(0x1c, InvalidController_error_length) } } } /** * @dev Internal pure function to validate calldata offsets for the * dyanamic type in ZoneParameters. This ensures that functions using * the calldata object normally will be using the same data as the * assembly functions and that values that are bound to a given range * are within that range. */ function _assertValidZoneParameters() internal pure { // Utilize assembly in order to read offset data directly from calldata. assembly { /* * Checks: * 1. Zone parameters struct offset == 0x20 */ // Zone parameters at calldata 0x04 must have offset of 0x20. if iszero(eq(calldataload(Zone_parameters_cdPtr), Zone_parameters_ptr)) { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidZoneParameterEncoding_error_selector) // revert(abi.encodeWithSignature( // "InvalidZoneParameterEncoding()" // )) revert(0x1c, InvalidZoneParameterEncoding_error_length) } } } /** * @dev Internal pure function to ensure that the context argument for the * supplied extra data follows the substandard #1 format. Returns the * expected fulfiller of the order for deriving the signed order hash. * * @param orderHash The order hash. * * @return expectedFulfiller The expected fulfiller of the order. */ function _assertValidSubstandardAndGetExpectedFulfiller( bytes32 orderHash ) internal pure returns (address expectedFulfiller) { // Revert if the expected fulfiller is not the zero address and does // not match the actual fulfiller or if the expected received // identifier does not match the actual received identifier. assembly { // Get the actual fulfiller. let actualFulfiller := calldataload(Zone_parameters_fulfiller_cdPtr) let extraDataPtr := calldataload(Zone_extraData_cdPtr) let considerationPtr := calldataload(Zone_consideration_head_cdPtr) // Get the expected fulfiller. expectedFulfiller := shr(96, calldataload(add(expectedFulfiller_offset, extraDataPtr))) // Get the actual received identifier. let actualReceivedIdentifier := calldataload( add(actualReceivedIdentifier_offset, considerationPtr) ) // Get the expected received identifier. let expectedReceivedIdentifier := calldataload( add(expectedReceivedIdentifier_offset, extraDataPtr) ) // Revert if expected fulfiller is not the zero address and does // not match the actual fulfiller. if and(iszero(iszero(expectedFulfiller)), iszero(eq(expectedFulfiller, actualFulfiller))) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidFulfiller_error_selector) mstore(InvalidFulfiller_error_expectedFulfiller_ptr, expectedFulfiller) mstore(InvalidFulfiller_error_actualFulfiller_ptr, actualFulfiller) mstore(InvalidFulfiller_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidFulfiller(address,address,bytes32)", // expectedFulfiller, // actualFulfiller, // orderHash // )) revert(0x1c, InvalidFulfiller_error_length) } // Revert if expected received item does not match the actual // received item. if iszero(eq(expectedReceivedIdentifier, actualReceivedIdentifier)) { // Store left-padded selector with push4, mem[28:32] = selector mstore(0, InvalidReceivedItem_error_selector) mstore(InvalidReceivedItem_error_expectedReceivedItem_ptr, expectedReceivedIdentifier) mstore(InvalidReceivedItem_error_actualReceivedItem_ptr, actualReceivedIdentifier) mstore(InvalidReceivedItem_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidReceivedItem(uint256,uint256,bytes32)", // expectedReceivedIdentifier, // actualReceievedIdentifier, // orderHash // )) revert(0x1c, InvalidReceivedItem_error_length) } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { OrderType, BasicOrderType, ItemType, Side } from "./ConsiderationEnums.sol"; /** * @dev An order contains eleven components: an offerer, a zone (or account that * can cancel the order or restrict who can fulfill the order depending on * the type), the order type (specifying partial fill support as well as * restricted order status), the start and end time, a hash that will be * provided to the zone when validating restricted orders, a salt, a key * corresponding to a given conduit, a counter, and an arbitrary number of * offer items that can be spent along with consideration items that must * be received by their respective recipient. */ struct OrderComponents { address offerer; address zone; OfferItem[] offer; ConsiderationItem[] consideration; OrderType orderType; uint256 startTime; uint256 endTime; bytes32 zoneHash; uint256 salt; bytes32 conduitKey; uint256 counter; } /** * @dev An offer item has five components: an item type (ETH or other native * tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and * ERC1155), a token address, a dual-purpose "identifierOrCriteria" * component that will either represent a tokenId or a merkle root * depending on the item type, and a start and end amount that support * increasing or decreasing amounts over the duration of the respective * order. */ struct OfferItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; } /** * @dev A consideration item has the same five components as an offer item and * an additional sixth component designating the required recipient of the * item. */ struct ConsiderationItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; address payable recipient; } /** * @dev A spent item is translated from a utilized offer item and has four * components: an item type (ETH or other native tokens, ERC20, ERC721, and * ERC1155), a token address, a tokenId, and an amount. */ struct SpentItem { ItemType itemType; address token; uint256 identifier; uint256 amount; } /** * @dev A received item is translated from a utilized consideration item and has * the same four components as a spent item, as well as an additional fifth * component designating the required recipient of the item. */ struct ReceivedItem { ItemType itemType; address token; uint256 identifier; uint256 amount; address payable recipient; } /** * @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155 * matching, a group of six functions may be called that only requires a * subset of the usual order arguments. Note the use of a "basicOrderType" * enum; this represents both the usual order type as well as the "route" * of the basic order (a simple derivation function for the basic order * type is `basicOrderType = orderType + (4 * basicOrderRoute)`.) */ struct BasicOrderParameters { // calldata offset address considerationToken; // 0x24 uint256 considerationIdentifier; // 0x44 uint256 considerationAmount; // 0x64 address payable offerer; // 0x84 address zone; // 0xa4 address offerToken; // 0xc4 uint256 offerIdentifier; // 0xe4 uint256 offerAmount; // 0x104 BasicOrderType basicOrderType; // 0x124 uint256 startTime; // 0x144 uint256 endTime; // 0x164 bytes32 zoneHash; // 0x184 uint256 salt; // 0x1a4 bytes32 offererConduitKey; // 0x1c4 bytes32 fulfillerConduitKey; // 0x1e4 uint256 totalOriginalAdditionalRecipients; // 0x204 AdditionalRecipient[] additionalRecipients; // 0x224 bytes signature; // 0x244 // Total length, excluding dynamic array data: 0x264 (580) } /** * @dev Basic orders can supply any number of additional recipients, with the * implied assumption that they are supplied from the offered ETH (or other * native token) or ERC20 token for the order. */ struct AdditionalRecipient { uint256 amount; address payable recipient; } /** * @dev The full set of order components, with the exception of the counter, * must be supplied when fulfilling more sophisticated orders or groups of * orders. The total number of original consideration items must also be * supplied, as the caller may specify additional consideration items. */ struct OrderParameters { address offerer; // 0x00 address zone; // 0x20 OfferItem[] offer; // 0x40 ConsiderationItem[] consideration; // 0x60 OrderType orderType; // 0x80 uint256 startTime; // 0xa0 uint256 endTime; // 0xc0 bytes32 zoneHash; // 0xe0 uint256 salt; // 0x100 bytes32 conduitKey; // 0x120 uint256 totalOriginalConsiderationItems; // 0x140 // offer.length // 0x160 } /** * @dev Orders require a signature in addition to the other order parameters. */ struct Order { OrderParameters parameters; bytes signature; } /** * @dev Advanced orders include a numerator (i.e. a fraction to attempt to fill) * and a denominator (the total size of the order) in addition to the * signature and other order parameters. It also supports an optional field * for supplying extra data; this data will be provided to the zone if the * order type is restricted and the zone is not the caller, or will be * provided to the offerer as context for contract order types. */ struct AdvancedOrder { OrderParameters parameters; uint120 numerator; uint120 denominator; bytes signature; bytes extraData; } /** * @dev Orders can be validated (either explicitly via `validate`, or as a * consequence of a full or partial fill), specifically cancelled (they can * also be cancelled in bulk via incrementing a per-zone counter), and * partially or fully filled (with the fraction filled represented by a * numerator and denominator). */ struct OrderStatus { bool isValidated; bool isCancelled; uint120 numerator; uint120 denominator; } /** * @dev A criteria resolver specifies an order, side (offer vs. consideration), * and item index. It then provides a chosen identifier (i.e. tokenId) * alongside a merkle proof demonstrating the identifier meets the required * criteria. */ struct CriteriaResolver { uint256 orderIndex; Side side; uint256 index; uint256 identifier; bytes32[] criteriaProof; } /** * @dev A fulfillment is applied to a group of orders. It decrements a series of * offer and consideration items, then generates a single execution * element. A given fulfillment can be applied to as many offer and * consideration items as desired, but must contain at least one offer and * at least one consideration that match. The fulfillment must also remain * consistent on all key parameters across all offer items (same offerer, * token, type, tokenId, and conduit preference) as well as across all * consideration items (token, type, tokenId, and recipient). */ struct Fulfillment { FulfillmentComponent[] offerComponents; FulfillmentComponent[] considerationComponents; } /** * @dev Each fulfillment component contains one index referencing a specific * order and another referencing a specific offer or consideration item. */ struct FulfillmentComponent { uint256 orderIndex; uint256 itemIndex; } /** * @dev An execution is triggered once all consideration items have been zeroed * out. It sends the item in question from the offerer to the item's * recipient, optionally sourcing approvals from either this contract * directly or from the offerer's chosen conduit if one is specified. An * execution is not provided as an argument, but rather is derived via * orders, criteria resolvers, and fulfillments (where the total number of * executions will be less than or equal to the total number of indicated * fulfillments) and returned as part of `matchOrders`. */ struct Execution { ReceivedItem item; address offerer; bytes32 conduitKey; } /** * @dev Restricted orders are validated post-execution by calling validateOrder * on the zone. This struct provides context about the order fulfillment * and any supplied extraData, as well as all order hashes fulfilled in a * call to a match or fulfillAvailable method. */ struct ZoneParameters { bytes32 orderHash; address fulfiller; address offerer; SpentItem[] offer; ReceivedItem[] consideration; bytes extraData; bytes32[] orderHashes; uint256 startTime; uint256 endTime; bytes32 zoneHash; } /** * @dev Zones and contract offerers can communicate which schemas they implement * along with any associated metadata related to each schema. */ struct Schema { uint256 id; bytes metadata; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {ZoneParameters, Schema} from "../lib/ConsiderationStructs.sol"; interface ZoneInterfaceV16 { function authorizeOrder( ZoneParameters calldata zoneParameters ) external returns (bytes4 authorizeOrderMagicValue); function validateOrder( ZoneParameters calldata zoneParameters ) external returns (bytes4 validOrderMagicValue); function getSeaportMetadata() external view returns ( string memory name, Schema[] memory schemas // map to Seaport Improvement Proposal IDs ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** * @notice SignedZoneV16RoyaltyEventsAndErrors contains errors and events * related to zone interaction. */ interface SignedZoneV16RoyaltyEventsAndErrors { /** * @dev Emit an event when a new signer is added. */ event SignerAdded(address signer); /** * @dev Emit an event when a signer is removed. */ event SignerRemoved(address signer); /** * @dev Revert with an error when the signature has expired. */ error SignatureExpired(uint256 expiration, bytes32 orderHash); /** * @dev Revert with an error when the caller is not seaport. */ error CallerNotSeaport(); /** * @dev Revert with an error when attempting to update the signers of a * the zone from a caller that is not the zone's controller. */ error InvalidController(); /** * @dev Revert with an error if supplied order extraData is an invalid * length. */ error InvalidExtraDataLength(bytes32 orderHash); /** * @dev Revert with an error if the supplied order extraData does not * support the zone's SIP6 version. */ error InvalidSIP6Version(bytes32 orderHash); /** * @dev Revert with an error if the supplied order extraData does not * support the zone's substandard requirements. */ error InvalidSubstandardSupport(string reason, uint256 substandardVersion, bytes32 orderHash); /** * @dev Revert with an error if the supplied order extraData does not * support the zone's substandard version. */ error InvalidSubstandardVersion(bytes32 orderHash); /** * @dev Revert with an error if the fulfiller does not match. */ error InvalidFulfiller(address expectedFulfiller, address actualFulfiller, bytes32 orderHash); /** * @dev Revert with an error if the received item does not match. */ error InvalidReceivedItem( uint256 expectedReceivedIdentifier, uint256 actualReceievedIdentifier, bytes32 orderHash ); /** * @dev Revert with an error if the zone parameter encoding is invalid. */ error InvalidZoneParameterEncoding(); /** * @dev Revert with an error when an order is signed with a signer * that is not active. */ error SignerNotActive(address signer, bytes32 orderHash); /** * @dev Revert when an unsupported function selector is found. */ error UnsupportedFunctionSelector(); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { Schema } from "../../lib/ConsiderationStructs.sol"; /** * @dev SIP-5: Contract Metadata Interface for Seaport Contracts * https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-5.md */ interface SIP5Interface { /** * @dev An event that is emitted when a SIP-5 compatible contract is deployed. */ event SeaportCompatibleContractDeployed(); /** * @dev Returns Seaport metadata for this contract, returning the * contract name and supported schemas. * * @return name The contract name * @return schemas The supported SIPs */ function getSeaportMetadata() external view returns (string memory name, Schema[] memory schemas); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** * @title SignedZoneControllerInterface * @author BCLeFevre * @notice SignedZoneControllerInterface enables the deploying of SignedZones. * SignedZones are an implementation of SIP-7 that requires orders * to be signed by an approved signer. * https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-7.md * */ interface SignedZoneControllerInterface { /** * @notice Deploy a SignedZone to a precomputed address. * * @param zoneName The name for the zone returned in * getSeaportMetadata(). * @param apiEndpoint The API endpoint where orders for this zone can be * signed. * @param documentationURI The URI to the documentation describing the * behavior of the contract. * Request and response payloads are defined in SIP-7. * @param salt The salt to be used to derive the zone address * @param initialOwner The initial owner to set for the new zone. * * @return derivedAddress The derived address for the zone. */ function createZone( string memory zoneName, string memory apiEndpoint, string memory documentationURI, address initialOwner, bytes32 salt ) external returns (address derivedAddress); /** * @notice Returns the active signers for the zone. * * @param signedZone The signed zone to get the active signers for. * * @return signers The active signers. */ function getActiveSigners(address signedZone) external view returns (address[] memory signers); /** * @notice Returns additional information about the zone. * * @param zone The zone to get the additional information for. * * @return domainSeparator The domain separator used for signing. * @return zoneName The name of the zone. * @return apiEndpoint The API endpoint for the zone. * @return substandards The substandards supported by the zone. * @return documentationURI The documentation URI for the zone. */ function getAdditionalZoneInformation(address zone) external view returns ( bytes32 domainSeparator, string memory zoneName, string memory apiEndpoint, uint256[] memory substandards, string memory documentationURI ); /** * @notice Update the API endpoint returned by the supplied zone. * Only the owner or an active signer can call this function. * * @param signedZone The signed zone to update the API endpoint for. * @param newApiEndpoint The new API endpoint. */ function updateAPIEndpoint( address signedZone, string calldata newApiEndpoint ) external; /** * @notice Update the signer for a given signed zone. * * @param signedZone The signed zone to update the signer for. * @param signer The signer to update. * @param active If the signer should be active or not. */ function updateSigner( address signedZone, address signer, bool active ) external; /** * @notice Initiate zone ownership transfer by assigning a new potential * owner for the given zone. Once set, the new potential owner * may call `acceptOwnership` to claim ownership of the zone. * Only the owner of the zone in question may call this function. * * @param zone The zone for which to initiate ownership transfer. * @param newPotentialOwner The new potential owner of the zone. */ function transferOwnership(address zone, address newPotentialOwner) external; /** * @notice Clear the currently set potential owner, if any, from a zone. * Only the owner of the zone in question may call this function. * * @param zone The zone for which to cancel ownership transfer. */ function cancelOwnershipTransfer(address zone) external; /** * @notice Accept ownership of a supplied zone. Only accounts that the * current owner has set as the new potential owner may call this * function. * * @param zone The zone for which to accept ownership. */ function acceptOwnership(address zone) external; /** * @notice Retrieve the current owner of a deployed zone. * * @param zone The zone for which to retrieve the associated owner. * * @return owner The owner of the supplied zone. */ function ownerOf(address zone) external view returns (address owner); /** * @notice Retrieve the potential owner, if any, for a given zone. The * current owner may set a new potential owner via * `transferOwnership` and that owner may then accept ownership of * the zone in question via `acceptOwnership`. * * @param zone The zone for which to retrieve the potential owner. * * @return potentialOwner The potential owner, if any, for the zone. */ function getPotentialOwner(address zone) external view returns (address potentialOwner); /** * @notice Derive the zone address associated with a salt. * * @param salt The salt to be used to derive the zone address * * @return derivedAddress The derived address of the signed zone. */ function getZone(bytes32 salt) external view returns (address derivedAddress); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; enum ListTypes { AuthorizerList, OperatorList } /// @title IAuthorizedTransferSecurityRegistry /// @dev Interface for the Authorized Transfer Security Registry, a simplified version of the Transfer /// Security Registry that only supports authorizers and whitelisted operators, and assumes a /// security level of OperatorWhitelistEnableOTC + authorizers for all collections that use it. /// Note that a number of view functions on collections that add this validator will not work. interface IAuthorizedTransferSecurityRegistry { event CreatedList(uint256 indexed id, string name); event AppliedListToCollection(address indexed collection, uint120 indexed id); event ReassignedListOwnership(uint256 indexed id, address indexed newOwner); event AddedAccountToList(ListTypes indexed kind, uint256 indexed id, address indexed account); event RemovedAccountFromList(ListTypes indexed kind, uint256 indexed id, address indexed account); error AuthorizedTransferSecurityRegistry__ListDoesNotExist(); error AuthorizedTransferSecurityRegistry__CallerDoesNotOwnList(); error AuthorizedTransferSecurityRegistry__ArrayLengthCannotBeZero(); error AuthorizedTransferSecurityRegistry__CallerMustHaveElevatedPermissionsForSpecifiedNFT(); error AuthorizedTransferSecurityRegistry__ListOwnershipCannotBeTransferredToZeroAddress(); error AuthorizedTransferSecurityRegistry__ZeroAddressNotAllowed(); error AuthorizedTransferSecurityRegistry__UnauthorizedTransfer(); error AuthorizedTransferSecurityRegistry__CallerIsNotValidAuthorizer(); /// Manage lists of authorizers & operators that can be applied to collections function createList(string calldata name) external returns (uint120); function createListCopy(string calldata name, uint120 sourceListId) external returns (uint120); function reassignOwnershipOfList(uint120 id, address newOwner) external; function renounceOwnershipOfList(uint120 id) external; function applyListToCollection(address collection, uint120 id) external; function listOwners(uint120 id) external view returns (address); /// Manage and query for authorizers on lists function addAuthorizers(uint120 id, address[] calldata accounts) external; function removeAuthorizers(uint120 id, address[] calldata accounts) external; function getAuthorizers(uint120 id) external view returns (address[] memory); function isAuthorizer(uint120 id, address account) external view returns (bool); function getAuthorizersByCollection(address collection) external view returns (address[] memory); function isAuthorizerByCollection( address collection, address account ) external view returns (bool); /// Manage and query for operators on lists function addOperators(uint120 id, address[] calldata accounts) external; function removeOperators(uint120 id, address[] calldata accounts) external; function getOperators(uint120 id) external view returns (address[] memory); function isOperator(uint120 id, address account) external view returns (bool); function getOperatorsByCollection(address collection) external view returns (address[] memory); function isOperatorByCollection(address collection, address account) external view returns (bool); /// Ensure that a specific operator has been authorized to transfer tokens function validateTransfer(address caller, address from, address to) external view; /// Ensure that a transfer has been authorized for a specific tokenId function validateTransfer( address caller, address from, address to, uint256 tokenId ) external view; /// Ensure that a transfer has been authorized for a specific amount of a specific tokenId, and /// reduce the transferable amount remaining function validateTransfer( address caller, address from, address to, uint256 tokenId, uint256 amount ) external; /// Legacy alias for validateTransfer (address caller, address from, address to) function applyCollectionTransferPolicy(address caller, address from, address to) external view; /// Temporarily assign a specific allowed operator for a given collection function beforeAuthorizedTransfer(address operator, address token) external; /// Clear assignment of a specific allowed operator for a given collection function afterAuthorizedTransfer(address token) external; /// Temporarily allow a specific tokenId from a given collection to be transferred function beforeAuthorizedTransfer(address token, uint256 tokenId) external; /// Clear assignment of an specific tokenId's transfer allowance function afterAuthorizedTransfer(address token, uint256 tokenId) external; /// Temporarily allow a specific amount of a specific tokenId from a given collection to be transferred function beforeAuthorizedTransferWithAmount( address token, uint256 tokenId, uint256 amount ) external; /// Clear assignment of a tokenId's transfer allowance for a specific amount function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /// @dev ECDSA signature offsets. uint256 constant ECDSA_MaxLength = 65; uint256 constant ECDSA_signature_s_offset = 0x40; uint256 constant ECDSA_signature_v_offset = 0x60; /// @dev Helpers for memory offsets. uint256 constant OneWord = 0x20; uint256 constant TwoWords = 0x40; uint256 constant ThreeWords = 0x60; uint256 constant FourWords = 0x80; uint256 constant FiveWords = 0xa0; uint256 constant Signature_lower_v = 27; uint256 constant MaxUint8 = 0xff; bytes32 constant EIP2098_allButHighestBitMask = ( 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ); uint256 constant Ecrecover_precompile = 1; uint256 constant Ecrecover_args_size = 0x80; uint256 constant FreeMemoryPointerSlot = 0x40; uint256 constant ZeroSlot = 0x60; uint256 constant Slot0x80 = 0x80; /// @dev The EIP-712 digest offsets. uint256 constant EIP712_DomainSeparator_offset = 0x02; uint256 constant EIP712_SignedOrderHash_offset = 0x22; uint256 constant EIP712_DigestPayload_size = 0x42; uint256 constant EIP_712_PREFIX = ( 0x1901000000000000000000000000000000000000000000000000000000000000 ); // @dev Function selectors used in the fallback function.. bytes4 constant UPDATE_SIGNER_SELECTOR = 0xf460590b; bytes4 constant GET_ACTIVE_SIGNERS_SELECTOR = 0xa784b80c; bytes4 constant IS_ACTIVE_SIGNER_SELECTOR = 0x7dff5a79; bytes4 constant SUPPORTS_INTERFACE_SELECTOR = 0x01ffc9a7; /* * error InvalidController() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidController_error_selector = 0x6d5769be; uint256 constant InvalidController_error_length = 0x04; /* * error InvalidFulfiller(address expectedFulfiller, address actualFulfiller, bytes32 orderHash) * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: expectedFulfiller * - 0x40: actualFullfiller * - 0x60: orderHash * Revert buffer is memory[0x1c:0x80] */ uint256 constant InvalidFulfiller_error_selector = 0x1bcf9bb7; uint256 constant InvalidFulfiller_error_expectedFulfiller_ptr = 0x20; uint256 constant InvalidFulfiller_error_actualFulfiller_ptr = 0x40; uint256 constant InvalidFulfiller_error_orderHash_ptr = 0x60; uint256 constant InvalidFulfiller_error_length = 0x64; /* * error InvalidReceivedItem(uint256 expectedReceivedIdentifier, uint256 actualReceievedIdentifier, bytes32 orderHash) * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: expectedReceivedIdentifier * - 0x40: actualReceievedIdentifier * - 0x60: orderHash * Revert buffer is memory[0x1c:0x80] */ uint256 constant InvalidReceivedItem_error_selector = 0xb36c03e8; uint256 constant InvalidReceivedItem_error_expectedReceivedItem_ptr = 0x20; uint256 constant InvalidReceivedItem_error_actualReceivedItem_ptr = 0x40; uint256 constant InvalidReceivedItem_error_orderHash_ptr = 0x60; uint256 constant InvalidReceivedItem_error_length = 0x64; /* * error InvalidZoneParameterEncoding() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidZoneParameterEncoding_error_selector = 0x46d5d895; uint256 constant InvalidZoneParameterEncoding_error_length = 0x04; /* * error InvalidExtraDataLength() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidExtraDataLength_error_selector = 0xd232fd2c; uint256 constant InvalidExtraDataLength_error_orderHash_ptr = 0x20; uint256 constant InvalidExtraDataLength_error_length = 0x24; uint256 constant InvalidExtraDataLength_expected_length_substandard_1 = 0x7e; // 126 uint256 constant InvalidExtraDataLength_expected_length_substandard_7 = 0xa6; // 166 uint256 constant InvalidExtraDataLength_expected_length_substandard_8_or_9 = 0x92; // 146 uint256 constant ExtraData_expiration_offset = 0x35; uint256 constant ExtraData_substandard_version_byte_offset = 0x7d; /* * error InvalidSIP6Version() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidSIP6Version_error_selector = 0x64115774; uint256 constant InvalidSIP6Version_error_orderHash_ptr = 0x20; uint256 constant InvalidSIP6Version_error_length = 0x24; /* * error InvalidSubstandardVersion() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidSubstandardVersion_error_selector = 0x26787999; uint256 constant InvalidSubstandardVersion_error_orderHash_ptr = 0x20; uint256 constant InvalidSubstandardVersion_error_length = 0x24; /* * error InvalidSubstandardSupport() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: reason * - 0x40: substandardVersion * - 0x60: orderHash * Revert buffer is memory[0x1c:0xe0] */ uint256 constant InvalidSubstandardSupport_error_selector = 0x2be76224; uint256 constant InvalidSubstandardSupport_error_reason_offset_ptr = 0x20; uint256 constant InvalidSubstandardSupport_error_substandard_version_ptr = 0x40; uint256 constant InvalidSubstandardSupport_error_orderHash_ptr = 0x60; uint256 constant InvalidSubstandardSupport_error_reason_length_ptr = 0x80; uint256 constant InvalidSubstandardSupport_error_reason_ptr = 0xa0; uint256 constant InvalidSubstandardSupport_error_reason_2_ptr = 0xc0; uint256 constant InvalidSubstandardSupport_error_length = 0xc4; /* * error SignatureExpired() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: expiration * - 0x40: orderHash * Revert buffer is memory[0x1c:0x60] */ uint256 constant SignatureExpired_error_selector = 0x16546071; uint256 constant SignatureExpired_error_expiration_ptr = 0x20; uint256 constant SignatureExpired_error_orderHash_ptr = 0x40; uint256 constant SignatureExpired_error_length = 0x44; /* * error UnsupportedFunctionSelector() * - Defined in SignedZoneEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant UnsupportedFunctionSelector_error_selector = 0x54c91b87; uint256 constant UnsupportedFunctionSelector_error_length = 0x04; // Zone parameter calldata pointers uint256 constant Zone_parameters_cdPtr = 0x04; uint256 constant Zone_parameters_fulfiller_cdPtr = 0x44; uint256 constant Zone_consideration_head_cdPtr = 0xa4; uint256 constant Zone_extraData_cdPtr = 0xc4; // Zone parameter memory pointers uint256 constant Zone_parameters_ptr = 0x20; // Zone parameter offsets uint256 constant Zone_parameters_offset = 0x24; uint256 constant expectedFulfiller_offset = 0x45; uint256 constant actualReceivedIdentifier_offset = 0x84; uint256 constant expectedReceivedIdentifier_offset = 0xa2; // Spent Item Size uint256 constant SpentItem_size = 0x80; // Received Item Size uint256 constant ReceivedItem_size = 0xa0;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; // prettier-ignore enum OrderType { // 0: no partial fills, anyone can execute FULL_OPEN, // 1: partial fills supported, anyone can execute PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute PARTIAL_RESTRICTED, // 4: contract order type CONTRACT } // prettier-ignore enum BasicOrderType { // 0: no partial fills, anyone can execute ETH_TO_ERC721_FULL_OPEN, // 1: partial fills supported, anyone can execute ETH_TO_ERC721_PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute ETH_TO_ERC721_FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute ETH_TO_ERC721_PARTIAL_RESTRICTED, // 4: no partial fills, anyone can execute ETH_TO_ERC1155_FULL_OPEN, // 5: partial fills supported, anyone can execute ETH_TO_ERC1155_PARTIAL_OPEN, // 6: no partial fills, only offerer or zone can execute ETH_TO_ERC1155_FULL_RESTRICTED, // 7: partial fills supported, only offerer or zone can execute ETH_TO_ERC1155_PARTIAL_RESTRICTED, // 8: no partial fills, anyone can execute ERC20_TO_ERC721_FULL_OPEN, // 9: partial fills supported, anyone can execute ERC20_TO_ERC721_PARTIAL_OPEN, // 10: no partial fills, only offerer or zone can execute ERC20_TO_ERC721_FULL_RESTRICTED, // 11: partial fills supported, only offerer or zone can execute ERC20_TO_ERC721_PARTIAL_RESTRICTED, // 12: no partial fills, anyone can execute ERC20_TO_ERC1155_FULL_OPEN, // 13: partial fills supported, anyone can execute ERC20_TO_ERC1155_PARTIAL_OPEN, // 14: no partial fills, only offerer or zone can execute ERC20_TO_ERC1155_FULL_RESTRICTED, // 15: partial fills supported, only offerer or zone can execute ERC20_TO_ERC1155_PARTIAL_RESTRICTED, // 16: no partial fills, anyone can execute ERC721_TO_ERC20_FULL_OPEN, // 17: partial fills supported, anyone can execute ERC721_TO_ERC20_PARTIAL_OPEN, // 18: no partial fills, only offerer or zone can execute ERC721_TO_ERC20_FULL_RESTRICTED, // 19: partial fills supported, only offerer or zone can execute ERC721_TO_ERC20_PARTIAL_RESTRICTED, // 20: no partial fills, anyone can execute ERC1155_TO_ERC20_FULL_OPEN, // 21: partial fills supported, anyone can execute ERC1155_TO_ERC20_PARTIAL_OPEN, // 22: no partial fills, only offerer or zone can execute ERC1155_TO_ERC20_FULL_RESTRICTED, // 23: partial fills supported, only offerer or zone can execute ERC1155_TO_ERC20_PARTIAL_RESTRICTED } // prettier-ignore enum BasicOrderRouteType { // 0: provide Ether (or other native token) to receive offered ERC721 item. ETH_TO_ERC721, // 1: provide Ether (or other native token) to receive offered ERC1155 item. ETH_TO_ERC1155, // 2: provide ERC20 item to receive offered ERC721 item. ERC20_TO_ERC721, // 3: provide ERC20 item to receive offered ERC1155 item. ERC20_TO_ERC1155, // 4: provide ERC721 item to receive offered ERC20 item. ERC721_TO_ERC20, // 5: provide ERC1155 item to receive offered ERC20 item. ERC1155_TO_ERC20 } // prettier-ignore enum ItemType { // 0: ETH on mainnet, MATIC on polygon, etc. NATIVE, // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work) ERC20, // 2: ERC721 items ERC721, // 3: ERC1155 items ERC1155, // 4: ERC721 items where a number of tokenIds are supported ERC721_WITH_CRITERIA, // 5: ERC1155 items where a number of ids are supported ERC1155_WITH_CRITERIA } // prettier-ignore enum Side { // 0: Items that can be spent OFFER, // 1: Items that must be received CONSIDERATION }
{ "viaIR": false, "codegen": "yul", "evmVersion": "london", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
[{"inputs":[{"internalType":"string","name":"zoneName","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerNotSeaport","type":"error"},{"inputs":[],"name":"InvalidController","type":"error"},{"inputs":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidExtraDataLength","type":"error"},{"inputs":[{"internalType":"address","name":"expectedFulfiller","type":"address"},{"internalType":"address","name":"actualFulfiller","type":"address"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidFulfiller","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedReceivedIdentifier","type":"uint256"},{"internalType":"uint256","name":"actualReceievedIdentifier","type":"uint256"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidReceivedItem","type":"error"},{"inputs":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidSIP6Version","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"},{"internalType":"uint256","name":"substandardVersion","type":"uint256"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidSubstandardSupport","type":"error"},{"inputs":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"InvalidSubstandardVersion","type":"error"},{"inputs":[],"name":"InvalidZoneParameterEncoding","type":"error"},{"inputs":[{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"SignatureExpired","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes32","name":"orderHash","type":"bytes32"}],"name":"SignerNotActive","type":"error"},{"inputs":[],"name":"UnsupportedFunctionSelector","type":"error"},{"anonymous":false,"inputs":[],"name":"SeaportCompatibleContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerRemoved","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"address","name":"offerer","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SpentItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem[]","name":"consideration","type":"tuple[]"},{"internalType":"bytes","name":"extraData","type":"bytes"},{"internalType":"bytes32[]","name":"orderHashes","type":"bytes32[]"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"}],"internalType":"struct ZoneParameters","name":"zoneParameters","type":"tuple"}],"name":"authorizeOrder","outputs":[{"internalType":"bytes4","name":"authorizedOrderMagicValue","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSeaportMetadata","outputs":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"internalType":"struct Schema[]","name":"schemas","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"address","name":"fulfiller","type":"address"},{"internalType":"address","name":"offerer","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SpentItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem[]","name":"consideration","type":"tuple[]"},{"internalType":"bytes","name":"extraData","type":"bytes"},{"internalType":"bytes32[]","name":"orderHashes","type":"bytes32[]"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"}],"internalType":"struct ZoneParameters","name":"zoneParameters","type":"tuple"}],"name":"validateOrder","outputs":[{"internalType":"bytes4","name":"validOrderMagicValue","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
0eb9251600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000002dec9ee54e1aae3e2014d424b8b3a1672493d7592dec9ee54e1aae3e2014d424b8b3a1672493d7590000000000000000000000000000000000000000000000000000000000000000000000000000000000000012526f79616c7479456e666f7263656d656e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x000400000000000200090000000000020000006004100270000002a00340019700030000003103550002000000010355000002a00040019d0000000100200190000000700000c13d0000008002000039000000400020043f000000040030008c000000aa0000413d000000000201043b000000e002200270000002bb0020009c0000014f0000613d000002bc0020009c000000fa0000613d000002bd0020009c000000aa0000c13d0000000001000416000000000001004b0000020d0000c13d0000000101000039000000800010043f0000010001000039000000400010043f0000006001000039000000e00010043f000000c001000039000000a00010043f0000000701000039000000c00010043f000002be01000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000900000001001d000002b50100004100000000001004430000000001000414000002a00010009c000002a001008041000000c001100210000002b6011001c70000800b020000390a7c0a770000040f0000000100200190000009e70000613d000000000201043b000002be01000041000000000010044300000000010004120000000400100443000000090020006c000003af0000c13d000000c00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d0000000003000410000000400200043d000000000101043b000600000001001d000002c0010000410000000001120436000800000001001d000900000002001d00000004012000390000000000310435000002be0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000201043b0000000001000414000002c102200197000000040020008c000004230000c13d00000003010003670000000103000031000004330000013d0000018004000039000000400040043f0000000002000416000000000002004b0000020d0000c13d0000001f02300039000002a1022001970000018002200039000000400020043f0000001f0530018f000002a2063001980000018002600039000000820000613d000000000701034f000000007807043c0000000004840436000000000024004b0000007e0000c13d000000000005004b0000008f0000613d000000000161034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c0000020d0000413d000001800200043d000002a30020009c0000020d0000213d0000001f01200039000000000031004b0000000004000019000002a404008041000002a401100197000000000001004b0000000005000019000002a405004041000002a40010009c000000000504c019000000000005004b0000020d0000c13d00000180012000390000000001010433000002a30010009c000001f70000a13d000002e601000041000000000010043f0000004101000039000000040010043f000002c20100004100000a7e000104300000000002000416000000000002004b0000020d0000c13d000000000201043b000002f102200197000002f20020009c000001ca0000613d000002f30020009c000001b00000613d000002f40020009c000001f30000c13d000000240230008c0000020d0000413d0000000403100370000000000303043b000900000003001d000002c10030009c0000020d0000213d000000200020008c0000020d0000413d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039000800000002001d000000000012004b0000020d0000c13d000002be0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b0000000002000411000000000012004b000003fd0000c13d0000000901000029000000000010043f000000200000043f000000080000006b000004010000c13d0000000001000414000002a00010009c000002a001008041000000c001100210000002e0011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000000201041a000002fc02200197000000000021041b000000400100043d00000009020000290000000000210435000002a00010009c000002a00100804100000040011002100000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002f8011001c70000800d020000390000000103000039000002fa040000410000041e0000013d000000240030008c0000020d0000413d0000000002000416000000000002004b0000020d0000c13d0000000401100370000000000101043b000900000001001d000002a30010009c0000020d0000213d000000090130006a000002c30010009c0000020d0000213d000001440010008c0000020d0000413d000002be01000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000002c1011001970000000002000411000000000012004b000003a30000c13d00000009010000290000000404100039000000a4081000390000000201000367000000000281034f000000000202043b000000000300003100000000054300490000001f0650008a000002a407600197000002a405200197000000000975013f000000000075004b0000000005000019000002a405004041000000000062004b000000000a000019000002a40a008041000002a40090009c00000000050ac019000000000005004b0000020d0000c13d0000000005420019000000000251034f000000000202043b000002a30020009c0000020d0000213d0000000009230049000000200a50003900000000009a004b000000000b000019000002a40b002041000002a409900197000002a40aa00197000000000c9a013f00000000009a004b0000000009000019000002a409004041000002a400c0009c00000000090bc019000000000009004b0000020d0000c13d0000005e0020008c000005a60000813d000002e601000041000000000010043f0000003201000039000000040010043f000002c20100004100000a7e00010430000000240030008c0000020d0000413d0000000002000416000000000002004b0000020d0000c13d0000000401100370000000000201043b000002a30020009c0000020d0000213d0000000001230049000002c30010009c0000020d0000213d000001440010008c0000020d0000413d000900000002001d000002be01000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000002c1011001970000000002000411000000000012004b000003ab0000c13d00000002010003670000000402100370000000000202043b000000200020008c000003f90000c13d0000000908000029000800a40080003d0000000802100360000000000302043b00000000020000310000000004820049000000230440008a000002a405400197000002a406300197000000000756013f000000000056004b0000000005000019000002a405004041000000000043004b0000000004000019000002a404008041000002a40070009c000000000504c019000000000005004b0000020d0000c13d000600040080003d0000000603300029000700000003001d000000000331034f000000000303043b000900000003001d000002a30030009c0000020d0000213d000000090220006a00000007030000290000002003300039000000000023004b0000000004000019000002a404002041000002a402200197000002a403300197000000000523013f000000000023004b0000000002000019000002a402004041000002a40050009c000000000204c019000000000002004b0000020d0000c13d0000000802000029000000a00220008a000000000321034f000000c402100370000000000202043b0000002402200039000000000421034f000000000503043b000000000304043b0000007d0030008c000006570000213d000002f001000041000006850000013d000002f501000041000000800010043f0000000001000410000000840010043f000002be0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000201043b0000000001000414000002c102200197000000040020008c0000020f0000c13d000000030100036700000001030000310000021a0000013d000000240030008c0000020d0000413d0000000401100370000000000101043b000002c10010009c0000020d0000213d000000000010043f000000200000043f0000000001000414000002a00010009c000002a001008041000000c001100210000002e0011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000000101041a000000ff001001900000000001000039000000010100c039000000400300043d0000002002300039000000000012043500000020010000390000000000130435000002a50030009c000000a40000213d0000004001300039000000400010043f0000002001300039000002a00010009c000002a00100804100000040011002100000000002030433000002a00020009c000002a0020080410000006002200210000000000112019f00000a7d0001042e000002fb01000041000000000010043f000002d20100004100000a7e000104300000001f04100039000002fd044001970000003f04400039000002fd04400197000000400600043d0000000004460019000000000064004b00000000050000390000000105004039000002a30040009c000000a40000213d0000000100500190000000a40000c13d0000018003300039000000400040043f000900000006001d0000000004160436000800000004001d000001a0022000390000000004210019000000000034004b000002870000a13d000000000100001900000a7e00010430000002a00010009c000002a001008041000000c001100210000002f6011001c70a7c0a770000040f0000006003100270000102a00030019d000002a00330019700030000000103550000000100200190000003850000613d000002fd053001980000001f0630018f00000080045000390000008009000039000002240000613d000000000701034f000000007807043c0000000009890436000000000049004b000002200000c13d000000000006004b000002310000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f01300039000002fd01100197000002ae0010009c000000a40000213d0000008001100039000000400010043f000002c30030009c0000020d0000213d000000200030008c0000020d0000413d000000800400043d000002a30040009c0000020d0000213d00000080033000390000009f05400039000000000035004b0000000006000019000002a406008041000002a407300197000002a405500197000000000875013f000000000075004b0000000005000019000002a405004041000002a40080009c000000000506c019000000000005004b0000020d0000c13d00000080054000390000000006050433000002a30060009c000000a40000213d00000005056002100000003f07500039000002c4077001970000000007170019000002a30070009c000000a40000213d000000400070043f0000000000610435000000a0044000390000000005450019000000000035004b0000020d0000213d000000000006004b000002670000613d00000000030100190000000046040434000002c10060009c0000020d0000213d00000020033000390000000000630435000000000054004b000002600000413d000000400300043d0000002004300039000000200500003900000000005404350000000005010433000000400430003900000000005404350000006004300039000000000005004b000002790000613d000000000600001900000020011000390000000007010433000002c10770019700000000047404360000000106600039000000000056004b000002720000413d0000000001340049000000200410008a00000000004304350000001f01100039000002fd021001970000000001320019000000000021004b00000000020000390000000102004039000002a30010009c000000a40000213d0000000100200190000001e80000613d000000a40000013d000000000001004b0000000806000029000002920000613d000000000300001900000000043600190000000005230019000000000505043300000000005404350000002003300039000000000013004b0000028b0000413d000000090110002900000020011000390000000000010435000000400100043d000002a50010009c000000a40000213d0000004002100039000000400020043f00000003020000390000000001210436000002a6020000410000000000210435000002a00010009c000002a00100804100000040011002100000000002000414000002a00020009c000002a002008041000000c002200210000000000121019f000002a7011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000c00010043f000000400100043d0000002002100039000002a80300004100000000003204350000002d03100039000002a90400004100000000004304350000003903100039000002aa0400004100000000004304350000004803100039000002ab0400004100000000004304350000005803100039000002ac0400004100000000004304350000007103100039000002ad04000041000000000043043500000052030000390000000000310435000002ae0010009c000000a40000213d0000008003100039000000400030043f000002a00020009c000002a00200804100000040022002100000000001010433000002a00010009c000002a0010080410000006001100210000000000121019f0000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002af011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000e00010043f000000400100043d0000002002100039000002b00300004100000000003204350000002c03100039000002b10400004100000000004304350000003e03100039000002b20400004100000000004304350000005003100039000002b30400004100000000004304350000006203100039000002b40400004100000000004304350000006f03100039000002ad04000041000000000043043500000050030000390000000000310435000002ae0010009c000000a40000213d0000008003100039000000400030043f000002a00020009c000002a00200804100000040022002100000000001010433000002a00010009c000002a0010080410000006001100210000000000121019f0000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002af011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000001000010043f000002b50100004100000000001004430000000001000414000002a00010009c000002a001008041000000c001100210000002b6011001c70000800b020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000001200010043f000002b701000041000001600010043f0000000001000411000000800010043f0000000801000029000002a00010009c000002a001008041000000400110021000000009020000290000000002020433000002a00020009c000002a0020080410000006002200210000000000112019f0000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002af011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000a00010043f000000800200043d000900000002001d000000400200043d000800000002001d000000c00200043d000000e00300043d000000000030043f000000200010043f000000400020043f000002b50100004100000000001004430000000001000414000002a00010009c000002a001008041000000c001100210000002b6011001c70000800b020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000600010043f0000000001000410000000800010043f0000000001000414000002a00010009c000002a001008041000000c001100210000002b8011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b0000000802000029000000400020043f000000600000043f0000000902000029000000800020043f000001400010043f0000000001000414000002a00010009c000002a001008041000000c001100210000002af011001c70000800d020000390000000103000039000002b9040000410a7c0a720000040f00000001002001900000020d0000613d000000800100043d00000140000004430000016000100443000000a00100043d00000020020000390000018000200443000001a000100443000000c00100043d0000004003000039000001c000300443000001e0001004430000006001000039000000e00300043d000002000010044300000220003004430000008001000039000001000300043d00000240001004430000026000300443000000a001000039000001200300043d0000028000100443000002a000300443000000c001000039000001400300043d000002c000100443000002e000300443000000e001000039000001600300043d00000300001004430000032000300443000001000020044300000008010000390000012000100443000002ba0100004100000a7d0001042e0000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000038c0000c13d000000000005004b0000039d0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000002a00020009c000002a0020080410000004002200210000000000112019f00000a7e00010430000000400100043d000002c5020000410000000000210435000002a00010009c000002a0010080410000004001100210000002c6011001c700000a7e00010430000002c501000041000000800010043f000002d00100004100000a7e00010430000800000002001d000000800100043d000700000001001d000000400100043d000900000001001d000000600100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000010043f000002be01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000200010043f000002be01000041000000000010044300000000010004120000000400100443000000400100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000400010043f0000000801000029000000600010043f0000000001000410000000800010043f0000000001000414000002a00010009c000002a001008041000000c001100210000002b8011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000600000001001d0000000902000029000000400020043f000000600000043f0000000701000029000000800010043f0000000003000410000000540000013d000002d101000041000000000010043f000002d20100004100000a7e00010430000002f701000041000000000010043f000002d20100004100000a7e000104300000000001000414000002a00010009c000002a001008041000000c001100210000002e0011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000000201041a000002fc0220019700000001022001bf000000000021041b000000400100043d00000009020000290000000000210435000002a00010009c000002a00100804100000040011002100000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002f8011001c70000800d020000390000000103000039000002f9040000410a7c0a720000040f00000001002001900000020d0000613d0000006003000039000001e90000013d0000000903000029000002a00030009c000002a0030080410000004003300210000002a00010009c000002a001008041000000c001100210000000000131019f000002c2011001c70a7c0a770000040f0000006003100270000102a00030019d000002a003300197000300000001035500000001002001900000059a0000613d000000090a000029000002fd053001980000001f0630018f00000000045a00190000043e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000048004b0000043a0000c13d000000000006004b0000044b0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f01300039000002fd041001970000000001a40019000000000041004b00000000040000390000000104004039000002a30010009c000000a40000213d0000000100400190000000a40000c13d000000400010043f000002c30030009c0000020d0000213d000000a00030008c0000020d0000413d00000008040000290000000005040433000002a30050009c0000020d0000213d000000090430002900000009035000290000001f05300039000000000045004b0000000006000019000002a406008041000002a407500197000002a405400197000000000857013f000000000057004b0000000007000019000002a407004041000002a40080009c000000000706c019000000000007004b0000020d0000c13d0000000076030434000002a30060009c000000a40000213d0000001f03600039000002fd033001970000003f03300039000002fd033001970000000003130019000002a30030009c000000a40000213d000000400030043f00000000036104360000000008760019000000000048004b0000020d0000213d000000000006004b000004870000613d00000000080000190000000009380019000000000a780019000000000a0a04330000000000a904350000002008800039000000000068004b000004800000413d00000000063600190000000000060435000000090600002900000040066000390000000006060433000002a30060009c0000020d0000213d00000009066000290000001f07600039000000000047004b0000000008000019000002a408008041000002a407700197000000000957013f000000000057004b0000000007000019000002a407004041000002a40090009c000000000708c019000000000007004b0000020d0000c13d0000000098060434000002a30080009c000000a40000213d0000001f06800039000002fd066001970000003f06600039000002fd06600197000000400700043d0000000006670019000000000076004b000000000a000039000000010a004039000002a30060009c000000a40000213d0000000100a00190000000a40000c13d000000400060043f0000000006870436000000000a98001900000000004a004b0000020d0000213d000000000008004b000004bb0000613d000000000a000019000000000b6a0019000000000c9a0019000000000c0c04330000000000cb0435000000200aa0003900000000008a004b000004b40000413d00000000088600190000000000080435000000090800002900000060088000390000000008080433000002a30080009c0000020d0000213d00000009088000290000001f09800039000000000049004b000000000a000019000002a40a008041000002a409900197000000000b59013f000000000059004b0000000009000019000002a409004041000002a400b0009c00000000090ac019000000000009004b0000020d0000c13d000000009a080434000002a300a0009c000000a40000213d000000050ba002100000003f08b00039000002c40c800197000000400800043d000000000cc8001900000000008c004b000000000d000039000000010d004039000002a300c0009c000000a40000213d0000000100d00190000000a40000c13d0000004000c0043f0000000000a80435000000000a9b001900000000004a004b0000020d0000213d0000000000a9004b000004ec0000813d000000000b080019000000200bb00039000000009c0904340000000000cb04350000000000a9004b000004e70000413d000000090900002900000080099000390000000009090433000002a30090009c0000020d0000213d00000009099000290000001f0a90003900000000004a004b000000000b000019000002a40b008041000002a40aa00197000000000c5a013f00000000005a004b0000000005000019000002a405004041000002a400c0009c00000000050bc019000000000005004b0000020d0000c13d00000000b5090434000002a30050009c000000a40000213d0000001f09500039000002fd099001970000003f09900039000002fd09900197000000400a00043d00000000099a00190000000000a9004b000000000c000039000000010c004039000002a30090009c000000a40000213d0000000100c00190000000a40000c13d000000400090043f00000000095a0436000000000cb5001900000000004c004b0000020d0000213d000000000005004b0000051e0000613d0000000004000019000000000c940019000000000db40019000000000d0d04330000000000dc04350000002004400039000000000054004b000005170000413d00000000045900190000000000040435000000400500043d000000400b500039000000800400003900000000004b0435000000200b500039000000060c0000290000000000cb04350000000007070433000000a00c50003900000000007c0435000000c00c500039000000000007004b000005350000613d000000000d000019000000000ecd0019000000000f6d0019000000000f0f04330000000000fe0435000000200dd0003900000000007d004b0000052e0000413d0000000006c7001900000000000604350000001f06700039000002fd066001970000000006c600190000000007b60049000000600c50003900000000007c0435000000000c0804330000000007c6043600000000000c004b000005490000613d000000000d0000190000000006070019000000200880003900000000070804330000000007760436000000010dd000390000000000cd004b000005420000413d0000000008b70049000000800b50003900000000008b043500000000080a043300000000008704350000004006600039000000000008004b000005590000613d0000000007000019000000000a670019000000000b970019000000000b0b04330000000000ba04350000002007700039000000000087004b000005520000413d0000000007680019000000000007043500000000065600490000001f07800039000002fd077001970000000006670019000000200760008a00000000007504350000001f06600039000002fd076001970000000006570019000000000076004b00000000070000390000000107004039000002a30060009c000000a40000213d0000000100700190000000a40000c13d000000400060043f000000800600043d000000000006004b000001490000613d000000a00600043d000000200660003900000000005604350000004006000039000000400500043d00000000076504360000000001010433000000400850003900000000001804350000006008500039000000000001004b000005830000613d0000000009000019000000000a890019000000000b390019000000000b0b04330000000000ba04350000002009900039000000000019004b0000057c0000413d000000000381001900000000000304350000001f01100039000002fd01100197000000000181001900000000035100490000000000370435000000800300043d0000000000310435000000050730021000000000077100190000002009700039000000000003004b000008a20000c13d0000000001590049000002a00010009c000002a0010080410000006001100210000002a00050009c000002a0050080410000004002500210000000000121019f00000a7d0001042e0000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005a10000c13d000003900000013d0000007d09500039000000000591034f000000000505043b000002c70050009c000005b30000213d000000400200043d000002ce010000410000000000120435000002a00020009c000002a0020080410000004001200210000002cf011001c700000a7d0001042e000000920020008c0000020d0000413d000000200a80008a0000000008a1034f000000000b08043b000002a408b00197000000000c78013f000000000078004b000000000d000019000002a40d00404100000000006b004b0000000008000019000002a408008041000002a400c0009c000000000d08c0190000002108900039000000000881034f000000000808043b000900000008001d00000000000d004b0000020d0000c13d00000000094b0019000000000b91034f000000000b0b043b000002a300b0009c0000020d0000213d000002fe0cb000d1000000000d3c0019000000200c900039000002a40ed00197000002a40fc001970000000008ef013f0000000000ef004b000000000e000019000002a40e0040410000000000dc004b000000000d000019000002a40d002041000002a40080009c000000000e0dc01900000000000e004b0000020d0000c13d00000000000b004b000001490000613d0000000008c1034f000000000b08043b0000000500b0008c0000020d0000213d0000000200b0008c0000060b0000813d0000002008a0008a000000000881034f000000000908043b000002a408900197000000000a78013f000000000078004b0000000007000019000002a407004041000000000069004b0000000006000019000002a406008041000002a400a0009c000000000706c019000000000007004b0000020d0000c13d0000000009490019000000000491034f000000000404043b000002a30040009c0000020d0000213d000000070640021000000000036300490000002006900039000000000036004b0000000007000019000002a407002041000002a403300197000002a406600197000000000836013f000000000036004b0000000003000019000002a403004041000002a40080009c000000000307c019000000000003004b0000020d0000c13d000000000004004b000001490000613d0000004003900039000000000331034f000000000303043b000800000003001d000002c10030009c0000020d0000213d000000f803500270000000090400002900090060004002780000006004900039000000000141034f000000000101043b000700000001001d000000070030008c000006e10000613d000002c801000041000000080030008c0000071b0000c13d0000000000100443000000090100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d000000400200043d000000240120003900000007030000290000000000310435000002ca010000410000000000120435000700000002001d00000004012000390000000802000029000000000021043500000000010004140000000902000029000000040020008c000007480000613d0000000702000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002cb011001c700000009020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000007480000c13d000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006520000c13d000003900000013d0000002002200039000000000321034f000000000303043b000002d30030009c000006840000813d000500000005001d0000005d02200039000000000321034f000000000403043b000002d60040009c000006890000213d000000f803400270000400000003001d000000020330008a000000040030008c000006890000a13d000200000004001d000000480220008a000000000121034f000000000101043b000300000001001d000002d70100004100000000001004430000000001000414000002a00010009c000002a001008041000000c001100210000002b6011001c70000800b020000390a7c0a770000040f0000000100200190000009e70000613d0000000302000029000300c000200278000000000101043b000000030010006b0000068f0000813d000002ed01000041000000000010043f0000000301000029000000200010043f0000000501000029000000400010043f000002ee0100004100000a7e00010430000002d401000041000000000010043f000000200050043f000002d50100004100000a7e00010430000002ef01000041000000000010043f0000000501000029000000200010043f000002d50100004100000a7e000104300000000201000367000000a402100370000000000202043b0000002402200039000000000321034f000000000303043b000000000003004b000006a70000c13d000002e901000041000000000010043f0000006001000039000000200010043f0000000101000039000000400010043f0000000501000029000000600010043f0000002a01000039000000800010043f000002ea01000041000000a00010043f000002eb01000041000000c00010043f000002ec0100004100000a7e00010430000000c403100370000000000303043b000000a2043000390000004503300039000000000531034f000000000341034f0000006002200039000000000221034f0000004404100370000000000404043b000000000202043b000000000303043b000000000505043b0001006000500278000002d80050009c000006bf0000413d000000010040006b000006bf0000613d000002e801000041000000000010043f0000000101000029000000200010043f000000400040043f000006d70000013d000000000023004b000006d30000c13d00000009020000290000005d0020008c0000020d0000413d0000000202000029000002c70020009c000006db0000a13d0000000402000029000000070020008c0000074e0000c13d0000000902000029000000a60020008c0000000505000029000001ae0000413d0000004902000039000000090300003900000040040000390000008006000039000007560000013d000002d901000041000000000010043f000000200030043f000000400020043f0000000501000029000000600010043f000002da0100004100000a7e0001043000000009020000290000007e0020008c0000020d0000413d00000021020000390000000103000039000007540000013d000000a60020008c0000020d0000413d000002c8010000410000000000100443000000090100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d000000400200043d000002cc010000410000000000120435000700000002001d00000004012000390000000802000029000000000021043500000000010004140000000902000029000000040020008c000007480000613d0000000702000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002c2011001c700000009020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000007480000c13d000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007160000c13d000003900000013d0000000000100443000000090100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d000000400200043d000000240120003900000007030000290000000000310435000002cd010000410000000000120435000700000002001d00000004012000390000000802000029000000000021043500000000010004140000000902000029000000040020008c000007480000613d0000000702000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002cb011001c700000009020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000008040000613d0000000701000029000002a30010009c000000a40000213d0000000702000029000000400020043f000005ac0000013d0000000902000029000000920020008c0000000505000029000001ae0000413d0000003502000039000000150300003900000020040000390000006006000039000000400500043d0000000007560019000000000067004b00000000060000390000000106004039000002a30070009c000000a40000213d0000000100600190000000a40000c13d00000007060000290009007d0060003d000000400070043f00000000062504360000000907200029000000000070007c0000020d0000213d00000009071003600000000001460019000000000807034f0000000009060019000000008a08043c0000000009a90436000000000019004b0000076a0000c13d000000000447034f0000000303300210000000000701043300000000073701cf000000000737022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000373019f000000000031043500000000012600190000000000010435000002a00060009c000002a00600804100000040016002100000000002050433000002a00020009c000002a0020080410000006002200210000000000112019f0000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002af011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000400000001001d000000400100043d000700000001001d000002be01000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f0000000100200190000009e70000613d00000007040000290000002002400039000000000101043b0000000000120435000000a00140003900000004030000290000000000310435000000800140003900000005030000290000000000310435000000600140003900000003030000290000000000310435000000400140003900000001030000290000000000310435000000a0010000390000000000140435000002db0040009c000000a40000213d0000000703000029000000c001300039000000400010043f000002a00020009c000002a00200804100000040012002100000000002030433000002a00020009c000002a0020080410000006002200210000000000112019f0000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002af011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000700000001001d0a7c09f50000040f000002dc02000041000000000020043f000000020010043f0000000701000029000000220010043f0000000001000414000002a00010009c000002a001008041000000c001100210000002dd011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000220000043f000000400200043d000700000002001d000002de0020009c000000a40000213d00000007050000290000006002500039000000400020043f000000400300003900000000033504360000000905000029000000000050007c0000020d0000213d0000000904000029000000400440008a0000000204400367000000004504043c0000000003530436000000000023004b000007eb0000c13d0000000000020435000000000000043f00000007030000290000000004030433000900000004001d000002ff03400197000000400030008c0000000003000019000008500000c13d000000070300002900040020003000920000004003300039000300000003001d0000000003030433000200000003001d0000000903000029000000410030008c000008110000c13d0000000002020433000000f802200270000008170000013d000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000080c0000c13d000003900000013d0000000204000029000002c30240019700000003030000290000000000230435000000ff024002700000001b0220003900000004040000290000000003040433000100000003001d000000070300002900000000002304350000000000140435000002a00040009c000002a001000041000000000104401900000040011002100000000002000414000002a00020009c000002a002008041000000c002200210000000000112019f000002df011001c700000001020000390a7c0a770000040f0000006002100270000002a002200197000000200020008c000000200300003900000000030240190000001f0430018f0000002003300190000008370000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000008330000c13d000000000004004b000008440000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f0000000000430435000100000002001f0003000000010355000000040100002900000001020000290000000000210435000000070100002900000009020000290000000000210435000000030100002900000002020000290000000000210435000000000300043d000002c101300197000900000001001d000000000010043f000000200000043f0000000001000414000002a00010009c000002a001008041000000c001100210000002e0011001c700008010020000390a7c0a770000040f00000001002001900000020d0000613d000000000101043b000000000101041a000000ff001001900000086f0000c13d000000400100043d000000240210003900000005030000290000000000320435000002e7020000410000000000210435000000040210003900000009030000290000000000320435000002a00010009c000002a0010080410000004001100210000002cb011001c700000a7e0001043000000002010003670000000802100360000000000202043b0000000004000031000000060340006a0000001f0630008a000002a407600197000002a403200197000000000573013f000000000073004b0000000003000019000002a403004041000000000062004b0000000008000019000002a408008041000002a40050009c000000000308c019000000000003004b0000020d0000c13d0000000602200029000000000321034f000000000303043b000002a30030009c0000020d0000213d00000000053400490000002008200039000000000058004b0000000009000019000002a409002041000002a405500197000002a408800197000000000a58013f000000000058004b0000000005000019000002a405004041000002a400a0009c000000000509c019000000000005004b0000020d0000c13d0000005d0030008c000001490000a13d0000007d08200039000000000581034f000000000505043b000002c70050009c000008c60000213d000000400100043d000900000001001d000002e5010000410000000902000029000005ad0000013d00000000070000190000000008010019000008ad0000013d000000000b9a001900000000000b04350000001f0aa00039000002fd0aa0019700000000099a00190000000107700039000000000037004b000005910000813d000000000a190049000000200aa0008a00000020088000390000000000a804350000002004400039000000000a04043300000000ba0a0434000000000aa90436000000000b0b043300000000006a0435000000400c90003900000000ba0b04340000000000ac0435000000600990003900000000000a004b000008a50000613d000000000c000019000000000d9c0019000000000ecb0019000000000e0e04330000000000ed0435000000200cc000390000000000ac004b000008be0000413d000008a50000013d000000920030008c0000020d0000413d0000000809000029000000200a90008a0000000009a1034f000000000909043b000002a40b900197000000000c7b013f00000000007b004b000000000b000019000002a40b004041000000000069004b000000000d000019000002a40d008041000002a400c0009c000000000b0dc0190000002108800039000000000881034f000000000808043b000900000008001d00000000000b004b0000020d0000c13d0000000609900029000000000b91034f000000000b0b043b000002a300b0009c0000020d0000213d000002fe0cb000d1000000000d4c0019000000200c900039000002a40ed00197000002a40fc001970000000008ef013f0000000000ef004b000000000e000019000002a40e0040410000000000dc004b000000000d000019000002a40d002041000002a40080009c000000000e0dc01900000000000e004b0000020d0000c13d00000000000b004b000001490000613d0000000008c1034f000000000b08043b0000000500b0008c0000020d0000213d0000000200b0008c0000091f0000813d0000002008a0008a000000000881034f000000000908043b000002a408900197000000000a78013f000000000078004b0000000007000019000002a407004041000000000069004b0000000006000019000002a406008041000002a400a0009c000000000706c019000000000007004b0000020d0000c13d0000000609900029000000000691034f000000000606043b000002a30060009c0000020d0000213d000000070760021000000000047400490000002007900039000000000047004b0000000008000019000002a408002041000002a404400197000002a407700197000000000a47013f000000000047004b0000000004000019000002a404004041000002a400a0009c000000000408c019000000000004004b0000020d0000c13d000000000006004b000001490000613d0000004004900039000000000441034f000000000404043b000700000004001d000002c10040009c0000020d0000213d000000f804500270000000090500002900080060005002780000006005900039000000000551034f0000008006900039000000000661034f000000000606043b000600000006001d000000000505043b000900000005001d000000070040008c0000096f0000613d000002c801000041000000080040008c000009b10000c13d0000000000100443000000080100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d000000400200043d000000240120003900000009030000290000000000310435000002e1010000410000000000120435000900000002001d00000004012000390000000702000029000000000021043500000000010004140000000802000029000000040020008c000009e10000613d0000000902000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002cb011001c700000008020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000009e10000c13d000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000096a0000c13d000003900000013d000000a60030008c0000020d0000413d000000b202200039000000000121034f000000000101043b000900000001001d000002c8010000410000000000100443000000080100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d00000009010000290000006001100270000000400400043d000000240240003900000007030000290000000000320435000002e2020000410000000000240435000900000004001d0000000402400039000000000012043500000000010004140000000802000029000000040020008c000009e10000613d0000000902000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002cb011001c700000008020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000009e10000c13d000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009ac0000c13d000003900000013d0000000000100443000000080100002900000004001004430000000001000414000002a00010009c000002a001008041000000c001100210000002c9011001c700008002020000390a7c0a770000040f0000000100200190000009e70000613d000000000101043b000000000001004b0000020d0000613d000000400200043d000000440120003900000006030000290000000000310435000000240120003900000009030000290000000000310435000002e3010000410000000000120435000900000002001d00000004012000390000000702000029000000000021043500000000010004140000000802000029000000040020008c000009e10000613d0000000902000029000002a00020009c000002a0020080410000004002200210000002a00010009c000002a001008041000000c001100210000000000121019f000002e4011001c700000008020000290a7c0a720000040f0000006003100270000102a00030019d00030000000103550000000100200190000009e80000613d0000000901000029000002a30010009c000000a40000213d0000000901000029000000400010043f0000089f0000013d000000000001042f000002a0033001970000001f0530018f000002a206300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009f00000c13d000003900000013d0003000000000002000002be01000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f000000010020019000000a6e0000613d000000000101043b000300000001001d000002b50100004100000000001004430000000001000414000002a00010009c000002a001008041000000c001100210000002b6011001c70000800b020000390a7c0a770000040f000000010020019000000a6e0000613d000000000201043b000002be01000041000000000010044300000000010004120000000400100443000000030020006c00000a260000c13d000000c00100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f000000010020019000000a6e0000613d000000000101043b000000000001042d000300000002001d000000800100043d000200000001001d000000400100043d000100000001001d000000600100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f000000010020019000000a6e0000613d000000000101043b000000000010043f000002be01000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f000000010020019000000a6e0000613d000000000101043b000000200010043f000002be01000041000000000010044300000000010004120000000400100443000000400100003900000024001004430000000001000414000002a00010009c000002a001008041000000c001100210000002bf011001c700008005020000390a7c0a770000040f000000010020019000000a6e0000613d000000000101043b000000400010043f0000000301000029000000600010043f0000000001000410000000800010043f0000000001000414000002a00010009c000002a001008041000000c001100210000002b8011001c700008010020000390a7c0a770000040f000000010020019000000a6f0000613d000000000101043b0000000102000029000000400020043f000000600000043f0000000202000029000000800020043f000000000001042d000000000001042f000000000100001900000a7e00010430000000000001042f00000a75002104210000000102000039000000000001042d0000000002000019000000000001042d00000a7a002104230000000102000039000000000001042d0000000002000019000000000001042d00000a7c0000043200000a7d0001042e00000a7e00010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf322e3000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000003000000000000000000000000454950373132446f6d61696e2800000000000000000000000000000000000000737472696e67206e616d652c0000000000000000000000000000000000000000737472696e672076657273696f6e2c000000000000000000000000000000000075696e7432353620636861696e49642c000000000000000000000000000000006164647265737320766572696679696e67436f6e7472616374000000000000002900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f02000000000000000000000000000000000000000000000000000000000000005369676e65644f72646572280000000000000000000000000000000000000000616464726573732066756c66696c6c65722c000000000000000000000000000075696e7436342065787069726174696f6e2c000000000000000000000000000062797465733332206f72646572486173682c0000000000000000000000000000627974657320636f6e74657874000000000000000000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000068f116a894984e2db1123eb39502000000000000000000000000000000000000a000000000000000000000000098a7ac23945182ac62b68fbe5ba35cc0bf5c4c34b3a410ce94a4c2270282d6b500000002000000000000000000000000000002400000010000000000000000000000000000000000000000000000000000000000000000000000000001e4d72a0000000000000000000000000000000000000000000000000000000017b1f942000000000000000000000000000000000000000000000000000000002e778efc310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e020000020000000000000000000000000000004400000000000000000000000004789c9800000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000240000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0979a7ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000b89c4b0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000ad3889900000000000000000000000000000000000000000000000000000000b6e39ba10000000000000000000000000000000000000000000000000000000017b1f94200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000000000000000000000000046d5d89500000000000000000000000000000000000000040000001c00000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006411577400000000000000000000000000000000000000240000001c000000000000000009ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000b36c03e800000000000000000000000000000000000000640000001c0000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f19010000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f000000000000000000000000000000000000008000000000000000000000000002000000000000000000000000000000000000400000000000000000000000003a0e316000000000000000000000000000000000000000000000000000000000507933150000000000000000000000000000000000000000000000000000000028cc113100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000001e4d72a000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000017c3008900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bcf9bb7000000000000000000000000000000000000000000000000000000002be76224436f6e73696465726174696f6e206d7573742068617665206174206c65617374206f6e65206974656d2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000001c0000000000000000000000000000000000000000000000000000000000000000000000001654607100000000000000000000000000000000000000440000001c0000000000000000000000000000000000000000000000000000000000000000000000002678799900000000000000000000000000000000000000000000000000000000d232fd2cffffffff000000000000000000000000000000000000000000000000000000007dff5a7900000000000000000000000000000000000000000000000000000000a784b80c00000000000000000000000000000000000000000000000000000000f460590b0000000000000000000000000000000000000000000000000000000066a2489f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000800000000000000000000000000000000000000000000000000000000000000000000000006d5769be020000000000000000000000000000000000002000000000000000000000000047d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f243525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b0000000000000000000000000000000000000000000000000000000054c91b87ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe27278f27bd01cae59b607545b9fd1ebc46faa744880eb076d88112bede49d815
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012526f79616c7479456e666f7263656d656e740000000000000000000000000000
-----Decoded View---------------
Arg [0] : zoneName (string): RoyaltyEnforcement
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [2] : 526f79616c7479456e666f7263656d656e740000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.