Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,844 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Fulfill Availabl... | 21459442 | 13 hrs ago | IN | 0.11836598 ETH | 0.00369221 | ||||
Fulfill Availabl... | 21459251 | 14 hrs ago | IN | 2.0309 ETH | 0.02415345 | ||||
Fulfill Availabl... | 21458128 | 18 hrs ago | IN | 0.07469999 ETH | 0.00353314 | ||||
Fulfill Availabl... | 21457426 | 20 hrs ago | IN | 0.07661041 ETH | 0.00546811 | ||||
Fulfill Availabl... | 21455432 | 27 hrs ago | IN | 0.02211399 ETH | 0.0024588 | ||||
Fulfill Availabl... | 21455376 | 27 hrs ago | IN | 0.02578299 ETH | 0.00247765 | ||||
Fulfill Availabl... | 21455017 | 28 hrs ago | IN | 0.13752199 ETH | 0.00430538 | ||||
Fulfill Availabl... | 21454062 | 31 hrs ago | IN | 0.23479199 ETH | 0.00304745 | ||||
Fulfill Availabl... | 21451196 | 41 hrs ago | IN | 0.049697 ETH | 0.01543951 | ||||
Fulfill Availabl... | 21446377 | 2 days ago | IN | 0.04899984 ETH | 0.00798377 | ||||
Fulfill Availabl... | 21445505 | 2 days ago | IN | 0.053696 ETH | 0.00654377 | ||||
Fulfill Availabl... | 21444341 | 2 days ago | IN | 1.605486 ETH | 0.02664058 | ||||
Fulfill Availabl... | 21443400 | 2 days ago | IN | 0.1764888 ETH | 0.00937386 | ||||
Fulfill Availabl... | 21441844 | 3 days ago | IN | 0.929598 ETH | 0.0037527 | ||||
Fulfill Availabl... | 21440974 | 3 days ago | IN | 0.0899 ETH | 0.00349998 | ||||
Fulfill Availabl... | 21439833 | 3 days ago | IN | 1.951838 ETH | 0.02388386 | ||||
Fulfill Availabl... | 21438025 | 3 days ago | IN | 0.35368599 ETH | 0.06990167 | ||||
Fulfill Availabl... | 21435157 | 3 days ago | IN | 0.21425299 ETH | 0.01045371 | ||||
Fulfill Availabl... | 21433958 | 4 days ago | IN | 0.588048 ETH | 0.00765646 | ||||
Fulfill Availabl... | 21432557 | 4 days ago | IN | 0.24378998 ETH | 0.01432559 | ||||
Fulfill Availabl... | 21431414 | 4 days ago | IN | 0.523348 ETH | 0.01005307 | ||||
Fulfill Availabl... | 21430974 | 4 days ago | IN | 1.989121 ETH | 0.04142371 | ||||
Fulfill Availabl... | 21429618 | 4 days ago | IN | 0.19668199 ETH | 0.01838549 | ||||
Fulfill Availabl... | 21429078 | 4 days ago | IN | 0.03599999 ETH | 0.01369758 | ||||
Fulfill Availabl... | 21426787 | 5 days ago | IN | 0.620332 ETH | 0.01447319 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21459442 | 13 hrs ago | 0.02959199 ETH | ||||
21459442 | 13 hrs ago | 0.08877399 ETH | ||||
21459251 | 14 hrs ago | 0.0589 ETH | ||||
21459251 | 14 hrs ago | 1.972 ETH | ||||
21458128 | 18 hrs ago | 0.0498 ETH | ||||
21458128 | 18 hrs ago | 0.02489999 ETH | ||||
21457426 | 20 hrs ago | 0.01625641 ETH | ||||
21457426 | 20 hrs ago | 0.060354 ETH | ||||
21455432 | 27 hrs ago | 0.01109999 ETH | ||||
21455432 | 27 hrs ago | 0.011014 ETH | ||||
21455376 | 27 hrs ago | 0.0179 ETH | ||||
21455376 | 27 hrs ago | 0.00788299 ETH | ||||
21455017 | 28 hrs ago | 0.11005 ETH | ||||
21455017 | 28 hrs ago | 0.02747199 ETH | ||||
21454062 | 31 hrs ago | 0.11739699 ETH | ||||
21454062 | 31 hrs ago | 0.117395 ETH | ||||
21451196 | 41 hrs ago | 0.026297 ETH | ||||
21451196 | 41 hrs ago | 0.0234 ETH | ||||
21446377 | 2 days ago | 0.03919988 ETH | ||||
21446377 | 2 days ago | 0.00979996 ETH | ||||
21445505 | 2 days ago | 0.026849 ETH | ||||
21445505 | 2 days ago | 0.026847 ETH | ||||
21444341 | 2 days ago | 1.284491 ETH | ||||
21444341 | 2 days ago | 0.320995 ETH | ||||
21443400 | 2 days ago | 0.1176908 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SeaportRouter
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { SeaportRouterInterface } from "seaport-types/src/interfaces/SeaportRouterInterface.sol"; import { SeaportInterface } from "seaport-types/src/interfaces/SeaportInterface.sol"; import { ReentrancyGuard } from "seaport-core/src/lib/ReentrancyGuard.sol"; import { AdvancedOrder, CriteriaResolver, Execution, FulfillmentComponent } from "seaport-types/src/lib/ConsiderationStructs.sol"; /** * @title SeaportRouter * @author Ryan Ghods (ralxz.eth), 0age (0age.eth), James Wenzel (emo.eth) * @notice A utility contract for fulfilling orders with multiple * Seaport versions. DISCLAIMER: This contract only works when * all consideration items across all listings are native tokens. */ contract SeaportRouter is SeaportRouterInterface, ReentrancyGuard { /// @dev The allowed v1.5 contract usable through this router. address private immutable _SEAPORT_V1_5; /// @dev The allowed v1.6 contract usable through this router. address private immutable _SEAPORT_V1_6; /** * @dev Deploy contract with the supported Seaport contracts. * * @param seaportV1point5 The address of the Seaport v1.5 contract. * @param seaportV1point6 The address of the Seaport v1.6 contract. */ constructor(address seaportV1point5, address seaportV1point6) { _SEAPORT_V1_5 = seaportV1point5; _SEAPORT_V1_6 = seaportV1point6; } /** * @dev Fallback function to receive excess ether, in case total amount of * ether sent is more than the amount required to fulfill the order. */ receive() external payable override { // Ensure we only receive ether from Seaport. _assertSeaportAllowed(msg.sender); } /** * @notice Fulfill available advanced orders through multiple Seaport * versions. * See {SeaportInterface-fulfillAvailableAdvancedOrders} * * @param params The parameters for fulfilling available advanced orders. */ function fulfillAvailableAdvancedOrders( FulfillAvailableAdvancedOrdersParams calldata params ) external payable override returns ( bool[][] memory availableOrders, Execution[][] memory executions ) { // Ensure this function cannot be triggered during a reentrant call. _setReentrancyGuard(true); // Put the number of Seaport contracts on the stack. uint256 seaportContractsLength = params.seaportContracts.length; // Set the availableOrders and executions arrays to the correct length. availableOrders = new bool[][](seaportContractsLength); executions = new Execution[][](seaportContractsLength); // Track the number of order fulfillments left. uint256 fulfillmentsLeft = params.maximumFulfilled; // To help avoid stack too deep errors, we format the calldata // params in a struct and put it on the stack. AdvancedOrder[] memory emptyAdvancedOrders; CriteriaResolver[] memory emptyCriteriaResolvers; FulfillmentComponent[][] memory emptyFulfillmentComponents; CalldataParams memory calldataParams = CalldataParams({ advancedOrders: emptyAdvancedOrders, criteriaResolvers: emptyCriteriaResolvers, offerFulfillments: emptyFulfillmentComponents, considerationFulfillments: emptyFulfillmentComponents, fulfillerConduitKey: params.fulfillerConduitKey, recipient: params.recipient, maximumFulfilled: fulfillmentsLeft }); // If recipient is not provided assign to msg.sender. if (calldataParams.recipient == address(0)) { calldataParams.recipient = msg.sender; } // Iterate through the provided Seaport contracts. for (uint256 i = 0; i < params.seaportContracts.length; ) { // Ensure the provided Seaport contract is allowed. _assertSeaportAllowed(params.seaportContracts[i]); // Put the order params on the stack. AdvancedOrderParams calldata orderParams = params .advancedOrderParams[i]; // Assign the variables to the calldata params. calldataParams.advancedOrders = orderParams.advancedOrders; calldataParams.criteriaResolvers = orderParams.criteriaResolvers; calldataParams.offerFulfillments = orderParams.offerFulfillments; calldataParams.considerationFulfillments = orderParams .considerationFulfillments; // Execute the orders, collecting availableOrders and executions. // This is wrapped in a try/catch in case a single order is // executed that is no longer available, leading to a revert // with `NoSpecifiedOrdersAvailable()` that can be ignored. try SeaportInterface(params.seaportContracts[i]) .fulfillAvailableAdvancedOrders{ value: orderParams.etherValue }( calldataParams.advancedOrders, calldataParams.criteriaResolvers, calldataParams.offerFulfillments, calldataParams.considerationFulfillments, calldataParams.fulfillerConduitKey, calldataParams.recipient, calldataParams.maximumFulfilled ) returns ( bool[] memory newAvailableOrders, Execution[] memory newExecutions ) { availableOrders[i] = newAvailableOrders; executions[i] = newExecutions; // Subtract the number of orders fulfilled. uint256 newAvailableOrdersLength = newAvailableOrders.length; for (uint256 j = 0; j < newAvailableOrdersLength; ) { if (newAvailableOrders[j]) { unchecked { --fulfillmentsLeft; ++j; } } } // Break if the maximum number of executions has been reached. if (fulfillmentsLeft == 0) { break; } } catch (bytes memory data) { // Set initial value of first four bytes of revert data // to the mask. bytes4 customErrorSelector = bytes4(0xffffffff); // Utilize assembly to read first four bytes // (if present) directly. assembly { // Combine original mask with first four bytes of // revert data. customErrorSelector := and( // Data begins after length offset. mload(add(data, 0x20)), customErrorSelector ) } // Pass through the custom error if the error is // not NoSpecifiedOrdersAvailable() if ( customErrorSelector != NoSpecifiedOrdersAvailable.selector ) { assembly { revert(add(data, 32), mload(data)) } } } // Update fulfillments left. calldataParams.maximumFulfilled = fulfillmentsLeft; unchecked { ++i; } } // Throw an error if no orders were fulfilled. if (fulfillmentsLeft == params.maximumFulfilled) { revert NoSpecifiedOrdersAvailable(); } // Return excess ether that may not have been used or was sent back. if (address(this).balance > 0) { _returnExcessEther(); } // Clear the reentrancy guard. _clearReentrancyGuard(); } /** * @notice Returns the Seaport contracts allowed to be used through this * router. */ function getAllowedSeaportContracts() external view override returns (address[] memory seaportContracts) { seaportContracts = new address[](2); seaportContracts[0] = _SEAPORT_V1_5; seaportContracts[1] = _SEAPORT_V1_6; } /** * @dev Reverts if the provided Seaport contract is not allowed. */ function _assertSeaportAllowed(address seaport) internal view { if ( _cast(seaport == _SEAPORT_V1_5) | _cast(seaport == _SEAPORT_V1_6) == 0 ) { revert SeaportNotAllowed(seaport); } } /** * @dev Function to return excess ether, in case total amount of * ether sent is more than the amount required to fulfill the order. */ function _returnExcessEther() private { // Send received funds back to msg.sender. (bool success, bytes memory data) = payable(msg.sender).call{ value: address(this).balance }(""); // Revert with an error if the ether transfer failed. if (!success) { revert EtherReturnTransferFailed( msg.sender, address(this).balance, data ); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { AdvancedOrder, CriteriaResolver, FulfillmentComponent } from "../lib/ConsiderationStructs.sol"; import { Execution } from "../lib/ConsiderationStructs.sol"; /** * @title SeaportRouterInterface * @author Ryan Ghods (ralxz.eth), 0age (0age.eth), James Wenzel (emo.eth) * @notice A utility contract for fulfilling orders with multiple * Seaport versions. DISCLAIMER: This contract only works when * all consideration items across all listings are native tokens. */ interface SeaportRouterInterface { /** * @dev Revert with an error when attempting to fulfill any number of * available orders when none are fulfillable. */ error NoSpecifiedOrdersAvailable(); /** * @dev Advanced order parameters for use through the * FulfillAvailableAdvancedOrdersParams struct. */ struct AdvancedOrderParams { AdvancedOrder[] advancedOrders; CriteriaResolver[] criteriaResolvers; FulfillmentComponent[][] offerFulfillments; FulfillmentComponent[][] considerationFulfillments; uint256 etherValue; /// The ether value to send with the set of orders. } /** * @dev Parameters for using fulfillAvailableAdvancedOrders * through SeaportRouter. */ struct FulfillAvailableAdvancedOrdersParams { address[] seaportContracts; AdvancedOrderParams[] advancedOrderParams; bytes32 fulfillerConduitKey; address recipient; uint256 maximumFulfilled; } /** * @dev Calldata params for calling FulfillAvailableAdvancedOrders. */ struct CalldataParams { AdvancedOrder[] advancedOrders; CriteriaResolver[] criteriaResolvers; FulfillmentComponent[][] offerFulfillments; FulfillmentComponent[][] considerationFulfillments; bytes32 fulfillerConduitKey; address recipient; uint256 maximumFulfilled; } /** * @dev Revert with an error if a provided Seaport contract is not allowed * to be used in the router. */ error SeaportNotAllowed(address seaport); /** * @dev Revert with an error if an ether transfer back to the fulfiller * fails. */ error EtherReturnTransferFailed( address recipient, uint256 amount, bytes returnData ); /** * @dev Fallback function to receive excess ether, in case total amount of * ether sent is more than the amount required to fulfill the order. */ receive() external payable; /** * @notice Fulfill available advanced orders through multiple Seaport * versions. * See {SeaportInterface-fulfillAvailableAdvancedOrders} * * @param params The parameters for fulfilling available advanced orders. */ function fulfillAvailableAdvancedOrders( FulfillAvailableAdvancedOrdersParams calldata params ) external payable returns ( bool[][] memory availableOrders, Execution[][] memory executions ); /** * @notice Returns the Seaport contracts allowed to be used through this * router. */ function getAllowedSeaportContracts() external view returns (address[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { AdvancedOrder, BasicOrderParameters, CriteriaResolver, Execution, Fulfillment, FulfillmentComponent, Order, OrderComponents } from "../lib/ConsiderationStructs.sol"; /** * @title SeaportInterface * @author 0age * @custom:version 1.6 * @notice Seaport is a generalized native token/ERC20/ERC721/ERC1155 * marketplace. It minimizes external calls to the greatest extent * possible and provides lightweight methods for common routes as well * as more flexible methods for composing advanced orders. * * @dev SeaportInterface contains all external function interfaces for Seaport. */ interface SeaportInterface { /** * @notice Fulfill an order offering an ERC721 token by supplying Ether (or * the native token for the given chain) as consideration for the * order. An arbitrary number of "additional recipients" may also be * supplied which will each receive native tokens from the fulfiller * as consideration. * * @param parameters Additional information on the fulfilled order. Note * that the offerer must first approve this contract (or * their preferred conduit if indicated by the order) for * their offered ERC721 token to be transferred. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillBasicOrder( BasicOrderParameters calldata parameters ) external payable returns (bool fulfilled); /** * @notice Fulfill an order with an arbitrary number of items for offer and * consideration. Note that this function does not support * criteria-based orders or partial filling of orders (though * filling the remainder of a partially-filled order is supported). * * @param order The order to fulfill. Note that both the * offerer and the fulfiller must first approve * this contract (or the corresponding conduit if * indicated) to transfer any relevant tokens on * their behalf and that contracts must implement * `onERC1155Received` to receive ERC1155 tokens * as consideration. * @param fulfillerConduitKey A bytes32 value indicating what conduit, if * any, to source the fulfiller's token approvals * from. The zero hash signifies that no conduit * should be used, with direct approvals set on * Seaport. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillOrder( Order calldata order, bytes32 fulfillerConduitKey ) external payable returns (bool fulfilled); /** * @notice Fill an order, fully or partially, with an arbitrary number of * items for offer and consideration alongside criteria resolvers * containing specific token identifiers and associated proofs. * * @param advancedOrder The order to fulfill along with the fraction * of the order to attempt to fill. Note that * both the offerer and the fulfiller must first * approve this contract (or their preferred * conduit if indicated by the order) to transfer * any relevant tokens on their behalf and that * contracts must implement `onERC1155Received` * to receive ERC1155 tokens as consideration. * Also note that all offer and consideration * components must have no remainder after * multiplication of the respective amount with * the supplied fraction for the partial fill to * be considered valid. * @param criteriaResolvers An array where each element contains a * reference to a specific offer or * consideration, a token identifier, and a proof * that the supplied token identifier is * contained in the merkle root held by the item * in question's criteria element. Note that an * empty criteria indicates that any * (transferable) token identifier on the token * in question is valid and that no associated * proof needs to be supplied. * @param fulfillerConduitKey A bytes32 value indicating what conduit, if * any, to source the fulfiller's token approvals * from. The zero hash signifies that no conduit * should be used, with direct approvals set on * Seaport. * @param recipient The intended recipient for all received items, * with `address(0)` indicating that the caller * should receive the items. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillAdvancedOrder( AdvancedOrder calldata advancedOrder, CriteriaResolver[] calldata criteriaResolvers, bytes32 fulfillerConduitKey, address recipient ) external payable returns (bool fulfilled); /** * @notice Attempt to fill a group of orders, each with an arbitrary number * of items for offer and consideration. Any order that is not * currently active, has already been fully filled, or has been * cancelled will be omitted. Remaining offer and consideration * items will then be aggregated where possible as indicated by the * supplied offer and consideration component arrays and aggregated * items will be transferred to the fulfiller or to each intended * recipient, respectively. Note that a failing item transfer or an * issue with order formatting will cause the entire batch to fail. * Note that this function does not support criteria-based orders or * partial filling of orders (though filling the remainder of a * partially-filled order is supported). * * @param orders The orders to fulfill. Note that both * the offerer and the fulfiller must first * approve this contract (or the * corresponding conduit if indicated) to * transfer any relevant tokens on their * behalf and that contracts must implement * `onERC1155Received` to receive ERC1155 * tokens as consideration. * @param offerFulfillments An array of FulfillmentComponent arrays * indicating which offer items to attempt * to aggregate when preparing executions. * @param considerationFulfillments An array of FulfillmentComponent arrays * indicating which consideration items to * attempt to aggregate when preparing * executions. * @param fulfillerConduitKey A bytes32 value indicating what conduit, * if any, to source the fulfiller's token * approvals from. The zero hash signifies * that no conduit should be used, with * direct approvals set on this contract. * @param maximumFulfilled The maximum number of orders to fulfill. * * @return availableOrders An array of booleans indicating if each order * with an index corresponding to the index of the * returned boolean was fulfillable or not. * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. Note that unspent offer item amounts or * native tokens will not be reflected as part of * this array. */ function fulfillAvailableOrders( Order[] calldata orders, FulfillmentComponent[][] calldata offerFulfillments, FulfillmentComponent[][] calldata considerationFulfillments, bytes32 fulfillerConduitKey, uint256 maximumFulfilled ) external payable returns (bool[] memory availableOrders, Execution[] memory executions); /** * @notice Attempt to fill a group of orders, fully or partially, with an * arbitrary number of items for offer and consideration per order * alongside criteria resolvers containing specific token * identifiers and associated proofs. Any order that is not * currently active, has already been fully filled, or has been * cancelled will be omitted. Remaining offer and consideration * items will then be aggregated where possible as indicated by the * supplied offer and consideration component arrays and aggregated * items will be transferred to the fulfiller or to each intended * recipient, respectively. Note that a failing item transfer or an * issue with order formatting will cause the entire batch to fail. * * @param advancedOrders The orders to fulfill along with the * fraction of those orders to attempt to * fill. Note that both the offerer and the * fulfiller must first approve this * contract (or their preferred conduit if * indicated by the order) to transfer any * relevant tokens on their behalf and that * contracts must implement * `onERC1155Received` to enable receipt of * ERC1155 tokens as consideration. Also * note that all offer and consideration * components must have no remainder after * multiplication of the respective amount * with the supplied fraction for an * order's partial fill amount to be * considered valid. * @param criteriaResolvers An array where each element contains a * reference to a specific offer or * consideration, a token identifier, and a * proof that the supplied token identifier * is contained in the merkle root held by * the item in question's criteria element. * Note that an empty criteria indicates * that any (transferable) token * identifier on the token in question is * valid and that no associated proof needs * to be supplied. * @param offerFulfillments An array of FulfillmentComponent arrays * indicating which offer items to attempt * to aggregate when preparing executions. * @param considerationFulfillments An array of FulfillmentComponent arrays * indicating which consideration items to * attempt to aggregate when preparing * executions. * @param fulfillerConduitKey A bytes32 value indicating what conduit, * if any, to source the fulfiller's token * approvals from. The zero hash signifies * that no conduit should be used, with * direct approvals set on this contract. * @param recipient The intended recipient for all received * items, with `address(0)` indicating that * the caller should receive the items. * @param maximumFulfilled The maximum number of orders to fulfill. * * @return availableOrders An array of booleans indicating if each order * with an index corresponding to the index of the * returned boolean was fulfillable or not. * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. Note that unspent offer item amounts or * native tokens will not be reflected as part of * this array. */ function fulfillAvailableAdvancedOrders( AdvancedOrder[] calldata advancedOrders, CriteriaResolver[] calldata criteriaResolvers, FulfillmentComponent[][] calldata offerFulfillments, FulfillmentComponent[][] calldata considerationFulfillments, bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled ) external payable returns (bool[] memory availableOrders, Execution[] memory executions); /** * @notice Match an arbitrary number of orders, each with an arbitrary * number of items for offer and consideration along with a set of * fulfillments allocating offer components to consideration * components. Note that this function does not support * criteria-based or partial filling of orders (though filling the * remainder of a partially-filled order is supported). Any unspent * offer item amounts or native tokens will be transferred to the * caller. * * @param orders The orders to match. Note that both the offerer and * fulfiller on each order must first approve this * contract (or their conduit if indicated by the order) * to transfer any relevant tokens on their behalf and * each consideration recipient must implement * `onERC1155Received` to enable ERC1155 token receipt. * @param fulfillments An array of elements allocating offer components to * consideration components. Note that each * consideration component must be fully met for the * match operation to be valid. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. Note that unspent offer item amounts or * native tokens will not be reflected as part of this * array. */ function matchOrders( Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Match an arbitrary number of full or partial orders, each with an * arbitrary number of items for offer and consideration, supplying * criteria resolvers containing specific token identifiers and * associated proofs as well as fulfillments allocating offer * components to consideration components. Any unspent offer item * amounts will be transferred to the designated recipient (with the * null address signifying to use the caller) and any unspent native * tokens will be returned to the caller. * * @param orders The advanced orders to match. Note that both the * offerer and fulfiller on each order must first * approve this contract (or a preferred conduit if * indicated by the order) to transfer any relevant * tokens on their behalf and each consideration * recipient must implement `onERC1155Received` in * order to receive ERC1155 tokens. Also note that * the offer and consideration components for each * order must have no remainder after multiplying * the respective amount with the supplied fraction * in order for the group of partial fills to be * considered valid. * @param criteriaResolvers An array where each element contains a reference * to a specific order as well as that order's * offer or consideration, a token identifier, and * a proof that the supplied token identifier is * contained in the order's merkle root. Note that * an empty root indicates that any (transferable) * token identifier is valid and that no associated * proof needs to be supplied. * @param fulfillments An array of elements allocating offer components * to consideration components. Note that each * consideration component must be fully met in * order for the match operation to be valid. * @param recipient The intended recipient for all unspent offer * item amounts, or the caller if the null address * is supplied. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. Note that unspent offer item amounts or native * tokens will not be reflected as part of this array. */ function matchAdvancedOrders( AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments, address recipient ) external payable returns (Execution[] memory executions); /** * @notice Cancel an arbitrary number of orders. Note that only the offerer * or the zone of a given order may cancel it. Callers should ensure * that the intended order was cancelled by calling `getOrderStatus` * and confirming that `isCancelled` returns `true`. * * @param orders The orders to cancel. * * @return cancelled A boolean indicating whether the supplied orders have * been successfully cancelled. */ function cancel( OrderComponents[] calldata orders ) external returns (bool cancelled); /** * @notice Validate an arbitrary number of orders, thereby registering their * signatures as valid and allowing the fulfiller to skip signature * verification on fulfillment. Note that validated orders may still * be unfulfillable due to invalid item amounts or other factors; * callers should determine whether validated orders are fulfillable * by simulating the fulfillment call prior to execution. Also note * that anyone can validate a signed order, but only the offerer can * validate an order without supplying a signature. * * @param orders The orders to validate. * * @return validated A boolean indicating whether the supplied orders have * been successfully validated. */ function validate( Order[] calldata orders ) external returns (bool validated); /** * @notice Cancel all orders from a given offerer with a given zone in bulk * by incrementing a counter. Note that only the offerer may * increment the counter. * * @return newCounter The new counter. */ function incrementCounter() external returns (uint256 newCounter); /** * @notice Fulfill an order offering an ERC721 token by supplying Ether (or * the native token for the given chain) as consideration for the * order. An arbitrary number of "additional recipients" may also be * supplied which will each receive native tokens from the fulfiller * as consideration. Note that this function costs less gas than * `fulfillBasicOrder` due to the zero bytes in the function * selector (0x00000000) which also results in earlier function * dispatch. * * @param parameters Additional information on the fulfilled order. Note * that the offerer must first approve this contract (or * their preferred conduit if indicated by the order) for * their offered ERC721 token to be transferred. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillBasicOrder_efficient_6GL6yc( BasicOrderParameters calldata parameters ) external payable returns (bool fulfilled); /** * @notice Retrieve the order hash for a given order. * * @param order The components of the order. * * @return orderHash The order hash. */ function getOrderHash( OrderComponents calldata order ) external view returns (bytes32 orderHash); /** * @notice Retrieve the status of a given order by hash, including whether * the order has been cancelled or validated and the fraction of the * order that has been filled. * * @param orderHash The order hash in question. * * @return isValidated A boolean indicating whether the order in question * has been validated (i.e. previously approved or * partially filled). * @return isCancelled A boolean indicating whether the order in question * has been cancelled. * @return totalFilled The total portion of the order that has been filled * (i.e. the "numerator"). * @return totalSize The total size of the order that is either filled or * unfilled (i.e. the "denominator"). */ function getOrderStatus( bytes32 orderHash ) external view returns ( bool isValidated, bool isCancelled, uint256 totalFilled, uint256 totalSize ); /** * @notice Retrieve the current counter for a given offerer. * * @param offerer The offerer in question. * * @return counter The current counter. */ function getCounter( address offerer ) external view returns (uint256 counter); /** * @notice Retrieve configuration information for this contract. * * @return version The contract version. * @return domainSeparator The domain separator for this contract. * @return conduitController The conduit Controller set for this contract. */ function information() external view returns ( string memory version, bytes32 domainSeparator, address conduitController ); function getContractOffererNonce( address contractOfferer ) external view returns (uint256 nonce); /** * @notice Retrieve the name of this contract. * * @return contractName The name of this contract. */ function name() external view returns (string memory contractName); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { ReentrancyErrors } from "seaport-types/src/interfaces/ReentrancyErrors.sol"; import { LowLevelHelpers } from "./LowLevelHelpers.sol"; import { _revertInvalidMsgValue, _revertNoReentrantCalls } from "seaport-types/src/lib/ConsiderationErrors.sol"; import { _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_SSTORE, _ENTERED_SSTORE, _NOT_ENTERED_SSTORE, _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_TSTORE, _ENTERED_TSTORE, _NOT_ENTERED_TSTORE, _TSTORE_ENABLED_SSTORE, _REENTRANCY_GUARD_SLOT, _TLOAD_TEST_PAYLOAD, _TLOAD_TEST_PAYLOAD_OFFSET, _TLOAD_TEST_PAYLOAD_LENGTH } from "seaport-types/src/lib/ConsiderationConstants.sol"; import { InvalidMsgValue_error_selector, InvalidMsgValue_error_length, InvalidMsgValue_error_value_ptr, NoReentrantCalls_error_selector, NoReentrantCalls_error_length, Error_selector_offset } from "seaport-types/src/lib/ConsiderationErrorConstants.sol"; /** * @title ReentrancyGuard * @author 0age * @notice ReentrancyGuard contains a storage variable (or a transient storage * variable in EVM environments that support it once activated) and * related functionality for protecting against reentrancy. */ contract ReentrancyGuard is ReentrancyErrors, LowLevelHelpers { // Declare an immutable variable to store the initial TSTORE support status. bool private immutable _tstoreInitialSupport; // Declare an immutable variable to store the tstore test contract address. address private immutable _tloadTestContract; /** * @dev Initialize the reentrancy guard during deployment. This involves * attempting to deploy a contract that utilizes TLOAD as part of the * contract construction bytecode, and configuring initial support for * using TSTORE in place of SSTORE for the reentrancy lock based on the * result. */ constructor() { // Deploy the contract testing TLOAD support and store the address. address tloadTestContract = _prepareTloadTest(); // Ensure the deployment was successful. if (tloadTestContract == address(0)) { revert TloadTestContractDeploymentFailed(); } // Determine if TSTORE is supported. bool tstoreInitialSupport = _testTload(tloadTestContract); // Store the result as an immutable. _tstoreInitialSupport = tstoreInitialSupport; // Set the address of the deployed TLOAD test contract as an immutable. _tloadTestContract = tloadTestContract; // If not using TSTORE (where _NOT_ENTERED_TSTORE = 0), set initial // sentinel value (where _NOT_ENTERED_SSTORE = 1). if (!tstoreInitialSupport) { // Initialize storage for the reentrancy guard in a cleared state. assembly { sstore(_REENTRANCY_GUARD_SLOT, _NOT_ENTERED_SSTORE) } } } /** * @dev External function to activate TSTORE usage for the reentrancy guard. * Does not need to be called if TSTORE is supported from deployment, * and only needs to be called once. Reverts if TSTORE has already been * activated, if the opcode is not available, or if the reentrancy * guard is currently set. */ function __activateTstore() external { // Determine if TSTORE can potentially be activated. If it has already // been activated, or if the reentrancy guard is currently set, then // it cannot be activated. bool tstoreActivatable; assembly { tstoreActivatable := eq( sload(_REENTRANCY_GUARD_SLOT), _NOT_ENTERED_SSTORE ) } // Revert if TSTORE is already activated or not activatable. if (_tstoreInitialSupport || !tstoreActivatable) { revert TStoreAlreadyActivated(); } // Determine if TSTORE can be activated and revert if not. if (!_testTload(_tloadTestContract)) { revert TStoreNotSupported(); } // Mark TSTORE as activated. assembly { sstore(_REENTRANCY_GUARD_SLOT, _TSTORE_ENABLED_SSTORE) } } /** * @dev Internal function to ensure that a sentinel value for the reentrancy * guard is not currently set and, if not, to set a sentinel value for * the reentrancy guard based on whether or not native tokens may be * received during execution or not. * * @param acceptNativeTokens A boolean indicating whether native tokens may * be received during execution or not. */ function _setReentrancyGuard(bool acceptNativeTokens) internal { // Place immutable variable on the stack access within inline assembly. bool tstoreInitialSupport = _tstoreInitialSupport; // Utilize assembly to set the reentrancy guard based on tstore support. assembly { // "Loop" over three possible cases for setting the reentrancy guard // based on tstore support and state, exiting once the respective // state has been identified and a corresponding guard has been set. for {} 1 {} { // 1: handle case where tstore is supported from the start. if tstoreInitialSupport { // Ensure that the reentrancy guard is not already set. if tload(_REENTRANCY_GUARD_SLOT) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert( Error_selector_offset, NoReentrantCalls_error_length ) } // Set the reentrancy guard. A value of 1 indicates that // native tokens may not be accepted during execution, // whereas a value of 2 indicates that they will be accepted // (returning any remaining native tokens to the caller). tstore( _REENTRANCY_GUARD_SLOT, add(_ENTERED_TSTORE, acceptNativeTokens) ) // Exit the loop. break } // Retrieve the reentrancy guard sentinel value. let reentrancyGuard := sload(_REENTRANCY_GUARD_SLOT) // 2: handle tstore support that was activated post-deployment. if iszero(reentrancyGuard) { // Ensure that the reentrancy guard is not already set. if tload(_REENTRANCY_GUARD_SLOT) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert( Error_selector_offset, NoReentrantCalls_error_length ) } // Set the reentrancy guard. A value of 1 indicates that // native tokens may not be accepted during execution, // whereas a value of 2 indicates that they will be accepted // (returning any remaining native tokens to the caller). tstore( _REENTRANCY_GUARD_SLOT, add(_ENTERED_TSTORE, acceptNativeTokens) ) // Exit the loop. break } // 3: handle case where tstore support has not been activated. // Ensure that the reentrancy guard is not already set. if iszero(eq(reentrancyGuard, _NOT_ENTERED_SSTORE)) { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert(Error_selector_offset, NoReentrantCalls_error_length) } // Set the reentrancy guard. A value of 2 indicates that native // tokens may not be accepted during execution, whereas a value // of 3 indicates that they will be accepted (with any remaining // native tokens returned to the caller). sstore( _REENTRANCY_GUARD_SLOT, add(_ENTERED_SSTORE, acceptNativeTokens) ) // Exit the loop. break } } } /** * @dev Internal function to unset the reentrancy guard sentinel value. */ function _clearReentrancyGuard() internal { // Place immutable variable on the stack access within inline assembly. bool tstoreInitialSupport = _tstoreInitialSupport; // Utilize assembly to clear reentrancy guard based on tstore support. assembly { // "Loop" over three possible cases for clearing reentrancy guard // based on tstore support and state, exiting once the respective // state has been identified and corresponding guard cleared. for {} 1 {} { // 1: handle case where tstore is supported from the start. if tstoreInitialSupport { // Clear the reentrancy guard. tstore(_REENTRANCY_GUARD_SLOT, _NOT_ENTERED_TSTORE) // Exit the loop. break } // Retrieve the reentrancy guard sentinel value. let reentrancyGuard := sload(_REENTRANCY_GUARD_SLOT) // 2: handle tstore support that was activated post-deployment. if iszero(reentrancyGuard) { // Clear the reentrancy guard. tstore(_REENTRANCY_GUARD_SLOT, _NOT_ENTERED_TSTORE) // Exit the loop. break } // 3: handle case where tstore support has not been activated. // Clear the reentrancy guard. sstore(_REENTRANCY_GUARD_SLOT, _NOT_ENTERED_SSTORE) // Exit the loop. break } } } /** * @dev Internal view function to ensure that a sentinel value for the * reentrancy guard is not currently set. */ function _assertNonReentrant() internal view { // Place immutable variable on the stack access within inline assembly. bool tstoreInitialSupport = _tstoreInitialSupport; // Utilize assembly to check reentrancy guard based on tstore support. assembly { // 1: handle case where tstore is supported from the start. if tstoreInitialSupport { // Ensure that the reentrancy guard is not currently set. if tload(_REENTRANCY_GUARD_SLOT) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert(Error_selector_offset, NoReentrantCalls_error_length) } } // Handle cases where tstore is not initially supported. if iszero(tstoreInitialSupport) { // Retrieve the reentrancy guard sentinel value. let reentrancyGuard := sload(_REENTRANCY_GUARD_SLOT) // 2: handle tstore support that was activated post-deployment. if iszero(reentrancyGuard) { // Ensure that the reentrancy guard is not currently set. if tload(_REENTRANCY_GUARD_SLOT) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert( Error_selector_offset, NoReentrantCalls_error_length ) } } // 3: handle case where tstore support has not been activated. // Ensure that the reentrancy guard is not currently set. if gt(reentrancyGuard, _NOT_ENTERED_SSTORE) { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert(Error_selector_offset, NoReentrantCalls_error_length) } } } } /** * @dev Internal view function to ensure that the sentinel value indicating * native tokens may be received during execution is currently set. */ function _assertAcceptingNativeTokens() internal view { // Place immutable variable on the stack access within inline assembly. bool tstoreInitialSupport = _tstoreInitialSupport; // Utilize assembly to check reentrancy guard based on tstore support. assembly { // 1: handle case where tstore is supported from the start. if tstoreInitialSupport { // Ensure reentrancy guard is set to accept native tokens. if iszero( eq( tload(_REENTRANCY_GUARD_SLOT), _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_TSTORE ) ) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, InvalidMsgValue_error_selector) // Store argument. mstore(InvalidMsgValue_error_value_ptr, callvalue()) // revert(abi.encodeWithSignature( // "InvalidMsgValue(uint256)", value) // ) revert(Error_selector_offset, InvalidMsgValue_error_length) } } // Handle cases where tstore is not initially supported. if iszero(tstoreInitialSupport) { // Retrieve the reentrancy guard sentinel value. let reentrancyGuard := sload(_REENTRANCY_GUARD_SLOT) // 2: handle tstore support that was activated post-deployment. if iszero(reentrancyGuard) { // Ensure reentrancy guard is set to accept native tokens. if iszero( eq( tload(_REENTRANCY_GUARD_SLOT), _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_TSTORE ) ) { // Store left-padded selector with push4, // mem[28:32] = selector mstore(0, InvalidMsgValue_error_selector) // Store argument. mstore(InvalidMsgValue_error_value_ptr, callvalue()) // revert(abi.encodeWithSignature( // "InvalidMsgValue(uint256)", value) // ) revert( Error_selector_offset, InvalidMsgValue_error_length ) } } // 3: handle case where tstore support has not been activated. // Ensure reentrancy guard is set to accepting native tokens. if and( iszero(iszero(reentrancyGuard)), iszero( eq( reentrancyGuard, _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_SSTORE ) ) ) { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidMsgValue_error_selector) // Store argument. mstore(InvalidMsgValue_error_value_ptr, callvalue()) // revert(abi.encodeWithSignature( // "InvalidMsgValue(uint256)", value) // ) revert(Error_selector_offset, InvalidMsgValue_error_length) } } } } /** * @dev Private function to deploy a test contract that utilizes TLOAD as * part of its fallback logic. */ function _prepareTloadTest() private returns (address contractAddress) { // Utilize assembly to deploy a contract testing TLOAD support. assembly { // Write the contract deployment code payload to scratch space. mstore(0, _TLOAD_TEST_PAYLOAD) // Deploy the contract. contractAddress := create( 0, _TLOAD_TEST_PAYLOAD_OFFSET, _TLOAD_TEST_PAYLOAD_LENGTH ) } } /** * @dev Private view function to determine if TSTORE/TLOAD are supported by * the current EVM implementation by attempting to call the test * contract, which utilizes TLOAD as part of its fallback logic. */ function _testTload( address tloadTestContract ) private view returns (bool ok) { // Call the test contract, which will perform a TLOAD test. If the call // does not revert, then TLOAD/TSTORE is supported. Do not forward all // available gas, as all forwarded gas will be consumed on revert. (ok, ) = tloadTestContract.staticcall{ gas: gasleft() / 10 }(""); } }
// 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; /** * @title ReentrancyErrors * @author 0age * @notice ReentrancyErrors contains errors related to reentrancy. */ interface ReentrancyErrors { /** * @dev Revert with an error when a caller attempts to reenter a protected * function. */ error NoReentrantCalls(); /** * @dev Revert with an error when attempting to activate the TSTORE opcode * when it is already active. */ error TStoreAlreadyActivated(); /** * @dev Revert with an error when attempting to activate the TSTORE opcode * in an EVM environment that does not support it. */ error TStoreNotSupported(); /** * @dev Revert with an error when deployment of the contract for testing * TSTORE support fails. */ error TloadTestContractDeploymentFailed(); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { CostPerWord, ExtraGasBuffer, FreeMemoryPointerSlot, MemoryExpansionCoefficientShift, OneWord, OneWordShift, ThirtyOneBytes } from "seaport-types/src/lib/ConsiderationConstants.sol"; import { MemoryPointer, MemoryPointerLib } from "seaport-types/src/helpers/PointerLibraries.sol"; import { AdvancedOrder, Execution } from "seaport-types/src/lib/ConsiderationStructs.sol"; /** * @title LowLevelHelpers * @author 0age * @notice LowLevelHelpers contains logic for performing various low-level * operations. */ contract LowLevelHelpers { /** * @dev Internal view function to revert and pass along the revert reason if * data was returned by the last call and that the size of that data * does not exceed the currently allocated memory size. */ function _revertWithReasonIfOneIsReturned() internal view { assembly { // If it returned a message, bubble it up as long as sufficient gas // remains to do so: if returndatasize() { // Ensure that sufficient gas is available to copy returndata // while expanding memory where necessary. Start by computing // the word size of returndata and allocated memory. let returnDataWords := shr( OneWordShift, add(returndatasize(), ThirtyOneBytes) ) // Note: use the free memory pointer in place of msize() to work // around a Yul warning that prevents accessing msize directly // when the IR pipeline is activated. let msizeWords := shr( OneWordShift, mload(FreeMemoryPointerSlot) ) // Next, compute the cost of the returndatacopy. let cost := mul(CostPerWord, returnDataWords) // Then, compute cost of new memory allocation. if gt(returnDataWords, msizeWords) { cost := add( cost, add( mul(sub(returnDataWords, msizeWords), CostPerWord), shr( MemoryExpansionCoefficientShift, sub( mul(returnDataWords, returnDataWords), mul(msizeWords, msizeWords) ) ) ) ) } // Finally, add a small constant and compare to gas remaining; // bubble up the revert data if enough gas is still available. if lt(add(cost, ExtraGasBuffer), gas()) { // Copy returndata to memory; overwrite existing memory. returndatacopy(0, 0, returndatasize()) // Revert, specifying memory region with copied returndata. revert(0, returndatasize()) } } } } /** * @dev Internal view function to branchlessly select either the caller (if * a supplied recipient is equal to zero) or the supplied recipient (if * that recipient is a nonzero value). * * @param recipient The supplied recipient. * * @return updatedRecipient The updated recipient. */ function _substituteCallerForEmptyRecipient( address recipient ) internal view returns (address updatedRecipient) { // Utilize assembly to perform a branchless operation on the recipient. assembly { // Add caller to recipient if recipient equals 0; otherwise add 0. updatedRecipient := add(recipient, mul(iszero(recipient), caller())) } } /** * @dev Internal pure function to cast a `bool` value to a `uint256` value. * * @param b The `bool` value to cast. * * @return u The `uint256` value. */ function _cast(bool b) internal pure returns (uint256 u) { assembly { u := b } } /** * @dev Internal pure function to cast the `pptrOffset` function from * `MemoryPointerLib` to a function that takes a memory array of * `AdvancedOrder` and an offset in memory and returns the * `AdvancedOrder` whose pointer is stored at that offset from the * array length. */ function _getReadAdvancedOrderByOffset() internal pure returns ( function(AdvancedOrder[] memory, uint256) internal pure returns (AdvancedOrder memory) fn2 ) { function(MemoryPointer, uint256) internal pure returns (MemoryPointer) fn1 = MemoryPointerLib.pptrOffset; assembly { fn2 := fn1 } } /** * @dev Internal pure function to cast the `pptrOffset` function from * `MemoryPointerLib` to a function that takes a memory array of * `Execution` and an offset in memory and returns the * `Execution` whose pointer is stored at that offset from the * array length. */ function _getReadExecutionByOffset() internal pure returns ( function(Execution[] memory, uint256) internal pure returns (Execution memory) fn2 ) { function(MemoryPointer, uint256) internal pure returns (MemoryPointer) fn1 = MemoryPointerLib.pptrOffset; assembly { fn2 := fn1 } } /** * @dev Internal pure function to return a `true` value that solc * will not recognize as a compile time constant. * * This function is used to bypass function specialization for * functions which take a constant boolean as an input parameter. * * This should only be used in cases where specialization has a * negligible impact on the gas cost of the function. * * Note: assumes the calldatasize is non-zero. */ function _runTimeConstantTrue() internal pure returns (bool) { return msg.data.length > 0; } /** * @dev Internal pure function to return a `false` value that solc * will not recognize as a compile time constant. * * This function is used to bypass function specialization for * functions which take a constant boolean as an input parameter. * * This should only be used in cases where specialization has a * negligible impact on the gas cost of the function. * * Note: assumes the calldatasize is non-zero. */ function _runTimeConstantFalse() internal pure returns (bool) { return msg.data.length == 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { Side } from "./ConsiderationEnums.sol"; import { BadFraction_error_length, BadFraction_error_selector, CannotCancelOrder_error_length, CannotCancelOrder_error_selector, ConsiderationLengthNotEqualToTotalOriginal_error_length, ConsiderationLengthNotEqualToTotalOriginal_error_selector, ConsiderationNotMet_error_considerationIndex_ptr, ConsiderationNotMet_error_length, ConsiderationNotMet_error_orderIndex_ptr, ConsiderationNotMet_error_selector, ConsiderationNotMet_error_shortfallAmount_ptr, CriteriaNotEnabledForItem_error_length, CriteriaNotEnabledForItem_error_selector, Error_selector_offset, InsufficientNativeTokensSupplied_error_length, InsufficientNativeTokensSupplied_error_selector, InvalidBasicOrderParameterEncoding_error_length, InvalidBasicOrderParameterEncoding_error_selector, InvalidCallToConduit_error_conduit_ptr, InvalidCallToConduit_error_length, InvalidCallToConduit_error_selector, InvalidConduit_error_conduit_ptr, InvalidConduit_error_conduitKey_ptr, InvalidConduit_error_length, InvalidConduit_error_selector, InvalidContractOrder_error_length, InvalidContractOrder_error_orderHash_ptr, InvalidContractOrder_error_selector, InvalidERC721TransferAmount_error_amount_ptr, InvalidERC721TransferAmount_error_length, InvalidERC721TransferAmount_error_selector, InvalidMsgValue_error_length, InvalidMsgValue_error_selector, InvalidMsgValue_error_value_ptr, InvalidNativeOfferItem_error_length, InvalidNativeOfferItem_error_selector, InvalidProof_error_length, InvalidProof_error_selector, InvalidTime_error_endTime_ptr, InvalidTime_error_length, InvalidTime_error_selector, InvalidTime_error_startTime_ptr, MismatchedOfferAndConsiderationComponents_error_idx_ptr, MismatchedOfferAndConsiderationComponents_error_length, MismatchedOfferAndConsiderationComponents_error_selector, MissingFulfillmentComponentOnAggregation_error_length, MissingFulfillmentComponentOnAggregation_error_selector, MissingFulfillmentComponentOnAggregation_error_side_ptr, MissingOriginalConsiderationItems_error_length, MissingOriginalConsiderationItems_error_selector, NoReentrantCalls_error_length, NoReentrantCalls_error_selector, NoSpecifiedOrdersAvailable_error_length, NoSpecifiedOrdersAvailable_error_selector, OfferAndConsiderationRequiredOnFulfillment_error_length, OfferAndConsiderationRequiredOnFulfillment_error_selector, OrderAlreadyFilled_error_length, OrderAlreadyFilled_error_orderHash_ptr, OrderAlreadyFilled_error_selector, OrderCriteriaResolverOutOfRange_error_length, OrderCriteriaResolverOutOfRange_error_selector, OrderCriteriaResolverOutOfRange_error_side_ptr, OrderIsCancelled_error_length, OrderIsCancelled_error_orderHash_ptr, OrderIsCancelled_error_selector, OrderPartiallyFilled_error_length, OrderPartiallyFilled_error_orderHash_ptr, OrderPartiallyFilled_error_selector, PartialFillsNotEnabledForOrder_error_length, PartialFillsNotEnabledForOrder_error_selector, UnresolvedConsiderationCriteria_error_length, UnresolvedConsiderationCriteria_error_orderIndex_ptr, UnresolvedConsiderationCriteria_error_selector, UnresolvedOfferCriteria_error_length, UnresolvedOfferCriteria_error_offerIndex_ptr, UnresolvedOfferCriteria_error_orderIndex_ptr, UnresolvedOfferCriteria_error_selector, UnusedItemParameters_error_length, UnusedItemParameters_error_selector } from "./ConsiderationErrorConstants.sol"; /** * @dev Reverts the current transaction with a "BadFraction" error message. */ function _revertBadFraction() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, BadFraction_error_selector) // revert(abi.encodeWithSignature("BadFraction()")) revert(Error_selector_offset, BadFraction_error_length) } } /** * @dev Reverts the current transaction with a "ConsiderationNotMet" error * message, including the provided order index, consideration index, and * shortfall amount. * * @param orderIndex The index of the order that did not meet the * consideration criteria. * @param considerationIndex The index of the consideration item that did not * meet its criteria. * @param shortfallAmount The amount by which the consideration criteria were * not met. */ function _revertConsiderationNotMet( uint256 orderIndex, uint256 considerationIndex, uint256 shortfallAmount ) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, ConsiderationNotMet_error_selector) // Store arguments. mstore(ConsiderationNotMet_error_orderIndex_ptr, orderIndex) mstore( ConsiderationNotMet_error_considerationIndex_ptr, considerationIndex ) mstore(ConsiderationNotMet_error_shortfallAmount_ptr, shortfallAmount) // revert(abi.encodeWithSignature( // "ConsiderationNotMet(uint256,uint256,uint256)", // orderIndex, // considerationIndex, // shortfallAmount // )) revert(Error_selector_offset, ConsiderationNotMet_error_length) } } /** * @dev Reverts the current transaction with a "CriteriaNotEnabledForItem" error * message. */ function _revertCriteriaNotEnabledForItem() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, CriteriaNotEnabledForItem_error_selector) // revert(abi.encodeWithSignature("CriteriaNotEnabledForItem()")) revert(Error_selector_offset, CriteriaNotEnabledForItem_error_length) } } /** * @dev Reverts the current transaction with an * "InsufficientNativeTokensSupplied" error message. */ function _revertInsufficientNativeTokensSupplied() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InsufficientNativeTokensSupplied_error_selector) // revert(abi.encodeWithSignature("InsufficientNativeTokensSupplied()")) revert( Error_selector_offset, InsufficientNativeTokensSupplied_error_length ) } } /** * @dev Reverts the current transaction with an * "InvalidBasicOrderParameterEncoding" error message. */ function _revertInvalidBasicOrderParameterEncoding() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidBasicOrderParameterEncoding_error_selector) // revert(abi.encodeWithSignature( // "InvalidBasicOrderParameterEncoding()" // )) revert( Error_selector_offset, InvalidBasicOrderParameterEncoding_error_length ) } } /** * @dev Reverts the current transaction with an "InvalidCallToConduit" error * message, including the provided address of the conduit that was called * improperly. * * @param conduit The address of the conduit that was called improperly. */ function _revertInvalidCallToConduit(address conduit) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidCallToConduit_error_selector) // Store argument. mstore(InvalidCallToConduit_error_conduit_ptr, conduit) // revert(abi.encodeWithSignature( // "InvalidCallToConduit(address)", // conduit // )) revert(Error_selector_offset, InvalidCallToConduit_error_length) } } /** * @dev Reverts the current transaction with an "CannotCancelOrder" error * message. */ function _revertCannotCancelOrder() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, CannotCancelOrder_error_selector) // revert(abi.encodeWithSignature("CannotCancelOrder()")) revert(Error_selector_offset, CannotCancelOrder_error_length) } } /** * @dev Reverts the current transaction with an "InvalidConduit" error message, * including the provided key and address of the invalid conduit. * * @param conduitKey The key of the invalid conduit. * @param conduit The address of the invalid conduit. */ function _revertInvalidConduit(bytes32 conduitKey, address conduit) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidConduit_error_selector) // Store arguments. mstore(InvalidConduit_error_conduitKey_ptr, conduitKey) mstore(InvalidConduit_error_conduit_ptr, conduit) // revert(abi.encodeWithSignature( // "InvalidConduit(bytes32,address)", // conduitKey, // conduit // )) revert(Error_selector_offset, InvalidConduit_error_length) } } /** * @dev Reverts the current transaction with an "InvalidERC721TransferAmount" * error message. * * @param amount The invalid amount. */ function _revertInvalidERC721TransferAmount(uint256 amount) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidERC721TransferAmount_error_selector) // Store argument. mstore(InvalidERC721TransferAmount_error_amount_ptr, amount) // revert(abi.encodeWithSignature( // "InvalidERC721TransferAmount(uint256)", // amount // )) revert(Error_selector_offset, InvalidERC721TransferAmount_error_length) } } /** * @dev Reverts the current transaction with an "InvalidMsgValue" error message, * including the invalid value that was sent in the transaction's * `msg.value` field. * * @param value The invalid value that was sent in the transaction's `msg.value` * field. */ function _revertInvalidMsgValue(uint256 value) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidMsgValue_error_selector) // Store argument. mstore(InvalidMsgValue_error_value_ptr, value) // revert(abi.encodeWithSignature("InvalidMsgValue(uint256)", value)) revert(Error_selector_offset, InvalidMsgValue_error_length) } } /** * @dev Reverts the current transaction with an "InvalidNativeOfferItem" error * message. */ function _revertInvalidNativeOfferItem() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidNativeOfferItem_error_selector) // revert(abi.encodeWithSignature("InvalidNativeOfferItem()")) revert(Error_selector_offset, InvalidNativeOfferItem_error_length) } } /** * @dev Reverts the current transaction with an "InvalidProof" error message. */ function _revertInvalidProof() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidProof_error_selector) // revert(abi.encodeWithSignature("InvalidProof()")) revert(Error_selector_offset, InvalidProof_error_length) } } /** * @dev Reverts the current transaction with an "InvalidContractOrder" error * message. * * @param orderHash The hash of the contract order that caused the error. */ function _revertInvalidContractOrder(bytes32 orderHash) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidContractOrder_error_selector) // Store arguments. mstore(InvalidContractOrder_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "InvalidContractOrder(bytes32)", // orderHash // )) revert(Error_selector_offset, InvalidContractOrder_error_length) } } /** * @dev Reverts the current transaction with an "InvalidTime" error message. * * @param startTime The time at which the order becomes active. * @param endTime The time at which the order becomes inactive. */ function _revertInvalidTime(uint256 startTime, uint256 endTime) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, InvalidTime_error_selector) // Store arguments. mstore(InvalidTime_error_startTime_ptr, startTime) mstore(InvalidTime_error_endTime_ptr, endTime) // revert(abi.encodeWithSignature( // "InvalidTime(uint256,uint256)", // startTime, // endTime // )) revert(Error_selector_offset, InvalidTime_error_length) } } /** * @dev Reverts execution with a "MissingFulfillmentComponentOnAggregation" * error message. * * @param side The side of the fulfillment component that is missing (0 for * offer, 1 for consideration). * */ function _revertMissingFulfillmentComponentOnAggregation(Side side) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, MissingFulfillmentComponentOnAggregation_error_selector) // Store argument. mstore(MissingFulfillmentComponentOnAggregation_error_side_ptr, side) // revert(abi.encodeWithSignature( // "MissingFulfillmentComponentOnAggregation(uint8)", // side // )) revert( Error_selector_offset, MissingFulfillmentComponentOnAggregation_error_length ) } } /** * @dev Reverts execution with a "MissingOriginalConsiderationItems" error * message. */ function _revertMissingOriginalConsiderationItems() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, MissingOriginalConsiderationItems_error_selector) // revert(abi.encodeWithSignature( // "MissingOriginalConsiderationItems()" // )) revert( Error_selector_offset, MissingOriginalConsiderationItems_error_length ) } } /** * @dev Reverts execution with a "NoReentrantCalls" error message. */ function _revertNoReentrantCalls() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, NoReentrantCalls_error_selector) // revert(abi.encodeWithSignature("NoReentrantCalls()")) revert(Error_selector_offset, NoReentrantCalls_error_length) } } /** * @dev Reverts execution with a "NoSpecifiedOrdersAvailable" error message. */ function _revertNoSpecifiedOrdersAvailable() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, NoSpecifiedOrdersAvailable_error_selector) // revert(abi.encodeWithSignature("NoSpecifiedOrdersAvailable()")) revert(Error_selector_offset, NoSpecifiedOrdersAvailable_error_length) } } /** * @dev Reverts execution with an "OrderAlreadyFilled" error message. * * @param orderHash The hash of the order that has already been filled. */ function _revertOrderAlreadyFilled(bytes32 orderHash) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, OrderAlreadyFilled_error_selector) // Store argument. mstore(OrderAlreadyFilled_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "OrderAlreadyFilled(bytes32)", // orderHash // )) revert(Error_selector_offset, OrderAlreadyFilled_error_length) } } /** * @dev Reverts execution with an "OrderCriteriaResolverOutOfRange" error * message. * * @param side The side of the criteria that is missing (0 for offer, 1 for * consideration). * */ function _revertOrderCriteriaResolverOutOfRange(Side side) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, OrderCriteriaResolverOutOfRange_error_selector) // Store argument. mstore(OrderCriteriaResolverOutOfRange_error_side_ptr, side) // revert(abi.encodeWithSignature( // "OrderCriteriaResolverOutOfRange(uint8)", // side // )) revert( Error_selector_offset, OrderCriteriaResolverOutOfRange_error_length ) } } /** * @dev Reverts execution with an "OrderIsCancelled" error message. * * @param orderHash The hash of the order that has already been cancelled. */ function _revertOrderIsCancelled(bytes32 orderHash) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, OrderIsCancelled_error_selector) // Store argument. mstore(OrderIsCancelled_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "OrderIsCancelled(bytes32)", // orderHash // )) revert(Error_selector_offset, OrderIsCancelled_error_length) } } /** * @dev Reverts execution with an "OrderPartiallyFilled" error message. * * @param orderHash The hash of the order that has already been partially * filled. */ function _revertOrderPartiallyFilled(bytes32 orderHash) pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, OrderPartiallyFilled_error_selector) // Store argument. mstore(OrderPartiallyFilled_error_orderHash_ptr, orderHash) // revert(abi.encodeWithSignature( // "OrderPartiallyFilled(bytes32)", // orderHash // )) revert(Error_selector_offset, OrderPartiallyFilled_error_length) } } /** * @dev Reverts execution with a "PartialFillsNotEnabledForOrder" error message. */ function _revertPartialFillsNotEnabledForOrder() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, PartialFillsNotEnabledForOrder_error_selector) // revert(abi.encodeWithSignature("PartialFillsNotEnabledForOrder()")) revert( Error_selector_offset, PartialFillsNotEnabledForOrder_error_length ) } } /** * @dev Reverts execution with an "UnusedItemParameters" error message. */ function _revertUnusedItemParameters() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, UnusedItemParameters_error_selector) // revert(abi.encodeWithSignature("UnusedItemParameters()")) revert(Error_selector_offset, UnusedItemParameters_error_length) } } /** * @dev Reverts execution with a "ConsiderationLengthNotEqualToTotalOriginal" * error message. */ function _revertConsiderationLengthNotEqualToTotalOriginal() pure { assembly { // Store left-padded selector with push4 (reduces bytecode), // mem[28:32] = selector mstore(0, ConsiderationLengthNotEqualToTotalOriginal_error_selector) // revert(abi.encodeWithSignature( // "ConsiderationLengthNotEqualToTotalOriginal()" // )) revert( Error_selector_offset, ConsiderationLengthNotEqualToTotalOriginal_error_length ) } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /* * -------------------------- Disambiguation & Other Notes --------------------- * - The term "head" is used as it is in the documentation for ABI encoding, * but only in reference to dynamic types, i.e. it always refers to the * offset or pointer to the body of a dynamic type. In calldata, the head * is always an offset (relative to the parent object), while in memory, * the head is always the pointer to the body. More information found here: * https://docs.soliditylang.org/en/v0.8.17/abi-spec.html#argument-encoding * - Note that the length of an array is separate from and precedes the * head of the array. * * - The term "body" is used in place of the term "head" used in the ABI * documentation. It refers to the start of the data for a dynamic type, * e.g. the first word of a struct or the first word of the first element * in an array. * * - The term "pointer" is used to describe the absolute position of a value * and never an offset relative to another value. * - The suffix "_ptr" refers to a memory pointer. * - The suffix "_cdPtr" refers to a calldata pointer. * * - The term "offset" is used to describe the position of a value relative * to some parent value. For example, OrderParameters_conduit_offset is the * offset to the "conduit" value in the OrderParameters struct relative to * the start of the body. * - Note: Offsets are used to derive pointers. * * - Some structs have pointers defined for all of their fields in this file. * Lines which are commented out are fields that are not used in the * codebase but have been left in for readability. */ // Declare constants for name, version, and reentrancy sentinel values. // Name is right padded, so it touches the length which is left padded. This // enables writing both values at once. Length goes at byte 95 in memory, and // name fills bytes 96-109, so both values can be written left-padded to 77. uint256 constant NameLengthPtr = 0x4D; uint256 constant NameWithLength = 0x0d436F6E73696465726174696F6E; uint256 constant information_version_offset = 0; uint256 constant information_version_cd_offset = 0x60; uint256 constant information_domainSeparator_offset = 0x20; uint256 constant information_conduitController_offset = 0x40; uint256 constant information_versionLengthPtr = 0x63; uint256 constant information_versionWithLength = 0x03312e36; // 1.6 uint256 constant information_length = 0xa0; // uint256(uint32(bytes4(keccak256("_REENTRANCY_GUARD_SLOT")))) uint256 constant _REENTRANCY_GUARD_SLOT = 0x929eee14; /* * * --------------------------------------------------------------------------+ * Opcode | Mnemonic | Stack | Memory | * --------------------------------------------------------------------------| * 60 0x02 | PUSH1 0x02 | 0x02 | | * 60 0x1e | PUSH1 0x1e | 0x1e 0x02 | | * 61 0x3d5c | PUSH2 0x3d5c | 0x3d5c 0x1e 0x02 | | * 3d | RETURNDATASIZE | 0 0x3d5c 0x1e 0x02 | | * | * ::: store deployed bytecode in memory: (3d) RETURNDATASIZE (5c) TLOAD ::: | * 52 | MSTORE | 0x1e 0x02 | [0..0x20): 0x3d5c | * f3 | RETURN | | [0..0x20): 0x3d5c | * --------------------------------------------------------------------------+ */ uint256 constant _TLOAD_TEST_PAYLOAD = 0x6002_601e_613d5c_3d_52_f3; uint256 constant _TLOAD_TEST_PAYLOAD_LENGTH = 0x0a; uint256 constant _TLOAD_TEST_PAYLOAD_OFFSET = 0x16; uint256 constant _NOT_ENTERED_TSTORE = 0; uint256 constant _ENTERED_TSTORE = 1; uint256 constant _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_TSTORE = 2; uint256 constant _TSTORE_ENABLED_SSTORE = 0; uint256 constant _NOT_ENTERED_SSTORE = 1; uint256 constant _ENTERED_SSTORE = 2; uint256 constant _ENTERED_AND_ACCEPTING_NATIVE_TOKENS_SSTORE = 3; uint256 constant Offset_fulfillAdvancedOrder_criteriaResolvers = 0x20; uint256 constant Offset_fulfillAvailableOrders_offerFulfillments = 0x20; uint256 constant Offset_fulfillAvailableOrders_considerationFulfillments = 0x40; uint256 constant Offset_fulfillAvailableAdvancedOrders_criteriaResolvers = 0x20; uint256 constant Offset_fulfillAvailableAdvancedOrders_offerFulfillments = 0x40; uint256 constant Offset_fulfillAvailableAdvancedOrders_cnsdrationFlflmnts = (0x60); uint256 constant Offset_matchOrders_fulfillments = 0x20; uint256 constant Offset_matchAdvancedOrders_criteriaResolvers = 0x20; uint256 constant Offset_matchAdvancedOrders_fulfillments = 0x40; // Common Offsets // Offsets for identically positioned fields shared by: // OfferItem, ConsiderationItem, SpentItem, ReceivedItem uint256 constant Selector_length = 0x4; uint256 constant Common_token_offset = 0x20; uint256 constant Common_identifier_offset = 0x40; uint256 constant Common_amount_offset = 0x60; uint256 constant Common_endAmount_offset = 0x80; uint256 constant SpentItem_size = 0x80; uint256 constant SpentItem_size_shift = 0x7; uint256 constant OfferItem_size = 0xa0; uint256 constant OfferItem_size_with_head_pointer = 0xc0; uint256 constant ReceivedItem_size_excluding_recipient = 0x80; uint256 constant ReceivedItem_size = 0xa0; uint256 constant ReceivedItem_amount_offset = 0x60; uint256 constant ReceivedItem_recipient_offset = 0x80; uint256 constant ReceivedItem_CommonParams_size = 0x60; uint256 constant ConsiderationItem_size = 0xc0; uint256 constant ConsiderationItem_size_with_head_pointer = 0xe0; uint256 constant ConsiderationItem_recipient_offset = 0xa0; // Store the same constant in an abbreviated format for a line length fix. uint256 constant ConsiderItem_recipient_offset = 0xa0; uint256 constant Execution_offerer_offset = 0x20; uint256 constant Execution_conduit_offset = 0x40; // uint256 constant OrderParameters_offerer_offset = 0x00; uint256 constant OrderParameters_zone_offset = 0x20; uint256 constant OrderParameters_offer_head_offset = 0x40; uint256 constant OrderParameters_consideration_head_offset = 0x60; // uint256 constant OrderParameters_orderType_offset = 0x80; uint256 constant OrderParameters_startTime_offset = 0xa0; uint256 constant OrderParameters_endTime_offset = 0xc0; uint256 constant OrderParameters_zoneHash_offset = 0xe0; uint256 constant OrderParameters_salt_offset = 0x100; uint256 constant OrderParameters_conduit_offset = 0x120; uint256 constant OrderParameters_counter_offset = 0x140; uint256 constant Fulfillment_itemIndex_offset = 0x20; uint256 constant AdvancedOrder_head_size = 0xa0; uint256 constant AdvancedOrder_numerator_offset = 0x20; uint256 constant AdvancedOrder_denominator_offset = 0x40; uint256 constant AdvancedOrder_signature_offset = 0x60; uint256 constant AdvancedOrder_extraData_offset = 0x80; uint256 constant OrderStatus_ValidatedAndNotCancelled = 1; uint256 constant OrderStatus_filledNumerator_offset = 0x10; uint256 constant OrderStatus_filledDenominator_offset = 0x88; uint256 constant OrderStatus_ValidatedAndNotCancelledAndFullyFilled = ( 0x0000000000000000000000000000010000000000000000000000000000010001 ); uint256 constant ThirtyOneBytes = 0x1f; uint256 constant OneWord = 0x20; uint256 constant TwoWords = 0x40; uint256 constant ThreeWords = 0x60; uint256 constant FourWords = 0x80; uint256 constant FiveWords = 0xa0; uint256 constant OneWordShift = 0x5; uint256 constant TwoWordsShift = 0x6; uint256 constant SixtyThreeBytes = 0x3f; uint256 constant OnlyFullWordMask = 0xffffffe0; uint256 constant FreeMemoryPointerSlot = 0x40; uint256 constant ZeroSlot = 0x60; uint256 constant DefaultFreeMemoryPointer = 0x80; uint256 constant Slot0x80 = 0x80; uint256 constant Slot0xA0 = 0xa0; uint256 constant BasicOrder_common_params_size = 0xa0; uint256 constant BasicOrder_considerationHashesArray_ptr = 0x160; uint256 constant BasicOrder_receivedItemByteMap = (0x0000010102030000000000000000000000000000000000000000000000000000); uint256 constant BasicOrder_offeredItemByteMap = (0x0203020301010000000000000000000000000000000000000000000000000000); uint256 constant BasicOrder_consideration_offset_from_offer = 0xa0; bytes32 constant OrdersMatchedTopic0 = (0x4b9f2d36e1b4c93de62cc077b00b1a91d84b6c31b4a14e012718dcca230689e7); uint256 constant EIP712_Order_size = 0x180; uint256 constant EIP712_OfferItem_size = 0xc0; uint256 constant EIP712_ConsiderationItem_size = 0xe0; uint256 constant AdditionalRecipient_size = 0x40; uint256 constant AdditionalRecipient_size_shift = 0x6; uint256 constant EIP712_DomainSeparator_offset = 0x02; uint256 constant EIP712_OrderHash_offset = 0x22; uint256 constant EIP712_DigestPayload_size = 0x42; uint256 constant EIP712_domainData_nameHash_offset = 0x20; uint256 constant EIP712_domainData_versionHash_offset = 0x40; uint256 constant EIP712_domainData_chainId_offset = 0x60; uint256 constant EIP712_domainData_verifyingContract_offset = 0x80; uint256 constant EIP712_domainData_size = 0xa0; // Minimum BulkOrder proof size: 64 bytes for signature + 3 for key + 32 for 1 // sibling. Maximum BulkOrder proof size: 65 bytes for signature + 3 for key + // 768 for 24 siblings. uint256 constant BulkOrderProof_minSize = 0x63; uint256 constant BulkOrderProof_rangeSize = 0x2e2; uint256 constant BulkOrderProof_lengthAdjustmentBeforeMask = 0x1d; uint256 constant BulkOrderProof_lengthRangeAfterMask = 0x2; uint256 constant BulkOrderProof_keyShift = 0xe8; uint256 constant BulkOrderProof_keySize = 0x3; uint256 constant BulkOrder_Typehash_Height_One = (0x3ca2711d29384747a8f61d60aad3c450405f7aaff5613541dee28df2d6986d32); uint256 constant BulkOrder_Typehash_Height_Two = (0xbf8e29b89f29ed9b529c154a63038ffca562f8d7cd1e2545dda53a1b582dde30); uint256 constant BulkOrder_Typehash_Height_Three = (0x53c6f6856e13104584dd0797ca2b2779202dc2597c6066a42e0d8fe990b0024d); uint256 constant BulkOrder_Typehash_Height_Four = (0xa02eb7ff164c884e5e2c336dc85f81c6a93329d8e9adf214b32729b894de2af1); uint256 constant BulkOrder_Typehash_Height_Five = (0x39c9d33c18e050dda0aeb9a8086fb16fc12d5d64536780e1da7405a800b0b9f6); uint256 constant BulkOrder_Typehash_Height_Six = (0x1c19f71958cdd8f081b4c31f7caf5c010b29d12950be2fa1c95070dc47e30b55); uint256 constant BulkOrder_Typehash_Height_Seven = (0xca74fab2fece9a1d58234a274220ad05ca096a92ef6a1ca1750b9d90c948955c); uint256 constant BulkOrder_Typehash_Height_Eight = (0x7ff98d9d4e55d876c5cfac10b43c04039522f3ddfb0ea9bfe70c68cfb5c7cc14); uint256 constant BulkOrder_Typehash_Height_Nine = (0xbed7be92d41c56f9e59ac7a6272185299b815ddfabc3f25deb51fe55fe2f9e8a); uint256 constant BulkOrder_Typehash_Height_Ten = (0xd1d97d1ef5eaa37a4ee5fbf234e6f6d64eb511eb562221cd7edfbdde0848da05); uint256 constant BulkOrder_Typehash_Height_Eleven = (0x896c3f349c4da741c19b37fec49ed2e44d738e775a21d9c9860a69d67a3dae53); uint256 constant BulkOrder_Typehash_Height_Twelve = (0xbb98d87cc12922b83759626c5f07d72266da9702d19ffad6a514c73a89002f5f); uint256 constant BulkOrder_Typehash_Height_Thirteen = (0xe6ae19322608dd1f8a8d56aab48ed9c28be489b689f4b6c91268563efc85f20e); uint256 constant BulkOrder_Typehash_Height_Fourteen = (0x6b5b04cbae4fcb1a9d78e7b2dfc51a36933d023cf6e347e03d517b472a852590); uint256 constant BulkOrder_Typehash_Height_Fifteen = (0xd1eb68309202b7106b891e109739dbbd334a1817fe5d6202c939e75cf5e35ca9); uint256 constant BulkOrder_Typehash_Height_Sixteen = (0x1da3eed3ecef6ebaa6e5023c057ec2c75150693fd0dac5c90f4a142f9879fde8); uint256 constant BulkOrder_Typehash_Height_Seventeen = (0xeee9a1392aa395c7002308119a58f2582777a75e54e0c1d5d5437bd2e8bf6222); uint256 constant BulkOrder_Typehash_Height_Eighteen = (0xc3939feff011e53ab8c35ca3370aad54c5df1fc2938cd62543174fa6e7d85877); uint256 constant BulkOrder_Typehash_Height_Nineteen = (0x0efca7572ac20f5ae84db0e2940674f7eca0a4726fa1060ffc2d18cef54b203d); uint256 constant BulkOrder_Typehash_Height_Twenty = (0x5a4f867d3d458dabecad65f6201ceeaba0096df2d0c491cc32e6ea4e64350017); uint256 constant BulkOrder_Typehash_Height_TwentyOne = (0x80987079d291feebf21c2230e69add0f283cee0b8be492ca8050b4185a2ff719); uint256 constant BulkOrder_Typehash_Height_TwentyTwo = (0x3bd8cff538aba49a9c374c806d277181e9651624b3e31111bc0624574f8bca1d); uint256 constant BulkOrder_Typehash_Height_TwentyThree = (0x5d6a3f098a0bc373f808c619b1bb4028208721b3c4f8d6bc8a874d659814eb76); uint256 constant BulkOrder_Typehash_Height_TwentyFour = (0x1d51df90cba8de7637ca3e8fe1e3511d1dc2f23487d05dbdecb781860c21ac1c); uint256 constant receivedItemsHash_ptr = 0x60; /* * Memory layout in _prepareBasicFulfillmentFromCalldata of * data for OrderFulfilled * * event OrderFulfilled( * bytes32 orderHash, * address indexed offerer, * address indexed zone, * address fulfiller, * SpentItem[] offer, * > (itemType, token, id, amount) * ReceivedItem[] consideration * > (itemType, token, id, amount, recipient) * ) * * - 0x00: orderHash * - 0x20: fulfiller * - 0x40: offer offset (0x80) * - 0x60: consideration offset (0x120) * - 0x80: offer.length (1) * - 0xa0: offerItemType * - 0xc0: offerToken * - 0xe0: offerIdentifier * - 0x100: offerAmount * - 0x120: consideration.length (1 + additionalRecipients.length) * - 0x140: considerationItemType * - 0x160: considerationToken * - 0x180: considerationIdentifier * - 0x1a0: considerationAmount * - 0x1c0: considerationRecipient * - ... */ // Minimum length of the OrderFulfilled event data. // Must be added to the size of the ReceivedItem array for additionalRecipients // (0xa0 * additionalRecipients.length) to calculate full size of the buffer. uint256 constant OrderFulfilled_baseSize = 0x1e0; uint256 constant OrderFulfilled_selector = (0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31); // Minimum offset in memory to OrderFulfilled event data. // Must be added to the size of the EIP712 hash array for additionalRecipients // (32 * additionalRecipients.length) to calculate the pointer to event data. uint256 constant OrderFulfilled_baseOffset = 0x180; uint256 constant OrderFulfilled_consideration_length_baseOffset = 0x2a0; uint256 constant OrderFulfilled_offer_length_baseOffset = 0x200; uint256 constant OrderFulfilled_offer_length_offset_relativeTo_baseOffset = ( 0x80 ); uint256 constant OrderFulfilled_offer_itemType_offset_relativeTo_baseOffset = ( 0xa0 ); uint256 constant OrderFulfilled_offer_token_offset_relativeTo_baseOffset = 0xc0; // Related constants used for restricted order checks on basic orders. uint256 constant OrderFulfilled_baseDataSize = 0x160; // uint256 constant ValidateOrder_offerDataOffset = 0x184; // uint256 constant RatifyOrder_offerDataOffset = 0xc4; // uint256 constant OrderFulfilled_orderHash_offset = 0x00; uint256 constant OrderFulfilled_fulfiller_offset = 0x20; uint256 constant OrderFulfilled_offer_head_offset = 0x40; uint256 constant OrderFulfilled_offer_body_offset = 0x80; uint256 constant OrderFulfilled_consideration_head_offset = 0x60; uint256 constant OrderFulfilled_consideration_body_offset = 0x120; /* * 3 memory slots/words for `authorizeOrder` and `validateOrder` calldata * to be used for tails of extra data (length 0) and order hashes (length 1) */ uint256 constant OrderFulfilled_post_memory_region_reservedBytes = 0x60; /* * OrderFulfilled_offer_length_baseOffset - 12 * 0x20 * we back up 12 words from where the `OrderFulfilled`'s data * for spent items start to be rewritten for `authorizeOrder` * and `validateOrder`. Let the reference pointer be `ptr` * pointing to the `OrderFulfilled`'s spent item array's length memory * position then we would have: * * ptr - 0x0180 : zero-padded calldata selector * ptr - 0x0160 : ZoneParameter's struct head (0x20) * ptr - 0x0140 : order hash * ptr - 0x0120 : fulfiller (msg.sender) * ptr - 0x0100 : offerer * ptr - 0x00e0 : spent items' head * ptr - 0x00c0 : received items' head * ptr - 0x00a0 : extra data / context head * ptr - 0x0080 : order hashes head * ptr - 0x0060 : start time * ptr - 0x0040 : end time * ptr - 0x0020 : zone hash * ptr - 0x0000 : offer.length (1) * ... * * Note that the padded calldata selector will be at minimum at the * 0x80 memory slot. */ uint256 constant authorizeOrder_calldata_baseOffset = ( OrderFulfilled_offer_length_baseOffset - 0x180 ); // BasicOrderParameters uint256 constant BasicOrder_parameters_cdPtr = 0x04; uint256 constant BasicOrder_considerationToken_cdPtr = 0x24; uint256 constant BasicOrder_considerationIdentifier_cdPtr = 0x44; uint256 constant BasicOrder_considerationAmount_cdPtr = 0x64; uint256 constant BasicOrder_offerer_cdPtr = 0x84; uint256 constant BasicOrder_zone_cdPtr = 0xa4; uint256 constant BasicOrder_offerToken_cdPtr = 0xc4; uint256 constant BasicOrder_offerIdentifier_cdPtr = 0xe4; uint256 constant BasicOrder_offerAmount_cdPtr = 0x104; uint256 constant BasicOrder_basicOrderParameters_cd_offset = 0x24; uint256 constant BasicOrder_basicOrderType_cdPtr = 0x124; uint256 constant BasicOrder_startTime_cdPtr = 0x144; uint256 constant BasicOrder_endTime_cdPtr = 0x164; // uint256 constant BasicOrder_zoneHash_cdPtr = 0x184; // uint256 constant BasicOrder_salt_cdPtr = 0x1a4; uint256 constant BasicOrder_offererConduit_cdPtr = 0x1c4; uint256 constant BasicOrder_fulfillerConduit_cdPtr = 0x1e4; uint256 constant BasicOrder_totalOriginalAdditionalRecipients_cdPtr = 0x204; uint256 constant BasicOrder_additionalRecipients_head_cdPtr = 0x224; uint256 constant BasicOrder_signature_cdPtr = 0x244; uint256 constant BasicOrder_additionalRecipients_length_cdPtr = 0x264; uint256 constant BasicOrder_addlRecipients_length_cdPtr = 0x264; uint256 constant BasicOrder_additionalRecipients_data_cdPtr = 0x284; uint256 constant BasicOrder_parameters_ptr = 0x20; uint256 constant BasicOrder_basicOrderType_range = 0x18; // 24 values /* * Memory layout in _prepareBasicFulfillmentFromCalldata of * EIP712 data for ConsiderationItem * - 0x80: ConsiderationItem EIP-712 typehash (constant) * - 0xa0: itemType * - 0xc0: token * - 0xe0: identifier * - 0x100: startAmount * - 0x120: endAmount * - 0x140: recipient */ uint256 constant BasicOrder_considerationItem_typeHash_ptr = 0x80; // memoryPtr uint256 constant BasicOrder_considerationItem_itemType_ptr = 0xa0; uint256 constant BasicOrder_considerationItem_token_ptr = 0xc0; uint256 constant BasicOrder_considerationItem_identifier_ptr = 0xe0; uint256 constant BasicOrder_considerationItem_startAmount_ptr = 0x100; uint256 constant BasicOrder_considerationItem_endAmount_ptr = 0x120; // uint256 constant BasicOrder_considerationItem_recipient_ptr = 0x140; /* * Memory layout in _prepareBasicFulfillmentFromCalldata of * EIP712 data for OfferItem * - 0x80: OfferItem EIP-712 typehash (constant) * - 0xa0: itemType * - 0xc0: token * - 0xe0: identifier (reused for offeredItemsHash) * - 0x100: startAmount * - 0x120: endAmount */ uint256 constant BasicOrder_offerItem_typeHash_ptr = 0x80; uint256 constant BasicOrder_offerItem_itemType_ptr = 0xa0; uint256 constant BasicOrder_offerItem_token_ptr = 0xc0; // uint256 constant BasicOrder_offerItem_identifier_ptr = 0xe0; // uint256 constant BasicOrder_offerItem_startAmount_ptr = 0x100; uint256 constant BasicOrder_offerItem_endAmount_ptr = 0x120; /* * Memory layout in _prepareBasicFulfillmentFromCalldata of * EIP712 data for Order * - 0x80: Order EIP-712 typehash (constant) * - 0xa0: orderParameters.offerer * - 0xc0: orderParameters.zone * - 0xe0: keccak256(abi.encodePacked(offerHashes)) * - 0x100: keccak256(abi.encodePacked(considerationHashes)) * - 0x120: orderType * - 0x140: startTime * - 0x160: endTime * - 0x180: zoneHash * - 0x1a0: salt * - 0x1c0: conduit * - 0x1e0: _counters[orderParameters.offerer] (from storage) */ uint256 constant BasicOrder_order_typeHash_ptr = 0x80; uint256 constant BasicOrder_order_offerer_ptr = 0xa0; // uint256 constant BasicOrder_order_zone_ptr = 0xc0; uint256 constant BasicOrder_order_offerHashes_ptr = 0xe0; uint256 constant BasicOrder_order_considerationHashes_ptr = 0x100; uint256 constant BasicOrder_order_orderType_ptr = 0x120; uint256 constant BasicOrder_order_startTime_ptr = 0x140; // uint256 constant BasicOrder_order_endTime_ptr = 0x160; // uint256 constant BasicOrder_order_zoneHash_ptr = 0x180; // uint256 constant BasicOrder_order_salt_ptr = 0x1a0; // uint256 constant BasicOrder_order_conduitKey_ptr = 0x1c0; uint256 constant BasicOrder_order_counter_ptr = 0x1e0; uint256 constant BasicOrder_additionalRecipients_head_ptr = 0x240; uint256 constant BasicOrder_signature_ptr = 0x260; uint256 constant BasicOrder_startTimeThroughZoneHash_size = 0x60; uint256 constant ContractOrder_orderHash_offerer_shift = 0x60; uint256 constant Counter_blockhash_shift = 0x80; // Signature-related bytes32 constant EIP2098_allButHighestBitMask = (0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); bytes32 constant ECDSA_twentySeventhAndTwentyEighthBytesSet = (0x0000000000000000000000000000000000000000000000000000000101000000); uint256 constant ECDSA_MaxLength = 65; uint256 constant ECDSA_signature_s_offset = 0x40; uint256 constant ECDSA_signature_v_offset = 0x60; bytes32 constant EIP1271_isValidSignature_selector = (0x1626ba7e00000000000000000000000000000000000000000000000000000000); uint256 constant EIP1271_isValidSignature_digest_negativeOffset = 0x40; uint256 constant EIP1271_isValidSignature_selector_negativeOffset = 0x44; uint256 constant EIP1271_isValidSignature_calldata_baseLength = 0x64; uint256 constant EIP1271_isValidSignature_signature_head_offset = 0x40; uint256 constant EIP_712_PREFIX = (0x1901000000000000000000000000000000000000000000000000000000000000); uint256 constant ExtraGasBuffer = 0x20; uint256 constant CostPerWord = 0x3; uint256 constant MemoryExpansionCoefficientShift = 0x9; uint256 constant Create2AddressDerivation_ptr = 0x0b; uint256 constant Create2AddressDerivation_length = 0x55; uint256 constant MaskOverByteTwelve = (0x0000000000000000000000ff0000000000000000000000000000000000000000); uint256 constant MaskOverLastTwentyBytes = (0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff); uint256 constant AddressDirtyUpperBitThreshold = (0x0000000000000000000000010000000000000000000000000000000000000000); uint256 constant MaskOverFirstFourBytes = (0xffffffff00000000000000000000000000000000000000000000000000000000); uint256 constant Conduit_execute_signature = (0x4ce34aa200000000000000000000000000000000000000000000000000000000); uint256 constant MaxUint8 = 0xff; uint256 constant MaxUint120 = 0xffffffffffffffffffffffffffffff; uint256 constant Conduit_execute_ConduitTransfer_ptr = 0x20; uint256 constant Conduit_execute_ConduitTransfer_length = 0x01; uint256 constant Conduit_execute_ConduitTransfer_offset_ptr = 0x04; uint256 constant Conduit_execute_ConduitTransfer_length_ptr = 0x24; uint256 constant Conduit_execute_transferItemType_ptr = 0x44; uint256 constant Conduit_execute_transferToken_ptr = 0x64; uint256 constant Conduit_execute_transferFrom_ptr = 0x84; uint256 constant Conduit_execute_transferTo_ptr = 0xa4; uint256 constant Conduit_execute_transferIdentifier_ptr = 0xc4; uint256 constant Conduit_execute_transferAmount_ptr = 0xe4; uint256 constant OneConduitExecute_size = 0x104; // Sentinel value to indicate that the conduit accumulator is not armed. uint256 constant AccumulatorDisarmed = 0x20; uint256 constant AccumulatorArmed = 0x40; uint256 constant Accumulator_conduitKey_ptr = 0x20; uint256 constant Accumulator_selector_ptr = 0x40; uint256 constant Accumulator_array_offset_ptr = 0x44; uint256 constant Accumulator_array_length_ptr = 0x64; uint256 constant Accumulator_itemSizeOffsetDifference = 0x3c; uint256 constant Accumulator_array_offset = 0x20; uint256 constant Conduit_transferItem_size = 0xc0; uint256 constant Conduit_transferItem_token_ptr = 0x20; uint256 constant Conduit_transferItem_from_ptr = 0x40; uint256 constant Conduit_transferItem_to_ptr = 0x60; uint256 constant Conduit_transferItem_identifier_ptr = 0x80; uint256 constant Conduit_transferItem_amount_ptr = 0xa0; uint256 constant Ecrecover_precompile = 0x1; uint256 constant Ecrecover_args_size = 0x80; uint256 constant Signature_lower_v = 27; // Bitmask that only gives a non-zero value if masked with a non-match selector. uint256 constant NonMatchSelector_MagicMask = (0x4000000000000000000000000000000000000000000000000000000000); // First bit indicates that a NATIVE offer items has been used and the 231st bit // indicates that a non match selector has been called. uint256 constant NonMatchSelector_InvalidErrorValue = (0x4000000000000000000000000000000000000000000000000000000001); /** * @dev Selector and offsets for generateOrder * * function generateOrder( * address fulfiller, * SpentItem[] calldata minimumReceived, * SpentItem[] calldata maximumSpent, * bytes calldata context * ) */ uint256 constant generateOrder_selector = 0x98919765; uint256 constant generateOrder_selector_offset = 0x1c; uint256 constant generateOrder_head_offset = 0x04; uint256 constant generateOrder_minimumReceived_head_offset = 0x20; uint256 constant generateOrder_maximumSpent_head_offset = 0x40; uint256 constant generateOrder_context_head_offset = 0x60; uint256 constant generateOrder_base_tail_offset = 0x80; uint256 constant generateOrder_maximum_returned_array_length = 0xffff; uint256 constant ratifyOrder_selector = 0xf4dd92ce; uint256 constant ratifyOrder_selector_offset = 0x1c; uint256 constant ratifyOrder_head_offset = 0x04; // uint256 constant ratifyOrder_offer_head_offset = 0x00; uint256 constant ratifyOrder_consideration_head_offset = 0x20; uint256 constant ratifyOrder_context_head_offset = 0x40; uint256 constant ratifyOrder_orderHashes_head_offset = 0x60; uint256 constant ratifyOrder_contractNonce_offset = 0x80; uint256 constant ratifyOrder_base_tail_offset = 0xa0; uint256 constant validateOrder_selector = 0x17b1f942; uint256 constant validateOrder_selector_offset = 0x1c; uint256 constant validateOrder_head_offset = 0x04; uint256 constant validateOrder_zoneParameters_offset = 0x20; uint256 constant authorizeOrder_selector = 0x01e4d72a; uint256 constant authorizeOrder_selector_offset = 0x1c; uint256 constant authorizeOrder_head_offset = 0x04; uint256 constant authorizeOrder_zoneParameters_offset = 0x20; // uint256 constant ZoneParameters_orderHash_offset = 0x00; uint256 constant ZoneParameters_fulfiller_offset = 0x20; uint256 constant ZoneParameters_offerer_offset = 0x40; uint256 constant ZoneParameters_offer_head_offset = 0x60; uint256 constant ZoneParameters_consideration_head_offset = 0x80; uint256 constant ZoneParameters_extraData_head_offset = 0xa0; uint256 constant ZoneParameters_orderHashes_head_offset = 0xc0; uint256 constant ZoneParameters_startTime_offset = 0xe0; uint256 constant ZoneParameters_endTime_offset = 0x100; uint256 constant ZoneParameters_zoneHash_offset = 0x120; uint256 constant ZoneParameters_base_tail_offset = 0x140; uint256 constant ZoneParameters_selectorAndPointer_length = 0x24; uint256 constant ZoneParameters_basicOrderFixedElements_length = 0x44; // ConsiderationDecoder Constants uint256 constant OrderParameters_head_size = 0x0160; uint256 constant OrderParameters_totalOriginalConsiderationItems_offset = ( 0x0140 ); uint256 constant AdvancedOrderPlusOrderParameters_head_size = 0x0200; uint256 constant Order_signature_offset = 0x20; uint256 constant Order_head_size = 0x40; uint256 constant AdvancedOrder_fixed_segment_0 = 0x40; uint256 constant CriteriaResolver_head_size = 0xa0; uint256 constant CriteriaResolver_fixed_segment_0 = 0x80; uint256 constant CriteriaResolver_criteriaProof_offset = 0x80; uint256 constant FulfillmentComponent_mem_tail_size = 0x40; uint256 constant FulfillmentComponent_mem_tail_size_shift = 0x6; uint256 constant Fulfillment_head_size = 0x40; uint256 constant Fulfillment_considerationComponents_offset = 0x20; uint256 constant OrderComponents_OrderParameters_common_head_size = 0x0140;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; uint256 constant Error_selector_offset = 0x1c; /* * error MissingFulfillmentComponentOnAggregation(uint8 side) * - Defined in FulfillmentApplicationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: side * Revert buffer is memory[0x1c:0x40] */ uint256 constant MissingFulfillmentComponentOnAggregation_error_selector = ( 0x375c24c1 ); uint256 constant MissingFulfillmentComponentOnAggregation_error_side_ptr = 0x20; uint256 constant MissingFulfillmentComponentOnAggregation_error_length = 0x24; /* * error OfferAndConsiderationRequiredOnFulfillment() * - Defined in FulfillmentApplicationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant OfferAndConsiderationRequiredOnFulfillment_error_selector = ( 0x98e9db6e ); uint256 constant OfferAndConsiderationRequiredOnFulfillment_error_length = 0x04; /* * error MismatchedFulfillmentOfferAndConsiderationComponents( * uint256 fulfillmentIndex * ) * - Defined in FulfillmentApplicationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: fulfillmentIndex * Revert buffer is memory[0x1c:0x40] */ uint256 constant MismatchedOfferAndConsiderationComponents_error_selector = ( 0xbced929d ); uint256 constant MismatchedOfferAndConsiderationComponents_error_idx_ptr = 0x20; uint256 constant MismatchedOfferAndConsiderationComponents_error_length = 0x24; /* * error InvalidFulfillmentComponentData() * - Defined in FulfillmentApplicationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidFulfillmentComponentData_error_selector = 0x7fda7279; uint256 constant InvalidFulfillmentComponentData_error_length = 0x04; /* * error InexactFraction() * - Defined in AmountDerivationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InexactFraction_error_selector = 0xc63cf089; uint256 constant InexactFraction_error_length = 0x04; /* * error OrderCriteriaResolverOutOfRange(uint8 side) * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: side * Revert buffer is memory[0x1c:0x40] */ uint256 constant OrderCriteriaResolverOutOfRange_error_selector = 0x133c37c6; uint256 constant OrderCriteriaResolverOutOfRange_error_side_ptr = 0x20; uint256 constant OrderCriteriaResolverOutOfRange_error_length = 0x24; /* * error UnresolvedOfferCriteria(uint256 orderIndex, uint256 offerIndex) * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderIndex * - 0x40: offerIndex * Revert buffer is memory[0x1c:0x60] */ uint256 constant UnresolvedOfferCriteria_error_selector = 0xd6929332; uint256 constant UnresolvedOfferCriteria_error_orderIndex_ptr = 0x20; uint256 constant UnresolvedOfferCriteria_error_offerIndex_ptr = 0x40; uint256 constant UnresolvedOfferCriteria_error_length = 0x44; /* * error UnresolvedConsiderationCriteria( * uint256 orderIndex, * uint256 considerationIndex * ) * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderIndex * - 0x40: considerationIndex * Revert buffer is memory[0x1c:0x60] */ uint256 constant UnresolvedConsiderationCriteria_error_selector = 0xa8930e9a; uint256 constant UnresolvedConsiderationCriteria_error_orderIndex_ptr = 0x20; uint256 constant UnresolvedConsiderationCriteria_error_itemIndex_ptr = 0x40; uint256 constant UnresolvedConsiderationCriteria_error_length = 0x44; /* * error OfferCriteriaResolverOutOfRange() * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant OfferCriteriaResolverOutOfRange_error_selector = 0xbfb3f8ce; // uint256 constant OfferCriteriaResolverOutOfRange_error_length = 0x04; /* * error ConsiderationCriteriaResolverOutOfRange() * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant ConsiderationCriteriaResolverOutOfRange_error_selector = ( 0x6088d7de ); uint256 constant ConsiderationCriteriaResolverOutOfRange_err_selector = ( 0x6088d7de ); // uint256 constant ConsiderationCriteriaResolverOutOfRange_error_length = 0x04; /* * error CriteriaNotEnabledForItem() * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant CriteriaNotEnabledForItem_error_selector = 0x94eb6af6; uint256 constant CriteriaNotEnabledForItem_error_length = 0x04; /* * error InvalidProof() * - Defined in CriteriaResolutionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidProof_error_selector = 0x09bde339; uint256 constant InvalidProof_error_length = 0x04; /* * error InvalidRestrictedOrder(bytes32 orderHash) * - Defined in ZoneInteractionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidRestrictedOrder_error_selector = 0xfb5014fc; uint256 constant InvalidRestrictedOrder_error_orderHash_ptr = 0x20; uint256 constant InvalidRestrictedOrder_error_length = 0x24; /* * error InvalidContractOrder(bytes32 orderHash) * - Defined in ZoneInteractionErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidContractOrder_error_selector = 0x93979285; uint256 constant InvalidContractOrder_error_orderHash_ptr = 0x20; uint256 constant InvalidContractOrder_error_length = 0x24; /* * error BadSignatureV(uint8 v) * - Defined in SignatureVerificationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: v * Revert buffer is memory[0x1c:0x40] */ uint256 constant BadSignatureV_error_selector = 0x1f003d0a; uint256 constant BadSignatureV_error_v_ptr = 0x20; uint256 constant BadSignatureV_error_length = 0x24; /* * error InvalidSigner() * - Defined in SignatureVerificationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidSigner_error_selector = 0x815e1d64; uint256 constant InvalidSigner_error_length = 0x04; /* * error InvalidSignature() * - Defined in SignatureVerificationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidSignature_error_selector = 0x8baa579f; uint256 constant InvalidSignature_error_length = 0x04; /* * error BadContractSignature() * - Defined in SignatureVerificationErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant BadContractSignature_error_selector = 0x4f7fb80d; uint256 constant BadContractSignature_error_length = 0x04; /* * error InvalidERC721TransferAmount(uint256 amount) * - Defined in TokenTransferrerErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: amount * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidERC721TransferAmount_error_selector = 0x69f95827; uint256 constant InvalidERC721TransferAmount_error_amount_ptr = 0x20; uint256 constant InvalidERC721TransferAmount_error_length = 0x24; /* * error MissingItemAmount() * - Defined in TokenTransferrerErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant MissingItemAmount_error_selector = 0x91b3e514; uint256 constant MissingItemAmount_error_length = 0x04; /* * error UnusedItemParameters() * - Defined in TokenTransferrerErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant UnusedItemParameters_error_selector = 0x6ab37ce7; uint256 constant UnusedItemParameters_error_length = 0x04; /* * error NoReentrantCalls() * - Defined in ReentrancyErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant NoReentrantCalls_error_selector = 0x7fa8a987; uint256 constant NoReentrantCalls_error_length = 0x04; /* * error OrderAlreadyFilled(bytes32 orderHash) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant OrderAlreadyFilled_error_selector = 0x10fda3e1; uint256 constant OrderAlreadyFilled_error_orderHash_ptr = 0x20; uint256 constant OrderAlreadyFilled_error_length = 0x24; /* * error InvalidTime(uint256 startTime, uint256 endTime) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: startTime * - 0x40: endTime * Revert buffer is memory[0x1c:0x60] */ uint256 constant InvalidTime_error_selector = 0x21ccfeb7; uint256 constant InvalidTime_error_startTime_ptr = 0x20; uint256 constant InvalidTime_error_endTime_ptr = 0x40; uint256 constant InvalidTime_error_length = 0x44; /* * error InvalidConduit(bytes32 conduitKey, address conduit) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: conduitKey * - 0x40: conduit * Revert buffer is memory[0x1c:0x60] */ uint256 constant InvalidConduit_error_selector = 0x1cf99b26; uint256 constant InvalidConduit_error_conduitKey_ptr = 0x20; uint256 constant InvalidConduit_error_conduit_ptr = 0x40; uint256 constant InvalidConduit_error_length = 0x44; /* * error MissingOriginalConsiderationItems() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant MissingOriginalConsiderationItems_error_selector = 0x466aa616; uint256 constant MissingOriginalConsiderationItems_error_length = 0x04; /* * error InvalidCallToConduit(address conduit) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: conduit * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidCallToConduit_error_selector = 0xd13d53d4; uint256 constant InvalidCallToConduit_error_conduit_ptr = 0x20; uint256 constant InvalidCallToConduit_error_length = 0x24; /* * error ConsiderationNotMet( * uint256 orderIndex, * uint256 considerationIndex, * uint256 shortfallAmount * ) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderIndex * - 0x40: considerationIndex * - 0x60: shortfallAmount * Revert buffer is memory[0x1c:0x80] */ uint256 constant ConsiderationNotMet_error_selector = 0xa5f54208; uint256 constant ConsiderationNotMet_error_orderIndex_ptr = 0x20; uint256 constant ConsiderationNotMet_error_considerationIndex_ptr = 0x40; uint256 constant ConsiderationNotMet_error_shortfallAmount_ptr = 0x60; uint256 constant ConsiderationNotMet_error_length = 0x64; /* * error InsufficientNativeTokensSupplied() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InsufficientNativeTokensSupplied_error_selector = 0x8ffff980; uint256 constant InsufficientNativeTokensSupplied_error_length = 0x04; /* * error NativeTokenTransferGenericFailure(address account, uint256 amount) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: account * - 0x40: amount * Revert buffer is memory[0x1c:0x60] */ uint256 constant NativeTokenTransferGenericFailure_error_selector = 0xbc806b96; uint256 constant NativeTokenTransferGenericFailure_error_account_ptr = 0x20; uint256 constant NativeTokenTransferGenericFailure_error_amount_ptr = 0x40; uint256 constant NativeTokenTransferGenericFailure_error_length = 0x44; /* * error PartialFillsNotEnabledForOrder() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant PartialFillsNotEnabledForOrder_error_selector = 0xa11b63ff; uint256 constant PartialFillsNotEnabledForOrder_error_length = 0x04; /* * error OrderIsCancelled(bytes32 orderHash) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant OrderIsCancelled_error_selector = 0x1a515574; uint256 constant OrderIsCancelled_error_orderHash_ptr = 0x20; uint256 constant OrderIsCancelled_error_length = 0x24; /* * error OrderPartiallyFilled(bytes32 orderHash) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: orderHash * Revert buffer is memory[0x1c:0x40] */ uint256 constant OrderPartiallyFilled_error_selector = 0xee9e0e63; uint256 constant OrderPartiallyFilled_error_orderHash_ptr = 0x20; uint256 constant OrderPartiallyFilled_error_length = 0x24; /* * error CannotCancelOrder() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant CannotCancelOrder_error_selector = 0xfed398fc; uint256 constant CannotCancelOrder_error_length = 0x04; /* * error BadFraction() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant BadFraction_error_selector = 0x5a052b32; uint256 constant BadFraction_error_length = 0x04; /* * error InvalidMsgValue(uint256 value) * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: value * Revert buffer is memory[0x1c:0x40] */ uint256 constant InvalidMsgValue_error_selector = 0xa61be9f0; uint256 constant InvalidMsgValue_error_value_ptr = 0x20; uint256 constant InvalidMsgValue_error_length = 0x24; /* * error InvalidBasicOrderParameterEncoding() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidBasicOrderParameterEncoding_error_selector = 0x39f3e3fd; uint256 constant InvalidBasicOrderParameterEncoding_error_length = 0x04; /* * error NoSpecifiedOrdersAvailable() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant NoSpecifiedOrdersAvailable_error_selector = 0xd5da9a1b; uint256 constant NoSpecifiedOrdersAvailable_error_length = 0x04; /* * error InvalidNativeOfferItem() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant InvalidNativeOfferItem_error_selector = 0x12d3f5a3; uint256 constant InvalidNativeOfferItem_error_length = 0x04; /* * error ConsiderationLengthNotEqualToTotalOriginal() * - Defined in ConsiderationEventsAndErrors.sol * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * Revert buffer is memory[0x1c:0x20] */ uint256 constant ConsiderationLengthNotEqualToTotalOriginal_error_selector = ( 0x2165628a ); uint256 constant ConsiderationLengthNotEqualToTotalOriginal_error_length = 0x04; /* * error Panic(uint256 code) * - Built-in Solidity error * Memory layout: * - 0x00: Left-padded selector (data begins at 0x1c) * - 0x20: code * Revert buffer is memory[0x1c:0x40] */ uint256 constant Panic_error_selector = 0x4e487b71; uint256 constant Panic_error_code_ptr = 0x20; uint256 constant Panic_error_length = 0x24; uint256 constant Panic_arithmetic = 0x11; // uint256 constant Panic_resource = 0x41;
// 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) } } }
{ "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/=lib/seaport-sol/", "seaport-types/=lib/seaport-types/", "seaport-core/=lib/seaport-core/", "seaport/=contracts/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "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
[{"inputs":[{"internalType":"address","name":"seaportV1point5","type":"address"},{"internalType":"address","name":"seaportV1point6","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"EtherReturnTransferFailed","type":"error"},{"inputs":[],"name":"NoReentrantCalls","type":"error"},{"inputs":[],"name":"NoSpecifiedOrdersAvailable","type":"error"},{"inputs":[{"internalType":"address","name":"seaport","type":"address"}],"name":"SeaportNotAllowed","type":"error"},{"inputs":[],"name":"TStoreAlreadyActivated","type":"error"},{"inputs":[],"name":"TStoreNotSupported","type":"error"},{"inputs":[],"name":"TloadTestContractDeploymentFailed","type":"error"},{"inputs":[],"name":"__activateTstore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"seaportContracts","type":"address[]"},{"components":[{"components":[{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"totalOriginalConsiderationItems","type":"uint256"}],"internalType":"struct OrderParameters","name":"parameters","type":"tuple"},{"internalType":"uint120","name":"numerator","type":"uint120"},{"internalType":"uint120","name":"denominator","type":"uint120"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AdvancedOrder[]","name":"advancedOrders","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"bytes32[]","name":"criteriaProof","type":"bytes32[]"}],"internalType":"struct CriteriaResolver[]","name":"criteriaResolvers","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[][]","name":"offerFulfillments","type":"tuple[][]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[][]","name":"considerationFulfillments","type":"tuple[][]"},{"internalType":"uint256","name":"etherValue","type":"uint256"}],"internalType":"struct SeaportRouterInterface.AdvancedOrderParams[]","name":"advancedOrderParams","type":"tuple[]"},{"internalType":"bytes32","name":"fulfillerConduitKey","type":"bytes32"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"maximumFulfilled","type":"uint256"}],"internalType":"struct SeaportRouterInterface.FulfillAvailableAdvancedOrdersParams","name":"params","type":"tuple"}],"name":"fulfillAvailableAdvancedOrders","outputs":[{"internalType":"bool[][]","name":"availableOrders","type":"bool[][]"},{"components":[{"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":"item","type":"tuple"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"}],"internalType":"struct Execution[][]","name":"executions","type":"tuple[][]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAllowedSeaportContracts","outputs":[{"internalType":"address[]","name":"seaportContracts","type":"address[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61010060405234801562000011575f80fd5b5060405162001e9638038062001e9683398101604081905262000034916200014a565b5f6200003f620000b3565b90506001600160a01b0381166200006957604051632aea588760e01b815260040160405180910390fd5b5f6200007582620000cc565b8015156080526001600160a01b03831660a0529050806200009957600163929eee14555b50506001600160a01b0391821660c0521660e052620001a0565b5f696002601e613d5c3d52f35f52600a60165ff0905090565b5f816001600160a01b0316600a5a620000e6919062000180565b6040515f8181818686fa925050503d805f811462000120576040519150601f19603f3d011682016040523d82523d5f602084013e62000125565b606091505b50909392505050565b80516001600160a01b038116811462000145575f80fd5b919050565b5f80604083850312156200015c575f80fd5b62000167836200012e565b915062000177602084016200012e565b90509250929050565b5f826200019b57634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e051611ca7620001ef5f395f818160ae015261023b01525f818161010301526101ce01525f61031901525f81816102b5015281816108a401526109d00152611ca75ff3fe608060405260043610610036575f3560e01c806330af8b561461004a5780637423eb3c14610074578063fc2a350b14610088575f80fd5b3661004657610044336100a9565b005b5f80fd5b348015610055575f80fd5b5061005e6101ac565b60405161006b9190610a21565b60405180910390f35b34801561007f575f80fd5b506100446102aa565b61009b610096366004610a7a565b61037d565b60405161006b929190610bf3565b6100fe7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490565b6101537f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490565b175f036101a9576040517f98d2897d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b50565b60408051600280825260608083018452926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106101ff576101ff610cda565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061026d5761026d610cda565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b63929eee14546001147f0000000000000000000000000000000000000000000000000000000000000000806102dd575080155b15610314576040517ff45b98b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61033d7f0000000000000000000000000000000000000000000000000000000000000000610837565b610373576040517f70a4078f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f63929eee145550565b60608061038a60016108a2565b5f6103958480610d07565b905090508067ffffffffffffffff8111156103b2576103b2610cad565b6040519080825280602002602001820160405280156103e557816020015b60608152602001906001900390816103d05790505b5092508067ffffffffffffffff81111561040157610401610cad565b60405190808252806020026020018201604052801561043457816020015b606081526020019060019003908161041f5790505b5091505f8460800135905060608060605f6040518060e001604052808581526020018481526020018381526020018381526020018a6040013581526020018a60600160208101906104859190610da3565b73ffffffffffffffffffffffffffffffffffffffff9081168252602090910187905260a0820151919250166104bb573360a08201525b5f5b6104c78a80610d07565b90508110156107d8576105076104dd8b80610d07565b838181106104ed576104ed610cda565b90506020020160208101906105029190610da3565b6100a9565b3661051560208c018c610d07565b8381811061052557610525610cda565b90506020028101906105379190610dbe565b90506105438180610d07565b61054c9161122d565b835261055b6020820182610d07565b61056491611336565b60208401526105766040820182610d07565b61057f9161145b565b60408401526105916060820182610d07565b61059a9161145b565b60608401526105a98b80610d07565b838181106105b9576105b9610cda565b90506020020160208101906105ce9190610da3565b73ffffffffffffffffffffffffffffffffffffffff166387201b418260800135855f015186602001518760400151886060015189608001518a60a001518b60c001516040518963ffffffff1660e01b81526004016106329796959493929190611813565b5f6040518083038185885af19350505050801561068e57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261068b9190810190611b42565b60015b61071e573d8080156106bb576040519150601f19603f3d011682016040523d82523d5f602084013e6106c0565b606091505b5060208101517fffffffff00000000000000000000000000000000000000000000000000000000167fd5da9a1b00000000000000000000000000000000000000000000000000000000811461071757815160208301fd5b50506107c8565b818c858151811061073157610731610cda565b6020026020010181905250808b858151811061074f5761074f610cda565b602090810291909101015281515f5b818110156107b35783818151811061077857610778610cda565b6020026020010151156107ae577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909a01996001015b61075e565b50895f036107c457505050506107d8565b5050505b5060c082018690526001016104bd565b5088608001358503610816576040517fd5da9a1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b471561082457610824610946565b61082c6109ce565b505050505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16600a5a61085c9190611c05565b6040515f8181818686fa925050503d805f8114610894576040519150601f19603f3d011682016040523d82523d5f602084013e610899565b606091505b50909392505050565b7f000000000000000000000000000000000000000000000000000000000000000080156108ef5763929eee145c156108e157637fa8a9875f526004601cfd5b8160010163929eee145d5050565b63929eee1454806109215763929eee145c1561091257637fa8a9875f526004601cfd5b8260010163929eee145d505050565b6001811461093657637fa8a9875f526004601cfd5b508160020163929eee14555b5050565b6040515f908190339047908381818185875af1925050503d805f8114610987576040519150601f19603f3d011682016040523d82523d5f602084013e61098c565b606091505b509150915081610942573347826040517fb18882910000000000000000000000000000000000000000000000000000000081526004016101a093929190611c3d565b7f000000000000000000000000000000000000000000000000000000000000000080156109ff575f63929eee145d50565b63929eee145480610a15575f63929eee145d5050565b50600163929eee145550565b602080825282518282018190525f9190848201906040850190845b81811015610a6e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610a3c565b50909695505050505050565b5f60208284031215610a8a575f80fd5b813567ffffffffffffffff811115610aa0575f80fd5b820160a08185031215610ab1575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60068110610af557610af5610ab8565b9052565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805180855290850190858501905f5b81811015610bd15783518051610b6b858251610ae5565b808a015173ffffffffffffffffffffffffffffffffffffffff908116868c01526040808301518188015260608084015190880152608092830151821692870192909252828b01511660a0860152015160c08401529287019260e090920191600101610b54565b50509985019993505090830190600101610b14565b5090979650505050505050565b5f604082016040835280855180835260608501915060608160051b860101925060208088015f5b83811015610c8e578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805180885290840190848801905f5b81811015610c78578351151583529286019291860191600101610c5a565b5090975050509382019390820190600101610c1a565b505085840381870152505050610ca48185610af9565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610d3a575f80fd5b83018035915067ffffffffffffffff821115610d54575f80fd5b6020019150600581901b3603821315610d6b575f80fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff811681146101a9575f80fd5b8035610d9e81610d72565b919050565b5f60208284031215610db3575f80fd5b8135610ab181610d72565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112610df0575f80fd5b9190910192915050565b60405160a0810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b60405290565b60405160c0810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b604051610160810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b6040805190810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b6040516060810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610ef757610ef7610cad565b604052919050565b5f67ffffffffffffffff821115610f1857610f18610cad565b5060051b60200190565b600681106101a9575f80fd5b5f82601f830112610f3d575f80fd5b81356020610f52610f4d83610eff565b610eb0565b82815260a09283028501820192828201919087851115610f70575f80fd5b8387015b85811015610be65781818a031215610f8a575f80fd5b610f92610dfa565b8135610f9d81610f22565b815281860135610fac81610d72565b818701526040828101359082015260608083013590820152608080830135908201528452928401928101610f74565b5f82601f830112610fea575f80fd5b81356020610ffa610f4d83610eff565b82815260c09283028501820192828201919087851115611018575f80fd5b8387015b85811015610be65781818a031215611032575f80fd5b61103a610e23565b813561104581610f22565b81528186013561105481610d72565b8187015260408281013590820152606080830135908201526080808301359082015260a08083013561108581610d72565b90820152845292840192810161101c565b803560058110610d9e575f80fd5b5f61016082840312156110b5575f80fd5b6110bd610e46565b90506110c882610d93565b81526110d660208301610d93565b6020820152604082013567ffffffffffffffff808211156110f5575f80fd5b61110185838601610f2e565b60408401526060840135915080821115611119575f80fd5b5061112684828501610fdb565b60608301525061113860808301611096565b608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b80356effffffffffffffffffffffffffffff81168114610d9e575f80fd5b5f82601f8301126111b2575f80fd5b813567ffffffffffffffff8111156111cc576111cc610cad565b6111fd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610eb0565b818152846020838601011115611211575f80fd5b816020850160208301375f918101602001919091529392505050565b5f61123a610f4d84610eff565b80848252602080830192508560051b850136811115611257575f80fd5b855b8181101561132a57803567ffffffffffffffff80821115611278575f80fd5b818901915060a0823603121561128c575f80fd5b611294610dfa565b8235828111156112a2575f80fd5b6112ae368286016110a4565b8252506112bc868401611185565b8682015260406112cd818501611185565b90820152606083810135838111156112e3575f80fd5b6112ef368287016111a3565b82840152505060808084013583811115611307575f80fd5b611313368287016111a3565b918301919091525087525050938201938201611259565b50919695505050505050565b5f611343610f4d84610eff565b83815260208082019190600586811b860136811115611360575f80fd5b865b8181101561144e57803567ffffffffffffffff80821115611381575f80fd5b818a01915060a08236031215611395575f80fd5b61139d610dfa565b8235815286830135600281106113b1575f80fd5b818801526040838101359082015260608084013590820152608080840135838111156113db575f80fd5b939093019236601f8501126113ee575f80fd5b833592506113fe610f4d84610eff565b83815292871b84018801928881019036851115611419575f80fd5b948901945b848610156114375785358252948901949089019061141e565b918301919091525088525050948301948301611362565b5092979650505050505050565b5f611468610f4d84610eff565b80848252602080830192508560051b850136811115611485575f80fd5b855b8181101561132a57803567ffffffffffffffff8111156114a5575f80fd5b870136601f8201126114b5575f80fd5b80356114c3610f4d82610eff565b81815260069190911b820185019085810190368311156114e1575f80fd5b928601925b8284101561152257604084360312156114fd575f80fd5b611505610e6a565b8435815287850135888201528252604090930192908601906114e6565b8852505050938201938201611487565b5f815180845260208085019450602084015f5b838110156115a857815161155a888251610ae5565b8084015173ffffffffffffffffffffffffffffffffffffffff168885015260408082015190890152606080820151908901526080908101519088015260a09096019590820190600101611545565b509495945050505050565b5f815180845260208085019450602084015f5b838110156115a85781516115db888251610ae5565b8084015173ffffffffffffffffffffffffffffffffffffffff90811689860152604080830151908a0152606080830151908a0152608080830151908a015260a091820151169088015260c090960195908201906001016115c6565b60058110610af557610af5610ab8565b5f81518084525f5b8181101561166a5760208185018101518683018201520161164e565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a080850182518652868301516002811061171057611710610ab8565b868801526040838101519087015260608084015190870152608092830151928601919091528151908190529085019060c08501905f905b808210156117675783518352928701929187019160019190910190611747565b505099850199935050908301906001016116c2565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805180855290850190858501905f5b818110156117fe5783518051845288015188840152928701926040909201916001016117d7565b50509985019993505090830190600101611797565b5f60e0820160e08352808a5180835261010092508285019150828160051b8601016020808e015f5b848110156119d5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008985030186528151805160a0865261189560a08701825173ffffffffffffffffffffffffffffffffffffffff169052565b8481015173ffffffffffffffffffffffffffffffffffffffff1660c0870152604081015161016060e088018190526118d1610200890183611532565b91506060808401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608a8503018d8b015261190c84826115b3565b935050608080850151610120611924818d0183611636565b60a08701516101408d81019190915260c0880151868e015260e08801516101808e01528f8801516101a08e0152908701516101c08d0152909501516101e08b0152888601516effffffffffffffffffffffffffffff9081168a8c0152604080880151909116908b0152818601518a8503838c015294506119a48486611646565b9450808601519550898503818b0152505050506119c18183611646565b97850197955050509082019060010161183b565b5050868203908701526119e8818d6116a7565b935050505082810360408401526119ff818961177c565b90508281036060840152611a13818861177c565b915050846080830152611a3e60a083018573ffffffffffffffffffffffffffffffffffffffff169052565b8260c083015298975050505050505050565b8051610d9e81610d72565b5f82601f830112611a6a575f80fd5b81516020611a7a610f4d83610eff565b82815260e09283028501820192828201919087851115611a98575f80fd5b8387015b85811015610be65780890382811215611ab3575f80fd5b611abb610e8d565b60a080831215611ac9575f80fd5b611ad1610dfa565b92508351611ade81610f22565b835283880151611aed81610d72565b838901526040848101518185015260608086015190850152608080860151611b1481610d72565b90850152838352611b26858301611a50565b838a015260c08501519083015250855250928401928101611a9c565b5f8060408385031215611b53575f80fd5b825167ffffffffffffffff80821115611b6a575f80fd5b818501915085601f830112611b7d575f80fd5b81516020611b8d610f4d83610eff565b82815260059290921b84018101918181019089841115611bab575f80fd5b948201945b83861015611bd65785518015158114611bc7575f80fd5b82529482019490820190611bb0565b91880151919650909350505080821115611bee575f80fd5b50611bfb85828601611a5b565b9150509250929050565b5f82611c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f610ca4606083018461164656fea26469706673582212207c99458f0e2e3e8ad786bb9e254dcffb8b48858f58813acdcf6813b79c31364864736f6c6343000818003300000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc0000000000000000000000000000000000000068f116a894984e2db1123eb395
Deployed Bytecode
0x608060405260043610610036575f3560e01c806330af8b561461004a5780637423eb3c14610074578063fc2a350b14610088575f80fd5b3661004657610044336100a9565b005b5f80fd5b348015610055575f80fd5b5061005e6101ac565b60405161006b9190610a21565b60405180910390f35b34801561007f575f80fd5b506100446102aa565b61009b610096366004610a7a565b61037d565b60405161006b929190610bf3565b6100fe7f0000000000000000000000000000000000000068f116a894984e2db1123eb39573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490565b6101537f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490565b175f036101a9576040517f98d2897d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b50565b60408051600280825260608083018452926020830190803683370190505090507f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc815f815181106101ff576101ff610cda565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000068f116a894984e2db1123eb3958160018151811061026d5761026d610cda565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b63929eee14546001147f0000000000000000000000000000000000000000000000000000000000000001806102dd575080155b15610314576040517ff45b98b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61033d7f000000000000000000000000768eef7a6e32fdceefad7720cde37112a1d13baa610837565b610373576040517f70a4078f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f63929eee145550565b60608061038a60016108a2565b5f6103958480610d07565b905090508067ffffffffffffffff8111156103b2576103b2610cad565b6040519080825280602002602001820160405280156103e557816020015b60608152602001906001900390816103d05790505b5092508067ffffffffffffffff81111561040157610401610cad565b60405190808252806020026020018201604052801561043457816020015b606081526020019060019003908161041f5790505b5091505f8460800135905060608060605f6040518060e001604052808581526020018481526020018381526020018381526020018a6040013581526020018a60600160208101906104859190610da3565b73ffffffffffffffffffffffffffffffffffffffff9081168252602090910187905260a0820151919250166104bb573360a08201525b5f5b6104c78a80610d07565b90508110156107d8576105076104dd8b80610d07565b838181106104ed576104ed610cda565b90506020020160208101906105029190610da3565b6100a9565b3661051560208c018c610d07565b8381811061052557610525610cda565b90506020028101906105379190610dbe565b90506105438180610d07565b61054c9161122d565b835261055b6020820182610d07565b61056491611336565b60208401526105766040820182610d07565b61057f9161145b565b60408401526105916060820182610d07565b61059a9161145b565b60608401526105a98b80610d07565b838181106105b9576105b9610cda565b90506020020160208101906105ce9190610da3565b73ffffffffffffffffffffffffffffffffffffffff166387201b418260800135855f015186602001518760400151886060015189608001518a60a001518b60c001516040518963ffffffff1660e01b81526004016106329796959493929190611813565b5f6040518083038185885af19350505050801561068e57506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261068b9190810190611b42565b60015b61071e573d8080156106bb576040519150601f19603f3d011682016040523d82523d5f602084013e6106c0565b606091505b5060208101517fffffffff00000000000000000000000000000000000000000000000000000000167fd5da9a1b00000000000000000000000000000000000000000000000000000000811461071757815160208301fd5b50506107c8565b818c858151811061073157610731610cda565b6020026020010181905250808b858151811061074f5761074f610cda565b602090810291909101015281515f5b818110156107b35783818151811061077857610778610cda565b6020026020010151156107ae577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909a01996001015b61075e565b50895f036107c457505050506107d8565b5050505b5060c082018690526001016104bd565b5088608001358503610816576040517fd5da9a1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b471561082457610824610946565b61082c6109ce565b505050505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16600a5a61085c9190611c05565b6040515f8181818686fa925050503d805f8114610894576040519150601f19603f3d011682016040523d82523d5f602084013e610899565b606091505b50909392505050565b7f000000000000000000000000000000000000000000000000000000000000000180156108ef5763929eee145c156108e157637fa8a9875f526004601cfd5b8160010163929eee145d5050565b63929eee1454806109215763929eee145c1561091257637fa8a9875f526004601cfd5b8260010163929eee145d505050565b6001811461093657637fa8a9875f526004601cfd5b508160020163929eee14555b5050565b6040515f908190339047908381818185875af1925050503d805f8114610987576040519150601f19603f3d011682016040523d82523d5f602084013e61098c565b606091505b509150915081610942573347826040517fb18882910000000000000000000000000000000000000000000000000000000081526004016101a093929190611c3d565b7f000000000000000000000000000000000000000000000000000000000000000180156109ff575f63929eee145d50565b63929eee145480610a15575f63929eee145d5050565b50600163929eee145550565b602080825282518282018190525f9190848201906040850190845b81811015610a6e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610a3c565b50909695505050505050565b5f60208284031215610a8a575f80fd5b813567ffffffffffffffff811115610aa0575f80fd5b820160a08185031215610ab1575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60068110610af557610af5610ab8565b9052565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805180855290850190858501905f5b81811015610bd15783518051610b6b858251610ae5565b808a015173ffffffffffffffffffffffffffffffffffffffff908116868c01526040808301518188015260608084015190880152608092830151821692870192909252828b01511660a0860152015160c08401529287019260e090920191600101610b54565b50509985019993505090830190600101610b14565b5090979650505050505050565b5f604082016040835280855180835260608501915060608160051b860101925060208088015f5b83811015610c8e578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805180885290840190848801905f5b81811015610c78578351151583529286019291860191600101610c5a565b5090975050509382019390820190600101610c1a565b505085840381870152505050610ca48185610af9565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610d3a575f80fd5b83018035915067ffffffffffffffff821115610d54575f80fd5b6020019150600581901b3603821315610d6b575f80fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff811681146101a9575f80fd5b8035610d9e81610d72565b919050565b5f60208284031215610db3575f80fd5b8135610ab181610d72565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112610df0575f80fd5b9190910192915050565b60405160a0810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b60405290565b60405160c0810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b604051610160810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b6040805190810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b6040516060810167ffffffffffffffff81118282101715610e1d57610e1d610cad565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610ef757610ef7610cad565b604052919050565b5f67ffffffffffffffff821115610f1857610f18610cad565b5060051b60200190565b600681106101a9575f80fd5b5f82601f830112610f3d575f80fd5b81356020610f52610f4d83610eff565b610eb0565b82815260a09283028501820192828201919087851115610f70575f80fd5b8387015b85811015610be65781818a031215610f8a575f80fd5b610f92610dfa565b8135610f9d81610f22565b815281860135610fac81610d72565b818701526040828101359082015260608083013590820152608080830135908201528452928401928101610f74565b5f82601f830112610fea575f80fd5b81356020610ffa610f4d83610eff565b82815260c09283028501820192828201919087851115611018575f80fd5b8387015b85811015610be65781818a031215611032575f80fd5b61103a610e23565b813561104581610f22565b81528186013561105481610d72565b8187015260408281013590820152606080830135908201526080808301359082015260a08083013561108581610d72565b90820152845292840192810161101c565b803560058110610d9e575f80fd5b5f61016082840312156110b5575f80fd5b6110bd610e46565b90506110c882610d93565b81526110d660208301610d93565b6020820152604082013567ffffffffffffffff808211156110f5575f80fd5b61110185838601610f2e565b60408401526060840135915080821115611119575f80fd5b5061112684828501610fdb565b60608301525061113860808301611096565b608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b80356effffffffffffffffffffffffffffff81168114610d9e575f80fd5b5f82601f8301126111b2575f80fd5b813567ffffffffffffffff8111156111cc576111cc610cad565b6111fd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610eb0565b818152846020838601011115611211575f80fd5b816020850160208301375f918101602001919091529392505050565b5f61123a610f4d84610eff565b80848252602080830192508560051b850136811115611257575f80fd5b855b8181101561132a57803567ffffffffffffffff80821115611278575f80fd5b818901915060a0823603121561128c575f80fd5b611294610dfa565b8235828111156112a2575f80fd5b6112ae368286016110a4565b8252506112bc868401611185565b8682015260406112cd818501611185565b90820152606083810135838111156112e3575f80fd5b6112ef368287016111a3565b82840152505060808084013583811115611307575f80fd5b611313368287016111a3565b918301919091525087525050938201938201611259565b50919695505050505050565b5f611343610f4d84610eff565b83815260208082019190600586811b860136811115611360575f80fd5b865b8181101561144e57803567ffffffffffffffff80821115611381575f80fd5b818a01915060a08236031215611395575f80fd5b61139d610dfa565b8235815286830135600281106113b1575f80fd5b818801526040838101359082015260608084013590820152608080840135838111156113db575f80fd5b939093019236601f8501126113ee575f80fd5b833592506113fe610f4d84610eff565b83815292871b84018801928881019036851115611419575f80fd5b948901945b848610156114375785358252948901949089019061141e565b918301919091525088525050948301948301611362565b5092979650505050505050565b5f611468610f4d84610eff565b80848252602080830192508560051b850136811115611485575f80fd5b855b8181101561132a57803567ffffffffffffffff8111156114a5575f80fd5b870136601f8201126114b5575f80fd5b80356114c3610f4d82610eff565b81815260069190911b820185019085810190368311156114e1575f80fd5b928601925b8284101561152257604084360312156114fd575f80fd5b611505610e6a565b8435815287850135888201528252604090930192908601906114e6565b8852505050938201938201611487565b5f815180845260208085019450602084015f5b838110156115a857815161155a888251610ae5565b8084015173ffffffffffffffffffffffffffffffffffffffff168885015260408082015190890152606080820151908901526080908101519088015260a09096019590820190600101611545565b509495945050505050565b5f815180845260208085019450602084015f5b838110156115a85781516115db888251610ae5565b8084015173ffffffffffffffffffffffffffffffffffffffff90811689860152604080830151908a0152606080830151908a0152608080830151908a015260a091820151169088015260c090960195908201906001016115c6565b60058110610af557610af5610ab8565b5f81518084525f5b8181101561166a5760208185018101518683018201520161164e565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a080850182518652868301516002811061171057611710610ab8565b868801526040838101519087015260608084015190870152608092830151928601919091528151908190529085019060c08501905f905b808210156117675783518352928701929187019160019190910190611747565b505099850199935050908301906001016116c2565b5f82825180855260208086019550808260051b8401018186015f5b84811015610be6578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805180855290850190858501905f5b818110156117fe5783518051845288015188840152928701926040909201916001016117d7565b50509985019993505090830190600101611797565b5f60e0820160e08352808a5180835261010092508285019150828160051b8601016020808e015f5b848110156119d5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008985030186528151805160a0865261189560a08701825173ffffffffffffffffffffffffffffffffffffffff169052565b8481015173ffffffffffffffffffffffffffffffffffffffff1660c0870152604081015161016060e088018190526118d1610200890183611532565b91506060808401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608a8503018d8b015261190c84826115b3565b935050608080850151610120611924818d0183611636565b60a08701516101408d81019190915260c0880151868e015260e08801516101808e01528f8801516101a08e0152908701516101c08d0152909501516101e08b0152888601516effffffffffffffffffffffffffffff9081168a8c0152604080880151909116908b0152818601518a8503838c015294506119a48486611646565b9450808601519550898503818b0152505050506119c18183611646565b97850197955050509082019060010161183b565b5050868203908701526119e8818d6116a7565b935050505082810360408401526119ff818961177c565b90508281036060840152611a13818861177c565b915050846080830152611a3e60a083018573ffffffffffffffffffffffffffffffffffffffff169052565b8260c083015298975050505050505050565b8051610d9e81610d72565b5f82601f830112611a6a575f80fd5b81516020611a7a610f4d83610eff565b82815260e09283028501820192828201919087851115611a98575f80fd5b8387015b85811015610be65780890382811215611ab3575f80fd5b611abb610e8d565b60a080831215611ac9575f80fd5b611ad1610dfa565b92508351611ade81610f22565b835283880151611aed81610d72565b838901526040848101518185015260608086015190850152608080860151611b1481610d72565b90850152838352611b26858301611a50565b838a015260c08501519083015250855250928401928101611a9c565b5f8060408385031215611b53575f80fd5b825167ffffffffffffffff80821115611b6a575f80fd5b818501915085601f830112611b7d575f80fd5b81516020611b8d610f4d83610eff565b82815260059290921b84018101918181019089841115611bab575f80fd5b948201945b83861015611bd65785518015158114611bc7575f80fd5b82529482019490820190611bb0565b91880151919650909350505080821115611bee575f80fd5b50611bfb85828601611a5b565b9150509250929050565b5f82611c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f610ca4606083018461164656fea26469706673582212207c99458f0e2e3e8ad786bb9e254dcffb8b48858f58813acdcf6813b79c31364864736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc0000000000000000000000000000000000000068f116a894984e2db1123eb395
-----Decoded View---------------
Arg [0] : seaportV1point5 (address): 0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC
Arg [1] : seaportV1point6 (address): 0x0000000000000068F116a894984e2DB1123eB395
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc
Arg [1] : 0000000000000000000000000000000000000068f116a894984e2db1123eb395
Deployed Bytecode Sourcemap
796:8658:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:33;1778:10;1756:21;:33::i;:::-;796:8658;;;;;8195:283;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3369:914:2;;;;;;;;;;;;;:::i;2071:6002:0:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8569:246::-;8692:31;8709:13;8698:24;;:7;:24;;;4256:1:1;4161:112;8692:31:0;8658;8675:13;8664:24;;:7;:24;;;4256:1:1;4161:112;8658:31:0;:65;8739:1;8658:82;8641:168;;8772:26;;;;;5193:42:12;5181:55;;8772:26:0;;;5163:74:12;5136:18;;8772:26:0;;;;;;;;8641:168;8569:246;:::o;8195:283::-;8365:16;;;8379:1;8365:16;;;8297:33;8365:16;;;;;8297:33;8365:16;;;;;;;;;;-1:-1:-1;8365:16:0;8346:35;;8413:13;8391:16;8408:1;8391:19;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;;8458:13;8436:16;8453:1;8436:19;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;;8195:283;:::o;3369:914:2:-;3709:22;3703:29;3750:19;3683:100;3876:21;;:43;;;3902:17;3901:18;3876:43;3872:105;;;3942:24;;;;;;;;;;;;;;3872:105;4059:30;4070:18;4059:10;:30::i;:::-;4054:89;;4112:20;;;;;;;;;;;;;;4054:89;4244:22;4220;4213:54;4199:78;3369:914::o;2071:6002:0:-;2259:31;2304;2437:25;2457:4;2437:19;:25::i;:::-;2534:30;2567:23;:6;;:23;:::i;:::-;:30;;2534:63;;2719:22;2706:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2688:54;;2783:22;2765:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2752:54;;2873:24;2900:6;:23;;;2873:50;;3060:42;3112:48;3170:58;3238:36;3277:406;;;;;;;;3322:19;3277:406;;;;3374:22;3277:406;;;;3429:26;3277:406;;;;3496:26;3277:406;;;;3557:6;:26;;;3277:406;;;;3608:6;:16;;;;;;;;;;:::i;:::-;3277:406;;;;;;;;;;;;;3760:24;;;;3238:445;;-1:-1:-1;3760:38:0;3756:106;;3841:10;3814:24;;;:37;3756:106;3936:9;3931:3726;3955:23;:6;;:23;:::i;:::-;:30;;3951:1;:34;3931:3726;;;4067:49;4089:23;:6;;:23;:::i;:::-;4113:1;4089:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4067:21;:49::i;:::-;4181:40;4224:43;;;;:6;:43;:::i;:::-;4268:1;4224:46;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4181:89;-1:-1:-1;4377:26:0;4181:89;;4377:26;:::i;:::-;4345:58;;;:::i;:::-;;;4452:29;;;;:11;:29;:::i;:::-;4417:64;;;:::i;:::-;:32;;;:64;4530:29;;;;:11;:29;:::i;:::-;4495:64;;;:::i;:::-;:32;;;:64;4616:54;;;;:11;:54;:::i;:::-;4573:97;;;:::i;:::-;:40;;;:97;5017:23;:6;;:23;:::i;:::-;5041:1;5017:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5000:96;;;5125:11;:22;;;5187:14;:29;;;5238:14;:32;;;5292:14;:32;;;5346:14;:40;;;5408:14;:34;;;5464:14;:24;;;5510:14;:31;;;5000:559;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4980:2501;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7008:4:0;6998:15;;6992:22;6603:18;6903:178;7282:35;7259:58;;7234:233;;7421:4;7415:11;7410:2;7404:4;7400:13;7393:34;7234:233;6452:1029;6426:1055;4980:2501;;;5734:18;5713:15;5729:1;5713:18;;;;;;;;:::i;:::-;;;;;;:39;;;;5786:13;5770:10;5781:1;5770:13;;;;;;;;:::i;:::-;;;;;;;;;;:29;5913:25;;5878:32;5956:285;5980:24;5976:1;:28;5956:285;;;6034:18;6053:1;6034:21;;;;;;;;:::i;:::-;;;;;;;6030:193;;;6123:18;;;;;;6171:3;6030:193;5956:285;;;;6342:16;6362:1;6342:21;6338:73;;6387:5;;;;;;6338:73;5695:730;5572:853;;4980:2501;-1:-1:-1;7536:31:0;;;:50;;;7629:3;;3931:3726;;;;7746:6;:23;;;7726:16;:43;7722:109;;7792:28;;;;;;;;;;;;;;7722:109;7922:21;:25;7918:76;;7963:20;:18;:20::i;:::-;8043:23;:21;:23::i;:::-;2350:5723;;;;;;2071:6002;;;:::o;18124:407:2:-;18207:7;18469:17;:28;;18516:2;18504:9;:14;;;;:::i;:::-;18469:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18460:64:2;;18124:407;-1:-1:-1;;;18124:407:2:o;4747:4355::-;4928:21;5413:20;5410:1167;;;5541:22;5535:29;5532:487;;;5716:31;5713:1;5706:42;5942:29;5891:21;5855:142;5532:487;6453:18;6436:15;6432:40;6384:22;6352:142;5050:4046;4747:4355;:::o;5410:1167::-;6689:22;6683:29;6820:15;6810:1170;;6944:22;6938:29;6935:487;;;7119:31;7116:1;7109:42;7345:29;7294:21;7258:142;6935:487;7856:18;7839:15;7835:40;7787:22;7755:142;7957:5;5050:4046;4747:4355;:::o;6810:1170::-;8179:19;8162:15;8159:40;8149:419;;8359:31;8356:1;8349:42;8520:29;8497:21;8490:60;8149:419;;8978:18;8961:15;8957:40;8913:22;8885:130;5304:3782;5050:4046;4747:4355;:::o;8984:468:0:-;9119:80;;9084:12;;;;9127:10;;9164:21;;9084:12;9119:80;9084:12;9119:80;9164:21;9127:10;9119:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9083:116;;;;9277:7;9272:174;;9350:10;9378:21;9417:4;9307:128;;;;;;;;;;;;;:::i;9200:1610:2:-;9360:21;9833:20;9830:231;;;9958:19;9934:22;9927:51;8569:246:0;:::o;9830:231:2:-;10173:22;10167:29;10304:15;10294:234;;10425:19;10401:22;10394:51;10505:5;8569:246:0;:::o;10294:234:2:-;;10703:19;10679:22;10672:51;9480:1324;9200:1610::o;146:681:12:-;317:2;369:21;;;439:13;;342:18;;;461:22;;;288:4;;317:2;540:15;;;;514:2;499:18;;;288:4;583:218;597:6;594:1;591:13;583:218;;;662:13;;677:42;658:62;646:75;;776:15;;;;741:12;;;;619:1;612:9;583:218;;;-1:-1:-1;818:3:12;;146:681;-1:-1:-1;;;;;;146:681:12:o;832:416::-;947:6;1000:2;988:9;979:7;975:23;971:32;968:52;;;1016:1;1013;1006:12;968:52;1056:9;1043:23;1089:18;1081:6;1078:30;1075:50;;;1121:1;1118;1111:12;1075:50;1144:22;;1200:3;1182:16;;;1178:26;1175:46;;;1217:1;1214;1207:12;1175:46;1240:2;832:416;-1:-1:-1;;;832:416:12:o;1253:184::-;1305:77;1302:1;1295:88;1402:4;1399:1;1392:15;1426:4;1423:1;1416:15;1442:139;1522:1;1515:5;1512:12;1502:46;;1528:18;;:::i;:::-;1557;;1442:139::o;1586:1787::-;1658:3;1689;1721:5;1715:12;1748:6;1743:3;1736:19;1774:4;1803:2;1798:3;1794:12;1787:19;;1859:2;1849:6;1846:1;1842:14;1835:5;1831:26;1827:35;1896:2;1889:5;1885:14;1917:1;1927:1420;1941:6;1938:1;1935:13;1927:1420;;;2006:16;;;2024:66;2002:89;1990:102;;2115:13;;2187:9;;2209:22;;;2295:11;;;;2253:13;;;;2330:1;2344:897;2360:8;2355:3;2352:17;2344:897;;;2439:8;2433:15;2481:2;2475:9;2501:42;2537:5;2532:2;2526:9;2501:42;:::i;:::-;2586:11;;;2580:18;2625:42;2707:21;;;2691:14;;;2684:45;2756:4;2806:11;;;2800:18;2784:14;;;2777:42;2846:4;2896:11;;;2890:18;2874:14;;;2867:42;2936:4;2990:11;;;2984:18;2980:27;;2964:14;;;2957:51;;;;3060:11;;;3054:18;3050:27;3043:4;3032:16;;3025:53;3126:11;3120:18;3113:4;3102:16;;3095:44;3210:17;;;;3176:4;3165:16;;;;2388:1;2379:11;2344:897;;;-1:-1:-1;;3325:12:12;;;;3262:5;-1:-1:-1;;3290:15:12;;;;1963:1;1956:9;1927:1420;;;-1:-1:-1;3363:4:12;;1586:1787;-1:-1:-1;;;;;;;1586:1787:12:o;3378:1634::-;3746:4;3794:2;3783:9;3779:18;3824:2;3813:9;3806:21;3847:6;3882;3876:13;3913:6;3905;3898:22;3951:2;3940:9;3936:18;3929:25;;4013:2;4003:6;4000:1;3996:14;3985:9;3981:30;3977:39;3963:53;;4035:4;4074:2;4066:6;4062:15;4095:1;4105:762;4119:6;4116:1;4113:13;4105:762;;;4184:22;;;4208:66;4180:95;4168:108;;4299:13;;4373:9;;4395:24;;;4485:11;;;;4441:15;;;;4520:1;4534:225;4550:8;4545:3;4542:17;4534:225;;;4641:15;;4634:23;4627:31;4613:46;;4728:17;;;;4685:14;;;;4578:1;4569:11;4534:225;;;-1:-1:-1;4782:5:12;;-1:-1:-1;;;4845:12:12;;;;4810:15;;;;4141:1;4134:9;4105:762;;;4109:3;;4915:9;4907:6;4903:22;4898:2;4887:9;4883:18;4876:50;;;;4943:63;4999:6;4991;4943:63;:::i;:::-;4935:71;3378:1634;-1:-1:-1;;;;;3378:1634:12:o;5248:184::-;5300:77;5297:1;5290:88;5397:4;5394:1;5387:15;5421:4;5418:1;5411:15;5437:184;5489:77;5486:1;5479:88;5586:4;5583:1;5576:15;5610:4;5607:1;5600:15;5626:604;5719:4;5725:6;5785:11;5772:25;5875:66;5864:8;5848:14;5844:29;5840:102;5820:18;5816:127;5806:155;;5957:1;5954;5947:12;5806:155;5984:33;;6036:20;;;-1:-1:-1;6079:18:12;6068:30;;6065:50;;;6111:1;6108;6101:12;6065:50;6144:4;6132:17;;-1:-1:-1;6195:1:12;6191:14;;;6175;6171:35;6161:46;;6158:66;;;6220:1;6217;6210:12;6158:66;5626:604;;;;;:::o;6235:154::-;6321:42;6314:5;6310:54;6303:5;6300:65;6290:93;;6379:1;6376;6369:12;6394:134;6462:20;;6491:31;6462:20;6491:31;:::i;:::-;6394:134;;;:::o;6533:247::-;6592:6;6645:2;6633:9;6624:7;6620:23;6616:32;6613:52;;;6661:1;6658;6651:12;6613:52;6700:9;6687:23;6719:31;6744:5;6719:31;:::i;7433:395::-;7538:4;7596:11;7583:25;7686:66;7675:8;7659:14;7655:29;7651:102;7631:18;7627:127;7617:155;;7768:1;7765;7758:12;7617:155;7789:33;;;;;7433:395;-1:-1:-1;;7433:395:12:o;8475:253::-;8547:2;8541:9;8589:4;8577:17;;8624:18;8609:34;;8645:22;;;8606:62;8603:88;;;8671:18;;:::i;:::-;8707:2;8700:22;8475:253;:::o;8733:::-;8805:2;8799:9;8847:4;8835:17;;8882:18;8867:34;;8903:22;;;8864:62;8861:88;;;8929:18;;:::i;8991:255::-;9063:2;9057:9;9105:6;9093:19;;9142:18;9127:34;;9163:22;;;9124:62;9121:88;;;9189:18;;:::i;9251:257::-;9323:4;9317:11;;;9355:17;;9402:18;9387:34;;9423:22;;;9384:62;9381:88;;;9449:18;;:::i;9513:253::-;9585:2;9579:9;9627:4;9615:17;;9662:18;9647:34;;9683:22;;;9644:62;9641:88;;;9709:18;;:::i;9771:334::-;9842:2;9836:9;9898:2;9888:13;;9903:66;9884:86;9872:99;;10001:18;9986:34;;10022:22;;;9983:62;9980:88;;;10048:18;;:::i;:::-;10084:2;10077:22;9771:334;;-1:-1:-1;9771:334:12:o;10110:196::-;10183:4;10216:18;10208:6;10205:30;10202:56;;;10238:18;;:::i;:::-;-1:-1:-1;10283:1:12;10279:14;10295:4;10275:25;;10110:196::o;10311:107::-;10392:1;10385:5;10382:12;10372:40;;10408:1;10405;10398:12;10423:1342;10486:5;10539:3;10532:4;10524:6;10520:17;10516:27;10506:55;;10557:1;10554;10547:12;10506:55;10593:6;10580:20;10619:4;10643:73;10659:56;10712:2;10659:56;:::i;:::-;10643:73;:::i;:::-;10750:15;;;10812:4;10855:13;;;10843:26;;10839:35;;;10781:12;;;;10738:3;10886:15;;;10883:35;;;10914:1;10911;10904:12;10883:35;10950:2;10942:6;10938:15;10962:774;10978:6;10973:3;10970:15;10962:774;;;11054:2;11048:3;11043;11039:13;11035:22;11032:42;;;11070:1;11067;11060:12;11032:42;11100:22;;:::i;:::-;11163:3;11150:17;11180:39;11211:7;11180:39;:::i;:::-;11232:22;;11295:12;;;11282:26;11321:33;11282:26;11321:33;:::i;:::-;11374:14;;;11367:31;11421:2;11472:12;;;11459:26;11443:14;;;11436:50;11509:2;11560:12;;;11547:26;11531:14;;;11524:50;11597:3;11649:12;;;11636:26;11620:14;;;11613:50;11676:18;;11714:12;;;;10995;;10962:774;;11770:1520;11841:5;11894:3;11887:4;11879:6;11875:17;11871:27;11861:55;;11912:1;11909;11902:12;11861:55;11948:6;11935:20;11974:4;11998:73;12014:56;12067:2;12014:56;:::i;11998:73::-;12105:15;;;12167:4;12210:13;;;12198:26;;12194:35;;;12136:12;;;;12093:3;12241:15;;;12238:35;;;12269:1;12266;12259:12;12238:35;12305:2;12297:6;12293:15;12317:944;12333:6;12328:3;12325:15;12317:944;;;12409:2;12403:3;12398;12394:13;12390:22;12387:42;;;12425:1;12422;12415:12;12387:42;12455:22;;:::i;:::-;12518:3;12505:17;12535:39;12566:7;12535:39;:::i;:::-;12587:22;;12650:12;;;12637:26;12676:33;12637:26;12676:33;:::i;:::-;12729:14;;;12722:31;12776:2;12827:12;;;12814:26;12798:14;;;12791:50;12864:2;12915:12;;;12902:26;12886:14;;;12879:50;12952:3;13004:12;;;12991:26;12975:14;;;12968:50;13041:3;13085:12;;;13072:26;13111:33;13072:26;13111:33;:::i;:::-;13164:14;;;13157:31;13201:18;;13239:12;;;;12350;;12317:944;;13295:150;13370:20;;13419:1;13409:12;;13399:40;;13435:1;13432;13425:12;13450:1291;13512:5;13560:6;13548:9;13543:3;13539:19;13535:32;13532:52;;;13580:1;13577;13570:12;13532:52;13602:22;;:::i;:::-;13593:31;;13647:29;13666:9;13647:29;:::i;:::-;13640:5;13633:44;13709:38;13743:2;13732:9;13728:18;13709:38;:::i;:::-;13704:2;13697:5;13693:14;13686:62;13799:2;13788:9;13784:18;13771:32;13822:18;13863:2;13855:6;13852:14;13849:34;;;13879:1;13876;13869:12;13849:34;13915:66;13977:3;13968:6;13957:9;13953:22;13915:66;:::i;:::-;13910:2;13903:5;13899:14;13892:90;14035:2;14024:9;14020:18;14007:32;13991:48;;14064:2;14054:8;14051:16;14048:36;;;14080:1;14077;14070:12;14048:36;;14116:76;14188:3;14177:8;14166:9;14162:24;14116:76;:::i;:::-;14111:2;14104:5;14100:14;14093:100;;14226:46;14267:3;14256:9;14252:19;14226:46;:::i;:::-;14220:3;14213:5;14209:15;14202:71;14334:3;14323:9;14319:19;14306:33;14300:3;14293:5;14289:15;14282:58;14401:3;14390:9;14386:19;14373:33;14367:3;14360:5;14356:15;14349:58;14468:3;14457:9;14453:19;14440:33;14434:3;14427:5;14423:15;14416:58;14493:3;14556:2;14545:9;14541:18;14528:32;14523:2;14516:5;14512:14;14505:56;;14580:3;14643:2;14632:9;14628:18;14615:32;14610:2;14603:5;14599:14;14592:56;;14667:3;14730:2;14719:9;14715:18;14702:32;14697:2;14690:5;14686:14;14679:56;;13450:1291;;;;:::o;14746:186::-;14814:20;;14874:32;14863:44;;14853:55;;14843:83;;14922:1;14919;14912:12;14937:589;14979:5;15032:3;15025:4;15017:6;15013:17;15009:27;14999:55;;15050:1;15047;15040:12;14999:55;15086:6;15073:20;15112:18;15108:2;15105:26;15102:52;;;15134:18;;:::i;:::-;15178:114;15286:4;15217:66;15210:4;15206:2;15202:13;15198:86;15194:97;15178:114;:::i;:::-;15317:2;15308:7;15301:19;15363:3;15356:4;15351:2;15343:6;15339:15;15335:26;15332:35;15329:55;;;15380:1;15377;15370:12;15329:55;15445:2;15438:4;15430:6;15426:17;15419:4;15410:7;15406:18;15393:55;15493:1;15468:16;;;15486:4;15464:27;15457:38;;;;15472:7;14937:589;-1:-1:-1;;;14937:589:12:o;15531:1794::-;15711:9;15746:77;15762:60;15815:6;15762:60;:::i;15746:77::-;15845:3;15869:6;15864:3;15857:19;15895:4;15924;15919:3;15915:14;15908:21;;15970:6;15967:1;15963:14;15956:5;15952:26;16001:14;15993:6;15990:26;15987:46;;;16029:1;16026;16019:12;15987:46;16053:5;16067:1225;16083:6;16078:3;16075:15;16067:1225;;;16169:3;16156:17;16196:18;16246:2;16233:11;16230:19;16227:39;;;16262:1;16259;16252:12;16227:39;16300:11;16293:5;16289:23;16279:33;;16357:4;16352:2;16336:14;16332:23;16328:34;16325:54;;;16375:1;16372;16365:12;16325:54;16407:22;;:::i;:::-;16469:2;16456:16;16499:2;16491:6;16488:14;16485:34;;;16515:1;16512;16505:12;16485:34;16548:66;16599:14;16590:6;16586:2;16582:15;16548:66;:::i;:::-;16539:7;16532:83;;16653:31;16680:2;16676;16672:11;16653:31;:::i;:::-;16648:2;16639:7;16635:16;16628:57;16708:2;16748:31;16775:2;16771;16767:11;16748:31;:::i;:::-;16730:16;;;16723:57;16803:2;16847:11;;;16834:25;16875:16;;;16872:36;;;16904:1;16901;16894:12;16872:36;16946:51;16982:14;16971:8;16967:2;16963:17;16946:51;:::i;:::-;16941:2;16932:7;16928:16;16921:77;;;17021:3;17074:2;17070;17066:11;17053:25;17107:2;17097:8;17094:16;17091:36;;;17123:1;17120;17113:12;17091:36;17165:51;17201:14;17190:8;17186:2;17182:17;17165:51;:::i;:::-;17147:16;;;17140:77;;;;-1:-1:-1;17230:20:12;;-1:-1:-1;;17270:12:12;;;;16100;;16067:1225;;;-1:-1:-1;17314:5:12;;15531:1794;-1:-1:-1;;;;;;15531:1794:12:o;17975:2268::-;18161:9;18196:77;18212:60;18265:6;18212:60;:::i;18196:77::-;18307:19;;;18345:4;18365:12;;;;18295:3;18396:1;18431:14;;;18420:26;;18469:14;18458:26;;18455:46;;;18497:1;18494;18487:12;18455:46;18521:5;18535:1675;18551:6;18546:3;18543:15;18535:1675;;;18637:3;18624:17;18664:18;18714:2;18701:11;18698:19;18695:39;;;18730:1;18727;18720:12;18695:39;18768:11;18761:5;18757:23;18747:33;;18825:4;18820:2;18804:14;18800:23;18796:34;18793:54;;;18843:1;18840;18833:12;18793:54;18875:22;;:::i;:::-;18939:2;18926:16;18917:7;18910:33;18992:2;18988;18984:11;18971:25;19031:1;19022:7;19019:14;19009:42;;19047:1;19044;19037:12;19009:42;19071:16;;;19064:33;19120:2;19173:11;;;19160:25;19142:16;;;19135:51;19209:2;19262:11;;;19249:25;19231:16;;;19224:51;19298:3;19341:11;;;19328:25;19369:14;;;19366:34;;;19396:1;19393;19386:12;19366:34;19423:15;;;;;19480:14;19473:4;19465:13;;19461:34;19451:62;;19509:1;19506;19499:12;19451:62;19549:2;19536:16;19526:26;;19578:73;19594:56;19647:2;19594:56;:::i;19578:73::-;19695:17;;;19789:11;;;19781:20;;19777:29;;;19734:14;;;;19835;19822:28;;19819:48;;;19863:1;19860;19853:12;19819:48;19893:11;;;;19917:174;19935:8;19928:5;19925:19;19917:174;;;20017:19;;20003:34;;19956:14;;;;20063;;;;19917:174;;;20111:16;;;20104:31;;;;-1:-1:-1;20148:20:12;;-1:-1:-1;;20188:12:12;;;;18568;;18535:1675;;;-1:-1:-1;20232:5:12;;17975:2268;-1:-1:-1;;;;;;;17975:2268:12:o;20924:1820::-;21170:9;21205:77;21221:60;21274:6;21221:60;:::i;21205:77::-;21304:3;21328:6;21323:3;21316:19;21354:4;21383:2;21378:3;21374:12;21367:19;;21427:6;21424:1;21420:14;21413:5;21409:26;21458:14;21450:6;21447:26;21444:46;;;21486:1;21483;21476:12;21444:46;21510:5;21524:1187;21540:6;21535:3;21532:15;21524:1187;;;21626:3;21613:17;21662:18;21649:11;21646:35;21643:55;;;21694:1;21691;21684:12;21643:55;21721:23;;21786:14;21779:4;21771:13;;21767:34;21757:62;;21815:1;21812;21805:12;21757:62;21855:2;21842:16;21884:73;21900:56;21953:2;21900:56;:::i;21884:73::-;22001:17;;;22099:1;22095:10;;;;22087:19;;22083:28;;;22040:14;;;;22140;22127:28;;22124:48;;;22168:1;22165;22158:12;22124:48;22198:11;;;;22222:416;22240:8;22233:5;22230:19;22222:416;;;22345:4;22337:5;22321:14;22317:26;22313:37;22310:57;;;22363:1;22360;22353:12;22310:57;22399:22;;:::i;:::-;22454:19;;22438:36;;22529:14;;;22516:28;22498:16;;;22491:54;22562:22;;22272:4;22261:16;;;;22610:14;;;;22222:416;;;22651:18;;-1:-1:-1;;;22689:12:12;;;;21557;;21524:1187;;22749:842;22811:3;22849:5;22843:12;22876:6;22871:3;22864:19;22902:4;22931;22926:3;22922:14;22915:21;;22970:4;22963:5;22959:16;22993:1;23003:563;23017:6;23014:1;23011:13;23003:563;;;23082:6;23076:13;23102:40;23138:3;23133:2;23127:9;23102:40;:::i;:::-;23186:11;;;23180:18;23200:42;23176:67;23162:12;;;23155:89;23267:4;23311:11;;;23305:18;23291:12;;;23284:40;23347:4;23391:11;;;23385:18;23371:12;;;23364:40;23427:4;23471:11;;;23465:18;23451:12;;;23444:40;23513:4;23504:14;;;;23541:15;;;;23039:1;23032:9;23003:563;;;-1:-1:-1;23582:3:12;;22749:842;-1:-1:-1;;;;;22749:842:12:o;23596:1009::-;23666:3;23704:5;23698:12;23731:6;23726:3;23719:19;23757:4;23786;23781:3;23777:14;23770:21;;23825:4;23818:5;23814:16;23848:1;23858:722;23872:6;23869:1;23866:13;23858:722;;;23937:6;23931:13;23957:40;23993:3;23988:2;23982:9;23957:40;:::i;:::-;24036:11;;;24030:18;24071:42;24147:21;;;24133:12;;;24126:43;24192:4;24236:11;;;24230:18;24216:12;;;24209:40;24272:4;24316:11;;;24310:18;24296:12;;;24289:40;24352:4;24396:11;;;24390:18;24376:12;;;24369:40;24432:4;24480:11;;;24474:18;24470:27;24456:12;;;24449:49;24527:4;24518:14;;;;24555:15;;;;23894:1;23887:9;23858:722;;24610:140;24691:1;24684:5;24681:12;24671:46;;24697:18;;:::i;24877:481::-;24918:3;24956:5;24950:12;24983:6;24978:3;24971:19;25008:1;25018:162;25032:6;25029:1;25026:13;25018:162;;;25094:4;25150:13;;;25146:22;;25140:29;25122:11;;;25118:20;;25111:59;25047:12;25018:162;;;25022:3;25225:1;25218:4;25209:6;25204:3;25200:16;25196:27;25189:38;25347:4;25277:66;25272:2;25264:6;25260:15;25256:88;25251:3;25247:98;25243:109;25236:116;;;24877:481;;;;:::o;25363:1673::-;25432:3;25463;25495:5;25489:12;25522:6;25517:3;25510:19;25548:4;25577:2;25572:3;25568:12;25561:19;;25633:2;25623:6;25620:1;25616:14;25609:5;25605:26;25601:35;25670:2;25663:5;25659:14;25691:1;25701:1309;25715:6;25712:1;25709:13;25701:1309;;;25798:66;25790:5;25784:4;25780:16;25776:89;25771:3;25764:102;25895:6;25889:13;25925:4;25966:2;25960:4;25956:13;26001:2;25995:9;25989:4;25982:23;26052:2;26048;26044:11;26038:18;26096:1;26082:12;26079:19;26069:53;;26102:18;;:::i;:::-;26142:13;;;26135:35;26193:4;26238:11;;;26232:18;26217:13;;;26210:41;26274:4;26319:11;;;26313:18;26298:13;;;26291:41;26355:4;26400:11;;;26394:18;26432:13;;;26425:25;;;;26511:21;;26545:24;;;;26634:23;;;;26601:3;26591:14;;;-1:-1:-1;;26695:209:12;26711:8;26706:3;26703:17;26695:209;;;26788:15;;26774:30;;26873:17;;;;26830:14;;;;26739:1;26730:11;;;;;26695:209;;;-1:-1:-1;;26988:12:12;;;;26925:5;-1:-1:-1;;26953:15:12;;;;25737:1;25730:9;25701:1309;;27041:1207;27124:3;27155;27187:5;27181:12;27214:6;27209:3;27202:19;27240:4;27269:2;27264:3;27260:12;27253:19;;27325:2;27315:6;27312:1;27308:14;27301:5;27297:26;27293:35;27362:2;27355:5;27351:14;27383:1;27393:829;27407:6;27404:1;27401:13;27393:829;;;27472:16;;;27490:66;27468:89;27456:102;;27581:13;;27653:9;;27675:22;;;27761:11;;;;27719:13;;;;27796:1;27810:306;27826:8;27821:3;27818:17;27810:306;;;27899:15;;27945:9;;27931:24;;28001:11;;27995:18;27979:14;;;27972:42;28085:17;;;;28051:4;28040:16;;;;27854:1;27845:11;27810:306;;;-1:-1:-1;;28200:12:12;;;;28137:5;-1:-1:-1;;28165:15:12;;;;27429:1;27422:9;27393:829;;28253:4169;29095:4;29143:3;29132:9;29128:19;29174:3;29163:9;29156:22;29198:6;29233;29227:13;29264:6;29256;29249:22;29290:3;29280:13;;29324:2;29313:9;29309:18;29302:25;;29386:2;29376:6;29373:1;29369:14;29358:9;29354:30;29350:39;29408:4;29447:2;29439:6;29435:15;29468:1;29478:2340;29492:6;29489:1;29486:13;29478:2340;;;29581:66;29569:9;29561:6;29557:22;29553:95;29548:3;29541:108;29678:6;29672:13;29724:2;29718:9;29755:4;29747:6;29740:20;29773:58;29825:4;29817:6;29813:17;29798:12;29792:19;91:42;80:54;68:67;;14:127;29773:58;29872:21;;;29866:28;91:42;80:54;29954:3;29942:16;;68:67;30018:4;30000:23;;29994:30;30047:6;30085:3;30073:16;;30066:28;;;30121:71;30187:3;30175:16;;29994:30;30121:71;:::i;:::-;30107:85;;30215:4;30278:2;30264:12;30260:21;30254:28;30344:66;30335:6;30327;30323:19;30319:92;30314:2;30306:6;30302:15;30295:117;30439:69;30501:6;30485:14;30439:69;:::i;:::-;30425:83;;;30531:4;30594:2;30580:12;30576:21;30570:28;30621:3;30637:58;30691:2;30683:6;30679:15;30663:14;30637:58;:::i;:::-;30742:4;30724:23;;30718:30;30771:3;30794:15;;;30787:27;;;;30875:3;30857:22;;30851:29;30834:15;;;30827:54;30943:3;30925:22;;30919:29;30913:3;30901:16;;30894:55;30993:21;;;30987:28;30981:3;30969:16;;30962:54;31060:21;;;31054:28;31048:3;31036:16;;31029:54;31127:21;;;31121:28;31115:3;31103:16;;31096:54;31191:11;;;31185:18;24832:32;24821:44;;;31251:15;;;24809:57;31316:4;31308:13;;;31302:20;24821:44;;;31370:17;;;24809:57;31429:11;;;31423:18;31478:19;;;31461:15;;;31454:44;31423:18;-1:-1:-1;31525:40:12;31482:6;31423:18;31525:40;:::i;:::-;31511:54;;31614:2;31610;31606:11;31600:18;31578:40;;31667:6;31659;31655:19;31650:2;31642:6;31638:15;31631:44;;;;;31698:40;31731:6;31715:14;31698:40;:::i;:::-;31796:12;;;;31688:50;-1:-1:-1;;;31761:15:12;;;;29514:1;29507:9;29478:2340;;;-1:-1:-1;;31854:22:12;;;31834:18;;;31827:50;31900:60;31858:6;31945;31900:60;:::i;:::-;31886:74;;;;;32010:9;32002:6;31998:22;31991:4;31980:9;31976:20;31969:52;32044:74;32111:6;32103;32044:74;:::i;:::-;32030:88;;32168:9;32160:6;32156:22;32149:4;32138:9;32134:20;32127:52;32196:74;32263:6;32255;32196:74;:::i;:::-;32188:82;;;32308:6;32301:4;32290:9;32286:20;32279:36;32324:48;32366:4;32355:9;32351:20;32343:6;91:42;80:54;68:67;;14:127;32324:48;32409:6;32403:3;32392:9;32388:19;32381:35;28253:4169;;;;;;;;;;:::o;32427:138::-;32506:13;;32528:31;32506:13;32528:31;:::i;32570:1722::-;32644:5;32697:3;32690:4;32682:6;32678:17;32674:27;32664:55;;32715:1;32712;32705:12;32664:55;32744:6;32738:13;32770:4;32794:73;32810:56;32863:2;32810:56;:::i;32794:73::-;32901:15;;;32963:4;33006:13;;;32994:26;;32990:35;;;32932:12;;;;32889:3;33037:15;;;33034:35;;;33065:1;33062;33055:12;33034:35;33101:2;33093:6;33089:15;33113:1150;33129:6;33124:3;33121:15;33113:1150;;;33202:3;33197;33193:13;33230:2;33226;33222:11;33219:31;;;33246:1;33243;33236:12;33219:31;33276:22;;:::i;:::-;33321:4;33349:2;33345;33341:11;33338:31;;;33365:1;33362;33355:12;33338:31;33397:22;;:::i;:::-;33382:37;;33453:3;33447:10;33470:39;33501:7;33470:39;:::i;:::-;33522:24;;33580:12;;;33574:19;33606:33;33574:19;33606:33;:::i;:::-;33659:16;;;33652:33;33708:2;33754:12;;;33748:19;33730:16;;;33723:45;33791:4;33839:12;;;33833:19;33815:16;;;33808:45;33876:3;33913:12;;;33907:19;33939:33;33907:19;33939:33;:::i;:::-;33992:16;;;33985:33;34031:22;;;34089:43;34119:12;;;34089:43;:::i;:::-;34073:14;;;34066:67;34184:3;34175:13;;34169:20;34153:14;;;34146:44;-1:-1:-1;34203:18:12;;-1:-1:-1;34241:12:12;;;;33146;;33113:1150;;34297:1284;34450:6;34458;34511:2;34499:9;34490:7;34486:23;34482:32;34479:52;;;34527:1;34524;34517:12;34479:52;34560:9;34554:16;34589:18;34630:2;34622:6;34619:14;34616:34;;;34646:1;34643;34636:12;34616:34;34684:6;34673:9;34669:22;34659:32;;34729:7;34722:4;34718:2;34714:13;34710:27;34700:55;;34751:1;34748;34741:12;34700:55;34780:2;34774:9;34802:4;34826:73;34842:56;34895:2;34842:56;:::i;34826:73::-;34933:15;;;35015:1;35011:10;;;;35003:19;;34999:28;;;34964:12;;;;35039:19;;;35036:39;;;35071:1;35068;35061:12;35036:39;35095:11;;;;35115:239;35131:6;35126:3;35123:15;35115:239;;;35204:3;35198:10;35255:5;35248:13;35241:21;35234:5;35231:32;35221:60;;35277:1;35274;35267:12;35221:60;35294:18;;35148:12;;;;35332;;;;35115:239;;;35409:18;;;35403:25;35373:5;;-1:-1:-1;35403:25:12;;-1:-1:-1;;;35440:16:12;;;35437:36;;;35469:1;35466;35459:12;35437:36;;35492:83;35567:7;35556:8;35545:9;35541:24;35492:83;:::i;:::-;35482:93;;;34297:1284;;;;;:::o;35586:274::-;35626:1;35652;35642:189;;35687:77;35684:1;35677:88;35788:4;35785:1;35778:15;35816:4;35813:1;35806:15;35642:189;-1:-1:-1;35845:9:12;;35586:274::o;36075:408::-;36290:42;36282:6;36278:55;36267:9;36260:74;36370:6;36365:2;36354:9;36350:18;36343:34;36413:2;36408;36397:9;36393:18;36386:30;36241:4;36433:44;36473:2;36462:9;36458:18;36450:6;36433:44;:::i
Swarm Source
ipfs://7c99458f0e2e3e8ad786bb9e254dcffb8b48858f58813acdcf6813b79c313648
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.