Overview
ETH Balance
ETH Value
$0.00Latest 9 from a total of 9 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Fulfill Availabl... | 3183821 | 1050 days ago | IN | 0.05253 ETH | 0.00000549 | ||||
| Fulfill Availabl... | 3183794 | 1050 days ago | IN | 0.04939 ETH | 0.00000582 | ||||
| Fulfill Availabl... | 3183777 | 1050 days ago | IN | 0.09086 ETH | 0.00000853 | ||||
| Fulfill Availabl... | 3086103 | 1054 days ago | IN | 0.0048 ETH | 0.0000049 | ||||
| Fulfill Availabl... | 3029768 | 1058 days ago | IN | 0.0048 ETH | 0.00000494 | ||||
| Fulfill Availabl... | 2915217 | 1060 days ago | IN | 0.00261 ETH | 0.00000705 | ||||
| Fulfill Availabl... | 2852275 | 1061 days ago | IN | 0.0423 ETH | 0.00001172 | ||||
| Fulfill Availabl... | 2850712 | 1062 days ago | IN | 0.0799 ETH | 0.00001986 | ||||
| Fulfill Availabl... | 2789960 | 1063 days ago | IN | 0.00203 ETH | 0.00000639 |
Latest 19 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3183821 | 1050 days ago | 0.03503 ETH | ||||
| 3183821 | 1050 days ago | 0.0175 ETH | ||||
| 3183794 | 1050 days ago | 0.0168 ETH | ||||
| 3183794 | 1050 days ago | 0.03259 ETH | ||||
| 3183777 | 1050 days ago | 0.06036 ETH | ||||
| 3183777 | 1050 days ago | 0.0305 ETH | ||||
| 3086103 | 1054 days ago | 0.0023 ETH | ||||
| 3086103 | 1054 days ago | 0.0025 ETH | ||||
| 3029768 | 1058 days ago | 0.0024 ETH | ||||
| 3029768 | 1058 days ago | 0.0024 ETH | ||||
| 2915217 | 1060 days ago | 0.001 ETH | ||||
| 2915217 | 1060 days ago | 0.00161 ETH | ||||
| 2852275 | 1061 days ago | 0.0047 ETH | ||||
| 2852275 | 1061 days ago | 0.0376 ETH | ||||
| 2850712 | 1062 days ago | 0.0047 ETH | ||||
| 2850712 | 1062 days ago | 0.0752 ETH | ||||
| 2789960 | 1063 days ago | 0.00074 ETH | ||||
| 2789960 | 1063 days ago | 0.00129 ETH | ||||
| 2437108 | 1074 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {
SeaportRouterInterface
} from "../interfaces/SeaportRouterInterface.sol";
import { SeaportInterface } from "../interfaces/SeaportInterface.sol";
import { ReentrancyGuard } from "../lib/ReentrancyGuard.sol";
import {
Execution,
AdvancedOrder,
CriteriaResolver,
FulfillmentComponent
} from "../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.1 contract usable through this router.
address private immutable _SEAPORT_V1_1;
/// @dev The allowed v1.4 contract usable through this router.
address private immutable _SEAPORT_V1_4;
/**
* @dev Deploy contract with the supported Seaport contracts.
*
* @param seaportV1point1 The address of the Seaport v1.1 contract.
* @param seaportV1point4 The address of the Seaport v1.4 contract.
*/
constructor(address seaportV1point1, address seaportV1point4) {
_SEAPORT_V1_1 = seaportV1point1;
_SEAPORT_V1_4 = seaportV1point4;
}
/**
* @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()`.
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 {}
// Update fulfillments left.
calldataParams.maximumFulfilled = fulfillmentsLeft;
unchecked {
++i;
}
}
// 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_1;
seaportContracts[1] = _SEAPORT_V1_4;
}
/**
* @dev Reverts if the provided Seaport contract is not allowed.
*/
function _assertSeaportAllowed(address seaport) internal view {
if (
_cast(seaport == _SEAPORT_V1_1) | _cast(seaport == _SEAPORT_V1_4) ==
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;
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);
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)
}
}
/// @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 pptr(
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)
}
}
/// @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 pptr(
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)
}
}
/// @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 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 pptr(
MemoryPointer mPtr,
uint256 headOffset
) internal pure returns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.offset(headOffset).readMemoryPointer();
}
/// @dev Resolves a pointer pointer stored at `mPtr` to a memory pointer.
/// `mPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(
MemoryPointer mPtr
) internal pure returns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.readMemoryPointer();
}
}
library CalldataReaders {
/// @dev Reads the value at `cdPtr` and applies a mask to return only the
/// last 4 bytes.
function readMaskedUint256(
CalldataPointer cdPtr
) internal pure returns (uint256 value) {
value = cdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `cdPtr` in calldata.
function readBool(
CalldataPointer cdPtr
) internal pure returns (bool value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the address at `cdPtr` in calldata.
function readAddress(
CalldataPointer cdPtr
) internal pure returns (address value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes1 at `cdPtr` in calldata.
function readBytes1(
CalldataPointer cdPtr
) internal pure returns (bytes1 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes2 at `cdPtr` in calldata.
function readBytes2(
CalldataPointer cdPtr
) internal pure returns (bytes2 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes3 at `cdPtr` in calldata.
function readBytes3(
CalldataPointer cdPtr
) internal pure returns (bytes3 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes4 at `cdPtr` in calldata.
function readBytes4(
CalldataPointer cdPtr
) internal pure returns (bytes4 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes5 at `cdPtr` in calldata.
function readBytes5(
CalldataPointer cdPtr
) internal pure returns (bytes5 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes6 at `cdPtr` in calldata.
function readBytes6(
CalldataPointer cdPtr
) internal pure returns (bytes6 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes7 at `cdPtr` in calldata.
function readBytes7(
CalldataPointer cdPtr
) internal pure returns (bytes7 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes8 at `cdPtr` in calldata.
function readBytes8(
CalldataPointer cdPtr
) internal pure returns (bytes8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes9 at `cdPtr` in calldata.
function readBytes9(
CalldataPointer cdPtr
) internal pure returns (bytes9 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes10 at `cdPtr` in calldata.
function readBytes10(
CalldataPointer cdPtr
) internal pure returns (bytes10 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes11 at `cdPtr` in calldata.
function readBytes11(
CalldataPointer cdPtr
) internal pure returns (bytes11 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes12 at `cdPtr` in calldata.
function readBytes12(
CalldataPointer cdPtr
) internal pure returns (bytes12 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes13 at `cdPtr` in calldata.
function readBytes13(
CalldataPointer cdPtr
) internal pure returns (bytes13 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes14 at `cdPtr` in calldata.
function readBytes14(
CalldataPointer cdPtr
) internal pure returns (bytes14 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes15 at `cdPtr` in calldata.
function readBytes15(
CalldataPointer cdPtr
) internal pure returns (bytes15 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes16 at `cdPtr` in calldata.
function readBytes16(
CalldataPointer cdPtr
) internal pure returns (bytes16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes17 at `cdPtr` in calldata.
function readBytes17(
CalldataPointer cdPtr
) internal pure returns (bytes17 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes18 at `cdPtr` in calldata.
function readBytes18(
CalldataPointer cdPtr
) internal pure returns (bytes18 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes19 at `cdPtr` in calldata.
function readBytes19(
CalldataPointer cdPtr
) internal pure returns (bytes19 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes20 at `cdPtr` in calldata.
function readBytes20(
CalldataPointer cdPtr
) internal pure returns (bytes20 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes21 at `cdPtr` in calldata.
function readBytes21(
CalldataPointer cdPtr
) internal pure returns (bytes21 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes22 at `cdPtr` in calldata.
function readBytes22(
CalldataPointer cdPtr
) internal pure returns (bytes22 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes23 at `cdPtr` in calldata.
function readBytes23(
CalldataPointer cdPtr
) internal pure returns (bytes23 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes24 at `cdPtr` in calldata.
function readBytes24(
CalldataPointer cdPtr
) internal pure returns (bytes24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes25 at `cdPtr` in calldata.
function readBytes25(
CalldataPointer cdPtr
) internal pure returns (bytes25 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes26 at `cdPtr` in calldata.
function readBytes26(
CalldataPointer cdPtr
) internal pure returns (bytes26 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes27 at `cdPtr` in calldata.
function readBytes27(
CalldataPointer cdPtr
) internal pure returns (bytes27 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes28 at `cdPtr` in calldata.
function readBytes28(
CalldataPointer cdPtr
) internal pure returns (bytes28 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes29 at `cdPtr` in calldata.
function readBytes29(
CalldataPointer cdPtr
) internal pure returns (bytes29 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes30 at `cdPtr` in calldata.
function readBytes30(
CalldataPointer cdPtr
) internal pure returns (bytes30 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes31 at `cdPtr` in calldata.
function readBytes31(
CalldataPointer cdPtr
) internal pure returns (bytes31 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes32 at `cdPtr` in calldata.
function readBytes32(
CalldataPointer cdPtr
) internal pure returns (bytes32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint8 at `cdPtr` in calldata.
function readUint8(
CalldataPointer cdPtr
) internal pure returns (uint8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint16 at `cdPtr` in calldata.
function readUint16(
CalldataPointer cdPtr
) internal pure returns (uint16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint24 at `cdPtr` in calldata.
function readUint24(
CalldataPointer cdPtr
) internal pure returns (uint24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint32 at `cdPtr` in calldata.
function readUint32(
CalldataPointer cdPtr
) internal pure returns (uint32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint40 at `cdPtr` in calldata.
function readUint40(
CalldataPointer cdPtr
) internal pure returns (uint40 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint48 at `cdPtr` in calldata.
function readUint48(
CalldataPointer cdPtr
) internal pure returns (uint48 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint56 at `cdPtr` in calldata.
function readUint56(
CalldataPointer cdPtr
) internal pure returns (uint56 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint64 at `cdPtr` in calldata.
function readUint64(
CalldataPointer cdPtr
) internal pure returns (uint64 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint72 at `cdPtr` in calldata.
function readUint72(
CalldataPointer cdPtr
) internal pure returns (uint72 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint80 at `cdPtr` in calldata.
function readUint80(
CalldataPointer cdPtr
) internal pure returns (uint80 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint88 at `cdPtr` in calldata.
function readUint88(
CalldataPointer cdPtr
) internal pure returns (uint88 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint96 at `cdPtr` in calldata.
function readUint96(
CalldataPointer cdPtr
) internal pure returns (uint96 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint104 at `cdPtr` in calldata.
function readUint104(
CalldataPointer cdPtr
) internal pure returns (uint104 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint112 at `cdPtr` in calldata.
function readUint112(
CalldataPointer cdPtr
) internal pure returns (uint112 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint120 at `cdPtr` in calldata.
function readUint120(
CalldataPointer cdPtr
) internal pure returns (uint120 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint128 at `cdPtr` in calldata.
function readUint128(
CalldataPointer cdPtr
) internal pure returns (uint128 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint136 at `cdPtr` in calldata.
function readUint136(
CalldataPointer cdPtr
) internal pure returns (uint136 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint144 at `cdPtr` in calldata.
function readUint144(
CalldataPointer cdPtr
) internal pure returns (uint144 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint152 at `cdPtr` in calldata.
function readUint152(
CalldataPointer cdPtr
) internal pure returns (uint152 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint160 at `cdPtr` in calldata.
function readUint160(
CalldataPointer cdPtr
) internal pure returns (uint160 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint168 at `cdPtr` in calldata.
function readUint168(
CalldataPointer cdPtr
) internal pure returns (uint168 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint176 at `cdPtr` in calldata.
function readUint176(
CalldataPointer cdPtr
) internal pure returns (uint176 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint184 at `cdPtr` in calldata.
function readUint184(
CalldataPointer cdPtr
) internal pure returns (uint184 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint192 at `cdPtr` in calldata.
function readUint192(
CalldataPointer cdPtr
) internal pure returns (uint192 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint200 at `cdPtr` in calldata.
function readUint200(
CalldataPointer cdPtr
) internal pure returns (uint200 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint208 at `cdPtr` in calldata.
function readUint208(
CalldataPointer cdPtr
) internal pure returns (uint208 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint216 at `cdPtr` in calldata.
function readUint216(
CalldataPointer cdPtr
) internal pure returns (uint216 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint224 at `cdPtr` in calldata.
function readUint224(
CalldataPointer cdPtr
) internal pure returns (uint224 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint232 at `cdPtr` in calldata.
function readUint232(
CalldataPointer cdPtr
) internal pure returns (uint232 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint240 at `cdPtr` in calldata.
function readUint240(
CalldataPointer cdPtr
) internal pure returns (uint240 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint248 at `cdPtr` in calldata.
function readUint248(
CalldataPointer cdPtr
) internal pure returns (uint248 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint256 at `cdPtr` in calldata.
function readUint256(
CalldataPointer cdPtr
) internal pure returns (uint256 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int8 at `cdPtr` in calldata.
function readInt8(
CalldataPointer cdPtr
) internal pure returns (int8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int16 at `cdPtr` in calldata.
function readInt16(
CalldataPointer cdPtr
) internal pure returns (int16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int24 at `cdPtr` in calldata.
function readInt24(
CalldataPointer cdPtr
) internal pure returns (int24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int32 at `cdPtr` in calldata.
function readInt32(
CalldataPointer cdPtr
) internal pure returns (int32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int40 at `cdPtr` in calldata.
function readInt40(
CalldataPointer cdPtr
) internal pure returns (int40 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int48 at `cdPtr` in calldata.
function readInt48(
CalldataPointer cdPtr
) internal pure returns (int48 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int56 at `cdPtr` in calldata.
function readInt56(
CalldataPointer cdPtr
) internal pure returns (int56 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int64 at `cdPtr` in calldata.
function readInt64(
CalldataPointer cdPtr
) internal pure returns (int64 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int72 at `cdPtr` in calldata.
function readInt72(
CalldataPointer cdPtr
) internal pure returns (int72 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int80 at `cdPtr` in calldata.
function readInt80(
CalldataPointer cdPtr
) internal pure returns (int80 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int88 at `cdPtr` in calldata.
function readInt88(
CalldataPointer cdPtr
) internal pure returns (int88 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int96 at `cdPtr` in calldata.
function readInt96(
CalldataPointer cdPtr
) internal pure returns (int96 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int104 at `cdPtr` in calldata.
function readInt104(
CalldataPointer cdPtr
) internal pure returns (int104 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int112 at `cdPtr` in calldata.
function readInt112(
CalldataPointer cdPtr
) internal pure returns (int112 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int120 at `cdPtr` in calldata.
function readInt120(
CalldataPointer cdPtr
) internal pure returns (int120 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int128 at `cdPtr` in calldata.
function readInt128(
CalldataPointer cdPtr
) internal pure returns (int128 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int136 at `cdPtr` in calldata.
function readInt136(
CalldataPointer cdPtr
) internal pure returns (int136 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int144 at `cdPtr` in calldata.
function readInt144(
CalldataPointer cdPtr
) internal pure returns (int144 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int152 at `cdPtr` in calldata.
function readInt152(
CalldataPointer cdPtr
) internal pure returns (int152 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int160 at `cdPtr` in calldata.
function readInt160(
CalldataPointer cdPtr
) internal pure returns (int160 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int168 at `cdPtr` in calldata.
function readInt168(
CalldataPointer cdPtr
) internal pure returns (int168 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int176 at `cdPtr` in calldata.
function readInt176(
CalldataPointer cdPtr
) internal pure returns (int176 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int184 at `cdPtr` in calldata.
function readInt184(
CalldataPointer cdPtr
) internal pure returns (int184 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int192 at `cdPtr` in calldata.
function readInt192(
CalldataPointer cdPtr
) internal pure returns (int192 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int200 at `cdPtr` in calldata.
function readInt200(
CalldataPointer cdPtr
) internal pure returns (int200 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int208 at `cdPtr` in calldata.
function readInt208(
CalldataPointer cdPtr
) internal pure returns (int208 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int216 at `cdPtr` in calldata.
function readInt216(
CalldataPointer cdPtr
) internal pure returns (int216 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int224 at `cdPtr` in calldata.
function readInt224(
CalldataPointer cdPtr
) internal pure returns (int224 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int232 at `cdPtr` in calldata.
function readInt232(
CalldataPointer cdPtr
) internal pure returns (int232 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int240 at `cdPtr` in calldata.
function readInt240(
CalldataPointer cdPtr
) internal pure returns (int240 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int248 at `cdPtr` in calldata.
function readInt248(
CalldataPointer cdPtr
) internal pure returns (int248 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int256 at `cdPtr` in calldata.
function readInt256(
CalldataPointer cdPtr
) internal pure returns (int256 value) {
assembly {
value := calldataload(cdPtr)
}
}
}
library ReturndataReaders {
/// @dev Reads value at `rdPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(
ReturndataPointer rdPtr
) internal pure returns (uint256 value) {
value = rdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `rdPtr` in returndata.
function readBool(
ReturndataPointer rdPtr
) internal pure returns (bool value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the address at `rdPtr` in returndata.
function readAddress(
ReturndataPointer rdPtr
) internal pure returns (address value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes1 at `rdPtr` in returndata.
function readBytes1(
ReturndataPointer rdPtr
) internal pure returns (bytes1 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes2 at `rdPtr` in returndata.
function readBytes2(
ReturndataPointer rdPtr
) internal pure returns (bytes2 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes3 at `rdPtr` in returndata.
function readBytes3(
ReturndataPointer rdPtr
) internal pure returns (bytes3 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes4 at `rdPtr` in returndata.
function readBytes4(
ReturndataPointer rdPtr
) internal pure returns (bytes4 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes5 at `rdPtr` in returndata.
function readBytes5(
ReturndataPointer rdPtr
) internal pure returns (bytes5 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes6 at `rdPtr` in returndata.
function readBytes6(
ReturndataPointer rdPtr
) internal pure returns (bytes6 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes7 at `rdPtr` in returndata.
function readBytes7(
ReturndataPointer rdPtr
) internal pure returns (bytes7 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes8 at `rdPtr` in returndata.
function readBytes8(
ReturndataPointer rdPtr
) internal pure returns (bytes8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes9 at `rdPtr` in returndata.
function readBytes9(
ReturndataPointer rdPtr
) internal pure returns (bytes9 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes10 at `rdPtr` in returndata.
function readBytes10(
ReturndataPointer rdPtr
) internal pure returns (bytes10 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes11 at `rdPtr` in returndata.
function readBytes11(
ReturndataPointer rdPtr
) internal pure returns (bytes11 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes12 at `rdPtr` in returndata.
function readBytes12(
ReturndataPointer rdPtr
) internal pure returns (bytes12 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes13 at `rdPtr` in returndata.
function readBytes13(
ReturndataPointer rdPtr
) internal pure returns (bytes13 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes14 at `rdPtr` in returndata.
function readBytes14(
ReturndataPointer rdPtr
) internal pure returns (bytes14 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes15 at `rdPtr` in returndata.
function readBytes15(
ReturndataPointer rdPtr
) internal pure returns (bytes15 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes16 at `rdPtr` in returndata.
function readBytes16(
ReturndataPointer rdPtr
) internal pure returns (bytes16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes17 at `rdPtr` in returndata.
function readBytes17(
ReturndataPointer rdPtr
) internal pure returns (bytes17 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes18 at `rdPtr` in returndata.
function readBytes18(
ReturndataPointer rdPtr
) internal pure returns (bytes18 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes19 at `rdPtr` in returndata.
function readBytes19(
ReturndataPointer rdPtr
) internal pure returns (bytes19 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes20 at `rdPtr` in returndata.
function readBytes20(
ReturndataPointer rdPtr
) internal pure returns (bytes20 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes21 at `rdPtr` in returndata.
function readBytes21(
ReturndataPointer rdPtr
) internal pure returns (bytes21 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes22 at `rdPtr` in returndata.
function readBytes22(
ReturndataPointer rdPtr
) internal pure returns (bytes22 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes23 at `rdPtr` in returndata.
function readBytes23(
ReturndataPointer rdPtr
) internal pure returns (bytes23 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes24 at `rdPtr` in returndata.
function readBytes24(
ReturndataPointer rdPtr
) internal pure returns (bytes24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes25 at `rdPtr` in returndata.
function readBytes25(
ReturndataPointer rdPtr
) internal pure returns (bytes25 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes26 at `rdPtr` in returndata.
function readBytes26(
ReturndataPointer rdPtr
) internal pure returns (bytes26 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes27 at `rdPtr` in returndata.
function readBytes27(
ReturndataPointer rdPtr
) internal pure returns (bytes27 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes28 at `rdPtr` in returndata.
function readBytes28(
ReturndataPointer rdPtr
) internal pure returns (bytes28 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes29 at `rdPtr` in returndata.
function readBytes29(
ReturndataPointer rdPtr
) internal pure returns (bytes29 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes30 at `rdPtr` in returndata.
function readBytes30(
ReturndataPointer rdPtr
) internal pure returns (bytes30 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes31 at `rdPtr` in returndata.
function readBytes31(
ReturndataPointer rdPtr
) internal pure returns (bytes31 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes32 at `rdPtr` in returndata.
function readBytes32(
ReturndataPointer rdPtr
) internal pure returns (bytes32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint8 at `rdPtr` in returndata.
function readUint8(
ReturndataPointer rdPtr
) internal pure returns (uint8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint16 at `rdPtr` in returndata.
function readUint16(
ReturndataPointer rdPtr
) internal pure returns (uint16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint24 at `rdPtr` in returndata.
function readUint24(
ReturndataPointer rdPtr
) internal pure returns (uint24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint32 at `rdPtr` in returndata.
function readUint32(
ReturndataPointer rdPtr
) internal pure returns (uint32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint40 at `rdPtr` in returndata.
function readUint40(
ReturndataPointer rdPtr
) internal pure returns (uint40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint48 at `rdPtr` in returndata.
function readUint48(
ReturndataPointer rdPtr
) internal pure returns (uint48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint56 at `rdPtr` in returndata.
function readUint56(
ReturndataPointer rdPtr
) internal pure returns (uint56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint64 at `rdPtr` in returndata.
function readUint64(
ReturndataPointer rdPtr
) internal pure returns (uint64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint72 at `rdPtr` in returndata.
function readUint72(
ReturndataPointer rdPtr
) internal pure returns (uint72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint80 at `rdPtr` in returndata.
function readUint80(
ReturndataPointer rdPtr
) internal pure returns (uint80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint88 at `rdPtr` in returndata.
function readUint88(
ReturndataPointer rdPtr
) internal pure returns (uint88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint96 at `rdPtr` in returndata.
function readUint96(
ReturndataPointer rdPtr
) internal pure returns (uint96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint104 at `rdPtr` in returndata.
function readUint104(
ReturndataPointer rdPtr
) internal pure returns (uint104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint112 at `rdPtr` in returndata.
function readUint112(
ReturndataPointer rdPtr
) internal pure returns (uint112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint120 at `rdPtr` in returndata.
function readUint120(
ReturndataPointer rdPtr
) internal pure returns (uint120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint128 at `rdPtr` in returndata.
function readUint128(
ReturndataPointer rdPtr
) internal pure returns (uint128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint136 at `rdPtr` in returndata.
function readUint136(
ReturndataPointer rdPtr
) internal pure returns (uint136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint144 at `rdPtr` in returndata.
function readUint144(
ReturndataPointer rdPtr
) internal pure returns (uint144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint152 at `rdPtr` in returndata.
function readUint152(
ReturndataPointer rdPtr
) internal pure returns (uint152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint160 at `rdPtr` in returndata.
function readUint160(
ReturndataPointer rdPtr
) internal pure returns (uint160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint168 at `rdPtr` in returndata.
function readUint168(
ReturndataPointer rdPtr
) internal pure returns (uint168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint176 at `rdPtr` in returndata.
function readUint176(
ReturndataPointer rdPtr
) internal pure returns (uint176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint184 at `rdPtr` in returndata.
function readUint184(
ReturndataPointer rdPtr
) internal pure returns (uint184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint192 at `rdPtr` in returndata.
function readUint192(
ReturndataPointer rdPtr
) internal pure returns (uint192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint200 at `rdPtr` in returndata.
function readUint200(
ReturndataPointer rdPtr
) internal pure returns (uint200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint208 at `rdPtr` in returndata.
function readUint208(
ReturndataPointer rdPtr
) internal pure returns (uint208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint216 at `rdPtr` in returndata.
function readUint216(
ReturndataPointer rdPtr
) internal pure returns (uint216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint224 at `rdPtr` in returndata.
function readUint224(
ReturndataPointer rdPtr
) internal pure returns (uint224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint232 at `rdPtr` in returndata.
function readUint232(
ReturndataPointer rdPtr
) internal pure returns (uint232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint240 at `rdPtr` in returndata.
function readUint240(
ReturndataPointer rdPtr
) internal pure returns (uint240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint248 at `rdPtr` in returndata.
function readUint248(
ReturndataPointer rdPtr
) internal pure returns (uint248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint256 at `rdPtr` in returndata.
function readUint256(
ReturndataPointer rdPtr
) internal pure returns (uint256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int8 at `rdPtr` in returndata.
function readInt8(
ReturndataPointer rdPtr
) internal pure returns (int8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int16 at `rdPtr` in returndata.
function readInt16(
ReturndataPointer rdPtr
) internal pure returns (int16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int24 at `rdPtr` in returndata.
function readInt24(
ReturndataPointer rdPtr
) internal pure returns (int24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int32 at `rdPtr` in returndata.
function readInt32(
ReturndataPointer rdPtr
) internal pure returns (int32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int40 at `rdPtr` in returndata.
function readInt40(
ReturndataPointer rdPtr
) internal pure returns (int40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int48 at `rdPtr` in returndata.
function readInt48(
ReturndataPointer rdPtr
) internal pure returns (int48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int56 at `rdPtr` in returndata.
function readInt56(
ReturndataPointer rdPtr
) internal pure returns (int56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int64 at `rdPtr` in returndata.
function readInt64(
ReturndataPointer rdPtr
) internal pure returns (int64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int72 at `rdPtr` in returndata.
function readInt72(
ReturndataPointer rdPtr
) internal pure returns (int72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int80 at `rdPtr` in returndata.
function readInt80(
ReturndataPointer rdPtr
) internal pure returns (int80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int88 at `rdPtr` in returndata.
function readInt88(
ReturndataPointer rdPtr
) internal pure returns (int88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int96 at `rdPtr` in returndata.
function readInt96(
ReturndataPointer rdPtr
) internal pure returns (int96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int104 at `rdPtr` in returndata.
function readInt104(
ReturndataPointer rdPtr
) internal pure returns (int104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int112 at `rdPtr` in returndata.
function readInt112(
ReturndataPointer rdPtr
) internal pure returns (int112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int120 at `rdPtr` in returndata.
function readInt120(
ReturndataPointer rdPtr
) internal pure returns (int120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int128 at `rdPtr` in returndata.
function readInt128(
ReturndataPointer rdPtr
) internal pure returns (int128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int136 at `rdPtr` in returndata.
function readInt136(
ReturndataPointer rdPtr
) internal pure returns (int136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int144 at `rdPtr` in returndata.
function readInt144(
ReturndataPointer rdPtr
) internal pure returns (int144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int152 at `rdPtr` in returndata.
function readInt152(
ReturndataPointer rdPtr
) internal pure returns (int152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int160 at `rdPtr` in returndata.
function readInt160(
ReturndataPointer rdPtr
) internal pure returns (int160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int168 at `rdPtr` in returndata.
function readInt168(
ReturndataPointer rdPtr
) internal pure returns (int168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int176 at `rdPtr` in returndata.
function readInt176(
ReturndataPointer rdPtr
) internal pure returns (int176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int184 at `rdPtr` in returndata.
function readInt184(
ReturndataPointer rdPtr
) internal pure returns (int184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int192 at `rdPtr` in returndata.
function readInt192(
ReturndataPointer rdPtr
) internal pure returns (int192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int200 at `rdPtr` in returndata.
function readInt200(
ReturndataPointer rdPtr
) internal pure returns (int200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int208 at `rdPtr` in returndata.
function readInt208(
ReturndataPointer rdPtr
) internal pure returns (int208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int216 at `rdPtr` in returndata.
function readInt216(
ReturndataPointer rdPtr
) internal pure returns (int216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int224 at `rdPtr` in returndata.
function readInt224(
ReturndataPointer rdPtr
) internal pure returns (int224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int232 at `rdPtr` in returndata.
function readInt232(
ReturndataPointer rdPtr
) internal pure returns (int232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int240 at `rdPtr` in returndata.
function readInt240(
ReturndataPointer rdPtr
) internal pure returns (int240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int248 at `rdPtr` in returndata.
function readInt248(
ReturndataPointer rdPtr
) internal pure returns (int248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int256 at `rdPtr` in returndata.
function readInt256(
ReturndataPointer rdPtr
) internal pure returns (int256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
}
library MemoryReaders {
/// @dev Reads the memory pointer at `mPtr` in memory.
function readMemoryPointer(
MemoryPointer mPtr
) internal pure returns (MemoryPointer value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads value at `mPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(
MemoryPointer mPtr
) internal pure returns (uint256 value) {
value = mPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `mPtr` in memory.
function readBool(MemoryPointer mPtr) internal pure returns (bool value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the address at `mPtr` in memory.
function readAddress(
MemoryPointer mPtr
) internal pure returns (address value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes1 at `mPtr` in memory.
function readBytes1(
MemoryPointer mPtr
) internal pure returns (bytes1 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes2 at `mPtr` in memory.
function readBytes2(
MemoryPointer mPtr
) internal pure returns (bytes2 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes3 at `mPtr` in memory.
function readBytes3(
MemoryPointer mPtr
) internal pure returns (bytes3 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes4 at `mPtr` in memory.
function readBytes4(
MemoryPointer mPtr
) internal pure returns (bytes4 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes5 at `mPtr` in memory.
function readBytes5(
MemoryPointer mPtr
) internal pure returns (bytes5 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes6 at `mPtr` in memory.
function readBytes6(
MemoryPointer mPtr
) internal pure returns (bytes6 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes7 at `mPtr` in memory.
function readBytes7(
MemoryPointer mPtr
) internal pure returns (bytes7 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes8 at `mPtr` in memory.
function readBytes8(
MemoryPointer mPtr
) internal pure returns (bytes8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes9 at `mPtr` in memory.
function readBytes9(
MemoryPointer mPtr
) internal pure returns (bytes9 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes10 at `mPtr` in memory.
function readBytes10(
MemoryPointer mPtr
) internal pure returns (bytes10 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes11 at `mPtr` in memory.
function readBytes11(
MemoryPointer mPtr
) internal pure returns (bytes11 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes12 at `mPtr` in memory.
function readBytes12(
MemoryPointer mPtr
) internal pure returns (bytes12 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes13 at `mPtr` in memory.
function readBytes13(
MemoryPointer mPtr
) internal pure returns (bytes13 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes14 at `mPtr` in memory.
function readBytes14(
MemoryPointer mPtr
) internal pure returns (bytes14 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes15 at `mPtr` in memory.
function readBytes15(
MemoryPointer mPtr
) internal pure returns (bytes15 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes16 at `mPtr` in memory.
function readBytes16(
MemoryPointer mPtr
) internal pure returns (bytes16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes17 at `mPtr` in memory.
function readBytes17(
MemoryPointer mPtr
) internal pure returns (bytes17 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes18 at `mPtr` in memory.
function readBytes18(
MemoryPointer mPtr
) internal pure returns (bytes18 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes19 at `mPtr` in memory.
function readBytes19(
MemoryPointer mPtr
) internal pure returns (bytes19 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes20 at `mPtr` in memory.
function readBytes20(
MemoryPointer mPtr
) internal pure returns (bytes20 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes21 at `mPtr` in memory.
function readBytes21(
MemoryPointer mPtr
) internal pure returns (bytes21 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes22 at `mPtr` in memory.
function readBytes22(
MemoryPointer mPtr
) internal pure returns (bytes22 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes23 at `mPtr` in memory.
function readBytes23(
MemoryPointer mPtr
) internal pure returns (bytes23 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes24 at `mPtr` in memory.
function readBytes24(
MemoryPointer mPtr
) internal pure returns (bytes24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes25 at `mPtr` in memory.
function readBytes25(
MemoryPointer mPtr
) internal pure returns (bytes25 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes26 at `mPtr` in memory.
function readBytes26(
MemoryPointer mPtr
) internal pure returns (bytes26 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes27 at `mPtr` in memory.
function readBytes27(
MemoryPointer mPtr
) internal pure returns (bytes27 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes28 at `mPtr` in memory.
function readBytes28(
MemoryPointer mPtr
) internal pure returns (bytes28 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes29 at `mPtr` in memory.
function readBytes29(
MemoryPointer mPtr
) internal pure returns (bytes29 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes30 at `mPtr` in memory.
function readBytes30(
MemoryPointer mPtr
) internal pure returns (bytes30 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes31 at `mPtr` in memory.
function readBytes31(
MemoryPointer mPtr
) internal pure returns (bytes31 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes32 at `mPtr` in memory.
function readBytes32(
MemoryPointer mPtr
) internal pure returns (bytes32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint8 at `mPtr` in memory.
function readUint8(MemoryPointer mPtr) internal pure returns (uint8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint16 at `mPtr` in memory.
function readUint16(
MemoryPointer mPtr
) internal pure returns (uint16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint24 at `mPtr` in memory.
function readUint24(
MemoryPointer mPtr
) internal pure returns (uint24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint32 at `mPtr` in memory.
function readUint32(
MemoryPointer mPtr
) internal pure returns (uint32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint40 at `mPtr` in memory.
function readUint40(
MemoryPointer mPtr
) internal pure returns (uint40 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint48 at `mPtr` in memory.
function readUint48(
MemoryPointer mPtr
) internal pure returns (uint48 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint56 at `mPtr` in memory.
function readUint56(
MemoryPointer mPtr
) internal pure returns (uint56 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint64 at `mPtr` in memory.
function readUint64(
MemoryPointer mPtr
) internal pure returns (uint64 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint72 at `mPtr` in memory.
function readUint72(
MemoryPointer mPtr
) internal pure returns (uint72 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint80 at `mPtr` in memory.
function readUint80(
MemoryPointer mPtr
) internal pure returns (uint80 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint88 at `mPtr` in memory.
function readUint88(
MemoryPointer mPtr
) internal pure returns (uint88 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint96 at `mPtr` in memory.
function readUint96(
MemoryPointer mPtr
) internal pure returns (uint96 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint104 at `mPtr` in memory.
function readUint104(
MemoryPointer mPtr
) internal pure returns (uint104 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint112 at `mPtr` in memory.
function readUint112(
MemoryPointer mPtr
) internal pure returns (uint112 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint120 at `mPtr` in memory.
function readUint120(
MemoryPointer mPtr
) internal pure returns (uint120 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint128 at `mPtr` in memory.
function readUint128(
MemoryPointer mPtr
) internal pure returns (uint128 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint136 at `mPtr` in memory.
function readUint136(
MemoryPointer mPtr
) internal pure returns (uint136 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint144 at `mPtr` in memory.
function readUint144(
MemoryPointer mPtr
) internal pure returns (uint144 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint152 at `mPtr` in memory.
function readUint152(
MemoryPointer mPtr
) internal pure returns (uint152 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint160 at `mPtr` in memory.
function readUint160(
MemoryPointer mPtr
) internal pure returns (uint160 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint168 at `mPtr` in memory.
function readUint168(
MemoryPointer mPtr
) internal pure returns (uint168 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint176 at `mPtr` in memory.
function readUint176(
MemoryPointer mPtr
) internal pure returns (uint176 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint184 at `mPtr` in memory.
function readUint184(
MemoryPointer mPtr
) internal pure returns (uint184 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint192 at `mPtr` in memory.
function readUint192(
MemoryPointer mPtr
) internal pure returns (uint192 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint200 at `mPtr` in memory.
function readUint200(
MemoryPointer mPtr
) internal pure returns (uint200 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint208 at `mPtr` in memory.
function readUint208(
MemoryPointer mPtr
) internal pure returns (uint208 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint216 at `mPtr` in memory.
function readUint216(
MemoryPointer mPtr
) internal pure returns (uint216 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint224 at `mPtr` in memory.
function readUint224(
MemoryPointer mPtr
) internal pure returns (uint224 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint232 at `mPtr` in memory.
function readUint232(
MemoryPointer mPtr
) internal pure returns (uint232 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint240 at `mPtr` in memory.
function readUint240(
MemoryPointer mPtr
) internal pure returns (uint240 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint248 at `mPtr` in memory.
function readUint248(
MemoryPointer mPtr
) internal pure returns (uint248 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint256 at `mPtr` in memory.
function readUint256(
MemoryPointer mPtr
) internal pure returns (uint256 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int8 at `mPtr` in memory.
function readInt8(MemoryPointer mPtr) internal pure returns (int8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int16 at `mPtr` in memory.
function readInt16(MemoryPointer mPtr) internal pure returns (int16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int24 at `mPtr` in memory.
function readInt24(MemoryPointer mPtr) internal pure returns (int24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int32 at `mPtr` in memory.
function readInt32(MemoryPointer mPtr) internal pure returns (int32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int40 at `mPtr` in memory.
function readInt40(MemoryPointer mPtr) internal pure returns (int40 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int48 at `mPtr` in memory.
function readInt48(MemoryPointer mPtr) internal pure returns (int48 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int56 at `mPtr` in memory.
function readInt56(MemoryPointer mPtr) internal pure returns (int56 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int64 at `mPtr` in memory.
function readInt64(MemoryPointer mPtr) internal pure returns (int64 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int72 at `mPtr` in memory.
function readInt72(MemoryPointer mPtr) internal pure returns (int72 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int80 at `mPtr` in memory.
function readInt80(MemoryPointer mPtr) internal pure returns (int80 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int88 at `mPtr` in memory.
function readInt88(MemoryPointer mPtr) internal pure returns (int88 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int96 at `mPtr` in memory.
function readInt96(MemoryPointer mPtr) internal pure returns (int96 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int104 at `mPtr` in memory.
function readInt104(
MemoryPointer mPtr
) internal pure returns (int104 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int112 at `mPtr` in memory.
function readInt112(
MemoryPointer mPtr
) internal pure returns (int112 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int120 at `mPtr` in memory.
function readInt120(
MemoryPointer mPtr
) internal pure returns (int120 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int128 at `mPtr` in memory.
function readInt128(
MemoryPointer mPtr
) internal pure returns (int128 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int136 at `mPtr` in memory.
function readInt136(
MemoryPointer mPtr
) internal pure returns (int136 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int144 at `mPtr` in memory.
function readInt144(
MemoryPointer mPtr
) internal pure returns (int144 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int152 at `mPtr` in memory.
function readInt152(
MemoryPointer mPtr
) internal pure returns (int152 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int160 at `mPtr` in memory.
function readInt160(
MemoryPointer mPtr
) internal pure returns (int160 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int168 at `mPtr` in memory.
function readInt168(
MemoryPointer mPtr
) internal pure returns (int168 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int176 at `mPtr` in memory.
function readInt176(
MemoryPointer mPtr
) internal pure returns (int176 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int184 at `mPtr` in memory.
function readInt184(
MemoryPointer mPtr
) internal pure returns (int184 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int192 at `mPtr` in memory.
function readInt192(
MemoryPointer mPtr
) internal pure returns (int192 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int200 at `mPtr` in memory.
function readInt200(
MemoryPointer mPtr
) internal pure returns (int200 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int208 at `mPtr` in memory.
function readInt208(
MemoryPointer mPtr
) internal pure returns (int208 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int216 at `mPtr` in memory.
function readInt216(
MemoryPointer mPtr
) internal pure returns (int216 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int224 at `mPtr` in memory.
function readInt224(
MemoryPointer mPtr
) internal pure returns (int224 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int232 at `mPtr` in memory.
function readInt232(
MemoryPointer mPtr
) internal pure returns (int232 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int240 at `mPtr` in memory.
function readInt240(
MemoryPointer mPtr
) internal pure returns (int240 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int248 at `mPtr` in memory.
function readInt248(
MemoryPointer mPtr
) internal pure returns (int248 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int256 at `mPtr` in memory.
function readInt256(
MemoryPointer mPtr
) internal pure returns (int256 value) {
assembly {
value := mload(mPtr)
}
}
}
library MemoryWriters {
/// @dev Writes `valuePtr` to memory at `mPtr`.
function write(MemoryPointer mPtr, MemoryPointer valuePtr) internal pure {
assembly {
mstore(mPtr, valuePtr)
}
}
/// @dev Writes a boolean `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, bool value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an address `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, address value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a bytes32 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeBytes32(MemoryPointer mPtr, bytes32 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a uint256 `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, uint256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an int256 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeInt(MemoryPointer mPtr, int256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
/**
* @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();
}// 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.4
* @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.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 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;
/*
* -------------------------- 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 = 0x03312e34; // 1.4
uint256 constant information_length = 0xa0;
uint256 constant _NOT_ENTERED = 1;
uint256 constant _ENTERED = 2;
uint256 constant _ENTERED_AND_ACCEPTING_NATIVE_TOKENS = 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_length = 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_length = 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 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_endAmount_cdPtr = 0x104;
uint256 constant BasicOrder_common_params_size = 0xa0;
uint256 constant BasicOrder_considerationHashesArray_ptr = 0x160;
uint256 constant BasicOrder_receivedItemByteMap = (
0x0000010102030000000000000000000000000000000000000000000000000000
);
uint256 constant BasicOrder_offeredItemByteMap = (
0x0203020301010000000000000000000000000000000000000000000000000000
);
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;
// 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;
// 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_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_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_returndatasize = 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 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 = 0x64;
// 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;
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;
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_considerationIdx_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.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_considerationIdx_ptr,
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
* "MismatchedFulfillmentOfferAndConsiderationComponents" error message.
*
* @param fulfillmentIndex The index of the fulfillment that caused the
* error.
*/
function _revertMismatchedFulfillmentOfferAndConsiderationComponents(
uint256 fulfillmentIndex
) pure {
assembly {
// Store left-padded selector with push4 (reduces bytecode),
// mem[28:32] = selector
mstore(0, MismatchedOfferAndConsiderationComponents_error_selector)
// Store fulfillment index argument.
mstore(
MismatchedOfferAndConsiderationComponents_error_idx_ptr,
fulfillmentIndex
)
// revert(abi.encodeWithSignature(
// "MismatchedFulfillmentOfferAndConsiderationComponents(uint256)",
// fulfillmentIndex
// ))
revert(
Error_selector_offset,
MismatchedOfferAndConsiderationComponents_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 a "OfferAndConsiderationRequiredOnFulfillment"
* error message.
*/
function _revertOfferAndConsiderationRequiredOnFulfillment() pure {
assembly {
// Store left-padded selector with push4 (reduces bytecode),
// mem[28:32] = selector
mstore(0, OfferAndConsiderationRequiredOnFulfillment_error_selector)
// revert(abi.encodeWithSignature(
// "OfferAndConsiderationRequiredOnFulfillment()"
// ))
revert(
Error_selector_offset,
OfferAndConsiderationRequiredOnFulfillment_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 "UnresolvedConsiderationCriteria" error
* message.
*/
function _revertUnresolvedConsiderationCriteria(
uint256 orderIndex,
uint256 considerationIndex
) pure {
assembly {
// Store left-padded selector with push4 (reduces bytecode),
// mem[28:32] = selector
mstore(0, UnresolvedConsiderationCriteria_error_selector)
// Store orderIndex and considerationIndex arguments.
mstore(UnresolvedConsiderationCriteria_error_orderIndex_ptr, orderIndex)
mstore(
UnresolvedConsiderationCriteria_error_considerationIdx_ptr,
considerationIndex
)
// revert(abi.encodeWithSignature(
// "UnresolvedConsiderationCriteria(uint256, uint256)",
// orderIndex,
// considerationIndex
// ))
revert(
Error_selector_offset,
UnresolvedConsiderationCriteria_error_length
)
}
}
/**
* @dev Reverts execution with an "UnresolvedOfferCriteria" error message.
*/
function _revertUnresolvedOfferCriteria(
uint256 orderIndex,
uint256 offerIndex
) pure {
assembly {
// Store left-padded selector with push4 (reduces bytecode),
// mem[28:32] = selector
mstore(0, UnresolvedOfferCriteria_error_selector)
// Store arguments.
mstore(UnresolvedOfferCriteria_error_orderIndex_ptr, orderIndex)
mstore(UnresolvedOfferCriteria_error_offerIndex_ptr, offerIndex)
// revert(abi.encodeWithSignature(
// "UnresolvedOfferCriteria(uint256, uint256)",
// orderIndex,
// offerIndex
// ))
revert(Error_selector_offset, UnresolvedOfferCriteria_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;
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.17;
import {
CostPerWord,
ExtraGasBuffer,
FreeMemoryPointerSlot,
MemoryExpansionCoefficientShift,
OneWord,
OneWordShift,
ThirtyOneBytes
} from "./ConsiderationConstants.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
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import { ReentrancyErrors } from "../interfaces/ReentrancyErrors.sol";
import { LowLevelHelpers } from "./LowLevelHelpers.sol";
import {
_revertInvalidMsgValue,
_revertNoReentrantCalls
} from "./ConsiderationErrors.sol";
import {
_ENTERED_AND_ACCEPTING_NATIVE_TOKENS,
_ENTERED,
_NOT_ENTERED
} from "./ConsiderationConstants.sol";
/**
* @title ReentrancyGuard
* @author 0age
* @notice ReentrancyGuard contains a storage variable and related functionality
* for protecting against reentrancy.
*/
contract ReentrancyGuard is ReentrancyErrors, LowLevelHelpers {
// Prevent reentrant calls on protected functions.
uint256 private _reentrancyGuard;
/**
* @dev Initialize the reentrancy guard during deployment.
*/
constructor() {
// Initialize the reentrancy guard in a cleared state.
_reentrancyGuard = _NOT_ENTERED;
}
/**
* @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 {
// Ensure that the reentrancy guard is not already set.
_assertNonReentrant();
// 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).
unchecked {
_reentrancyGuard = _ENTERED + _cast(acceptNativeTokens);
}
}
/**
* @dev Internal function to unset the reentrancy guard sentinel value.
*/
function _clearReentrancyGuard() internal {
// Clear the reentrancy guard.
_reentrancyGuard = _NOT_ENTERED;
}
/**
* @dev Internal view function to ensure that a sentinel value for the
reentrancy guard is not currently set.
*/
function _assertNonReentrant() internal view {
// Ensure that the reentrancy guard is not currently set.
if (_reentrancyGuard != _NOT_ENTERED) {
_revertNoReentrantCalls();
}
}
/**
* @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 {
// Ensure that the reentrancy guard is not currently set.
if (_reentrancyGuard != _ENTERED_AND_ACCEPTING_NATIVE_TOKENS) {
_revertInvalidMsgValue(msg.value);
}
}
}{
"remappings": [
"@rari-capital/=node_modules/@rari-capital/",
"@rari-capital/solmate/=lib/solmate/",
"ERC721A/=lib/utility-contracts/lib/ERC721A/contracts/",
"ds-test/=lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"murky/=lib/murky/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"seaport-sol/=contracts/helpers/sol/",
"solmate/=lib/solmate/src/",
"utility-contracts/=lib/utility-contracts/src/"
],
"optimizer": {
"enabled": true,
"runs": 5000000
},
"metadata": {
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "london",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"seaportV1point1","type":"address"},{"internalType":"address","name":"seaportV1point4","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":[{"internalType":"address","name":"seaport","type":"address"}],"name":"SeaportNotAllowed","type":"error"},{"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
60c06040523480156200001157600080fd5b5060405162001a9438038062001a9483398101604081905262000034916200006e565b60016000556001600160a01b039182166080521660a052620000a6565b80516001600160a01b03811681146200006957600080fd5b919050565b600080604083850312156200008257600080fd5b6200008d8362000051565b91506200009d6020840162000051565b90509250929050565b60805160a0516119bc620000d8600039600081816093015261022201526000818160e801526101b401526119bc6000f3fe60806040526004361061002d5760003560e01c806330af8b5614610042578063fc2a350b1461006d57600080fd5b3661003d5761003b3361008e565b005b600080fd5b34801561004e57600080fd5b50610057610192565b604051610064919061074f565b60405180910390f35b61008061007b3660046107a9565b610291565b60405161006492919061090b565b6100e37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490565b6101387f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490565b1760000361018f576040517f98d2897d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b50565b60408051600280825260608083018452926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106101e6576101e66109f8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610254576102546109f8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b60608061029e600161068e565b60006102aa8480610a27565b905090508067ffffffffffffffff8111156102c7576102c76109c9565b6040519080825280602002602001820160405280156102fa57816020015b60608152602001906001900390816102e55790505b5092508067ffffffffffffffff811115610316576103166109c9565b60405190808252806020026020018201604052801561034957816020015b60608152602001906001900390816103345790505b509150600084608001359050606080606060006040518060e001604052808581526020018481526020018381526020018381526020018a6040013581526020018a606001602081019061039c9190610ac8565b73ffffffffffffffffffffffffffffffffffffffff9081168252602090910187905260a0820151919250166103d2573360a08201525b60005b6103df8a80610a27565b905081101561066a5761041f6103f58b80610a27565b83818110610405576104056109f8565b905060200201602081019061041a9190610ac8565b61008e565b3661042d60208c018c610a27565b8381811061043d5761043d6109f8565b905060200281019061044f9190610ae5565b905061045b8180610a27565b61046491610f79565b83526104736020820182610a27565b61047c9161108e565b602084015261048e6040820182610a27565b610497916111c3565b60408401526104a96060820182610a27565b6104b2916111c3565b60608401526104c18b80610a27565b838181106104d1576104d16109f8565b90506020020160208101906104e69190610ac8565b73ffffffffffffffffffffffffffffffffffffffff166387201b418260800135856000015186602001518760400151886060015189608001518a60a001518b60c001516040518963ffffffff1660e01b815260040161054b979695949392919061154e565b60006040518083038185885af1935050505080156105a957506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105a69190810190611886565b60015b1561065a57818c85815181106105c1576105c16109f8565b6020026020010181905250808b85815181106105df576105df6109f8565b6020908102919091010152815160005b8181101561064457838181518110610609576106096109f8565b60200260200101511561063f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909a01996001015b6105ef565b5089600003610656575050505061066a565b5050505b5060c082018690526001016103d5565b5047156106795761067961069e565b6106836001600055565b505050505050915091565b61069661072d565b600201600055565b6040516000908190339047908381818185875af1925050503d80600081146106e2576040519150601f19603f3d011682016040523d82523d6000602084013e6106e7565b606091505b509150915081610729573347826040517fb188829100000000000000000000000000000000000000000000000000000000815260040161018693929190611951565b5050565b60016000541461073f5761073f610741565b565b637fa8a9876000526004601cfd5b6020808252825182820181905260009190848201906040850190845b8181101561079d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161076b565b50909695505050505050565b6000602082840312156107bb57600080fd5b813567ffffffffffffffff8111156107d257600080fd5b820160a081850312156107e457600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061082a5761082a6107eb565b9052565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825180518087529087019087870190845b818110156108e8578351805161088285825161081a565b808c015173ffffffffffffffffffffffffffffffffffffffff908116868e01526040808301518188015260608084015190880152608092830151821692870192909252828d01511660a0860152015160c08401529289019260e09092019160010161086b565b50509a87019a9550509185019160010161084d565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b848110156109a9578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0018652825180518089529085019085890190845b81811015610993578351151583529287019291870191600101610975565b5090985050509483019491830191600101610935565b505050858403818701525050506109c0818561082e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610a5c57600080fd5b83018035915067ffffffffffffffff821115610a7757600080fd5b6020019150600581901b3603821315610a8f57600080fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461018f57600080fd5b8035610ac381610a96565b919050565b600060208284031215610ada57600080fd5b81356107e481610a96565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112610b1957600080fd5b9190910192915050565b60405160a0810167ffffffffffffffff81118282101715610b4657610b466109c9565b60405290565b60405160c0810167ffffffffffffffff81118282101715610b4657610b466109c9565b604051610160810167ffffffffffffffff81118282101715610b4657610b466109c9565b6040805190810167ffffffffffffffff81118282101715610b4657610b466109c9565b6040516060810167ffffffffffffffff81118282101715610b4657610b466109c9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610c2057610c206109c9565b604052919050565b600067ffffffffffffffff821115610c4257610c426109c9565b5060051b60200190565b6006811061018f57600080fd5b600082601f830112610c6a57600080fd5b81356020610c7f610c7a83610c28565b610bd9565b82815260a09283028501820192828201919087851115610c9e57600080fd5b8387015b85811015610d0b5781818a031215610cba5760008081fd5b610cc2610b23565b8135610ccd81610c4c565b815281860135610cdc81610a96565b818701526040828101359082015260608083013590820152608080830135908201528452928401928101610ca2565b5090979650505050505050565b600082601f830112610d2957600080fd5b81356020610d39610c7a83610c28565b82815260c09283028501820192828201919087851115610d5857600080fd5b8387015b85811015610d0b5781818a031215610d745760008081fd5b610d7c610b4c565b8135610d8781610c4c565b815281860135610d9681610a96565b8187015260408281013590820152606080830135908201526080808301359082015260a080830135610dc781610a96565b908201528452928401928101610d5c565b803560058110610ac357600080fd5b60006101608284031215610dfa57600080fd5b610e02610b6f565b9050610e0d82610ab8565b8152610e1b60208301610ab8565b6020820152604082013567ffffffffffffffff80821115610e3b57600080fd5b610e4785838601610c59565b60408401526060840135915080821115610e6057600080fd5b50610e6d84828501610d18565b606083015250610e7f60808301610dd8565b608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b80356effffffffffffffffffffffffffffff81168114610ac357600080fd5b600082601f830112610efc57600080fd5b813567ffffffffffffffff811115610f1657610f166109c9565b610f4760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610bd9565b818152846020838601011115610f5c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610f87610c7a84610c28565b80848252602080830192508560051b850136811115610fa557600080fd5b855b8181101561108257803567ffffffffffffffff80821115610fc85760008081fd5b818901915060a08236031215610fde5760008081fd5b610fe6610b23565b823582811115610ff65760008081fd5b61100236828601610de7565b825250611010868401610ecc565b868201526040611021818501610ecc565b90820152606083810135838111156110395760008081fd5b61104536828701610eeb565b8284015250506080808401358381111561105f5760008081fd5b61106b36828701610eeb565b918301919091525087525050938201938201610fa7565b50919695505050505050565b600061109c610c7a84610c28565b83815260208082019190600586811b8601368111156110ba57600080fd5b865b818110156111b657803567ffffffffffffffff808211156110dd5760008081fd5b818a01915060a082360312156110f35760008081fd5b6110fb610b23565b8235815286830135600281106111115760008081fd5b8188015260408381013590820152606080840135908201526080808401358381111561113d5760008081fd5b939093019236601f85011261115457600092508283fd5b83359250611164610c7a84610c28565b83815292871b840188019288810190368511156111815760008081fd5b948901945b8486101561119f57853582529489019490890190611186565b9183019190915250885250509483019483016110bc565b5092979650505050505050565b60006111d1610c7a84610c28565b80848252602080830192508560051b8501368111156111ef57600080fd5b855b8181101561108257803567ffffffffffffffff8111156112115760008081fd5b870136601f8201126112235760008081fd5b8035611231610c7a82610c28565b81815260069190911b820185019085810190368311156112515760008081fd5b928601925b82841015611294576040843603121561126f5760008081fd5b611277610b93565b843581528785013588820152825260409093019290860190611256565b88525050509382019382016111f1565b600081518084526020808501945080840160005b8381101561131b5781516112cd88825161081a565b8084015173ffffffffffffffffffffffffffffffffffffffff168885015260408082015190890152606080820151908901526080908101519088015260a090960195908201906001016112b8565b509495945050505050565b600081518084526020808501945080840160005b8381101561131b57815161134f88825161081a565b8084015173ffffffffffffffffffffffffffffffffffffffff90811689860152604080830151908a0152606080830151908a0152608080830151908a015260a091820151169088015260c0909601959082019060010161133a565b6005811061082a5761082a6107eb565b6000815180845260005b818110156113e0576020818501810151868301820152016113c4565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825160a0808701825188528883015160028110611469576114696107eb565b888a01526040838101519089015260608084015190890152608092830151928801919091528151908190529087019060c087019084905b808210156114c057835183529289019291890191600191909101906114a0565b50509a87019a9550509185019160010161143d565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825180518087529087019087870190845b81811015611539578351805184528a01518a84015292890192604090920191600101611512565b50509a87019a955050918501916001016114f4565b600060e0820160e08352808a5180835261010092508285019150828160051b8601016020808e0160005b84811015611712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008985030186528151805160a086526115d260a08701825173ffffffffffffffffffffffffffffffffffffffff169052565b8481015173ffffffffffffffffffffffffffffffffffffffff1660c0870152604081015161016060e0880181905261160e6102008901836112a4565b91506060808401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608a8503018d8b01526116498482611326565b935050608080850151610120611661818d01836113aa565b60a08701516101408d81019190915260c0880151868e015260e08801516101808e01528f8801516101a08e0152908701516101c08d0152909501516101e08b0152888601516effffffffffffffffffffffffffffff9081168a8c0152604080880151909116908b0152818601518a8503838c015294506116e184866113ba565b9450808601519550898503818b0152505050506116fe81836113ba565b978501979550505090820190600101611578565b505086820390870152611725818d61141e565b9350505050828103604084015261173c81896114d5565b9050828103606084015261175081886114d5565b91505084608083015261177b60a083018573ffffffffffffffffffffffffffffffffffffffff169052565b8260c083015298975050505050505050565b8051610ac381610a96565b600082601f8301126117a957600080fd5b815160206117b9610c7a83610c28565b82815260e092830285018201928282019190878511156117d857600080fd5b8387015b85811015610d0b57808903828112156117f55760008081fd5b6117fd610bb6565b60a08083121561180d5760008081fd5b611815610b23565b9250835161182281610c4c565b83528388015161183181610a96565b83890152604084810151818501526060808601519085015260808086015161185881610a96565b9085015283835261186a85830161178d565b838a015260c085015190830152508552509284019281016117dc565b6000806040838503121561189957600080fd5b825167ffffffffffffffff808211156118b157600080fd5b818501915085601f8301126118c557600080fd5b815160206118d5610c7a83610c28565b82815260059290921b840181019181810190898411156118f457600080fd5b948201945b8386101561192157855180151581146119125760008081fd5b825294820194908201906118f9565b9188015191965090935050508082111561193a57600080fd5b5061194785828601611798565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006109c060608301846113ba56fea264697066735822122043e7378e8b5e2d869b70a162db70b12ffb9f61e5f16c0563fa3dc4328eae63d864736f6c6343000811003300000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd6
Deployed Bytecode
0x60806040526004361061002d5760003560e01c806330af8b5614610042578063fc2a350b1461006d57600080fd5b3661003d5761003b3361008e565b005b600080fd5b34801561004e57600080fd5b50610057610192565b604051610064919061074f565b60405180910390f35b61008061007b3660046107a9565b610291565b60405161006492919061090b565b6100e37f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490565b6101387f00000000000000000000000000000000006c3852cbef3e08e8df289169ede58173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490565b1760000361018f576040517f98d2897d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b50565b60408051600280825260608083018452926020830190803683370190505090507f00000000000000000000000000000000006c3852cbef3e08e8df289169ede581816000815181106101e6576101e66109f8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd681600181518110610254576102546109f8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b60608061029e600161068e565b60006102aa8480610a27565b905090508067ffffffffffffffff8111156102c7576102c76109c9565b6040519080825280602002602001820160405280156102fa57816020015b60608152602001906001900390816102e55790505b5092508067ffffffffffffffff811115610316576103166109c9565b60405190808252806020026020018201604052801561034957816020015b60608152602001906001900390816103345790505b509150600084608001359050606080606060006040518060e001604052808581526020018481526020018381526020018381526020018a6040013581526020018a606001602081019061039c9190610ac8565b73ffffffffffffffffffffffffffffffffffffffff9081168252602090910187905260a0820151919250166103d2573360a08201525b60005b6103df8a80610a27565b905081101561066a5761041f6103f58b80610a27565b83818110610405576104056109f8565b905060200201602081019061041a9190610ac8565b61008e565b3661042d60208c018c610a27565b8381811061043d5761043d6109f8565b905060200281019061044f9190610ae5565b905061045b8180610a27565b61046491610f79565b83526104736020820182610a27565b61047c9161108e565b602084015261048e6040820182610a27565b610497916111c3565b60408401526104a96060820182610a27565b6104b2916111c3565b60608401526104c18b80610a27565b838181106104d1576104d16109f8565b90506020020160208101906104e69190610ac8565b73ffffffffffffffffffffffffffffffffffffffff166387201b418260800135856000015186602001518760400151886060015189608001518a60a001518b60c001516040518963ffffffff1660e01b815260040161054b979695949392919061154e565b60006040518083038185885af1935050505080156105a957506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105a69190810190611886565b60015b1561065a57818c85815181106105c1576105c16109f8565b6020026020010181905250808b85815181106105df576105df6109f8565b6020908102919091010152815160005b8181101561064457838181518110610609576106096109f8565b60200260200101511561063f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909a01996001015b6105ef565b5089600003610656575050505061066a565b5050505b5060c082018690526001016103d5565b5047156106795761067961069e565b6106836001600055565b505050505050915091565b61069661072d565b600201600055565b6040516000908190339047908381818185875af1925050503d80600081146106e2576040519150601f19603f3d011682016040523d82523d6000602084013e6106e7565b606091505b509150915081610729573347826040517fb188829100000000000000000000000000000000000000000000000000000000815260040161018693929190611951565b5050565b60016000541461073f5761073f610741565b565b637fa8a9876000526004601cfd5b6020808252825182820181905260009190848201906040850190845b8181101561079d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161076b565b50909695505050505050565b6000602082840312156107bb57600080fd5b813567ffffffffffffffff8111156107d257600080fd5b820160a081850312156107e457600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061082a5761082a6107eb565b9052565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825180518087529087019087870190845b818110156108e8578351805161088285825161081a565b808c015173ffffffffffffffffffffffffffffffffffffffff908116868e01526040808301518188015260608084015190880152608092830151821692870192909252828d01511660a0860152015160c08401529289019260e09092019160010161086b565b50509a87019a9550509185019160010161084d565b509298975050505050505050565b6000604082016040835280855180835260608501915060608160051b860101925060208088016000805b848110156109a9578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0018652825180518089529085019085890190845b81811015610993578351151583529287019291870191600101610975565b5090985050509483019491830191600101610935565b505050858403818701525050506109c0818561082e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610a5c57600080fd5b83018035915067ffffffffffffffff821115610a7757600080fd5b6020019150600581901b3603821315610a8f57600080fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461018f57600080fd5b8035610ac381610a96565b919050565b600060208284031215610ada57600080fd5b81356107e481610a96565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112610b1957600080fd5b9190910192915050565b60405160a0810167ffffffffffffffff81118282101715610b4657610b466109c9565b60405290565b60405160c0810167ffffffffffffffff81118282101715610b4657610b466109c9565b604051610160810167ffffffffffffffff81118282101715610b4657610b466109c9565b6040805190810167ffffffffffffffff81118282101715610b4657610b466109c9565b6040516060810167ffffffffffffffff81118282101715610b4657610b466109c9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610c2057610c206109c9565b604052919050565b600067ffffffffffffffff821115610c4257610c426109c9565b5060051b60200190565b6006811061018f57600080fd5b600082601f830112610c6a57600080fd5b81356020610c7f610c7a83610c28565b610bd9565b82815260a09283028501820192828201919087851115610c9e57600080fd5b8387015b85811015610d0b5781818a031215610cba5760008081fd5b610cc2610b23565b8135610ccd81610c4c565b815281860135610cdc81610a96565b818701526040828101359082015260608083013590820152608080830135908201528452928401928101610ca2565b5090979650505050505050565b600082601f830112610d2957600080fd5b81356020610d39610c7a83610c28565b82815260c09283028501820192828201919087851115610d5857600080fd5b8387015b85811015610d0b5781818a031215610d745760008081fd5b610d7c610b4c565b8135610d8781610c4c565b815281860135610d9681610a96565b8187015260408281013590820152606080830135908201526080808301359082015260a080830135610dc781610a96565b908201528452928401928101610d5c565b803560058110610ac357600080fd5b60006101608284031215610dfa57600080fd5b610e02610b6f565b9050610e0d82610ab8565b8152610e1b60208301610ab8565b6020820152604082013567ffffffffffffffff80821115610e3b57600080fd5b610e4785838601610c59565b60408401526060840135915080821115610e6057600080fd5b50610e6d84828501610d18565b606083015250610e7f60808301610dd8565b608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b80356effffffffffffffffffffffffffffff81168114610ac357600080fd5b600082601f830112610efc57600080fd5b813567ffffffffffffffff811115610f1657610f166109c9565b610f4760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610bd9565b818152846020838601011115610f5c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610f87610c7a84610c28565b80848252602080830192508560051b850136811115610fa557600080fd5b855b8181101561108257803567ffffffffffffffff80821115610fc85760008081fd5b818901915060a08236031215610fde5760008081fd5b610fe6610b23565b823582811115610ff65760008081fd5b61100236828601610de7565b825250611010868401610ecc565b868201526040611021818501610ecc565b90820152606083810135838111156110395760008081fd5b61104536828701610eeb565b8284015250506080808401358381111561105f5760008081fd5b61106b36828701610eeb565b918301919091525087525050938201938201610fa7565b50919695505050505050565b600061109c610c7a84610c28565b83815260208082019190600586811b8601368111156110ba57600080fd5b865b818110156111b657803567ffffffffffffffff808211156110dd5760008081fd5b818a01915060a082360312156110f35760008081fd5b6110fb610b23565b8235815286830135600281106111115760008081fd5b8188015260408381013590820152606080840135908201526080808401358381111561113d5760008081fd5b939093019236601f85011261115457600092508283fd5b83359250611164610c7a84610c28565b83815292871b840188019288810190368511156111815760008081fd5b948901945b8486101561119f57853582529489019490890190611186565b9183019190915250885250509483019483016110bc565b5092979650505050505050565b60006111d1610c7a84610c28565b80848252602080830192508560051b8501368111156111ef57600080fd5b855b8181101561108257803567ffffffffffffffff8111156112115760008081fd5b870136601f8201126112235760008081fd5b8035611231610c7a82610c28565b81815260069190911b820185019085810190368311156112515760008081fd5b928601925b82841015611294576040843603121561126f5760008081fd5b611277610b93565b843581528785013588820152825260409093019290860190611256565b88525050509382019382016111f1565b600081518084526020808501945080840160005b8381101561131b5781516112cd88825161081a565b8084015173ffffffffffffffffffffffffffffffffffffffff168885015260408082015190890152606080820151908901526080908101519088015260a090960195908201906001016112b8565b509495945050505050565b600081518084526020808501945080840160005b8381101561131b57815161134f88825161081a565b8084015173ffffffffffffffffffffffffffffffffffffffff90811689860152604080830151908a0152606080830151908a0152608080830151908a015260a091820151169088015260c0909601959082019060010161133a565b6005811061082a5761082a6107eb565b6000815180845260005b818110156113e0576020818501810151868301820152016113c4565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825160a0808701825188528883015160028110611469576114696107eb565b888a01526040838101519089015260608084015190890152608092830151928801919091528151908190529087019060c087019084905b808210156114c057835183529289019291890191600191909101906114a0565b50509a87019a9550509185019160010161143d565b600081518084526020808501808196508360051b810191508286016000805b868110156108fd578385038a52825180518087529087019087870190845b81811015611539578351805184528a01518a84015292890192604090920191600101611512565b50509a87019a955050918501916001016114f4565b600060e0820160e08352808a5180835261010092508285019150828160051b8601016020808e0160005b84811015611712577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008985030186528151805160a086526115d260a08701825173ffffffffffffffffffffffffffffffffffffffff169052565b8481015173ffffffffffffffffffffffffffffffffffffffff1660c0870152604081015161016060e0880181905261160e6102008901836112a4565b91506060808401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608a8503018d8b01526116498482611326565b935050608080850151610120611661818d01836113aa565b60a08701516101408d81019190915260c0880151868e015260e08801516101808e01528f8801516101a08e0152908701516101c08d0152909501516101e08b0152888601516effffffffffffffffffffffffffffff9081168a8c0152604080880151909116908b0152818601518a8503838c015294506116e184866113ba565b9450808601519550898503818b0152505050506116fe81836113ba565b978501979550505090820190600101611578565b505086820390870152611725818d61141e565b9350505050828103604084015261173c81896114d5565b9050828103606084015261175081886114d5565b91505084608083015261177b60a083018573ffffffffffffffffffffffffffffffffffffffff169052565b8260c083015298975050505050505050565b8051610ac381610a96565b600082601f8301126117a957600080fd5b815160206117b9610c7a83610c28565b82815260e092830285018201928282019190878511156117d857600080fd5b8387015b85811015610d0b57808903828112156117f55760008081fd5b6117fd610bb6565b60a08083121561180d5760008081fd5b611815610b23565b9250835161182281610c4c565b83528388015161183181610a96565b83890152604084810151818501526060808601519085015260808086015161185881610a96565b9085015283835261186a85830161178d565b838a015260c085015190830152508552509284019281016117dc565b6000806040838503121561189957600080fd5b825167ffffffffffffffff808211156118b157600080fd5b818501915085601f8301126118c557600080fd5b815160206118d5610c7a83610c28565b82815260059290921b840181019181810190898411156118f457600080fd5b948201945b8386101561192157855180151581146119125760008081fd5b825294820194908201906118f9565b9188015191965090935050508082111561193a57600080fd5b5061194785828601611798565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006109c060608301846113ba56fea264697066735822122043e7378e8b5e2d869b70a162db70b12ffb9f61e5f16c0563fa3dc4328eae63d864736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd6
-----Decoded View---------------
Arg [0] : seaportV1point1 (address): 0x00000000006c3852cbEf3e08E8dF289169EdE581
Arg [1] : seaportV1point4 (address): 0x00000000000001ad428e4906aE43D8F9852d0dD6
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000006c3852cbef3e08e8df289169ede581
Arg [1] : 00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd6
Deployed Bytecode Sourcemap
733:7417:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1693:33;1715:10;1693:21;:33::i;:::-;733:7417;;;;;6891:283;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2008:4761;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;7265:246::-;7388:31;7405:13;7394:24;;:7;:24;;;4028:1:10;3933:112;7388:31:1;7354;7371:13;7360:24;;:7;:24;;;4028:1:10;3933:112;7354:31:1;:65;7435:1;7354:82;7337:168;;7468:26;;;;;5212:42:12;5200:55;;7468:26:1;;;5182:74:12;5155:18;;7468:26:1;;;;;;;;7337:168;7265:246;:::o;6891:283::-;7061:16;;;7075:1;7061:16;;;6993:33;7061:16;;;;;6993:33;7061:16;;;;;;;;;;-1:-1:-1;7061:16:1;7042:35;;7109:13;7087:16;7104:1;7087:19;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;;7154:13;7132:16;7149:1;7132:19;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;;6891:283;:::o;2008:4761::-;2196:31;2241;2374:25;2394:4;2374:19;:25::i;:::-;2471:30;2504:23;:6;;:23;:::i;:::-;:30;;2471:63;;2656:22;2643:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2625:54;;2720:22;2702:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2689:54;;2810:24;2837:6;:23;;;2810:50;;2997:42;3049:48;3107:58;3175:36;3214:406;;;;;;;;3259:19;3214:406;;;;3311:22;3214:406;;;;3366:26;3214:406;;;;3433:26;3214:406;;;;3494:6;:26;;;3214:406;;;;3545:6;:16;;;;;;;;;;:::i;:::-;3214:406;;;;;;;;;;;;;3697:24;;;;3175:445;;-1:-1:-1;3697:38:1;3693:106;;3778:10;3751:24;;;:37;3693:106;3873:9;3868:2659;3892:23;:6;;:23;:::i;:::-;:30;;3888:1;:34;3868:2659;;;4004:49;4026:23;:6;;:23;:::i;:::-;4050:1;4026:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4004:21;:49::i;:::-;4118:40;4161:43;;;;:6;:43;:::i;:::-;4205:1;4161:46;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4118:89;-1:-1:-1;4314:26:1;4118:89;;4314:26;:::i;:::-;4282:58;;;:::i;:::-;;;4389:29;;;;:11;:29;:::i;:::-;4354:64;;;:::i;:::-;:32;;;:64;4467:29;;;;:11;:29;:::i;:::-;4432:64;;;:::i;:::-;:32;;;:64;4553:54;;;;:11;:54;:::i;:::-;4510:97;;;:::i;:::-;:40;;;:97;4934:23;:6;;:23;:::i;:::-;4958:1;4934:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4917:96;;;5042:11;:22;;;5104:14;:29;;;5155:14;:32;;;5209:14;:32;;;5263:14;:40;;;5325:14;:34;;;5381:14;:24;;;5427:14;:31;;;4917:559;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4897:1454;;;5651:18;5630:15;5646:1;5630:18;;;;;;;;:::i;:::-;;;;;;:39;;;;5703:13;5687:10;5698:1;5687:13;;;;;;;;:::i;:::-;;;;;;;;;;:29;5830:25;;5795:32;5873:285;5897:24;5893:1;:28;5873:285;;;5951:18;5970:1;5951:21;;;;;;;;:::i;:::-;;;;;;;5947:193;;;6040:18;;;;;;6088:3;5947:193;5873:285;;;;6259:16;6279:1;6259:21;6255:73;;6304:5;;;;;;6255:73;5612:730;5489:853;;4897:1454;-1:-1:-1;6406:31:1;;;:50;;;6499:3;;3868:2659;;;-1:-1:-1;6618:21:1;:25;6614:76;;6659:20;:18;:20::i;:::-;6739:23;2627:1:5;2139:16:11;:31;2048:129;6739:23:1;2287:4482;;;;;;2008:4761;;;:::o;1418:532:11:-;1555:21;:19;:21::i;:::-;2658:1:5;1897:36:11;1878:16;:55;1418:532::o;7680:468:1:-;7815:80;;7780:12;;;;7823:10;;7860:21;;7780:12;7815:80;7780:12;7815:80;7860:21;7823:10;7815:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7779:116;;;;7973:7;7968:174;;8046:10;8074:21;8113:4;8003:128;;;;;;;;;;;;;:::i;7968:174::-;7718:430;;7680:468::o;2325:215:11:-;2627:1:5;2450:16:11;;:32;2446:88;;2498:25;:23;:25::i;:::-;2325:215::o;15967:352:8:-;16144:31;16141:1;16134:42;16281:29;16258:21;16251:60;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:1779::-;1658:3;1696:5;1690:12;1723:6;1718:3;1711:19;1749:4;1790:2;1785:3;1781:12;1815:11;1842;1835:18;;1892:6;1889:1;1885:14;1878:5;1874:26;1862:38;;1934:2;1927:5;1923:14;1955:1;1976;1986:1353;2002:6;1997:3;1994:15;1986:1353;;;2067:16;;;2055:29;;2107:13;;2179:9;;2201:22;;;2287:11;;;;2245:13;;;;2322:1;2336:897;2352:8;2347:3;2344:17;2336:897;;;2431:8;2425:15;2473:2;2467:9;2493:42;2529:5;2524:2;2518:9;2493:42;:::i;:::-;2578:11;;;2572:18;2617:42;2699:21;;;2683:14;;;2676:45;2748:4;2798:11;;;2792:18;2776:14;;;2769:42;2838:4;2888:11;;;2882:18;2866:14;;;2859:42;2928:4;2982:11;;;2976:18;2972:27;;2956:14;;;2949:51;;;;3052:11;;;3046:18;3042:27;3035:4;3024:16;;3017:53;3118:11;3112:18;3105:4;3094:16;;3087:44;3202:17;;;;3168:4;3157:16;;;;2380:1;2371:11;2336:897;;;-1:-1:-1;;3317:12:12;;;;3254:5;-1:-1:-1;;3282:15:12;;;;2028:1;2019:11;1986:1353;;;-1:-1:-1;3355:4:12;;1586:1779;-1:-1:-1;;;;;;;;1586:1779:12:o;3370:1661::-;3738:4;3786:2;3775:9;3771:18;3816:2;3805:9;3798:21;3839:6;3874;3868:13;3905:6;3897;3890:22;3943:2;3932:9;3928:18;3921:25;;4005:2;3995:6;3992:1;3988:14;3977:9;3973:30;3969:39;3955:53;;4027:4;4066:2;4058:6;4054:15;4087:1;4108;4118:768;4134:6;4129:3;4126:15;4118:768;;;4203:22;;;4227:66;4199:95;4187:108;;4318:13;;4392:9;;4414:24;;;4504:11;;;;4460:15;;;;4539:1;4553:225;4569:8;4564:3;4561:17;4553:225;;;4660:15;;4653:23;4646:31;4632:46;;4747:17;;;;4704:14;;;;4597:1;4588:11;4553:225;;;-1:-1:-1;4801:5:12;;-1:-1:-1;;;4864:12:12;;;;4829:15;;;;4160:1;4151:11;4118:768;;;4122:3;;;4934:9;4926:6;4922:22;4917:2;4906:9;4902:18;4895:50;;;;4962:63;5018:6;5010;4962:63;:::i;:::-;4954:71;3370:1661;-1:-1:-1;;;;;3370:1661:12:o;5267:184::-;5319:77;5316:1;5309:88;5416:4;5413:1;5406:15;5440:4;5437:1;5430:15;5456:184;5508:77;5505:1;5498:88;5605:4;5602:1;5595:15;5629:4;5626:1;5619:15;5645:604;5738:4;5744:6;5804:11;5791:25;5894:66;5883:8;5867:14;5863:29;5859:102;5839:18;5835:127;5825:155;;5976:1;5973;5966:12;5825:155;6003:33;;6055:20;;;-1:-1:-1;6098:18:12;6087:30;;6084:50;;;6130:1;6127;6120:12;6084:50;6163:4;6151:17;;-1:-1:-1;6214:1:12;6210:14;;;6194;6190:35;6180:46;;6177:66;;;6239:1;6236;6229:12;6177:66;5645:604;;;;;:::o;6254:154::-;6340:42;6333:5;6329:54;6322:5;6319:65;6309:93;;6398:1;6395;6388:12;6413:134;6481:20;;6510:31;6481:20;6510:31;:::i;:::-;6413:134;;;:::o;6552:247::-;6611:6;6664:2;6652:9;6643:7;6639:23;6635:32;6632:52;;;6680:1;6677;6670:12;6632:52;6719:9;6706:23;6738:31;6763:5;6738:31;:::i;7452:395::-;7557:4;7615:11;7602:25;7705:66;7694:8;7678:14;7674:29;7670:102;7650:18;7646:127;7636:155;;7787:1;7784;7777:12;7636:155;7808:33;;;;;7452:395;-1:-1:-1;;7452:395:12:o;8494:253::-;8566:2;8560:9;8608:4;8596:17;;8643:18;8628:34;;8664:22;;;8625:62;8622:88;;;8690:18;;:::i;:::-;8726:2;8719:22;8494:253;:::o;8752:::-;8824:2;8818:9;8866:4;8854:17;;8901:18;8886:34;;8922:22;;;8883:62;8880:88;;;8948:18;;:::i;9010:255::-;9082:2;9076:9;9124:6;9112:19;;9161:18;9146:34;;9182:22;;;9143:62;9140:88;;;9208:18;;:::i;9270:257::-;9342:4;9336:11;;;9374:17;;9421:18;9406:34;;9442:22;;;9403:62;9400:88;;;9468:18;;:::i;9532:253::-;9604:2;9598:9;9646:4;9634:17;;9681:18;9666:34;;9702:22;;;9663:62;9660:88;;;9728:18;;:::i;9790:334::-;9861:2;9855:9;9917:2;9907:13;;9922:66;9903:86;9891:99;;10020:18;10005:34;;10041:22;;;10002:62;9999:88;;;10067:18;;:::i;:::-;10103:2;10096:22;9790:334;;-1:-1:-1;9790:334:12:o;10129:196::-;10202:4;10235:18;10227:6;10224:30;10221:56;;;10257:18;;:::i;:::-;-1:-1:-1;10302:1:12;10298:14;10314:4;10294:25;;10129:196::o;10330:107::-;10411:1;10404:5;10401:12;10391:40;;10427:1;10424;10417:12;10442:1410;10505:5;10558:3;10551:4;10543:6;10539:17;10535:27;10525:55;;10576:1;10573;10566:12;10525:55;10612:6;10599:20;10638:4;10662:73;10678:56;10731:2;10678:56;:::i;:::-;10662:73;:::i;:::-;10769:15;;;10831:4;10874:11;;;10862:24;;10858:33;;;10800:12;;;;10757:3;10903:15;;;10900:35;;;10931:1;10928;10921:12;10900:35;10967:2;10959:6;10955:15;10979:844;10995:6;10990:3;10987:15;10979:844;;;11071:2;11065:3;11060;11056:13;11052:22;11049:112;;;11115:1;11144:2;11140;11133:14;11049:112;11187:22;;:::i;:::-;11250:3;11237:17;11267:39;11298:7;11267:39;:::i;:::-;11319:22;;11382:12;;;11369:26;11408:33;11369:26;11408:33;:::i;:::-;11461:14;;;11454:31;11508:2;11559:12;;;11546:26;11530:14;;;11523:50;11596:2;11647:12;;;11634:26;11618:14;;;11611:50;11684:3;11736:12;;;11723:26;11707:14;;;11700:50;11763:18;;11801:12;;;;11012;;10979:844;;;-1:-1:-1;11841:5:12;;10442:1410;-1:-1:-1;;;;;;;10442:1410:12:o;11857:1588::-;11928:5;11981:3;11974:4;11966:6;11962:17;11958:27;11948:55;;11999:1;11996;11989:12;11948:55;12035:6;12022:20;12061:4;12085:73;12101:56;12154:2;12101:56;:::i;12085:73::-;12192:15;;;12254:4;12297:11;;;12285:24;;12281:33;;;12223:12;;;;12180:3;12326:15;;;12323:35;;;12354:1;12351;12344:12;12323:35;12390:2;12382:6;12378:15;12402:1014;12418:6;12413:3;12410:15;12402:1014;;;12494:2;12488:3;12483;12479:13;12475:22;12472:112;;;12538:1;12567:2;12563;12556:14;12472:112;12610:22;;:::i;:::-;12673:3;12660:17;12690:39;12721:7;12690:39;:::i;:::-;12742:22;;12805:12;;;12792:26;12831:33;12792:26;12831:33;:::i;:::-;12884:14;;;12877:31;12931:2;12982:12;;;12969:26;12953:14;;;12946:50;13019:2;13070:12;;;13057:26;13041:14;;;13034:50;13107:3;13159:12;;;13146:26;13130:14;;;13123:50;13196:3;13240:12;;;13227:26;13266:33;13227:26;13266:33;:::i;:::-;13319:14;;;13312:31;13356:18;;13394:12;;;;12435;;12402:1014;;13450:150;13525:20;;13574:1;13564:12;;13554:40;;13590:1;13587;13580:12;13605:1291;13667:5;13715:6;13703:9;13698:3;13694:19;13690:32;13687:52;;;13735:1;13732;13725:12;13687:52;13757:22;;:::i;:::-;13748:31;;13802:29;13821:9;13802:29;:::i;:::-;13795:5;13788:44;13864:38;13898:2;13887:9;13883:18;13864:38;:::i;:::-;13859:2;13852:5;13848:14;13841:62;13954:2;13943:9;13939:18;13926:32;13977:18;14018:2;14010:6;14007:14;14004:34;;;14034:1;14031;14024:12;14004:34;14070:66;14132:3;14123:6;14112:9;14108:22;14070:66;:::i;:::-;14065:2;14058:5;14054:14;14047:90;14190:2;14179:9;14175:18;14162:32;14146:48;;14219:2;14209:8;14206:16;14203:36;;;14235:1;14232;14225:12;14203:36;;14271:76;14343:3;14332:8;14321:9;14317:24;14271:76;:::i;:::-;14266:2;14259:5;14255:14;14248:100;;14381:46;14422:3;14411:9;14407:19;14381:46;:::i;:::-;14375:3;14368:5;14364:15;14357:71;14489:3;14478:9;14474:19;14461:33;14455:3;14448:5;14444:15;14437:58;14556:3;14545:9;14541:19;14528:33;14522:3;14515:5;14511:15;14504:58;14623:3;14612:9;14608:19;14595:33;14589:3;14582:5;14578:15;14571:58;14648:3;14711:2;14700:9;14696:18;14683:32;14678:2;14671:5;14667:14;14660:56;;14735:3;14798:2;14787:9;14783:18;14770:32;14765:2;14758:5;14754:14;14747:56;;14822:3;14885:2;14874:9;14870:18;14857:32;14852:2;14845:5;14841:14;14834:56;;13605:1291;;;;:::o;14901:186::-;14969:20;;15029:32;15018:44;;15008:55;;14998:83;;15077:1;15074;15067:12;15092:589;15134:5;15187:3;15180:4;15172:6;15168:17;15164:27;15154:55;;15205:1;15202;15195:12;15154:55;15241:6;15228:20;15267:18;15263:2;15260:26;15257:52;;;15289:18;;:::i;:::-;15333:114;15441:4;15372:66;15365:4;15361:2;15357:13;15353:86;15349:97;15333:114;:::i;:::-;15472:2;15463:7;15456:19;15518:3;15511:4;15506:2;15498:6;15494:15;15490:26;15487:35;15484:55;;;15535:1;15532;15525:12;15484:55;15600:2;15593:4;15585:6;15581:17;15574:4;15565:7;15561:18;15548:55;15648:1;15623:16;;;15641:4;15619:27;15612:38;;;;15627:7;15092:589;-1:-1:-1;;;15092:589:12:o;15686:2148::-;15866:9;15901:77;15917:60;15970:6;15917:60;:::i;15901:77::-;16000:3;16024:6;16019:3;16012:19;16050:4;16079:2;16074:3;16070:12;16063:19;;16123:6;16120:1;16116:14;16109:5;16105:26;16154:14;16146:6;16143:26;16140:46;;;16182:1;16179;16172:12;16140:46;16206:5;16220:1581;16236:6;16231:3;16228:15;16220:1581;;;16322:3;16309:17;16349:18;16399:2;16386:11;16383:19;16380:109;;;16443:1;16472:2;16468;16461:14;16380:109;16523:11;16516:5;16512:23;16502:33;;16580:4;16575:2;16559:14;16555:23;16551:34;16548:124;;;16626:1;16655:2;16651;16644:14;16548:124;16700:22;;:::i;:::-;16762:2;16749:16;16792:2;16784:6;16781:14;16778:104;;;16836:1;16865:2;16861;16854:14;16778:104;16911:66;16962:14;16953:6;16949:2;16945:15;16911:66;:::i;:::-;16902:7;16895:83;;17016:31;17043:2;17039;17035:11;17016:31;:::i;:::-;17011:2;17002:7;16998:16;16991:57;17071:2;17111:31;17138:2;17134;17130:11;17111:31;:::i;:::-;17093:16;;;17086:57;17166:2;17210:11;;;17197:25;17238:16;;;17235:106;;;17295:1;17324:2;17320;17313:14;17235:106;17379:51;17415:14;17404:8;17400:2;17396:17;17379:51;:::i;:::-;17374:2;17365:7;17361:16;17354:77;;;17455:3;17508;17504:2;17500:12;17487:26;17542:2;17532:8;17529:16;17526:109;;;17587:1;17617:3;17612;17605:16;17526:109;17674:51;17710:14;17699:8;17695:2;17691:17;17674:51;:::i;:::-;17655:17;;;17648:78;;;;-1:-1:-1;17739:20:12;;-1:-1:-1;;17779:12:12;;;;16253;;16220:1581;;;-1:-1:-1;17823:5:12;;15686:2148;-1:-1:-1;;;;;;15686:2148:12:o;18484:2710::-;18670:9;18705:77;18721:60;18774:6;18721:60;:::i;18705:77::-;18816:19;;;18854:4;18874:12;;;;18804:3;18905:1;18940:15;;;18929:27;;18979:14;18968:26;;18965:46;;;19007:1;19004;18997:12;18965:46;19031:5;19045:2116;19061:6;19056:3;19053:15;19045:2116;;;19147:3;19134:17;19174:18;19224:2;19211:11;19208:19;19205:109;;;19268:1;19297:2;19293;19286:14;19205:109;19348:11;19341:5;19337:23;19327:33;;19405:4;19400:2;19384:14;19380:23;19376:34;19373:124;;;19451:1;19480:2;19476;19469:14;19373:124;19525:22;;:::i;:::-;19589:2;19576:16;19567:7;19560:33;19642:2;19638;19634:11;19621:25;19681:1;19672:7;19669:14;19659:112;;19725:1;19754:2;19750;19743:14;19659:112;19791:16;;;19784:33;19840:2;19893:11;;;19880:25;19862:16;;;19855:51;19929:2;19982:11;;;19969:25;19951:16;;;19944:51;20019:3;20062:12;;;20049:26;20091:14;;;20088:107;;;20147:1;20177:3;20172;20165:16;20088:107;20219:15;;;;;20277:14;20270:4;20261:14;;20257:35;20247:136;;20335:1;20324:12;;20365:3;20360;20353:16;20247:136;20420:3;20407:17;20396:28;;20450:74;20466:57;20519:3;20466:57;:::i;20450:74::-;20568:18;;;20664:12;;;20655:22;;20651:31;;;20608:14;;;;20711;20698:28;;20695:121;;;20768:1;20798:3;20793;20786:16;20695:121;20842:12;;;;20867:174;20885:8;20878:5;20875:19;20867:174;;;20967:19;;20953:34;;20906:14;;;;21013;;;;20867:174;;;21061:17;;;21054:32;;;;-1:-1:-1;21099:20:12;;-1:-1:-1;;21139:12:12;;;;19078;;19045:2116;;;-1:-1:-1;21183:5:12;;18484:2710;-1:-1:-1;;;;;;;18484:2710:12:o;21875:2116::-;22121:9;22156:77;22172:60;22225:6;22172:60;:::i;22156:77::-;22255:3;22279:6;22274:3;22267:19;22305:4;22334:2;22329:3;22325:12;22318:19;;22378:6;22375:1;22371:14;22364:5;22360:26;22409:14;22401:6;22398:26;22395:46;;;22437:1;22434;22427:12;22395:46;22461:5;22475:1483;22491:6;22486:3;22483:15;22475:1483;;;22577:3;22564:17;22613:18;22600:11;22597:35;22594:125;;;22673:1;22702:2;22698;22691:14;22594:125;22742:23;;22807:14;22800:4;22792:13;;22788:34;22778:132;;22864:1;22893:2;22889;22882:14;22778:132;22946:2;22933:16;22975:73;22991:56;23044:2;22991:56;:::i;22975:73::-;23092:17;;;23190:1;23186:10;;;;23178:19;;23174:28;;;23131:14;;;;23231;23218:28;;23215:118;;;23287:1;23316:2;23312;23305:14;23215:118;23359:11;;;;23383:502;23401:8;23394:5;23391:19;23383:502;;;23506:4;23498:5;23482:14;23478:26;23474:37;23471:143;;;23560:1;23593:2;23589;23582:14;23471:143;23646:22;;:::i;:::-;23701:19;;23685:36;;23776:14;;;23763:28;23745:16;;;23738:54;23809:22;;23433:4;23422:16;;;;23857:14;;;;23383:502;;;23898:18;;-1:-1:-1;;;23936:12:12;;;;22508;;22475:1483;;23996:838;24058:3;24096:5;24090:12;24123:6;24118:3;24111:19;24149:4;24178:2;24173:3;24169:12;24162:19;;24215:2;24208:5;24204:14;24236:1;24246:563;24260:6;24257:1;24254:13;24246:563;;;24325:6;24319:13;24345:40;24381:3;24376:2;24370:9;24345:40;:::i;:::-;24429:11;;;24423:18;24443:42;24419:67;24405:12;;;24398:89;24510:4;24554:11;;;24548:18;24534:12;;;24527:40;24590:4;24634:11;;;24628:18;24614:12;;;24607:40;24670:4;24714:11;;;24708:18;24694:12;;;24687:40;24756:4;24747:14;;;;24784:15;;;;24282:1;24275:9;24246:563;;;-1:-1:-1;24825:3:12;;23996:838;-1:-1:-1;;;;;23996:838:12:o;24839:1005::-;24909:3;24947:5;24941:12;24974:6;24969:3;24962:19;25000:4;25029:2;25024:3;25020:12;25013:19;;25066:2;25059:5;25055:14;25087:1;25097:722;25111:6;25108:1;25105:13;25097:722;;;25176:6;25170:13;25196:40;25232:3;25227:2;25221:9;25196:40;:::i;:::-;25275:11;;;25269:18;25310:42;25386:21;;;25372:12;;;25365:43;25431:4;25475:11;;;25469:18;25455:12;;;25448:40;25511:4;25555:11;;;25549:18;25535:12;;;25528:40;25591:4;25635:11;;;25629:18;25615:12;;;25608:40;25671:4;25719:11;;;25713:18;25709:27;25695:12;;;25688:49;25766:4;25757:14;;;;25794:15;;;;25133:1;25126:9;25097:722;;25849:140;25930:1;25923:5;25920:12;25910:46;;25936:18;;:::i;26116:481::-;26157:3;26195:5;26189:12;26222:6;26217:3;26210:19;26247:1;26257:162;26271:6;26268:1;26265:13;26257:162;;;26333:4;26389:13;;;26385:22;;26379:29;26361:11;;;26357:20;;26350:59;26286:12;26257:162;;;26261:3;26464:1;26457:4;26448:6;26443:3;26439:16;26435:27;26428:38;26586:4;26516:66;26511:2;26503:6;26499:15;26495:88;26490:3;26486:98;26482:109;26475:116;;;26116:481;;;;:::o;26602:1665::-;26671:3;26709:5;26703:12;26736:6;26731:3;26724:19;26762:4;26803:2;26798:3;26794:12;26828:11;26855;26848:18;;26905:6;26902:1;26898:14;26891:5;26887:26;26875:38;;26947:2;26940:5;26936:14;26968:1;26989;26999:1242;27015:6;27010:3;27007:15;26999:1242;;;27090:5;27084:4;27080:16;27075:3;27068:29;27126:6;27120:13;27156:4;27197:2;27191:4;27187:13;27232:2;27226:9;27220:4;27213:23;27283:2;27279;27275:11;27269:18;27327:1;27313:12;27310:19;27300:53;;27333:18;;:::i;:::-;27373:13;;;27366:35;27424:4;27469:11;;;27463:18;27448:13;;;27441:41;27505:4;27550:11;;;27544:18;27529:13;;;27522:41;27586:4;27631:11;;;27625:18;27663:13;;;27656:25;;;;27742:21;;27776:24;;;;27865:23;;;;27832:3;27822:14;;;27912:1;;27926:209;27942:8;27937:3;27934:17;27926:209;;;28019:15;;28005:30;;28104:17;;;;28061:14;;;;27970:1;27961:11;;;;;27926:209;;;-1:-1:-1;;28219:12:12;;;;28156:5;-1:-1:-1;;28184:15:12;;;;27041:1;27032:11;26999:1242;;28272:1199;28355:3;28393:5;28387:12;28420:6;28415:3;28408:19;28446:4;28487:2;28482:3;28478:12;28512:11;28539;28532:18;;28589:6;28586:1;28582:14;28575:5;28571:26;28559:38;;28631:2;28624:5;28620:14;28652:1;28673;28683:762;28699:6;28694:3;28691:15;28683:762;;;28764:16;;;28752:29;;28804:13;;28876:9;;28898:22;;;28984:11;;;;28942:13;;;;29019:1;29033:306;29049:8;29044:3;29041:17;29033:306;;;29122:15;;29168:9;;29154:24;;29224:11;;29218:18;29202:14;;;29195:42;29308:17;;;;29274:4;29263:16;;;;29077:1;29068:11;29033:306;;;-1:-1:-1;;29423:12:12;;;;29360:5;-1:-1:-1;;29388:15:12;;;;28725:1;28716:11;28683:762;;29476:4169;30318:4;30366:3;30355:9;30351:19;30397:3;30386:9;30379:22;30421:6;30456;30450:13;30487:6;30479;30472:22;30513:3;30503:13;;30547:2;30536:9;30532:18;30525:25;;30609:2;30599:6;30596:1;30592:14;30581:9;30577:30;30573:39;30631:4;30670:2;30662:6;30658:15;30691:1;30701:2340;30715:6;30712:1;30709:13;30701:2340;;;30804:66;30792:9;30784:6;30780:22;30776:95;30771:3;30764:108;30901:6;30895:13;30947:2;30941:9;30978:4;30970:6;30963:20;30996:58;31048:4;31040:6;31036:17;31021:12;31015:19;91:42;80:54;68:67;;14:127;30996:58;31095:21;;;31089:28;91:42;80:54;31177:3;31165:16;;68:67;31241:4;31223:23;;31217:30;31270:6;31308:3;31296:16;;31289:28;;;31344:71;31410:3;31398:16;;31217:30;31344:71;:::i;:::-;31330:85;;31438:4;31501:2;31487:12;31483:21;31477:28;31567:66;31558:6;31550;31546:19;31542:92;31537:2;31529:6;31525:15;31518:117;31662:69;31724:6;31708:14;31662:69;:::i;:::-;31648:83;;;31754:4;31817:2;31803:12;31799:21;31793:28;31844:3;31860:58;31914:2;31906:6;31902:15;31886:14;31860:58;:::i;:::-;31965:4;31947:23;;31941:30;31994:3;32017:15;;;32010:27;;;;32098:3;32080:22;;32074:29;32057:15;;;32050:54;32166:3;32148:22;;32142:29;32136:3;32124:16;;32117:55;32216:21;;;32210:28;32204:3;32192:16;;32185:54;32283:21;;;32277:28;32271:3;32259:16;;32252:54;32350:21;;;32344:28;32338:3;32326:16;;32319:54;32414:11;;;32408:18;26071:32;26060:44;;;32474:15;;;26048:57;32539:4;32531:13;;;32525:20;26060:44;;;32593:17;;;26048:57;32652:11;;;32646:18;32701:19;;;32684:15;;;32677:44;32646:18;-1:-1:-1;32748:40:12;32705:6;32646:18;32748:40;:::i;:::-;32734:54;;32837:2;32833;32829:11;32823:18;32801:40;;32890:6;32882;32878:19;32873:2;32865:6;32861:15;32854:44;;;;;32921:40;32954:6;32938:14;32921:40;:::i;:::-;33019:12;;;;32911:50;-1:-1:-1;;;32984:15:12;;;;30737:1;30730:9;30701:2340;;;-1:-1:-1;;33077:22:12;;;33057:18;;;33050:50;33123:60;33081:6;33168;33123:60;:::i;:::-;33109:74;;;;;33233:9;33225:6;33221:22;33214:4;33203:9;33199:20;33192:52;33267:74;33334:6;33326;33267:74;:::i;:::-;33253:88;;33391:9;33383:6;33379:22;33372:4;33361:9;33357:20;33350:52;33419:74;33486:6;33478;33419:74;:::i;:::-;33411:82;;;33531:6;33524:4;33513:9;33509:20;33502:36;33547:48;33589:4;33578:9;33574:20;33566:6;91:42;80:54;68:67;;14:127;33547:48;33632:6;33626:3;33615:9;33611:19;33604:35;29476:4169;;;;;;;;;;:::o;33650:138::-;33729:13;;33751:31;33729:13;33751:31;:::i;33793:1863::-;33867:5;33920:3;33913:4;33905:6;33901:17;33897:27;33887:55;;33938:1;33935;33928:12;33887:55;33967:6;33961:13;33993:4;34017:73;34033:56;34086:2;34033:56;:::i;34017:73::-;34124:15;;;34186:4;34229:11;;;34217:24;;34213:33;;;34155:12;;;;34112:3;34258:15;;;34255:35;;;34286:1;34283;34276:12;34255:35;34322:2;34314:6;34310:15;34334:1293;34350:6;34345:3;34342:15;34334:1293;;;34423:3;34418;34414:13;34451:2;34447;34443:11;34440:101;;;34495:1;34524:2;34520;34513:14;34440:101;34567:22;;:::i;:::-;34612:4;34640:2;34636;34632:11;34629:101;;;34684:1;34713:2;34709;34702:14;34629:101;34758:22;;:::i;:::-;34743:37;;34814:3;34808:10;34831:39;34862:7;34831:39;:::i;:::-;34883:24;;34941:12;;;34935:19;34967:33;34935:19;34967:33;:::i;:::-;35020:16;;;35013:33;35069:2;35115:12;;;35109:19;35091:16;;;35084:45;35152:4;35200:12;;;35194:19;35176:16;;;35169:45;35238:3;35275:13;;;35269:20;35302:33;35269:20;35302:33;:::i;:::-;35355:17;;;35348:34;35395:22;;;35453:43;35483:12;;;35453:43;:::i;:::-;35437:14;;;35430:67;35548:3;35539:13;;35533:20;35517:14;;;35510:44;-1:-1:-1;35567:18:12;;-1:-1:-1;35605:12:12;;;;34367;;34334:1293;;35661:1354;35814:6;35822;35875:2;35863:9;35854:7;35850:23;35846:32;35843:52;;;35891:1;35888;35881:12;35843:52;35924:9;35918:16;35953:18;35994:2;35986:6;35983:14;35980:34;;;36010:1;36007;36000:12;35980:34;36048:6;36037:9;36033:22;36023:32;;36093:7;36086:4;36082:2;36078:13;36074:27;36064:55;;36115:1;36112;36105:12;36064:55;36144:2;36138:9;36166:4;36190:73;36206:56;36259:2;36206:56;:::i;36190:73::-;36297:15;;;36379:1;36375:10;;;;36367:19;;36363:28;;;36328:12;;;;36403:19;;;36400:39;;;36435:1;36432;36425:12;36400:39;36459:11;;;;36479:309;36495:6;36490:3;36487:15;36479:309;;;36568:3;36562:10;36619:5;36612:13;36605:21;36598:5;36595:32;36585:130;;36669:1;36698:2;36694;36687:14;36585:130;36728:18;;36512:12;;;;36766;;;;36479:309;;;36843:18;;;36837:25;36807:5;;-1:-1:-1;36837:25:12;;-1:-1:-1;;;36874:16:12;;;36871:36;;;36903:1;36900;36893:12;36871:36;;36926:83;37001:7;36990:8;36979:9;36975:24;36926:83;:::i;:::-;36916:93;;;35661:1354;;;;;:::o;37230:408::-;37445:42;37437:6;37433:55;37422:9;37415:74;37525:6;37520:2;37509:9;37505:18;37498:34;37568:2;37563;37552:9;37548:18;37541:30;37396:4;37588:44;37628:2;37617:9;37613:18;37605:6;37588:44;:::i
Swarm Source
ipfs://43e7378e8b5e2d869b70a162db70b12ffb9f61e5f16c0563fa3dc4328eae63d8
Net Worth in USD
Net Worth in ETH
Token Allocations
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| CELO | 100.00% | $0.105067 | 0.00057 | $0.00006 |
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.