Source Code
Overview
APE Balance
APE Value
$0.00Multichain Info
N/A
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 8832354 | 362 days ago | Contract Creation | 0 APE |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SignedZone
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {
ZoneParameters,
Schema
} from "../../../../types/lib/ConsiderationStructs.sol";
import { ZoneInterface } from "../../../interfaces/ZoneInterface.sol";
import {
SignedZoneEventsAndErrors
} from "../interfaces/SignedZoneEventsAndErrors.sol";
import { SIP5Interface } from "../../interfaces/SIP5Interface.sol";
import {
SignedZoneControllerInterface
} from "../interfaces/SignedZoneControllerInterface.sol";
import {
IAuthorizedTransferSecurityRegistry
} from "lib/erc721c-seaport/src/interfaces/IAuthorizedTransferSecurityRegistry.sol";
import "./lib/SignedZoneConstants.sol";
/**
* @title SignedZone
* @author ryanio, BCLeFevre
* @notice SignedZone 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 SignedZone is SignedZoneEventsAndErrors, ZoneInterface, 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 = ZoneInterface.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 = ZoneInterface.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, ZoneInterface)
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 Returns if the zone supports the interfaceId.
*
* @param interfaceId The interface identifier, as specified in ERC-165.
*
* @return supportsInterface True if the zone supports interfaceId, false
*/
function supportsInterface(
bytes4 interfaceId
) external view override returns (bool) {
// Call the internal function to determine if the interface is supported.
return _supportsInterface(interfaceId);
}
/**
* @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(ZoneInterface).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 {
BasicOrderType, ItemType, OrderType, Side
} from "./ConsiderationEnums.sol";
import { CalldataPointer, MemoryPointer } from "../helpers/PointerLibraries.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;
}
using StructPointers for OrderComponents global;
using StructPointers for OfferItem global;
using StructPointers for ConsiderationItem global;
using StructPointers for SpentItem global;
using StructPointers for ReceivedItem global;
using StructPointers for BasicOrderParameters global;
using StructPointers for AdditionalRecipient global;
using StructPointers for OrderParameters global;
using StructPointers for Order global;
using StructPointers for AdvancedOrder global;
using StructPointers for OrderStatus global;
using StructPointers for CriteriaResolver global;
using StructPointers for Fulfillment global;
using StructPointers for FulfillmentComponent global;
using StructPointers for Execution global;
using StructPointers for ZoneParameters global;
/**
* @dev This library provides a set of functions for converting structs to
* pointers.
*/
library StructPointers {
/**
* @dev Get a MemoryPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(OrderComponents memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(OrderComponents calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(OfferItem memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(OfferItem calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(ConsiderationItem memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(ConsiderationItem calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(SpentItem memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(SpentItem calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(ReceivedItem memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(ReceivedItem calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(BasicOrderParameters memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(BasicOrderParameters calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(AdditionalRecipient memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(AdditionalRecipient calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(OrderParameters memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(OrderParameters calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(Order memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(Order calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(AdvancedOrder memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(AdvancedOrder calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(OrderStatus memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(OrderStatus calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(CriteriaResolver memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(CriteriaResolver calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(Fulfillment memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(Fulfillment calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(FulfillmentComponent memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(FulfillmentComponent calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(Execution memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(Execution calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(ZoneParameters memory obj)
internal
pure
returns (MemoryPointer ptr)
{
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(ZoneParameters calldata obj)
internal
pure
returns (CalldataPointer ptr)
{
assembly {
ptr := obj
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import { ZoneInterface } from "seaport-types/src/interfaces/ZoneInterface.sol";
interface LocalZoneInterface is ZoneInterface { }// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
/**
* @notice SignedZoneEventsAndErrors contains errors and events
* related to zone interaction.
*/
interface SignedZoneEventsAndErrors {
/**
* @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.24;
import { Schema } from "../../../types/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.24;
/**
* @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 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 documentationURI returned by a zone.
* Only the owner or an active signer of the supplied zone can call
* this function.
*
* @param zone The signed zone to update the API endpoint for.
* @param documentationURI The new documentation URI.
*/
function updateDocumentationURI(
address zone,
string calldata documentationURI
) 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 Returns whether or not the supplied address is an active signer
* for the supplied zone.
*
* @param zone The zone to check if the supplied address is an active
* signer for.
* @param signer The address to check if it is an active signer for
*
* @return active If the supplied address is an active signer for the
* supplied zone.
*/
function isActiveSigner(
address zone,
address signer
) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
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.19;
/// @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;
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
}
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
}
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
}
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
}
enum Side
// 0: Items that can be spent
{
OFFER,
// 1: Items that must be received
CONSIDERATION
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
type CalldataPointer is uint256;
type ReturndataPointer is uint256;
type MemoryPointer is uint256;
using CalldataPointerLib for CalldataPointer global;
using MemoryPointerLib for MemoryPointer global;
using ReturndataPointerLib for ReturndataPointer global;
using CalldataReaders for CalldataPointer global;
using ReturndataReaders for ReturndataPointer global;
using MemoryReaders for MemoryPointer global;
using MemoryWriters for MemoryPointer global;
CalldataPointer constant CalldataStart = CalldataPointer.wrap(0x04);
MemoryPointer constant FreeMemoryPPtr = MemoryPointer.wrap(0x40);
MemoryPointer constant ZeroSlotPtr = MemoryPointer.wrap(0x60);
uint256 constant IdentityPrecompileAddress = 0x4;
uint256 constant OffsetOrLengthMask = 0xffffffff;
uint256 constant _OneWord = 0x20;
uint256 constant _FreeMemoryPointerSlot = 0x40;
/// @dev Allocates `size` bytes in memory by increasing the free memory pointer
/// and returns the memory pointer to the first byte of the allocated region.
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function malloc(uint256 size) pure returns (MemoryPointer mPtr) {
assembly {
mPtr := mload(_FreeMemoryPointerSlot)
mstore(_FreeMemoryPointerSlot, add(mPtr, size))
}
}
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function getFreeMemoryPointer() pure returns (MemoryPointer mPtr) {
mPtr = FreeMemoryPPtr.readMemoryPointer();
}
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function setFreeMemoryPointer(MemoryPointer mPtr) pure {
FreeMemoryPPtr.write(mPtr);
}
library CalldataPointerLib {
function lt(CalldataPointer a, CalldataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := lt(a, b)
}
}
function gt(CalldataPointer a, CalldataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := gt(a, b)
}
}
function eq(CalldataPointer a, CalldataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := eq(a, b)
}
}
function isNull(CalldataPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
/// @dev Resolves an offset stored at `cdPtr + headOffset` to a calldata.
/// pointer `cdPtr` must point to some parent object with a dynamic
/// type's head stored at `cdPtr + headOffset`.
function pptrOffset(CalldataPointer cdPtr, uint256 headOffset)
internal
pure
returns (CalldataPointer cdPtrChild)
{
cdPtrChild = cdPtr.offset(
cdPtr.offset(headOffset).readUint256() & OffsetOrLengthMask
);
}
/// @dev Resolves an offset stored at `cdPtr` to a calldata pointer.
/// `cdPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(CalldataPointer cdPtr)
internal
pure
returns (CalldataPointer cdPtrChild)
{
cdPtrChild = cdPtr.offset(cdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the calldata pointer one word after `cdPtr`.
function next(CalldataPointer cdPtr)
internal
pure
returns (CalldataPointer cdPtrNext)
{
assembly {
cdPtrNext := add(cdPtr, _OneWord)
}
}
/// @dev Returns the calldata pointer `_offset` bytes after `cdPtr`.
function offset(CalldataPointer cdPtr, uint256 _offset)
internal
pure
returns (CalldataPointer cdPtrNext)
{
assembly {
cdPtrNext := add(cdPtr, _offset)
}
}
/// @dev Copies `size` bytes from calldata starting at `src` to memory at
/// `dst`.
function copy(CalldataPointer src, MemoryPointer dst, uint256 size)
internal
pure
{
assembly {
calldatacopy(dst, src, size)
}
}
}
library ReturndataPointerLib {
function lt(ReturndataPointer a, ReturndataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := lt(a, b)
}
}
function gt(ReturndataPointer a, ReturndataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := gt(a, b)
}
}
function eq(ReturndataPointer a, ReturndataPointer b)
internal
pure
returns (bool c)
{
assembly {
c := eq(a, b)
}
}
function isNull(ReturndataPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
/// @dev Resolves an offset stored at `rdPtr + headOffset` to a returndata
/// pointer. `rdPtr` must point to some parent object with a dynamic
/// type's head stored at `rdPtr + headOffset`.
function pptrOffset(ReturndataPointer rdPtr, uint256 headOffset)
internal
pure
returns (ReturndataPointer rdPtrChild)
{
rdPtrChild = rdPtr.offset(
rdPtr.offset(headOffset).readUint256() & OffsetOrLengthMask
);
}
/// @dev Resolves an offset stored at `rdPtr` to a returndata pointer.
/// `rdPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(ReturndataPointer rdPtr)
internal
pure
returns (ReturndataPointer rdPtrChild)
{
rdPtrChild = rdPtr.offset(rdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the returndata pointer one word after `cdPtr`.
function next(ReturndataPointer rdPtr)
internal
pure
returns (ReturndataPointer rdPtrNext)
{
assembly {
rdPtrNext := add(rdPtr, _OneWord)
}
}
/// @dev Returns the returndata pointer `_offset` bytes after `cdPtr`.
function offset(ReturndataPointer rdPtr, uint256 _offset)
internal
pure
returns (ReturndataPointer rdPtrNext)
{
assembly {
rdPtrNext := add(rdPtr, _offset)
}
}
/// @dev Copies `size` bytes from returndata starting at `src` to memory at
/// `dst`.
function copy(ReturndataPointer src, MemoryPointer dst, uint256 size)
internal
pure
{
assembly {
returndatacopy(dst, src, size)
}
}
}
library MemoryPointerLib {
function copy(MemoryPointer src, MemoryPointer dst, uint256 size)
internal
view
{
assembly {
let success :=
staticcall(gas(), IdentityPrecompileAddress, src, size, dst, size)
if or(iszero(returndatasize()), iszero(success)) { revert(0, 0) }
}
}
function lt(MemoryPointer a, MemoryPointer b)
internal
pure
returns (bool c)
{
assembly {
c := lt(a, b)
}
}
function gt(MemoryPointer a, MemoryPointer b)
internal
pure
returns (bool c)
{
assembly {
c := gt(a, b)
}
}
function eq(MemoryPointer a, MemoryPointer b)
internal
pure
returns (bool c)
{
assembly {
c := eq(a, b)
}
}
function isNull(MemoryPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
function hash(MemoryPointer ptr, uint256 length)
internal
pure
returns (bytes32 _hash)
{
assembly {
_hash := keccak256(ptr, length)
}
}
/// @dev Returns the memory pointer one word after `mPtr`.
function next(MemoryPointer mPtr)
internal
pure
returns (MemoryPointer mPtrNext)
{
assembly {
mPtrNext := add(mPtr, _OneWord)
}
}
/// @dev Returns the memory pointer `_offset` bytes after `mPtr`.
function offset(MemoryPointer mPtr, uint256 _offset)
internal
pure
returns (MemoryPointer mPtrNext)
{
assembly {
mPtrNext := add(mPtr, _offset)
}
}
/// @dev Resolves a pointer at `mPtr + headOffset` to a memory
/// pointer. `mPtr` must point to some parent object with a dynamic
/// type's pointer stored at `mPtr + headOffset`.
function pptrOffset(MemoryPointer mPtr, uint256 headOffset)
internal
pure
returns (MemoryPointer mPtrChild)
{
mPtrChild = mPtr.offset(headOffset).readMemoryPointer();
}
/// @dev Resolves a pointer stored at `mPtr` to a memory pointer.
/// `mPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(MemoryPointer mPtr)
internal
pure
returns (MemoryPointer mPtrChild)
{
mPtrChild = mPtr.readMemoryPointer();
}
}
library CalldataReaders {
/// @dev Reads the value at `cdPtr` and applies a mask to return only the
/// last 4 bytes.
function readMaskedUint256(CalldataPointer cdPtr)
internal
pure
returns (uint256 value)
{
value = cdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `cdPtr` in calldata.
function readBool(CalldataPointer cdPtr)
internal
pure
returns (bool value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the address at `cdPtr` in calldata.
function readAddress(CalldataPointer cdPtr)
internal
pure
returns (address value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes1 at `cdPtr` in calldata.
function readBytes1(CalldataPointer cdPtr)
internal
pure
returns (bytes1 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes2 at `cdPtr` in calldata.
function readBytes2(CalldataPointer cdPtr)
internal
pure
returns (bytes2 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes3 at `cdPtr` in calldata.
function readBytes3(CalldataPointer cdPtr)
internal
pure
returns (bytes3 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes4 at `cdPtr` in calldata.
function readBytes4(CalldataPointer cdPtr)
internal
pure
returns (bytes4 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes5 at `cdPtr` in calldata.
function readBytes5(CalldataPointer cdPtr)
internal
pure
returns (bytes5 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes6 at `cdPtr` in calldata.
function readBytes6(CalldataPointer cdPtr)
internal
pure
returns (bytes6 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes7 at `cdPtr` in calldata.
function readBytes7(CalldataPointer cdPtr)
internal
pure
returns (bytes7 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes8 at `cdPtr` in calldata.
function readBytes8(CalldataPointer cdPtr)
internal
pure
returns (bytes8 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes9 at `cdPtr` in calldata.
function readBytes9(CalldataPointer cdPtr)
internal
pure
returns (bytes9 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes10 at `cdPtr` in calldata.
function readBytes10(CalldataPointer cdPtr)
internal
pure
returns (bytes10 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes11 at `cdPtr` in calldata.
function readBytes11(CalldataPointer cdPtr)
internal
pure
returns (bytes11 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes12 at `cdPtr` in calldata.
function readBytes12(CalldataPointer cdPtr)
internal
pure
returns (bytes12 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes13 at `cdPtr` in calldata.
function readBytes13(CalldataPointer cdPtr)
internal
pure
returns (bytes13 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes14 at `cdPtr` in calldata.
function readBytes14(CalldataPointer cdPtr)
internal
pure
returns (bytes14 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes15 at `cdPtr` in calldata.
function readBytes15(CalldataPointer cdPtr)
internal
pure
returns (bytes15 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes16 at `cdPtr` in calldata.
function readBytes16(CalldataPointer cdPtr)
internal
pure
returns (bytes16 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes17 at `cdPtr` in calldata.
function readBytes17(CalldataPointer cdPtr)
internal
pure
returns (bytes17 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes18 at `cdPtr` in calldata.
function readBytes18(CalldataPointer cdPtr)
internal
pure
returns (bytes18 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes19 at `cdPtr` in calldata.
function readBytes19(CalldataPointer cdPtr)
internal
pure
returns (bytes19 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes20 at `cdPtr` in calldata.
function readBytes20(CalldataPointer cdPtr)
internal
pure
returns (bytes20 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes21 at `cdPtr` in calldata.
function readBytes21(CalldataPointer cdPtr)
internal
pure
returns (bytes21 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes22 at `cdPtr` in calldata.
function readBytes22(CalldataPointer cdPtr)
internal
pure
returns (bytes22 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes23 at `cdPtr` in calldata.
function readBytes23(CalldataPointer cdPtr)
internal
pure
returns (bytes23 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes24 at `cdPtr` in calldata.
function readBytes24(CalldataPointer cdPtr)
internal
pure
returns (bytes24 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes25 at `cdPtr` in calldata.
function readBytes25(CalldataPointer cdPtr)
internal
pure
returns (bytes25 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes26 at `cdPtr` in calldata.
function readBytes26(CalldataPointer cdPtr)
internal
pure
returns (bytes26 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes27 at `cdPtr` in calldata.
function readBytes27(CalldataPointer cdPtr)
internal
pure
returns (bytes27 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes28 at `cdPtr` in calldata.
function readBytes28(CalldataPointer cdPtr)
internal
pure
returns (bytes28 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes29 at `cdPtr` in calldata.
function readBytes29(CalldataPointer cdPtr)
internal
pure
returns (bytes29 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes30 at `cdPtr` in calldata.
function readBytes30(CalldataPointer cdPtr)
internal
pure
returns (bytes30 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes31 at `cdPtr` in calldata.
function readBytes31(CalldataPointer cdPtr)
internal
pure
returns (bytes31 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes32 at `cdPtr` in calldata.
function readBytes32(CalldataPointer cdPtr)
internal
pure
returns (bytes32 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint8 at `cdPtr` in calldata.
function readUint8(CalldataPointer cdPtr)
internal
pure
returns (uint8 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint16 at `cdPtr` in calldata.
function readUint16(CalldataPointer cdPtr)
internal
pure
returns (uint16 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint24 at `cdPtr` in calldata.
function readUint24(CalldataPointer cdPtr)
internal
pure
returns (uint24 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint32 at `cdPtr` in calldata.
function readUint32(CalldataPointer cdPtr)
internal
pure
returns (uint32 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint40 at `cdPtr` in calldata.
function readUint40(CalldataPointer cdPtr)
internal
pure
returns (uint40 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint48 at `cdPtr` in calldata.
function readUint48(CalldataPointer cdPtr)
internal
pure
returns (uint48 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint56 at `cdPtr` in calldata.
function readUint56(CalldataPointer cdPtr)
internal
pure
returns (uint56 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint64 at `cdPtr` in calldata.
function readUint64(CalldataPointer cdPtr)
internal
pure
returns (uint64 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint72 at `cdPtr` in calldata.
function readUint72(CalldataPointer cdPtr)
internal
pure
returns (uint72 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint80 at `cdPtr` in calldata.
function readUint80(CalldataPointer cdPtr)
internal
pure
returns (uint80 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint88 at `cdPtr` in calldata.
function readUint88(CalldataPointer cdPtr)
internal
pure
returns (uint88 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint96 at `cdPtr` in calldata.
function readUint96(CalldataPointer cdPtr)
internal
pure
returns (uint96 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint104 at `cdPtr` in calldata.
function readUint104(CalldataPointer cdPtr)
internal
pure
returns (uint104 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint112 at `cdPtr` in calldata.
function readUint112(CalldataPointer cdPtr)
internal
pure
returns (uint112 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint120 at `cdPtr` in calldata.
function readUint120(CalldataPointer cdPtr)
internal
pure
returns (uint120 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint128 at `cdPtr` in calldata.
function readUint128(CalldataPointer cdPtr)
internal
pure
returns (uint128 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint136 at `cdPtr` in calldata.
function readUint136(CalldataPointer cdPtr)
internal
pure
returns (uint136 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint144 at `cdPtr` in calldata.
function readUint144(CalldataPointer cdPtr)
internal
pure
returns (uint144 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint152 at `cdPtr` in calldata.
function readUint152(CalldataPointer cdPtr)
internal
pure
returns (uint152 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint160 at `cdPtr` in calldata.
function readUint160(CalldataPointer cdPtr)
internal
pure
returns (uint160 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint168 at `cdPtr` in calldata.
function readUint168(CalldataPointer cdPtr)
internal
pure
returns (uint168 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint176 at `cdPtr` in calldata.
function readUint176(CalldataPointer cdPtr)
internal
pure
returns (uint176 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint184 at `cdPtr` in calldata.
function readUint184(CalldataPointer cdPtr)
internal
pure
returns (uint184 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint192 at `cdPtr` in calldata.
function readUint192(CalldataPointer cdPtr)
internal
pure
returns (uint192 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint200 at `cdPtr` in calldata.
function readUint200(CalldataPointer cdPtr)
internal
pure
returns (uint200 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint208 at `cdPtr` in calldata.
function readUint208(CalldataPointer cdPtr)
internal
pure
returns (uint208 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint216 at `cdPtr` in calldata.
function readUint216(CalldataPointer cdPtr)
internal
pure
returns (uint216 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint224 at `cdPtr` in calldata.
function readUint224(CalldataPointer cdPtr)
internal
pure
returns (uint224 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint232 at `cdPtr` in calldata.
function readUint232(CalldataPointer cdPtr)
internal
pure
returns (uint232 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint240 at `cdPtr` in calldata.
function readUint240(CalldataPointer cdPtr)
internal
pure
returns (uint240 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint248 at `cdPtr` in calldata.
function readUint248(CalldataPointer cdPtr)
internal
pure
returns (uint248 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint256 at `cdPtr` in calldata.
function readUint256(CalldataPointer cdPtr)
internal
pure
returns (uint256 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int8 at `cdPtr` in calldata.
function readInt8(CalldataPointer cdPtr)
internal
pure
returns (int8 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int16 at `cdPtr` in calldata.
function readInt16(CalldataPointer cdPtr)
internal
pure
returns (int16 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int24 at `cdPtr` in calldata.
function readInt24(CalldataPointer cdPtr)
internal
pure
returns (int24 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int32 at `cdPtr` in calldata.
function readInt32(CalldataPointer cdPtr)
internal
pure
returns (int32 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int40 at `cdPtr` in calldata.
function readInt40(CalldataPointer cdPtr)
internal
pure
returns (int40 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int48 at `cdPtr` in calldata.
function readInt48(CalldataPointer cdPtr)
internal
pure
returns (int48 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int56 at `cdPtr` in calldata.
function readInt56(CalldataPointer cdPtr)
internal
pure
returns (int56 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int64 at `cdPtr` in calldata.
function readInt64(CalldataPointer cdPtr)
internal
pure
returns (int64 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int72 at `cdPtr` in calldata.
function readInt72(CalldataPointer cdPtr)
internal
pure
returns (int72 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int80 at `cdPtr` in calldata.
function readInt80(CalldataPointer cdPtr)
internal
pure
returns (int80 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int88 at `cdPtr` in calldata.
function readInt88(CalldataPointer cdPtr)
internal
pure
returns (int88 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int96 at `cdPtr` in calldata.
function readInt96(CalldataPointer cdPtr)
internal
pure
returns (int96 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int104 at `cdPtr` in calldata.
function readInt104(CalldataPointer cdPtr)
internal
pure
returns (int104 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int112 at `cdPtr` in calldata.
function readInt112(CalldataPointer cdPtr)
internal
pure
returns (int112 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int120 at `cdPtr` in calldata.
function readInt120(CalldataPointer cdPtr)
internal
pure
returns (int120 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int128 at `cdPtr` in calldata.
function readInt128(CalldataPointer cdPtr)
internal
pure
returns (int128 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int136 at `cdPtr` in calldata.
function readInt136(CalldataPointer cdPtr)
internal
pure
returns (int136 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int144 at `cdPtr` in calldata.
function readInt144(CalldataPointer cdPtr)
internal
pure
returns (int144 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int152 at `cdPtr` in calldata.
function readInt152(CalldataPointer cdPtr)
internal
pure
returns (int152 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int160 at `cdPtr` in calldata.
function readInt160(CalldataPointer cdPtr)
internal
pure
returns (int160 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int168 at `cdPtr` in calldata.
function readInt168(CalldataPointer cdPtr)
internal
pure
returns (int168 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int176 at `cdPtr` in calldata.
function readInt176(CalldataPointer cdPtr)
internal
pure
returns (int176 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int184 at `cdPtr` in calldata.
function readInt184(CalldataPointer cdPtr)
internal
pure
returns (int184 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int192 at `cdPtr` in calldata.
function readInt192(CalldataPointer cdPtr)
internal
pure
returns (int192 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int200 at `cdPtr` in calldata.
function readInt200(CalldataPointer cdPtr)
internal
pure
returns (int200 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int208 at `cdPtr` in calldata.
function readInt208(CalldataPointer cdPtr)
internal
pure
returns (int208 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int216 at `cdPtr` in calldata.
function readInt216(CalldataPointer cdPtr)
internal
pure
returns (int216 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int224 at `cdPtr` in calldata.
function readInt224(CalldataPointer cdPtr)
internal
pure
returns (int224 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int232 at `cdPtr` in calldata.
function readInt232(CalldataPointer cdPtr)
internal
pure
returns (int232 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int240 at `cdPtr` in calldata.
function readInt240(CalldataPointer cdPtr)
internal
pure
returns (int240 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int248 at `cdPtr` in calldata.
function readInt248(CalldataPointer cdPtr)
internal
pure
returns (int248 value)
{
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int256 at `cdPtr` in calldata.
function readInt256(CalldataPointer cdPtr)
internal
pure
returns (int256 value)
{
assembly {
value := calldataload(cdPtr)
}
}
}
library ReturndataReaders {
/// @dev Reads value at `rdPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(ReturndataPointer rdPtr)
internal
pure
returns (uint256 value)
{
value = rdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `rdPtr` in returndata.
function readBool(ReturndataPointer rdPtr)
internal
pure
returns (bool value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the address at `rdPtr` in returndata.
function readAddress(ReturndataPointer rdPtr)
internal
pure
returns (address value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes1 at `rdPtr` in returndata.
function readBytes1(ReturndataPointer rdPtr)
internal
pure
returns (bytes1 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes2 at `rdPtr` in returndata.
function readBytes2(ReturndataPointer rdPtr)
internal
pure
returns (bytes2 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes3 at `rdPtr` in returndata.
function readBytes3(ReturndataPointer rdPtr)
internal
pure
returns (bytes3 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes4 at `rdPtr` in returndata.
function readBytes4(ReturndataPointer rdPtr)
internal
pure
returns (bytes4 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes5 at `rdPtr` in returndata.
function readBytes5(ReturndataPointer rdPtr)
internal
pure
returns (bytes5 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes6 at `rdPtr` in returndata.
function readBytes6(ReturndataPointer rdPtr)
internal
pure
returns (bytes6 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes7 at `rdPtr` in returndata.
function readBytes7(ReturndataPointer rdPtr)
internal
pure
returns (bytes7 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes8 at `rdPtr` in returndata.
function readBytes8(ReturndataPointer rdPtr)
internal
pure
returns (bytes8 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes9 at `rdPtr` in returndata.
function readBytes9(ReturndataPointer rdPtr)
internal
pure
returns (bytes9 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes10 at `rdPtr` in returndata.
function readBytes10(ReturndataPointer rdPtr)
internal
pure
returns (bytes10 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes11 at `rdPtr` in returndata.
function readBytes11(ReturndataPointer rdPtr)
internal
pure
returns (bytes11 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes12 at `rdPtr` in returndata.
function readBytes12(ReturndataPointer rdPtr)
internal
pure
returns (bytes12 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes13 at `rdPtr` in returndata.
function readBytes13(ReturndataPointer rdPtr)
internal
pure
returns (bytes13 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes14 at `rdPtr` in returndata.
function readBytes14(ReturndataPointer rdPtr)
internal
pure
returns (bytes14 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes15 at `rdPtr` in returndata.
function readBytes15(ReturndataPointer rdPtr)
internal
pure
returns (bytes15 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes16 at `rdPtr` in returndata.
function readBytes16(ReturndataPointer rdPtr)
internal
pure
returns (bytes16 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes17 at `rdPtr` in returndata.
function readBytes17(ReturndataPointer rdPtr)
internal
pure
returns (bytes17 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes18 at `rdPtr` in returndata.
function readBytes18(ReturndataPointer rdPtr)
internal
pure
returns (bytes18 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes19 at `rdPtr` in returndata.
function readBytes19(ReturndataPointer rdPtr)
internal
pure
returns (bytes19 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes20 at `rdPtr` in returndata.
function readBytes20(ReturndataPointer rdPtr)
internal
pure
returns (bytes20 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes21 at `rdPtr` in returndata.
function readBytes21(ReturndataPointer rdPtr)
internal
pure
returns (bytes21 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes22 at `rdPtr` in returndata.
function readBytes22(ReturndataPointer rdPtr)
internal
pure
returns (bytes22 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes23 at `rdPtr` in returndata.
function readBytes23(ReturndataPointer rdPtr)
internal
pure
returns (bytes23 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes24 at `rdPtr` in returndata.
function readBytes24(ReturndataPointer rdPtr)
internal
pure
returns (bytes24 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes25 at `rdPtr` in returndata.
function readBytes25(ReturndataPointer rdPtr)
internal
pure
returns (bytes25 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes26 at `rdPtr` in returndata.
function readBytes26(ReturndataPointer rdPtr)
internal
pure
returns (bytes26 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes27 at `rdPtr` in returndata.
function readBytes27(ReturndataPointer rdPtr)
internal
pure
returns (bytes27 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes28 at `rdPtr` in returndata.
function readBytes28(ReturndataPointer rdPtr)
internal
pure
returns (bytes28 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes29 at `rdPtr` in returndata.
function readBytes29(ReturndataPointer rdPtr)
internal
pure
returns (bytes29 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes30 at `rdPtr` in returndata.
function readBytes30(ReturndataPointer rdPtr)
internal
pure
returns (bytes30 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes31 at `rdPtr` in returndata.
function readBytes31(ReturndataPointer rdPtr)
internal
pure
returns (bytes31 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes32 at `rdPtr` in returndata.
function readBytes32(ReturndataPointer rdPtr)
internal
pure
returns (bytes32 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint8 at `rdPtr` in returndata.
function readUint8(ReturndataPointer rdPtr)
internal
pure
returns (uint8 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint16 at `rdPtr` in returndata.
function readUint16(ReturndataPointer rdPtr)
internal
pure
returns (uint16 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint24 at `rdPtr` in returndata.
function readUint24(ReturndataPointer rdPtr)
internal
pure
returns (uint24 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint32 at `rdPtr` in returndata.
function readUint32(ReturndataPointer rdPtr)
internal
pure
returns (uint32 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint40 at `rdPtr` in returndata.
function readUint40(ReturndataPointer rdPtr)
internal
pure
returns (uint40 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint48 at `rdPtr` in returndata.
function readUint48(ReturndataPointer rdPtr)
internal
pure
returns (uint48 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint56 at `rdPtr` in returndata.
function readUint56(ReturndataPointer rdPtr)
internal
pure
returns (uint56 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint64 at `rdPtr` in returndata.
function readUint64(ReturndataPointer rdPtr)
internal
pure
returns (uint64 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint72 at `rdPtr` in returndata.
function readUint72(ReturndataPointer rdPtr)
internal
pure
returns (uint72 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint80 at `rdPtr` in returndata.
function readUint80(ReturndataPointer rdPtr)
internal
pure
returns (uint80 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint88 at `rdPtr` in returndata.
function readUint88(ReturndataPointer rdPtr)
internal
pure
returns (uint88 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint96 at `rdPtr` in returndata.
function readUint96(ReturndataPointer rdPtr)
internal
pure
returns (uint96 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint104 at `rdPtr` in returndata.
function readUint104(ReturndataPointer rdPtr)
internal
pure
returns (uint104 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint112 at `rdPtr` in returndata.
function readUint112(ReturndataPointer rdPtr)
internal
pure
returns (uint112 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint120 at `rdPtr` in returndata.
function readUint120(ReturndataPointer rdPtr)
internal
pure
returns (uint120 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint128 at `rdPtr` in returndata.
function readUint128(ReturndataPointer rdPtr)
internal
pure
returns (uint128 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint136 at `rdPtr` in returndata.
function readUint136(ReturndataPointer rdPtr)
internal
pure
returns (uint136 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint144 at `rdPtr` in returndata.
function readUint144(ReturndataPointer rdPtr)
internal
pure
returns (uint144 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint152 at `rdPtr` in returndata.
function readUint152(ReturndataPointer rdPtr)
internal
pure
returns (uint152 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint160 at `rdPtr` in returndata.
function readUint160(ReturndataPointer rdPtr)
internal
pure
returns (uint160 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint168 at `rdPtr` in returndata.
function readUint168(ReturndataPointer rdPtr)
internal
pure
returns (uint168 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint176 at `rdPtr` in returndata.
function readUint176(ReturndataPointer rdPtr)
internal
pure
returns (uint176 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint184 at `rdPtr` in returndata.
function readUint184(ReturndataPointer rdPtr)
internal
pure
returns (uint184 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint192 at `rdPtr` in returndata.
function readUint192(ReturndataPointer rdPtr)
internal
pure
returns (uint192 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint200 at `rdPtr` in returndata.
function readUint200(ReturndataPointer rdPtr)
internal
pure
returns (uint200 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint208 at `rdPtr` in returndata.
function readUint208(ReturndataPointer rdPtr)
internal
pure
returns (uint208 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint216 at `rdPtr` in returndata.
function readUint216(ReturndataPointer rdPtr)
internal
pure
returns (uint216 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint224 at `rdPtr` in returndata.
function readUint224(ReturndataPointer rdPtr)
internal
pure
returns (uint224 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint232 at `rdPtr` in returndata.
function readUint232(ReturndataPointer rdPtr)
internal
pure
returns (uint232 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint240 at `rdPtr` in returndata.
function readUint240(ReturndataPointer rdPtr)
internal
pure
returns (uint240 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint248 at `rdPtr` in returndata.
function readUint248(ReturndataPointer rdPtr)
internal
pure
returns (uint248 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint256 at `rdPtr` in returndata.
function readUint256(ReturndataPointer rdPtr)
internal
pure
returns (uint256 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int8 at `rdPtr` in returndata.
function readInt8(ReturndataPointer rdPtr)
internal
pure
returns (int8 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int16 at `rdPtr` in returndata.
function readInt16(ReturndataPointer rdPtr)
internal
pure
returns (int16 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int24 at `rdPtr` in returndata.
function readInt24(ReturndataPointer rdPtr)
internal
pure
returns (int24 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int32 at `rdPtr` in returndata.
function readInt32(ReturndataPointer rdPtr)
internal
pure
returns (int32 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int40 at `rdPtr` in returndata.
function readInt40(ReturndataPointer rdPtr)
internal
pure
returns (int40 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int48 at `rdPtr` in returndata.
function readInt48(ReturndataPointer rdPtr)
internal
pure
returns (int48 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int56 at `rdPtr` in returndata.
function readInt56(ReturndataPointer rdPtr)
internal
pure
returns (int56 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int64 at `rdPtr` in returndata.
function readInt64(ReturndataPointer rdPtr)
internal
pure
returns (int64 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int72 at `rdPtr` in returndata.
function readInt72(ReturndataPointer rdPtr)
internal
pure
returns (int72 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int80 at `rdPtr` in returndata.
function readInt80(ReturndataPointer rdPtr)
internal
pure
returns (int80 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int88 at `rdPtr` in returndata.
function readInt88(ReturndataPointer rdPtr)
internal
pure
returns (int88 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int96 at `rdPtr` in returndata.
function readInt96(ReturndataPointer rdPtr)
internal
pure
returns (int96 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int104 at `rdPtr` in returndata.
function readInt104(ReturndataPointer rdPtr)
internal
pure
returns (int104 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int112 at `rdPtr` in returndata.
function readInt112(ReturndataPointer rdPtr)
internal
pure
returns (int112 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int120 at `rdPtr` in returndata.
function readInt120(ReturndataPointer rdPtr)
internal
pure
returns (int120 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int128 at `rdPtr` in returndata.
function readInt128(ReturndataPointer rdPtr)
internal
pure
returns (int128 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int136 at `rdPtr` in returndata.
function readInt136(ReturndataPointer rdPtr)
internal
pure
returns (int136 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int144 at `rdPtr` in returndata.
function readInt144(ReturndataPointer rdPtr)
internal
pure
returns (int144 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int152 at `rdPtr` in returndata.
function readInt152(ReturndataPointer rdPtr)
internal
pure
returns (int152 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int160 at `rdPtr` in returndata.
function readInt160(ReturndataPointer rdPtr)
internal
pure
returns (int160 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int168 at `rdPtr` in returndata.
function readInt168(ReturndataPointer rdPtr)
internal
pure
returns (int168 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int176 at `rdPtr` in returndata.
function readInt176(ReturndataPointer rdPtr)
internal
pure
returns (int176 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int184 at `rdPtr` in returndata.
function readInt184(ReturndataPointer rdPtr)
internal
pure
returns (int184 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int192 at `rdPtr` in returndata.
function readInt192(ReturndataPointer rdPtr)
internal
pure
returns (int192 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int200 at `rdPtr` in returndata.
function readInt200(ReturndataPointer rdPtr)
internal
pure
returns (int200 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int208 at `rdPtr` in returndata.
function readInt208(ReturndataPointer rdPtr)
internal
pure
returns (int208 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int216 at `rdPtr` in returndata.
function readInt216(ReturndataPointer rdPtr)
internal
pure
returns (int216 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int224 at `rdPtr` in returndata.
function readInt224(ReturndataPointer rdPtr)
internal
pure
returns (int224 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int232 at `rdPtr` in returndata.
function readInt232(ReturndataPointer rdPtr)
internal
pure
returns (int232 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int240 at `rdPtr` in returndata.
function readInt240(ReturndataPointer rdPtr)
internal
pure
returns (int240 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int248 at `rdPtr` in returndata.
function readInt248(ReturndataPointer rdPtr)
internal
pure
returns (int248 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int256 at `rdPtr` in returndata.
function readInt256(ReturndataPointer rdPtr)
internal
pure
returns (int256 value)
{
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
}
library MemoryReaders {
/// @dev Reads the memory pointer at `mPtr` in memory.
function readMemoryPointer(MemoryPointer mPtr)
internal
pure
returns (MemoryPointer value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads value at `mPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(MemoryPointer mPtr)
internal
pure
returns (uint256 value)
{
value = mPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `mPtr` in memory.
function readBool(MemoryPointer mPtr) internal pure returns (bool value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the address at `mPtr` in memory.
function readAddress(MemoryPointer mPtr)
internal
pure
returns (address value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes1 at `mPtr` in memory.
function readBytes1(MemoryPointer mPtr)
internal
pure
returns (bytes1 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes2 at `mPtr` in memory.
function readBytes2(MemoryPointer mPtr)
internal
pure
returns (bytes2 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes3 at `mPtr` in memory.
function readBytes3(MemoryPointer mPtr)
internal
pure
returns (bytes3 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes4 at `mPtr` in memory.
function readBytes4(MemoryPointer mPtr)
internal
pure
returns (bytes4 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes5 at `mPtr` in memory.
function readBytes5(MemoryPointer mPtr)
internal
pure
returns (bytes5 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes6 at `mPtr` in memory.
function readBytes6(MemoryPointer mPtr)
internal
pure
returns (bytes6 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes7 at `mPtr` in memory.
function readBytes7(MemoryPointer mPtr)
internal
pure
returns (bytes7 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes8 at `mPtr` in memory.
function readBytes8(MemoryPointer mPtr)
internal
pure
returns (bytes8 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes9 at `mPtr` in memory.
function readBytes9(MemoryPointer mPtr)
internal
pure
returns (bytes9 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes10 at `mPtr` in memory.
function readBytes10(MemoryPointer mPtr)
internal
pure
returns (bytes10 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes11 at `mPtr` in memory.
function readBytes11(MemoryPointer mPtr)
internal
pure
returns (bytes11 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes12 at `mPtr` in memory.
function readBytes12(MemoryPointer mPtr)
internal
pure
returns (bytes12 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes13 at `mPtr` in memory.
function readBytes13(MemoryPointer mPtr)
internal
pure
returns (bytes13 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes14 at `mPtr` in memory.
function readBytes14(MemoryPointer mPtr)
internal
pure
returns (bytes14 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes15 at `mPtr` in memory.
function readBytes15(MemoryPointer mPtr)
internal
pure
returns (bytes15 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes16 at `mPtr` in memory.
function readBytes16(MemoryPointer mPtr)
internal
pure
returns (bytes16 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes17 at `mPtr` in memory.
function readBytes17(MemoryPointer mPtr)
internal
pure
returns (bytes17 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes18 at `mPtr` in memory.
function readBytes18(MemoryPointer mPtr)
internal
pure
returns (bytes18 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes19 at `mPtr` in memory.
function readBytes19(MemoryPointer mPtr)
internal
pure
returns (bytes19 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes20 at `mPtr` in memory.
function readBytes20(MemoryPointer mPtr)
internal
pure
returns (bytes20 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes21 at `mPtr` in memory.
function readBytes21(MemoryPointer mPtr)
internal
pure
returns (bytes21 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes22 at `mPtr` in memory.
function readBytes22(MemoryPointer mPtr)
internal
pure
returns (bytes22 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes23 at `mPtr` in memory.
function readBytes23(MemoryPointer mPtr)
internal
pure
returns (bytes23 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes24 at `mPtr` in memory.
function readBytes24(MemoryPointer mPtr)
internal
pure
returns (bytes24 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes25 at `mPtr` in memory.
function readBytes25(MemoryPointer mPtr)
internal
pure
returns (bytes25 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes26 at `mPtr` in memory.
function readBytes26(MemoryPointer mPtr)
internal
pure
returns (bytes26 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes27 at `mPtr` in memory.
function readBytes27(MemoryPointer mPtr)
internal
pure
returns (bytes27 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes28 at `mPtr` in memory.
function readBytes28(MemoryPointer mPtr)
internal
pure
returns (bytes28 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes29 at `mPtr` in memory.
function readBytes29(MemoryPointer mPtr)
internal
pure
returns (bytes29 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes30 at `mPtr` in memory.
function readBytes30(MemoryPointer mPtr)
internal
pure
returns (bytes30 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes31 at `mPtr` in memory.
function readBytes31(MemoryPointer mPtr)
internal
pure
returns (bytes31 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes32 at `mPtr` in memory.
function readBytes32(MemoryPointer mPtr)
internal
pure
returns (bytes32 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint8 at `mPtr` in memory.
function readUint8(MemoryPointer mPtr)
internal
pure
returns (uint8 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint16 at `mPtr` in memory.
function readUint16(MemoryPointer mPtr)
internal
pure
returns (uint16 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint24 at `mPtr` in memory.
function readUint24(MemoryPointer mPtr)
internal
pure
returns (uint24 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint32 at `mPtr` in memory.
function readUint32(MemoryPointer mPtr)
internal
pure
returns (uint32 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint40 at `mPtr` in memory.
function readUint40(MemoryPointer mPtr)
internal
pure
returns (uint40 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint48 at `mPtr` in memory.
function readUint48(MemoryPointer mPtr)
internal
pure
returns (uint48 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint56 at `mPtr` in memory.
function readUint56(MemoryPointer mPtr)
internal
pure
returns (uint56 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint64 at `mPtr` in memory.
function readUint64(MemoryPointer mPtr)
internal
pure
returns (uint64 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint72 at `mPtr` in memory.
function readUint72(MemoryPointer mPtr)
internal
pure
returns (uint72 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint80 at `mPtr` in memory.
function readUint80(MemoryPointer mPtr)
internal
pure
returns (uint80 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint88 at `mPtr` in memory.
function readUint88(MemoryPointer mPtr)
internal
pure
returns (uint88 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint96 at `mPtr` in memory.
function readUint96(MemoryPointer mPtr)
internal
pure
returns (uint96 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint104 at `mPtr` in memory.
function readUint104(MemoryPointer mPtr)
internal
pure
returns (uint104 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint112 at `mPtr` in memory.
function readUint112(MemoryPointer mPtr)
internal
pure
returns (uint112 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint120 at `mPtr` in memory.
function readUint120(MemoryPointer mPtr)
internal
pure
returns (uint120 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint128 at `mPtr` in memory.
function readUint128(MemoryPointer mPtr)
internal
pure
returns (uint128 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint136 at `mPtr` in memory.
function readUint136(MemoryPointer mPtr)
internal
pure
returns (uint136 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint144 at `mPtr` in memory.
function readUint144(MemoryPointer mPtr)
internal
pure
returns (uint144 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint152 at `mPtr` in memory.
function readUint152(MemoryPointer mPtr)
internal
pure
returns (uint152 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint160 at `mPtr` in memory.
function readUint160(MemoryPointer mPtr)
internal
pure
returns (uint160 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint168 at `mPtr` in memory.
function readUint168(MemoryPointer mPtr)
internal
pure
returns (uint168 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint176 at `mPtr` in memory.
function readUint176(MemoryPointer mPtr)
internal
pure
returns (uint176 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint184 at `mPtr` in memory.
function readUint184(MemoryPointer mPtr)
internal
pure
returns (uint184 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint192 at `mPtr` in memory.
function readUint192(MemoryPointer mPtr)
internal
pure
returns (uint192 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint200 at `mPtr` in memory.
function readUint200(MemoryPointer mPtr)
internal
pure
returns (uint200 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint208 at `mPtr` in memory.
function readUint208(MemoryPointer mPtr)
internal
pure
returns (uint208 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint216 at `mPtr` in memory.
function readUint216(MemoryPointer mPtr)
internal
pure
returns (uint216 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint224 at `mPtr` in memory.
function readUint224(MemoryPointer mPtr)
internal
pure
returns (uint224 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint232 at `mPtr` in memory.
function readUint232(MemoryPointer mPtr)
internal
pure
returns (uint232 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint240 at `mPtr` in memory.
function readUint240(MemoryPointer mPtr)
internal
pure
returns (uint240 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint248 at `mPtr` in memory.
function readUint248(MemoryPointer mPtr)
internal
pure
returns (uint248 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint256 at `mPtr` in memory.
function readUint256(MemoryPointer mPtr)
internal
pure
returns (uint256 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int8 at `mPtr` in memory.
function readInt8(MemoryPointer mPtr) internal pure returns (int8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int16 at `mPtr` in memory.
function readInt16(MemoryPointer mPtr)
internal
pure
returns (int16 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int24 at `mPtr` in memory.
function readInt24(MemoryPointer mPtr)
internal
pure
returns (int24 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int32 at `mPtr` in memory.
function readInt32(MemoryPointer mPtr)
internal
pure
returns (int32 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int40 at `mPtr` in memory.
function readInt40(MemoryPointer mPtr)
internal
pure
returns (int40 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int48 at `mPtr` in memory.
function readInt48(MemoryPointer mPtr)
internal
pure
returns (int48 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int56 at `mPtr` in memory.
function readInt56(MemoryPointer mPtr)
internal
pure
returns (int56 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int64 at `mPtr` in memory.
function readInt64(MemoryPointer mPtr)
internal
pure
returns (int64 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int72 at `mPtr` in memory.
function readInt72(MemoryPointer mPtr)
internal
pure
returns (int72 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int80 at `mPtr` in memory.
function readInt80(MemoryPointer mPtr)
internal
pure
returns (int80 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int88 at `mPtr` in memory.
function readInt88(MemoryPointer mPtr)
internal
pure
returns (int88 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int96 at `mPtr` in memory.
function readInt96(MemoryPointer mPtr)
internal
pure
returns (int96 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int104 at `mPtr` in memory.
function readInt104(MemoryPointer mPtr)
internal
pure
returns (int104 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int112 at `mPtr` in memory.
function readInt112(MemoryPointer mPtr)
internal
pure
returns (int112 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int120 at `mPtr` in memory.
function readInt120(MemoryPointer mPtr)
internal
pure
returns (int120 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int128 at `mPtr` in memory.
function readInt128(MemoryPointer mPtr)
internal
pure
returns (int128 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int136 at `mPtr` in memory.
function readInt136(MemoryPointer mPtr)
internal
pure
returns (int136 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int144 at `mPtr` in memory.
function readInt144(MemoryPointer mPtr)
internal
pure
returns (int144 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int152 at `mPtr` in memory.
function readInt152(MemoryPointer mPtr)
internal
pure
returns (int152 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int160 at `mPtr` in memory.
function readInt160(MemoryPointer mPtr)
internal
pure
returns (int160 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int168 at `mPtr` in memory.
function readInt168(MemoryPointer mPtr)
internal
pure
returns (int168 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int176 at `mPtr` in memory.
function readInt176(MemoryPointer mPtr)
internal
pure
returns (int176 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int184 at `mPtr` in memory.
function readInt184(MemoryPointer mPtr)
internal
pure
returns (int184 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int192 at `mPtr` in memory.
function readInt192(MemoryPointer mPtr)
internal
pure
returns (int192 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int200 at `mPtr` in memory.
function readInt200(MemoryPointer mPtr)
internal
pure
returns (int200 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int208 at `mPtr` in memory.
function readInt208(MemoryPointer mPtr)
internal
pure
returns (int208 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int216 at `mPtr` in memory.
function readInt216(MemoryPointer mPtr)
internal
pure
returns (int216 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int224 at `mPtr` in memory.
function readInt224(MemoryPointer mPtr)
internal
pure
returns (int224 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int232 at `mPtr` in memory.
function readInt232(MemoryPointer mPtr)
internal
pure
returns (int232 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int240 at `mPtr` in memory.
function readInt240(MemoryPointer mPtr)
internal
pure
returns (int240 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int248 at `mPtr` in memory.
function readInt248(MemoryPointer mPtr)
internal
pure
returns (int248 value)
{
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int256 at `mPtr` in memory.
function readInt256(MemoryPointer mPtr)
internal
pure
returns (int256 value)
{
assembly {
value := mload(mPtr)
}
}
}
library MemoryWriters {
/// @dev Writes `valuePtr` to memory at `mPtr`.
function write(MemoryPointer mPtr, MemoryPointer valuePtr) internal pure {
assembly {
mstore(mPtr, valuePtr)
}
}
/// @dev Writes a boolean `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, bool value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an address `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, address value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a bytes32 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeBytes32(MemoryPointer mPtr, bytes32 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a uint256 `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, uint256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an int256 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeInt(MemoryPointer mPtr, int256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import { ZoneParameters, Schema } from "../lib/ConsiderationStructs.sol";
import { IERC165 } from "./IERC165.sol";
/**
* @title ZoneInterface
* @notice Contains functions exposed by a zone.
*/
interface ZoneInterface is IERC165 {
/**
* @dev Authorizes an order before any token fulfillments from any order have been executed by Seaport.
*
* @param zoneParameters The context about the order fulfillment and any
* supplied extraData.
*
* @return authorizedOrderMagicValue The magic value that indicates a valid
* order.
*/
function authorizeOrder(ZoneParameters calldata zoneParameters)
external
returns (bytes4 authorizedOrderMagicValue);
/**
* @dev Validates an order after all token fulfillments for all orders have been executed by Seaport.
*
* @param zoneParameters The context about the order fulfillment and any
* supplied extraData.
*
* @return validOrderMagicValue The magic value that indicates a valid
* order.
*/
function validateOrder(ZoneParameters calldata zoneParameters)
external
returns (bytes4 validOrderMagicValue);
/**
* @dev Returns the metadata for this zone.
*
* @return name The name of the zone.
* @return schemas The schemas that the zone implements.
*/
function getSeaportMetadata()
external
view
returns (string memory name, Schema[] memory schemas); // map to Seaport Improvement Proposal IDs
/**
* @dev Returns if the zone supports the interfaceId.
*
* @param interfaceId The interface identifier, as specified in ERC-165.
*
* @return supportsInterface True if the zone supports interfaceId, false
*/
function supportsInterface(bytes4 interfaceId)
external
view
override
returns (bool supportsInterface);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.7;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId)
external
view
returns (bool);
}{
"remappings": [
"@rari-capital/solmate/=lib/solmate/",
"ds-test/=lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"murky/=lib/murky/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"solarray/=lib/solarray/src/",
"solady/=lib/solady/",
"seaport-sol/src/=src/sol/",
"seaport-sol/=src/sol/",
"seaport-types/src/=src/types/",
"seaport-types/=src/types/",
"seaport-core/src/=src/core/",
"seaport-core/=src/core/",
"seaport/=src/main/",
"@limitbreak/creator-token-standards/=lib/erc721c-seaport/lib/creator-token-standards/src/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ERC721A/=lib/erc721c-seaport/lib/creator-token-standards/lib/ERC721A/contracts/",
"creator-token-standards/=lib/erc721c-seaport/lib/creator-token-standards/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"erc721a/=lib/erc721c-seaport/lib/creator-token-standards/lib/ERC721A/",
"erc721c-seaport/=lib/erc721c-seaport/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"seaport-deploy/=lib/erc721c-seaport/lib/seaport-deploy/",
"solmate/=lib/solmate/src/"
],
"optimizer": {
"enabled": true,
"runs": 9999999
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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
600361018052620322e360ec1b6101a0527f88f72b566ae0c96f6fffac4bc8ac74909f61512ac0c06a8124d5ed420d306f9060c0526c08a92a06e626488dedac2d2dc5609b1b6101e09081526b1cdd1c9a5b99c81b985b594b60a21b6101ed526e1cdd1c9a5b99c81d995c9cda5bdb8b608a1b6101f9526f1d5a5b9d0c8d4d8818da185a5b92590b60821b610208527f6164647265737320766572696679696e67436f6e74726163740000000000000061021852602960f81b61023181905260526101c081905290912060e0526b0a6d2cedccac89ee4c8cae4560a31b610252908152711859191c995cdcc8199d5b199a5b1b195c8b60721b61025e52711d5a5b9d0d8d08195e1c1a5c985d1a5bdb8b60721b6102705271189e5d195ccccc881bdc99195c92185cda0b60721b610282526c189e5d195cc818dbdb9d195e1d609a1b610294526102a19190915260506102328190526102a260405290206101005246610120526c68f116a894984e2db1123eb3956101605234801562000183575f80fd5b5060405162001eab38038062001eab833981016040819052620001a69162000235565b336080528051602082012060a052620001ee60e05160a0805160c05160408051608080515f978852602095909552928252466060908152308452948620915293909252905290565b610140526040517f98a7ac23945182ac62b68fbe5ba35cc0bf5c4c34b3a410ce94a4c2270282d6b5905f90a15062000303565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121562000247575f80fd5b82516001600160401b03808211156200025e575f80fd5b818501915085601f83011262000272575f80fd5b81518181111562000287576200028762000221565b604051601f8201601f19908116603f01168101908382118183101715620002b257620002b262000221565b816040528281528886848701011115620002ca575f80fd5b5f93505b82841015620002ed5784840186015181850187015292850192620002ce565b5f86848301015280965050505050505092915050565b60805160a05160c05160e05161010051610120516101405161016051611b37620003745f395f81816103d4015261077a01525f610bed01525f610b3501525f610a8801525f610b6501525f610bae01525f610b8a01525f8181610318015281816108d101526112bd0152611b375ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301e4d72a1461022f57806301ffc9a71461027857806317b1f9421461029b5780632e778efc146102ae575b5f3660607fffffffff000000000000000000000000000000000000000000000000000000008335167f0b9fa6f50000000000000000000000000000000000000000000000000000000081016100e4575f6100a7366004818461136b565b8101906100b491906113b3565b90505f6100c4366024818461136b565b8101906100d191906113d5565b90506100dd82826102c4565b5050610222565b7f587b47f4000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161015c576101356102e7565b60405160200161014591906113f4565b604051602081830303815290604052915050610224565b7f8200a587000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610215575f6101b3366004818461136b565b8101906101c091906113b3565b90506101f08173ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205460ff1690565b6040805191151560208301520160405160208183030381529060405292505050610224565b6354c91b875f526004601cfd5b505b915050805190602001f35b61024261023d36600461144d565b6103bb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61028b610286366004611485565b610751565b604051901515815260200161026f565b6102426102a936600461144d565b610761565b6102b6610802565b60405161026f92919061152f565b6102cc6108cf565b806102de576102da82610907565b5050565b6102da82610987565b6040517f66a2489f0000000000000000000000000000000000000000000000000000000081523060048201526060907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906366a2489f906024015f60405180830381865afa158015610371573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103b6919081019061166f565b905090565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042b576040517f979a7ba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610433610a03565b365f61044260a0850185611709565b909250905083355f80602460c435018035607e81101561046d5763d232fd2c5f52846020526024601cfd5b50602081013560f81c801561048d5763641157745f52846020526024601cfd5b50607d81013560f81c91506007821060018311166009831117156104bc5763267879995f52836020526024601cfd5b6035013560c01c9150428210156104e25763165460715f5281602052826040526044601cfd5b60a435602401358061055657632be762245f526060602052600160405283606052602a6080527f436f6e73696465726174696f6e206d7573742068617665206174206c6561737460a0527f206f6e65206974656d2e0000000000000000000000000000000000000000000060c05260c4601cfd5b505f61056184610a1c565b9050365f610573605d601d898b61136b565b91509150365f600286101561059957610590607e605d8b8d61136b565b915091506105f6565b856007036105c95760a68910156105bb5763d232fd2c5f52876020526024601cfd5b61059060a6605d8b8d61136b565b60928910156105e35763d232fd2c5f52876020526024601cfd5b6105f16092605d8b8d61136b565b915091505b5f61060486898b8686610a85565b90505f61064c610612610b32565b7f19010000000000000000000000000000000000000000000000000000000000005f90815260029190915260228481526042822091905290565b90505f61068e8288888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c0f92505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020819052604090205490915060ff16610712576040517f17c3008900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018c905260440160405180910390fd5b61071d8f6001610c9b565b507f01e4d72a000000000000000000000000000000000000000000000000000000009e9d5050505050505050505050505050565b5f61075b8261119d565b92915050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107d1576040517f979a7ba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107db825f610c9b565b507f17b1f94200000000000000000000000000000000000000000000000000000000919050565b604080516001808252818301909252606091829190816020015b604080518082019091525f81526060602082015281526020019060019003908161081c5790505090506007815f8151811061085957610859611771565b6020908102919091010151525f8080808061087261127d565b9450945094509450945083965084838383604051602001610896949392919061179e565b604051602081830303815290604052865f815181106108b7576108b7611771565b60200260200101516020018190525050505050509091565b7f000000000000000000000000000000000000000000000000000000000000000033811461090457636d5769be5f526004601cfd5b50565b73ffffffffffffffffffffffffffffffffffffffff81165f818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b91015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81165f818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f24910161097c565b602060043514610a1a576346d5d8955f526004601cfd5b565b60c435604581013560601c906044359060a2013560a43560840135828414158415151615610a5d57631bcf9bb75f528360205282604052846060526064601cfd5b808214610a7d5763b36c03e85f528160205280604052846060526064601cfd5b505050919050565b5f7f00000000000000000000000000000000000000000000000000000000000000008686868686604051610aba92919061180c565b604051908190038120610b11959493929160200194855273ffffffffffffffffffffffffffffffffffffffff93909316602085015267ffffffffffffffff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120905095945050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610bea575060408051608080517f00000000000000000000000000000000000000000000000000000000000000005f9081527f00000000000000000000000000000000000000000000000000000000000000006020527f0000000000000000000000000000000000000000000000000000000000000000855246606090815230845260a08220949095529093529190915290565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f805f525f82516020840380518260410360018111610c8f57604087015160608801515f1a95508115610c6e57601b8160ff1c0195507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811660408901525b85885288845260205f60808660015afa5082845284885260408801525f5195505b50905250909392505050565b5f610ca960a0840184611709565b605d818110610cba57610cba611771565b919091013560f81c9150506002811015610cd357505050565b5f610ce160a0850185611709565b610cf091609291607e9161136b565b610cf99161181b565b60601c90505f80806001610d106080890189611863565b5f818110610d2057610d20611771565b610d3692602060a09092020190810191506118c6565b6005811115610d4757610d476118e4565b1115610dde57610d5a6080880188611863565b5f818110610d6a57610d6a611771565b905060a002016020016020810190610d8291906113b3565b9250610d916080880188611863565b5f818110610da157610da1611771565b905060a00201604001359150868060800190610dbd9190611863565b5f818110610dcd57610dcd611771565b905060a00201606001359050610e6b565b610deb6060880188611911565b5f818110610dfb57610dfb611771565b9050608002016020016020810190610e1391906113b3565b9250610e226060880188611911565b5f818110610e3257610e32611771565b905060800201604001359150868060600190610e4e9190611911565b5f818110610e5e57610e5e611771565b9050608002016060013590505b8460ff16600703610fb3575f610e8460a0890189611709565b610e939160a69160929161136b565b610e9c9161181b565b60601c90508615610f30576040517f5079331500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff828116600483015285811660248301528616906350793315906044015f604051808303815f87803b158015610f15575f80fd5b505af1158015610f27573d5f803e3d5ffd5b50505050610fad565b6040517f0ad3889900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152861690630ad38899906024015f604051808303815f87803b158015610f96575f80fd5b505af1158015610fa8573d5f803e3d5ffd5b505050505b50611194565b8460ff166008036110a857851561104d576040517f3a0e316000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052851690633a0e3160906044015b5f604051808303815f87803b158015611032575f80fd5b505af1158015611044573d5f803e3d5ffd5b50505050611194565b6040517fb89c4b0d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063b89c4b0d9060440161101b565b8515611110576040517f28cc113100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390528516906328cc11319060640161101b565b6040517fb6e39ba100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063b6e39ba1906044015f604051808303815f87803b15801561117d575f80fd5b505af115801561118f573d5f803e3d5ffd5b505050505b50505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2e778efc00000000000000000000000000000000000000000000000000000000148061122f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f39dd693300000000000000000000000000000000000000000000000000000000145b8061075b5750507fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b5f60608060608061128c610b32565b6040517f04789c980000000000000000000000000000000000000000000000000000000081523060048201529095507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906304789c98906024015f60405180830381865afa158015611316573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261135b91908101906119fc565b9899929891975095509350915050565b5f8085851115611379575f80fd5b83861115611385575f80fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff81168114610904575f80fd5b5f602082840312156113c3575f80fd5b81356113ce81611392565b9392505050565b5f602082840312156113e5575f80fd5b813580151581146113ce575f80fd5b602080825282518282018190525f9190848201906040850190845b8181101561144157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161140f565b50909695505050505050565b5f6020828403121561145d575f80fd5b813567ffffffffffffffff811115611473575f80fd5b820161014081850312156113ce575f80fd5b5f60208284031215611495575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146113ce575f80fd5b5f5b838110156114de5781810151838201526020016114c6565b50505f910152565b5f81518084526114fd8160208601602086016114c4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f604080835261154260408401866114e6565b6020848203818601528186518084528284019150828160051b8501018389015f5b838110156115c0578683037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00185528151805184528601518684018990526115ad898501826114e6565b9587019593505090850190600101611563565b50909a9950505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611644576116446115d0565b604052919050565b5f67ffffffffffffffff821115611665576116656115d0565b5060051b60200190565b5f6020808385031215611680575f80fd5b825167ffffffffffffffff811115611696575f80fd5b8301601f810185136116a6575f80fd5b80516116b96116b48261164c565b6115fd565b81815260059190911b820183019083810190878311156116d7575f80fd5b928401925b828410156116fe5783516116ef81611392565b825292840192908401906116dc565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261173c575f80fd5b83018035915067ffffffffffffffff821115611756575f80fd5b60200191503681900382131561176a575f80fd5b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8481525f6020608060208401526117b860808401876114e6565b8381036040850152855180825260208088019201905f5b818110156117eb578351835292840192918401916001016117cf565b505084810360608601526117ff81876114e6565b9998505050505050505050565b818382375f9101908152919050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561185b5780818660140360031b1b83161692505b505092915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611896575f80fd5b83018035915067ffffffffffffffff8211156118b0575f80fd5b602001915060a08102360382131561176a575f80fd5b5f602082840312156118d6575f80fd5b8135600681106113ce575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611944575f80fd5b83018035915067ffffffffffffffff82111561195e575f80fd5b6020019150600781901b360382131561176a575f80fd5b5f82601f830112611984575f80fd5b815167ffffffffffffffff81111561199e5761199e6115d0565b6119cf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016115fd565b8181528460208386010111156119e3575f80fd5b6119f48260208301602087016114c4565b949350505050565b5f805f805f60a08688031215611a10575f80fd5b8551945060208087015167ffffffffffffffff80821115611a2f575f80fd5b611a3b8a838b01611975565b96506040890151915080821115611a50575f80fd5b611a5c8a838b01611975565b95506060890151915080821115611a71575f80fd5b818901915089601f830112611a84575f80fd5b8151611a926116b48261164c565b81815260059190911b8301840190848101908c831115611ab0575f80fd5b938501935b82851015611ace57845182529385019390850190611ab5565b60808c01519097509450505080831115611ae6575f80fd5b5050611af488828901611975565b915050929550929590935056fea26469706673582212208cf0e76ef76b2bee85dd5f1436a047bf9c87ae5f888e0b194385b99aece78a8664736f6c63430008180033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000114f70656e5365615369676e65645a6f6e65000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301e4d72a1461022f57806301ffc9a71461027857806317b1f9421461029b5780632e778efc146102ae575b5f3660607fffffffff000000000000000000000000000000000000000000000000000000008335167f0b9fa6f50000000000000000000000000000000000000000000000000000000081016100e4575f6100a7366004818461136b565b8101906100b491906113b3565b90505f6100c4366024818461136b565b8101906100d191906113d5565b90506100dd82826102c4565b5050610222565b7f587b47f4000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161015c576101356102e7565b60405160200161014591906113f4565b604051602081830303815290604052915050610224565b7f8200a587000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601610215575f6101b3366004818461136b565b8101906101c091906113b3565b90506101f08173ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205460ff1690565b6040805191151560208301520160405160208183030381529060405292505050610224565b6354c91b875f526004601cfd5b505b915050805190602001f35b61024261023d36600461144d565b6103bb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61028b610286366004611485565b610751565b604051901515815260200161026f565b6102426102a936600461144d565b610761565b6102b6610802565b60405161026f92919061152f565b6102cc6108cf565b806102de576102da82610907565b5050565b6102da82610987565b6040517f66a2489f0000000000000000000000000000000000000000000000000000000081523060048201526060907f000000000000000000000000000000657e498d54000053b69bdaad008a001dbf73ffffffffffffffffffffffffffffffffffffffff16906366a2489f906024015f60405180830381865afa158015610371573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103b6919081019061166f565b905090565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000068f116a894984e2db1123eb395161461042b576040517f979a7ba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610433610a03565b365f61044260a0850185611709565b909250905083355f80602460c435018035607e81101561046d5763d232fd2c5f52846020526024601cfd5b50602081013560f81c801561048d5763641157745f52846020526024601cfd5b50607d81013560f81c91506007821060018311166009831117156104bc5763267879995f52836020526024601cfd5b6035013560c01c9150428210156104e25763165460715f5281602052826040526044601cfd5b60a435602401358061055657632be762245f526060602052600160405283606052602a6080527f436f6e73696465726174696f6e206d7573742068617665206174206c6561737460a0527f206f6e65206974656d2e0000000000000000000000000000000000000000000060c05260c4601cfd5b505f61056184610a1c565b9050365f610573605d601d898b61136b565b91509150365f600286101561059957610590607e605d8b8d61136b565b915091506105f6565b856007036105c95760a68910156105bb5763d232fd2c5f52876020526024601cfd5b61059060a6605d8b8d61136b565b60928910156105e35763d232fd2c5f52876020526024601cfd5b6105f16092605d8b8d61136b565b915091505b5f61060486898b8686610a85565b90505f61064c610612610b32565b7f19010000000000000000000000000000000000000000000000000000000000005f90815260029190915260228481526042822091905290565b90505f61068e8288888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c0f92505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020819052604090205490915060ff16610712576040517f17c3008900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018c905260440160405180910390fd5b61071d8f6001610c9b565b507f01e4d72a000000000000000000000000000000000000000000000000000000009e9d5050505050505050505050505050565b5f61075b8261119d565b92915050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000068f116a894984e2db1123eb39516146107d1576040517f979a7ba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107db825f610c9b565b507f17b1f94200000000000000000000000000000000000000000000000000000000919050565b604080516001808252818301909252606091829190816020015b604080518082019091525f81526060602082015281526020019060019003908161081c5790505090506007815f8151811061085957610859611771565b6020908102919091010151525f8080808061087261127d565b9450945094509450945083965084838383604051602001610896949392919061179e565b604051602081830303815290604052865f815181106108b7576108b7611771565b60200260200101516020018190525050505050509091565b7f000000000000000000000000000000657e498d54000053b69bdaad008a001dbf33811461090457636d5769be5f526004601cfd5b50565b73ffffffffffffffffffffffffffffffffffffffff81165f818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b91015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81165f818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f24910161097c565b602060043514610a1a576346d5d8955f526004601cfd5b565b60c435604581013560601c906044359060a2013560a43560840135828414158415151615610a5d57631bcf9bb75f528360205282604052846060526064601cfd5b808214610a7d5763b36c03e85f528160205280604052846060526064601cfd5b505050919050565b5f7f58d1345cbd7d0ceb38b86441d42a4086bc412b7f1ed7d947a569ed7d68b1b7908686868686604051610aba92919061180c565b604051908190038120610b11959493929160200194855273ffffffffffffffffffffffffffffffffffffffff93909316602085015267ffffffffffffffff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120905095945050505050565b5f7f00000000000000000000000000000000000000000000000000000000000081734614610bea575060408051608080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f9081527f9d5b9438a9d7eeaa076af4212c6fe8fab33591a0bc22cc712826de09a81ab4476020527f88f72b566ae0c96f6fffac4bc8ac74909f61512ac0c06a8124d5ed420d306f90855246606090815230845260a08220949095529093529190915290565b507f17f15dd8fbcdddb102541974c37de2b9f972b7acebf875a1427d676c146a7b1390565b5f805f525f82516020840380518260410360018111610c8f57604087015160608801515f1a95508115610c6e57601b8160ff1c0195507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811660408901525b85885288845260205f60808660015afa5082845284885260408801525f5195505b50905250909392505050565b5f610ca960a0840184611709565b605d818110610cba57610cba611771565b919091013560f81c9150506002811015610cd357505050565b5f610ce160a0850185611709565b610cf091609291607e9161136b565b610cf99161181b565b60601c90505f80806001610d106080890189611863565b5f818110610d2057610d20611771565b610d3692602060a09092020190810191506118c6565b6005811115610d4757610d476118e4565b1115610dde57610d5a6080880188611863565b5f818110610d6a57610d6a611771565b905060a002016020016020810190610d8291906113b3565b9250610d916080880188611863565b5f818110610da157610da1611771565b905060a00201604001359150868060800190610dbd9190611863565b5f818110610dcd57610dcd611771565b905060a00201606001359050610e6b565b610deb6060880188611911565b5f818110610dfb57610dfb611771565b9050608002016020016020810190610e1391906113b3565b9250610e226060880188611911565b5f818110610e3257610e32611771565b905060800201604001359150868060600190610e4e9190611911565b5f818110610e5e57610e5e611771565b9050608002016060013590505b8460ff16600703610fb3575f610e8460a0890189611709565b610e939160a69160929161136b565b610e9c9161181b565b60601c90508615610f30576040517f5079331500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff828116600483015285811660248301528616906350793315906044015f604051808303815f87803b158015610f15575f80fd5b505af1158015610f27573d5f803e3d5ffd5b50505050610fad565b6040517f0ad3889900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152861690630ad38899906024015f604051808303815f87803b158015610f96575f80fd5b505af1158015610fa8573d5f803e3d5ffd5b505050505b50611194565b8460ff166008036110a857851561104d576040517f3a0e316000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052851690633a0e3160906044015b5f604051808303815f87803b158015611032575f80fd5b505af1158015611044573d5f803e3d5ffd5b50505050611194565b6040517fb89c4b0d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063b89c4b0d9060440161101b565b8515611110576040517f28cc113100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052604482018390528516906328cc11319060640161101b565b6040517fb6e39ba100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063b6e39ba1906044015f604051808303815f87803b15801561117d575f80fd5b505af115801561118f573d5f803e3d5ffd5b505050505b50505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2e778efc00000000000000000000000000000000000000000000000000000000148061122f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f39dd693300000000000000000000000000000000000000000000000000000000145b8061075b5750507fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b5f60608060608061128c610b32565b6040517f04789c980000000000000000000000000000000000000000000000000000000081523060048201529095507f000000000000000000000000000000657e498d54000053b69bdaad008a001dbf73ffffffffffffffffffffffffffffffffffffffff16906304789c98906024015f60405180830381865afa158015611316573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261135b91908101906119fc565b9899929891975095509350915050565b5f8085851115611379575f80fd5b83861115611385575f80fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff81168114610904575f80fd5b5f602082840312156113c3575f80fd5b81356113ce81611392565b9392505050565b5f602082840312156113e5575f80fd5b813580151581146113ce575f80fd5b602080825282518282018190525f9190848201906040850190845b8181101561144157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161140f565b50909695505050505050565b5f6020828403121561145d575f80fd5b813567ffffffffffffffff811115611473575f80fd5b820161014081850312156113ce575f80fd5b5f60208284031215611495575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146113ce575f80fd5b5f5b838110156114de5781810151838201526020016114c6565b50505f910152565b5f81518084526114fd8160208601602086016114c4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f604080835261154260408401866114e6565b6020848203818601528186518084528284019150828160051b8501018389015f5b838110156115c0578683037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00185528151805184528601518684018990526115ad898501826114e6565b9587019593505090850190600101611563565b50909a9950505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611644576116446115d0565b604052919050565b5f67ffffffffffffffff821115611665576116656115d0565b5060051b60200190565b5f6020808385031215611680575f80fd5b825167ffffffffffffffff811115611696575f80fd5b8301601f810185136116a6575f80fd5b80516116b96116b48261164c565b6115fd565b81815260059190911b820183019083810190878311156116d7575f80fd5b928401925b828410156116fe5783516116ef81611392565b825292840192908401906116dc565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261173c575f80fd5b83018035915067ffffffffffffffff821115611756575f80fd5b60200191503681900382131561176a575f80fd5b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8481525f6020608060208401526117b860808401876114e6565b8381036040850152855180825260208088019201905f5b818110156117eb578351835292840192918401916001016117cf565b505084810360608601526117ff81876114e6565b9998505050505050505050565b818382375f9101908152919050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561185b5780818660140360031b1b83161692505b505092915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611896575f80fd5b83018035915067ffffffffffffffff8211156118b0575f80fd5b602001915060a08102360382131561176a575f80fd5b5f602082840312156118d6575f80fd5b8135600681106113ce575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611944575f80fd5b83018035915067ffffffffffffffff82111561195e575f80fd5b6020019150600781901b360382131561176a575f80fd5b5f82601f830112611984575f80fd5b815167ffffffffffffffff81111561199e5761199e6115d0565b6119cf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016115fd565b8181528460208386010111156119e3575f80fd5b6119f48260208301602087016114c4565b949350505050565b5f805f805f60a08688031215611a10575f80fd5b8551945060208087015167ffffffffffffffff80821115611a2f575f80fd5b611a3b8a838b01611975565b96506040890151915080821115611a50575f80fd5b611a5c8a838b01611975565b95506060890151915080821115611a71575f80fd5b818901915089601f830112611a84575f80fd5b8151611a926116b48261164c565b81815260059190911b8301840190848101908c831115611ab0575f80fd5b938501935b82851015611ace57845182529385019390850190611ab5565b60808c01519097509450505080831115611ae6575f80fd5b5050611af488828901611975565b915050929550929590935056fea26469706673582212208cf0e76ef76b2bee85dd5f1436a047bf9c87ae5f888e0b194385b99aece78a8664736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000114f70656e5365615369676e65645a6f6e65000000000000000000000000000000
-----Decoded View---------------
Arg [0] : zoneName (string): OpenSeaSignedZone
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [2] : 4f70656e5365615369676e65645a6f6e65000000000000000000000000000000
Deployed Bytecode Sourcemap
922:37707:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3141:19;3228:7;;;;3250:34;;;3246:1559;;3461:14;3489:12;:8;3498:1;3489:8;3461:14;3489:12;:::i;:::-;3478:35;;;;;;;:::i;:::-;3461:52;-1:-1:-1;3527:11:5;3552:13;:8;3561:2;3552:8;3527:11;3552:13;:::i;:::-;3541:33;;;;;;;:::i;:::-;3527:47;;3631:29;3645:6;3653;3631:13;:29::i;:::-;3286:385;;3246:1559;;;3681:39;;;;;3677:1128;;3893:19;:17;:19::i;:::-;3882:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;3875:38;;;;;3677:1128;3934:37;;;;;3930:875;;4093:14;4121:12;:8;4130:1;4121:8;4093:14;4121:12;:::i;:::-;4110:35;;;;;;;:::i;:::-;4093:52;;4258:23;4274:6;21223:16;;21149:4;21223:16;;;;;;;;;;;;;;21085:161;4258:23;4247:35;;;1914:14:12;;1907:22;4247:35:5;;;1889:41:12;1862:18;4247:35:5;;;;;;;;;;;;4240:42;;;;;;3930:875;4542:42;4539:1;4532:53;4740:40;4734:4;4727:54;3930:875;3162:1649;3098:1713;;;;922:37707;;;;;;5174:8682;;;;;;:::i;:::-;;:::i;:::-;;;2514:66:12;2502:79;;;2484:98;;2472:2;2457:18;5174:8682:5;;;;;;;;16040:236;;;;;;:::i;:::-;;:::i;:::-;;;1914:14:12;;1907:22;1889:41;;1877:2;1862:18;16040:236:5;1749:187:12;14209:527:5;;;;;;:::i;:::-;;:::i;14969:822::-;;;:::i;:::-;;;;;;;;:::i;19043:258::-;19169:27;:25;:27::i;:::-;19243:6;:51;;19273:21;19287:6;19273:13;:21::i;:::-;19043:258;;:::o;19243:51::-;19252:18;19263:6;19252:10;:18::i;20531:306::-;20734:96;;;;;20815:4;20734:96;;;4880:74:12;20607:24:5;;20764:11;20734:59;;;;;4853:18:12;;20734:96:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20724:106;;20531:306;:::o;5174:8682::-;5279:32;5327:10;:21;5341:7;5327:21;;5323:129;;5423:18;;;;;;;;;;;;;;5323:129;5505:28;:26;:28::i;:::-;5620:24;;5647;;;;:14;:24;:::i;:::-;5620:51;;-1:-1:-1;5620:51:5;-1:-1:-1;5701:24:5;;5681:17;;6057:4;6076:20;6063:34;6053:45;6134:26;;6277:52;6224:119;;6221:566;;;6452:37;6449:1;6442:48;6558:9;6514:42;6507:61;6737:35;6731:4;6724:49;6221:566;-1:-1:-1;6930:4:5;6912:23;;6899:37;6894:3;6890:47;7008:21;;6998:460;;7139:33;7136:1;7129:44;7237:9;7197:38;7190:57;7412:31;7406:4;7399:45;6998:460;;7702:41;7688:12;7684:60;7650:112;7629:3;7608:168;7582:194;;8023:4;7999:22;7996:32;7969:4;7945:22;7942:32;7917:129;7894:4;7870:22;7867:32;7847:213;7844:672;;;8169:40;8166:1;8159:51;8281:9;8234:45;8227:64;8463:38;8457:4;8450:52;7844:672;8685:27;8667:46;8654:60;8633:3;8612:116;;-1:-1:-1;8794:11:5;8779:27;;8776:544;;;8915:31;8912:1;8905:42;9010:10;8971:37;8964:57;9083:9;9045:36;9038:55;9276:29;9270:4;9263:43;8776:544;9472:29;9459:43;9453:4;9449:54;9419:98;9668:19;9658:1203;;9797:40;9794:1;9787:51;9913:4;9862:49;9855:63;10040:1;9963:55;9935:124;10130:9;10083:45;10076:64;10215:4;10164:49;10157:63;10329:34;10265:42;10237:144;10492:12;10426:44;10398:124;10808:38;10802:4;10795:52;9658:1203;;10994:25;11036:57;11083:9;11036:46;:57::i;:::-;10994:109;-1:-1:-1;11219:24:5;;11246:16;11259:2;11256;11246:9;;:16;:::i;:::-;11219:43;;;;11350:22;;11412:1;11387:22;:26;11383:1487;;;11439:17;11452:3;11449:2;11439:9;;:17;:::i;:::-;11429:27;;;;11383:1487;;;11477:22;11503:1;11477:27;11473:1397;;11543:3;11524:22;;11520:614;;;11691:37;11688:1;11681:48;11850:9;11782:42;11750:131;12066:35;12060:4;12053:49;11520:614;12157:17;12170:3;12167:2;12157:9;;:17;:::i;11473:1397::-;12228:3;12209:22;;12205:614;;;12376:37;12373:1;12366:48;12535:9;12467:42;12435:131;12751:35;12745:4;12738:49;12205:614;12842:17;12855:3;12852:2;12842:9;;:17;:::i;:::-;12832:27;;;;11473:1397;12920:23;12946:131;12982:17;13013:10;13037:9;13060:7;;12946:22;:131::i;:::-;12920:157;;13185:14;13202:90;13235:18;:16;:18::i;:::-;32043:14;31849;32033:25;;;32158:29;32151:54;;;;32517:29;32510:54;;;32641:25;32628:39;;32746:40;;;32628:39;31725:1077;13202:90;13185:107;;13372:23;13398:33;13413:6;13421:9;;13398:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13398:14:5;;-1:-1:-1;;;13398:33:5:i;:::-;13494:25;;;:8;:25;;;;;;;;;;;13372:59;;-1:-1:-1;13494:25:5;;13489:107;;13542:43;;;;;7439:42:12;7427:55;;13542:43:5;;;7409:74:12;7499:18;;;7492:34;;;7382:18;;13542:43:5;;;;;;;13489:107;13664:40;13683:14;13699:4;13664:18;:40::i;:::-;-1:-1:-1;13812:37:5;;5174:8682;-1:-1:-1;;;;;;;;;;;;;;5174:8682:5:o;16040:236::-;16133:4;16238:31;16257:11;16238:18;:31::i;:::-;16231:38;16040:236;-1:-1:-1;;16040:236:5:o;14209:527::-;14313:27;14356:10;:21;14370:7;14356:21;;14352:129;;14452:18;;;;;;;;;;;;;;14352:129;14550:41;14569:14;14585:5;14550:18;:41::i;:::-;-1:-1:-1;14693:36:5;;14209:527;-1:-1:-1;14209:527:5:o;14969:822::-;15200:15;;;15213:1;15200:15;;;;;;;;;15093:18;;;;15200:15;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;15200:15:5;;;;;;;;;;;;;;;15190:25;;15241:1;15225:7;15233:1;15225:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;:13;;;;;15503:18;:16;:18::i;:::-;15291:230;;;;;;;;;;15572:8;15565:15;;15678;15707:11;15732:12;15758:16;15654:130;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15632:7;15640:1;15632:10;;;;;;;;:::i;:::-;;;;;;;:19;;:152;;;;15142:649;;;;;14969:822;;:::o;32918:638::-;33068:11;33185:8;33182:24;;33172:368;;33316:32;33313:1;33306:43;33495:30;33489:4;33482:44;33172:368;33099:451;32918:638::o;19942:232::-;20052:16;;;20071:5;20052:16;;;;;;;;;;;;:24;;;;;;20146:21;;4880:74:12;;;20146:21:5;;4853:18:12;20146:21:5;;;;;;;;19942:232;:::o;19506:223::-;19612:16;;;:8;:16;;;;;;;;;;;;:23;;;;19631:4;19612:23;;;19703:19;;4880:74:12;;;19703:19:5;;4853:18:12;19703:19:5;4734:226:12;33919:871:5;34337:19;34313:21;34300:35;34297:60;34270:504;;34518:43;34515:1;34508:54;34718:41;34712:4;34705:55;34270:504;33919:871::o;35174:3453::-;35717:20;35704:34;35954:24;35950:43;;35937:57;35917:2;35896:112;;35639:31;35626:45;;36338:33;36334:52;36304:96;35788:29;35775:43;36139:31;36135:54;36105:98;36620:38;;;36613:46;36569:25;;36562:33;36541:132;36538:966;;;36782:31;36779:1;36772:42;36925:17;36859:44;36831:129;37069:15;37005:42;36977:125;37164:9;37126:36;37119:55;37460:29;37454:4;37447:43;36538:966;37680:24;37652:26;37649:56;37622:989;;37828:34;37825:1;37818:45;37980:26;37908:50;37880:144;38139:24;38069:48;38041:140;38246:9;38205:39;38198:58;38564:32;38558:4;38551:46;37622:989;;;;35174:3453;;;:::o;23300:490::-;23474:23;23619:22;23659:9;23686:10;23714:9;23751:7;;23741:18;;;;;;;:::i;:::-;;;;;;;;;23591:182;;;;;;;;9231:25:12;;;9304:42;9292:55;;;;9287:2;9272:18;;9265:83;9396:18;9384:31;;;;9379:2;9364:18;;9357:59;9447:2;9432:18;;9425:34;9490:3;9475:19;;9468:35;9218:3;9203:19;;8974:535;23591:182:5;;;;;;;;;;;;;23568:215;;;;;;23550:233;;23300:490;;;;;;;:::o;29593:208::-;29644:7;29714:9;29697:13;:26;:97;;-1:-1:-1;30440:21:5;30434:28;;30574:8;30568:15;;30105:24;30047:23;30676:19;;;30158:10;30715:7;30708:25;30200:13;30746:29;;30866:9;-1:-1:-1;30847:29:5;;;30987:9;30969:28;;31121:9;31108:23;;31193:48;;;;31301:19;;;31376:26;;;;31108:23;20531:306::o;29697:97::-;-1:-1:-1;29738:17:5;;29593:208::o;24140:5135::-;24249:23;24461:1;24458;24451:12;24533:5;24629:9;24623:16;24931:7;24920:9;24916:23;25073:22;25067:29;25540:15;25523;25519:37;25706:1;25697:7;25694:14;25684:3382;;25857:24;25846:9;25842:40;25811:93;26289:24;26278:9;26274:40;26268:47;26241:1;26211:126;26206:131;;26436:7;26433:820;;;26685:17;26636:18;26626:8;26622:33;26589:139;26584:144;;27147:28;27095:18;27058:147;27003:24;26992:9;26988:40;26952:279;26433:820;27438:1;27427:9;27420:20;27650:6;27626:22;27619:38;28312:7;28247:1;28166:19;28085:22;28005:20;27970:5;27930:451;-1:-1:-1;28486:57:5;;;28621:34;;;28783:24;28768:40;;28736:138;-1:-1:-1;29040:8:5;;-1:-1:-1;25684:3382:5;-1:-1:-1;29202:57:5;;-1:-1:-1;24140:5135:5;;;-1:-1:-1;;;24140:5135:5:o;16521:2325::-;16643:28;16700:24;;;;:14;:24;:::i;:::-;16725:2;16700:28;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;16779:1:5;16754:26;;16750:63;;;16796:7;16521:2325;;:::o;16750:63::-;16823:16;16858:24;;;;:14;:24;:::i;:::-;:33;;16887:3;;16883;;16858:33;:::i;:::-;16850:42;;;:::i;:::-;16842:51;;;-1:-1:-1;16904:13:5;;;17036:1;16992:28;;;;:14;:28;:::i;:::-;17021:1;16992:31;;;;;;;:::i;:::-;:40;;;:31;;;;;:40;;;;-1:-1:-1;16992:40:5;:::i;:::-;16984:49;;;;;;;;:::i;:::-;:53;16980:519;;;17104:28;;;;:14;:28;:::i;:::-;17133:1;17104:31;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;;;:::i;:::-;17096:45;-1:-1:-1;17168:28:5;;;;:14;:28;:::i;:::-;17197:1;17168:31;;;;;;;:::i;:::-;;;;;;:42;;;17155:55;;17233:14;:28;;;;;;;;:::i;:::-;17262:1;17233:31;;;;;;;:::i;:::-;;;;;;:38;;;17224:47;;16980:519;;;17345:20;;;;:14;:20;:::i;:::-;17366:1;17345:23;;;;;;;:::i;:::-;;;;;;:29;;;;;;;;;;:::i;:::-;17337:37;-1:-1:-1;17401:20:5;;;;:14;:20;:::i;:::-;17422:1;17401:23;;;;;;;:::i;:::-;;;;;;:34;;;17388:47;;17458:14;:20;;;;;;;;:::i;:::-;17479:1;17458:23;;;;;;;:::i;:::-;;;;;;:30;;;17449:39;;16980:519;17513:22;:27;;17539:1;17513:27;17509:1331;;17556:16;17608:24;;;;:14;:24;:::i;:::-;:33;;17637:3;;17633;;17608:33;:::i;:::-;17600:42;;;:::i;:::-;17575:81;;17556:100;;17674:6;17670:289;;;17700:108;;;;;:91;12149:15:12;;;17700:108:5;;;12131:34:12;12201:15;;;12181:18;;;12174:43;17700:91:5;;;;;12043:18:12;;17700:108:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17670:289;;;17847:97;;;;;:90;4898:55:12;;;17847:97:5;;;4880:74:12;17847:90:5;;;;;4853:18:12;;17847:97:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17670:289;17542:427;17509:1331;;;17979:22;:27;;18005:1;17979:27;17975:865;;18026:6;18022:303;;;18052:110;;;;;:91;7427:55:12;;;18052:110:5;;;7409:74:12;7499:18;;;7492:34;;;18052:91:5;;;;;7382:18:12;;18052:110:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17975:865;;18022:303;18201:109;;;;;:90;7427:55:12;;;18201:109:5;;;7409:74:12;7499:18;;;7492:34;;;18201:90:5;;;;;7382:18:12;;18201:109:5;7235:297:12;17975:865:5;18409:6;18405:425;;;18435:222;;;;;:101;12750:55:12;;;18435:222:5;;;12732:74:12;12822:18;;;12815:34;;;12865:18;;;12858:34;;;18435:101:5;;;;;12705:18:12;;18435:222:5;12530:368:12;18405:425:5;18696:119;;;;;:100;7427:55:12;;;18696:119:5;;;7409:74:12;7499:18;;;7492:34;;;18696:100:5;;;;;7382:18:12;;18696:119:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18405:425;16633:2213;;;;;16521:2325;;:::o;21395:355::-;21480:4;21556:46;;;21571:31;21556:46;;:117;;-1:-1:-1;21627:46:5;;;21642:31;21627:46;21556:117;:175;;;-1:-1:-1;;21706:25:5;;;;;21395:355::o;22227:680::-;22315:23;22352:22;22388:25;22427:29;22470:30;22584:18;:16;:18::i;:::-;22801:99;;;;;22894:4;22801:99;;;4880:74:12;22566:36:5;;-1:-1:-1;22831:11:5;22801:84;;;;;4853:18:12;;22801:99:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22227:680;;22671:229;;;;-1:-1:-1;22671:229:5;-1:-1:-1;22671:229:5;-1:-1:-1;22227:680:5;-1:-1:-1;;22227:680:5:o;14:331:12:-;119:9;130;172:8;160:10;157:24;154:44;;;194:1;191;184:12;154:44;223:6;213:8;210:20;207:40;;;243:1;240;233:12;207:40;-1:-1:-1;;269:23:12;;;314:25;;;;;-1:-1:-1;14:331:12:o;350:162::-;444:42;437:5;433:54;426:5;423:65;413:93;;502:1;499;492:12;517:263;584:6;637:2;625:9;616:7;612:23;608:32;605:52;;;653:1;650;643:12;605:52;692:9;679:23;711:39;744:5;711:39;:::i;:::-;769:5;517:263;-1:-1:-1;;;517:263:12:o;785:273::-;841:6;894:2;882:9;873:7;869:23;865:32;862:52;;;910:1;907;900:12;862:52;949:9;936:23;1002:5;995:13;988:21;981:5;978:32;968:60;;1024:1;1021;1014:12;1063:681;1234:2;1286:21;;;1356:13;;1259:18;;;1378:22;;;1205:4;;1234:2;1457:15;;;;1431:2;1416:18;;;1205:4;1500:218;1514:6;1511:1;1508:13;1500:218;;;1579:13;;1594:42;1575:62;1563:75;;1693:15;;;;1658:12;;;;1536:1;1529:9;1500:218;;;-1:-1:-1;1735:3:12;;1063:681;-1:-1:-1;;;;;;1063:681:12:o;1941:394::-;2034:6;2087:2;2075:9;2066:7;2062:23;2058:32;2055:52;;;2103:1;2100;2093:12;2055:52;2143:9;2130:23;2176:18;2168:6;2165:30;2162:50;;;2208:1;2205;2198:12;2162:50;2231:22;;2287:3;2269:16;;;2265:26;2262:46;;;2304:1;2301;2294:12;2593:332;2651:6;2704:2;2692:9;2683:7;2679:23;2675:32;2672:52;;;2720:1;2717;2710:12;2672:52;2759:9;2746:23;2809:66;2802:5;2798:78;2791:5;2788:89;2778:117;;2891:1;2888;2881:12;2930:250;3015:1;3025:113;3039:6;3036:1;3033:13;3025:113;;;3115:11;;;3109:18;3096:11;;;3089:39;3061:2;3054:10;3025:113;;;-1:-1:-1;;3172:1:12;3154:16;;3147:27;2930:250::o;3185:330::-;3227:3;3265:5;3259:12;3292:6;3287:3;3280:19;3308:76;3377:6;3370:4;3365:3;3361:14;3354:4;3347:5;3343:16;3308:76;:::i;:::-;3429:2;3417:15;3434:66;3413:88;3404:98;;;;3504:4;3400:109;;3185:330;-1:-1:-1;;3185:330:12:o;3520:1209::-;3758:4;3787:2;3816;3805:9;3798:21;3842:45;3883:2;3872:9;3868:18;3860:6;3842:45;:::i;:::-;3906:2;3956:9;3948:6;3944:22;3939:2;3928:9;3924:18;3917:50;3987:6;4022;4016:13;4053:6;4045;4038:22;4088:2;4080:6;4076:15;4069:22;;4147:2;4137:6;4134:1;4130:14;4122:6;4118:27;4114:36;4185:2;4177:6;4173:15;4206:1;4216:484;4230:6;4227:1;4224:13;4216:484;;;4295:19;;;4316:66;4291:92;4279:105;;4407:13;;4448:9;;4433:25;;4497:11;;4491:18;4529:15;;;4522:27;;;4572:48;4604:15;;;4491:18;4572:48;:::i;:::-;4678:12;;;;4562:58;-1:-1:-1;;4643:15:12;;;;4252:1;4245:9;4216:484;;;-1:-1:-1;4717:6:12;;3520:1209;-1:-1:-1;;;;;;;;;;3520:1209:12:o;4965:184::-;5017:77;5014:1;5007:88;5114:4;5111:1;5104:15;5138:4;5135:1;5128:15;5154:334;5225:2;5219:9;5281:2;5271:13;;5286:66;5267:86;5255:99;;5384:18;5369:34;;5405:22;;;5366:62;5363:88;;;5431:18;;:::i;:::-;5467:2;5460:22;5154:334;;-1:-1:-1;5154:334:12:o;5493:183::-;5553:4;5586:18;5578:6;5575:30;5572:56;;;5608:18;;:::i;:::-;-1:-1:-1;5653:1:12;5649:14;5665:4;5645:25;;5493:183::o;5681:964::-;5776:6;5807:2;5850;5838:9;5829:7;5825:23;5821:32;5818:52;;;5866:1;5863;5856:12;5818:52;5899:9;5893:16;5932:18;5924:6;5921:30;5918:50;;;5964:1;5961;5954:12;5918:50;5987:22;;6040:4;6032:13;;6028:27;-1:-1:-1;6018:55:12;;6069:1;6066;6059:12;6018:55;6098:2;6092:9;6121:60;6137:43;6177:2;6137:43;:::i;:::-;6121:60;:::i;:::-;6215:15;;;6297:1;6293:10;;;;6285:19;;6281:28;;;6246:12;;;;6321:19;;;6318:39;;;6353:1;6350;6343:12;6318:39;6377:11;;;;6397:218;6413:6;6408:3;6405:15;6397:218;;;6486:3;6480:10;6503:39;6536:5;6503:39;:::i;:::-;6555:18;;6430:12;;;;6593;;;;6397:218;;;6634:5;5681:964;-1:-1:-1;;;;;;;5681:964:12:o;6650:580::-;6727:4;6733:6;6793:11;6780:25;6883:66;6872:8;6856:14;6852:29;6848:102;6828:18;6824:127;6814:155;;6965:1;6962;6955:12;6814:155;6992:33;;7044:20;;;-1:-1:-1;7087:18:12;7076:30;;7073:50;;;7119:1;7116;7109:12;7073:50;7152:4;7140:17;;-1:-1:-1;7183:14:12;7179:27;;;7169:38;;7166:58;;;7220:1;7217;7210:12;7166:58;6650:580;;;;;:::o;7537:184::-;7589:77;7586:1;7579:88;7686:4;7683:1;7676:15;7710:4;7707:1;7700:15;7726:967;8029:6;8018:9;8011:25;7992:4;8055:2;8093:3;8088:2;8077:9;8073:18;8066:31;8120:46;8161:3;8150:9;8146:19;8138:6;8120:46;:::i;:::-;8202:22;;;8197:2;8182:18;;8175:50;8274:13;;8296:22;;;8346:2;8372:15;;;;8334;;8405:1;8415:169;8429:6;8426:1;8423:13;8415:169;;;8490:13;;8478:26;;8559:15;;;;8524:12;;;;8451:1;8444:9;8415:169;;;8419:3;;8629:9;8624:3;8620:19;8615:2;8604:9;8600:18;8593:47;8657:30;8683:3;8675:6;8657:30;:::i;:::-;8649:38;7726:967;-1:-1:-1;;;;;;;;;7726:967:12:o;8698:271::-;8881:6;8873;8868:3;8855:33;8837:3;8907:16;;8932:13;;;8907:16;8698:271;-1:-1:-1;8698:271:12:o;9514:372::-;9673:66;9635:19;;9757:11;;;;9788:2;9780:11;;9777:103;;;9867:2;9861;9854:3;9850:2;9846:12;9843:1;9839:20;9835:29;9831:2;9827:38;9823:47;9814:56;;9777:103;;;9514:372;;;;:::o;9891:639::-;10016:4;10022:6;10082:11;10069:25;10172:66;10161:8;10145:14;10141:29;10137:102;10117:18;10113:127;10103:155;;10254:1;10251;10244:12;10103:155;10281:33;;10333:20;;;-1:-1:-1;10376:18:12;10365:30;;10362:50;;;10408:1;10405;10398:12;10362:50;10441:4;10429:17;;-1:-1:-1;10500:4:12;10488:17;;10472:14;10468:38;10458:49;;10455:69;;;10520:1;10517;10510:12;10535:269;10607:6;10660:2;10648:9;10639:7;10635:23;10631:32;10628:52;;;10676:1;10673;10666:12;10628:52;10715:9;10702:23;10754:1;10747:5;10744:12;10734:40;;10770:1;10767;10760:12;10809:184;10861:77;10858:1;10851:88;10958:4;10955:1;10948:15;10982:4;10979:1;10972:15;11258:633;11380:4;11386:6;11446:11;11433:25;11536:66;11525:8;11509:14;11505:29;11501:102;11481:18;11477:127;11467:155;;11618:1;11615;11608:12;11467:155;11645:33;;11697:20;;;-1:-1:-1;11740:18:12;11729:30;;11726:50;;;11772:1;11769;11762:12;11726:50;11805:4;11793:17;;-1:-1:-1;11856:1:12;11852:14;;;11836;11832:35;11822:46;;11819:66;;;11881:1;11878;11871:12;12903:569;12957:5;13010:3;13003:4;12995:6;12991:17;12987:27;12977:55;;13028:1;13025;13018:12;12977:55;13057:6;13051:13;13083:18;13079:2;13076:26;13073:52;;;13105:18;;:::i;:::-;13149:114;13257:4;13188:66;13181:4;13177:2;13173:13;13169:86;13165:97;13149:114;:::i;:::-;13288:2;13279:7;13272:19;13334:3;13327:4;13322:2;13314:6;13310:15;13306:26;13303:35;13300:55;;;13351:1;13348;13341:12;13300:55;13364:77;13438:2;13431:4;13422:7;13418:18;13411:4;13403:6;13399:17;13364:77;:::i;:::-;13459:7;12903:569;-1:-1:-1;;;;12903:569:12:o;13477:1577::-;13638:6;13646;13654;13662;13670;13723:3;13711:9;13702:7;13698:23;13694:33;13691:53;;;13740:1;13737;13730:12;13691:53;13769:9;13763:16;13753:26;;13798:2;13844;13833:9;13829:18;13823:25;13867:18;13908:2;13900:6;13897:14;13894:34;;;13924:1;13921;13914:12;13894:34;13947:61;14000:7;13991:6;13980:9;13976:22;13947:61;:::i;:::-;13937:71;;14054:2;14043:9;14039:18;14033:25;14017:41;;14083:2;14073:8;14070:16;14067:36;;;14099:1;14096;14089:12;14067:36;14122:63;14177:7;14166:8;14155:9;14151:24;14122:63;:::i;:::-;14112:73;;14231:2;14220:9;14216:18;14210:25;14194:41;;14260:2;14250:8;14247:16;14244:36;;;14276:1;14273;14266:12;14244:36;14314:8;14303:9;14299:24;14289:34;;14361:7;14354:4;14350:2;14346:13;14342:27;14332:55;;14383:1;14380;14373:12;14332:55;14412:2;14406:9;14435:60;14451:43;14491:2;14451:43;:::i;14435:60::-;14529:15;;;14611:1;14607:10;;;;14599:19;;14595:28;;;14560:12;;;;14635:19;;;14632:39;;;14667:1;14664;14657:12;14632:39;14691:11;;;;14711:135;14727:6;14722:3;14719:15;14711:135;;;14793:10;;14781:23;;14744:12;;;;14824;;;;14711:135;;;14916:3;14901:19;;14895:26;14865:5;;-1:-1:-1;14895:26:12;-1:-1:-1;;;14933:16:12;;;14930:36;;;14962:1;14959;14952:12;14930:36;;;14985:63;15040:7;15029:8;15018:9;15014:24;14985:63;:::i;:::-;14975:73;;;13477:1577;;;;;;;;:::o
Swarm Source
ipfs://8cf0e76ef76b2bee85dd5f1436a047bf9c87ae5f888e0b194385b99aece78a86
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.