¡El código fuente de este contrato está verificado!
Metadatos del Contrato
Compilador
0.8.20+commit.a1b79de6
Idioma
Solidity
Código Fuente del Contrato
Archivo 1 de 45: Arrays.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Arrays.sol)pragmasolidity ^0.8.20;import {StorageSlot} from"./StorageSlot.sol";
import {Math} from"./math/Math.sol";
/**
* @dev Collection of functions related to array types.
*/libraryArrays{
usingStorageSlotforbytes32;
/**
* @dev Searches a sorted `array` and returns the first index that contains
* a value greater or equal to `element`. If no such index exists (i.e. all
* values in the array are strictly less than `element`), the array length is
* returned. Time complexity O(log n).
*
* `array` is expected to be sorted in ascending order, and to contain no
* repeated elements.
*/functionfindUpperBound(uint256[] storage array, uint256 element) internalviewreturns (uint256) {
uint256 low =0;
uint256 high = array.length;
if (high ==0) {
return0;
}
while (low < high) {
uint256 mid = Math.average(low, high);
// Note that mid will always be strictly less than high (i.e. it will be a valid array index)// because Math.average rounds towards zero (it does integer division with truncation).if (unsafeAccess(array, mid).value> element) {
high = mid;
} else {
low = mid +1;
}
}
// At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.if (low >0&& unsafeAccess(array, low -1).value== element) {
return low -1;
} else {
return low;
}
}
/**
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
*
* WARNING: Only use if you are certain `pos` is lower than the array length.
*/functionunsafeAccess(address[] storage arr, uint256 pos) internalpurereturns (StorageSlot.AddressSlot storage) {
bytes32 slot;
// We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`// following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays./// @solidity memory-safe-assemblyassembly {
mstore(0, arr.slot)
slot :=add(keccak256(0, 0x20), pos)
}
return slot.getAddressSlot();
}
/**
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
*
* WARNING: Only use if you are certain `pos` is lower than the array length.
*/functionunsafeAccess(bytes32[] storage arr, uint256 pos) internalpurereturns (StorageSlot.Bytes32Slot storage) {
bytes32 slot;
// We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`// following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays./// @solidity memory-safe-assemblyassembly {
mstore(0, arr.slot)
slot :=add(keccak256(0, 0x20), pos)
}
return slot.getBytes32Slot();
}
/**
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
*
* WARNING: Only use if you are certain `pos` is lower than the array length.
*/functionunsafeAccess(uint256[] storage arr, uint256 pos) internalpurereturns (StorageSlot.Uint256Slot storage) {
bytes32 slot;
// We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`// following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays./// @solidity memory-safe-assemblyassembly {
mstore(0, arr.slot)
slot :=add(keccak256(0, 0x20), pos)
}
return slot.getUint256Slot();
}
/**
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
*
* WARNING: Only use if you are certain `pos` is lower than the array length.
*/functionunsafeMemoryAccess(uint256[] memory arr, uint256 pos) internalpurereturns (uint256 res) {
assembly {
res :=mload(add(add(arr, 0x20), mul(pos, 0x20)))
}
}
/**
* @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
*
* WARNING: Only use if you are certain `pos` is lower than the array length.
*/functionunsafeMemoryAccess(address[] memory arr, uint256 pos) internalpurereturns (address res) {
assembly {
res :=mload(add(add(arr, 0x20), mul(pos, 0x20)))
}
}
}
Código Fuente del Contrato
Archivo 2 de 45: BurnieTheFlame.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;import {ERC721ShipyardRedeemableMintable} from"./ERC721ShipyardRedeemableMintable.sol";
contractBurnieTheFlameisERC721ShipyardRedeemableMintable{
/// @dev Store the token URI number for each token id.mapping(uint256=>uint256) internal tokenURINumbers;
constructor() ERC721ShipyardRedeemableMintable("Burnie The Flame: OpenSea Redeemable Example", "BRNIE") {}
/**
* @notice Hook to set tokenURINumber on mint.
*/function_beforeTokenTransfer(addressfrom, address, /* to */uint256 id) internalvirtualoverride{
// Set tokenURINumbers on mint.if (from==address(0)) {
// 60% chance of tokenURI 1// 30% chance of tokenURI 2// 10% chance of tokenURI 3uint256 randomness = (uint256(keccak256(abi.encode(block.prevrandao))) %100) +1;
uint256 tokenURINumber =1;
if (randomness >=60&& randomness <90) {
tokenURINumber =2;
} elseif (randomness >=90) {
tokenURINumber =3;
}
tokenURINumbers[id] = tokenURINumber;
}
}
/*
* @notice Overrides the `tokenURI()` function to return baseURI + 1, 2, or 3
*/functiontokenURI(uint256 tokenId) publicviewvirtualoverridereturns (stringmemory) {
if (!_exists(tokenId)) revert TokenDoesNotExist();
uint256 tokenURINumber = tokenURINumbers[tokenId];
returnstring(abi.encodePacked(baseURI, _toString(tokenURINumber)));
}
}
Código Fuente del Contrato
Archivo 3 de 45: ConsiderationEnums.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.13;enumOrderType {
// 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
}
enumBasicOrderType {
// 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
}
enumBasicOrderRouteType {
// 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
}
enumItemType {
// 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
}
enumSide {
// 0: Items that can be spent
OFFER,
// 1: Items that must be received
CONSIDERATION
}
Código Fuente del Contrato
Archivo 4 de 45: ConsiderationStructs.sol
// SPDX-License-Identifier: MITpragmasolidity ^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.
*/structOrderComponents {
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.
*/structOfferItem {
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.
*/structConsiderationItem {
ItemType itemType;
address token;
uint256 identifierOrCriteria;
uint256 startAmount;
uint256 endAmount;
addresspayable 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.
*/structSpentItem {
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.
*/structReceivedItem {
ItemType itemType;
address token;
uint256 identifier;
uint256 amount;
addresspayable 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)`.)
*/structBasicOrderParameters {
// calldata offsetaddress considerationToken; // 0x24uint256 considerationIdentifier; // 0x44uint256 considerationAmount; // 0x64addresspayable offerer; // 0x84address zone; // 0xa4address offerToken; // 0xc4uint256 offerIdentifier; // 0xe4uint256 offerAmount; // 0x104
BasicOrderType basicOrderType; // 0x124uint256 startTime; // 0x144uint256 endTime; // 0x164bytes32 zoneHash; // 0x184uint256 salt; // 0x1a4bytes32 offererConduitKey; // 0x1c4bytes32 fulfillerConduitKey; // 0x1e4uint256 totalOriginalAdditionalRecipients; // 0x204
AdditionalRecipient[] additionalRecipients; // 0x224bytes 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.
*/structAdditionalRecipient {
uint256 amount;
addresspayable 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.
*/structOrderParameters {
address offerer; // 0x00address zone; // 0x20
OfferItem[] offer; // 0x40
ConsiderationItem[] consideration; // 0x60
OrderType orderType; // 0x80uint256 startTime; // 0xa0uint256 endTime; // 0xc0bytes32 zoneHash; // 0xe0uint256 salt; // 0x100bytes32 conduitKey; // 0x120uint256 totalOriginalConsiderationItems; // 0x140// offer.length // 0x160
}
/**
* @dev Orders require a signature in addition to the other order parameters.
*/structOrder {
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.
*/structAdvancedOrder {
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).
*/structOrderStatus {
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.
*/structCriteriaResolver {
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).
*/structFulfillment {
FulfillmentComponent[] offerComponents;
FulfillmentComponent[] considerationComponents;
}
/**
* @dev Each fulfillment component contains one index referencing a specific
* order and another referencing a specific offer or consideration item.
*/structFulfillmentComponent {
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`.
*/structExecution {
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.
*/structZoneParameters {
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.
*/structSchema {
uint256 id;
bytes metadata;
}
usingStructPointersforOrderComponentsglobal;
usingStructPointersforOfferItemglobal;
usingStructPointersforConsiderationItemglobal;
usingStructPointersforSpentItemglobal;
usingStructPointersforReceivedItemglobal;
usingStructPointersforBasicOrderParametersglobal;
usingStructPointersforAdditionalRecipientglobal;
usingStructPointersforOrderParametersglobal;
usingStructPointersforOrderglobal;
usingStructPointersforAdvancedOrderglobal;
usingStructPointersforOrderStatusglobal;
usingStructPointersforCriteriaResolverglobal;
usingStructPointersforFulfillmentglobal;
usingStructPointersforFulfillmentComponentglobal;
usingStructPointersforExecutionglobal;
usingStructPointersforZoneParametersglobal;
/**
* @dev This library provides a set of functions for converting structs to
* pointers.
*/libraryStructPointers{
/**
* @dev Get a MemoryPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
OrderComponents memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
OrderComponents calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
OfferItem memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
OfferItem calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
ConsiderationItem memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
ConsiderationItem calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
SpentItem memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
SpentItem calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
ReceivedItem memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
ReceivedItem calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
BasicOrderParameters memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
BasicOrderParameters calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
AdditionalRecipient memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
AdditionalRecipient calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
OrderParameters memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
OrderParameters calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
Order memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
Order calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
AdvancedOrder memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
AdvancedOrder calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
OrderStatus memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
OrderStatus calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
CriteriaResolver memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
CriteriaResolver calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
Fulfillment memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
Fulfillment calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
FulfillmentComponent memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
FulfillmentComponent calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
Execution memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
Execution calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The MemoryPointer.
*/functiontoMemoryPointer(
ZoneParameters memory obj
) internalpurereturns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The CalldataPointer.
*/functiontoCalldataPointer(
ZoneParameters calldata obj
) internalpurereturns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragmasolidity ^0.8.20;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
}
Código Fuente del Contrato
Archivo 7 de 45: DynamicTraits.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;import {EnumerableSet} from"openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol";
import {IERC7496} from"./interfaces/IERC7496.sol";
contractDynamicTraitsisIERC7496{
usingEnumerableSetforEnumerableSet.Bytes32Set;
/// @notice Thrown when a new trait value is not different from the existing valueerrorTraitValueUnchanged();
/// @notice An enumerable set of all trait keys that have been set
EnumerableSet.Bytes32Set internal _traitKeys;
/// @notice A mapping of token ID to a mapping of trait key to trait valuemapping(uint256 tokenId =>mapping(bytes32 traitKey =>bytes32 traitValue)) internal _traits;
/// @notice An offchain string URI that points to a JSON file containing trait metadatastringinternal _traitMetadataURI;
/**
* @notice Get the value of a trait for a given token ID.
* @param tokenId The token ID to get the trait value for
* @param traitKey The trait key to get the value of
*/functiongetTraitValue(uint256 tokenId, bytes32 traitKey) publicviewvirtualreturns (bytes32 traitValue) {
traitValue = _traits[tokenId][traitKey];
}
/**
* @notice Get the values of traits for a given token ID.
* @param tokenId The token ID to get the trait values for
* @param traitKeys The trait keys to get the values of
*/functiongetTraitValues(uint256 tokenId, bytes32[] calldata traitKeys)
publicviewvirtualreturns (bytes32[] memory traitValues)
{
uint256 length = traitKeys.length;
traitValues =newbytes32[](length);
for (uint256 i =0; i < length;) {
bytes32 traitKey = traitKeys[i];
traitValues[i] = getTraitValue(tokenId, traitKey);
unchecked {
++i;
}
}
}
/**
* @notice Get the URI for the trait metadata
*/functiongetTraitMetadataURI() externalviewvirtualreturns (stringmemory labelsURI) {
return _traitMetadataURI;
}
/**
* @notice Set the value of a trait for a given token ID.
* Reverts if the trait value is unchanged.
* @dev IMPORTANT: Override this method with access role restriction.
* @param tokenId The token ID to set the trait value for
* @param traitKey The trait key to set the value of
* @param newValue The new trait value to set
*/functionsetTrait(uint256 tokenId, bytes32 traitKey, bytes32 newValue) publicvirtual{
bytes32 existingValue = _traits[tokenId][traitKey];
if (existingValue == newValue) {
revert TraitValueUnchanged();
}
// no-op if exists
_traitKeys.add(traitKey);
_traits[tokenId][traitKey] = newValue;
emit TraitUpdated(traitKey, tokenId, newValue);
}
/**
* @notice Set the URI for the trait metadata
* @param uri The new URI to set
*/function_setTraitMetadataURI(stringcalldata uri) internalvirtual{
_traitMetadataURI = uri;
emit TraitMetadataURIUpdated();
}
functionsupportsInterface(bytes4 interfaceId) publicviewvirtualreturns (bool) {
return interfaceId ==type(IERC7496).interfaceId;
}
}
Código Fuente del Contrato
Archivo 8 de 45: ERC1155.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol)pragmasolidity ^0.8.20;import {IERC1155} from"./IERC1155.sol";
import {IERC1155Receiver} from"./IERC1155Receiver.sol";
import {IERC1155MetadataURI} from"./extensions/IERC1155MetadataURI.sol";
import {Context} from"../../utils/Context.sol";
import {IERC165, ERC165} from"../../utils/introspection/ERC165.sol";
import {Arrays} from"../../utils/Arrays.sol";
import {IERC1155Errors} from"../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*/abstractcontractERC1155isContext, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors{
usingArraysforuint256[];
usingArraysforaddress[];
mapping(uint256 id =>mapping(address account =>uint256)) private _balances;
mapping(address account =>mapping(address operator =>bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.jsonstringprivate _uri;
/**
* @dev See {_setURI}.
*/constructor(stringmemory uri_) {
_setURI(uri_);
}
/**
* @dev See {IERC165-supportsInterface}.
*/functionsupportsInterface(bytes4 interfaceId) publicviewvirtualoverride(ERC165, IERC165) returns (bool) {
return
interfaceId ==type(IERC1155).interfaceId||
interfaceId ==type(IERC1155MetadataURI).interfaceId||super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/functionuri(uint256/* id */) publicviewvirtualreturns (stringmemory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*/functionbalanceOf(address account, uint256 id) publicviewvirtualreturns (uint256) {
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/functionbalanceOfBatch(address[] memory accounts,
uint256[] memory ids
) publicviewvirtualreturns (uint256[] memory) {
if (accounts.length!= ids.length) {
revert ERC1155InvalidArrayLength(ids.length, accounts.length);
}
uint256[] memory batchBalances =newuint256[](accounts.length);
for (uint256 i =0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/functionsetApprovalForAll(address operator, bool approved) publicvirtual{
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/functionisApprovedForAll(address account, address operator) publicviewvirtualreturns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/functionsafeTransferFrom(addressfrom, address to, uint256 id, uint256 value, bytesmemory data) publicvirtual{
address sender = _msgSender();
if (from!= sender &&!isApprovedForAll(from, sender)) {
revert ERC1155MissingApprovalForAll(sender, from);
}
_safeTransferFrom(from, to, id, value, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/functionsafeBatchTransferFrom(addressfrom,
address to,
uint256[] memory ids,
uint256[] memory values,
bytesmemory data
) publicvirtual{
address sender = _msgSender();
if (from!= sender &&!isApprovedForAll(from, sender)) {
revert ERC1155MissingApprovalForAll(sender, from);
}
_safeBatchTransferFrom(from, to, ids, values, data);
}
/**
* @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`
* (or `to`) is the zero address.
*
* Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}
* or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.
* - `ids` and `values` must have the same length.
*
* NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.
*/function_update(addressfrom, address to, uint256[] memory ids, uint256[] memory values) internalvirtual{
if (ids.length!= values.length) {
revert ERC1155InvalidArrayLength(ids.length, values.length);
}
address operator = _msgSender();
for (uint256 i =0; i < ids.length; ++i) {
uint256 id = ids.unsafeMemoryAccess(i);
uint256 value = values.unsafeMemoryAccess(i);
if (from!=address(0)) {
uint256 fromBalance = _balances[id][from];
if (fromBalance < value) {
revert ERC1155InsufficientBalance(from, fromBalance, value, id);
}
unchecked {
// Overflow not possible: value <= fromBalance
_balances[id][from] = fromBalance - value;
}
}
if (to !=address(0)) {
_balances[id][to] += value;
}
}
if (ids.length==1) {
uint256 id = ids.unsafeMemoryAccess(0);
uint256 value = values.unsafeMemoryAccess(0);
emit TransferSingle(operator, from, to, id, value);
} else {
emit TransferBatch(operator, from, to, ids, values);
}
}
/**
* @dev Version of {_update} that performs the token acceptance check by calling
* {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it
* contains code (eg. is a smart contract at the moment of execution).
*
* IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any
* update to the contract state after this function would break the check-effect-interaction pattern. Consider
* overriding {_update} instead.
*/function_updateWithAcceptanceCheck(addressfrom,
address to,
uint256[] memory ids,
uint256[] memory values,
bytesmemory data
) internalvirtual{
_update(from, to, ids, values);
if (to !=address(0)) {
address operator = _msgSender();
if (ids.length==1) {
uint256 id = ids.unsafeMemoryAccess(0);
uint256 value = values.unsafeMemoryAccess(0);
_doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);
} else {
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);
}
}
}
/**
* @dev Transfers a `value` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `from` must have a balance of tokens of type `id` of at least `value` amount.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/function_safeTransferFrom(addressfrom, address to, uint256 id, uint256 value, bytesmemory data) internal{
if (to ==address(0)) {
revert ERC1155InvalidReceiver(address(0));
}
if (from==address(0)) {
revert ERC1155InvalidSender(address(0));
}
(uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
_updateWithAcceptanceCheck(from, to, ids, values, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
* - `ids` and `values` must have the same length.
*/function_safeBatchTransferFrom(addressfrom,
address to,
uint256[] memory ids,
uint256[] memory values,
bytesmemory data
) internal{
if (to ==address(0)) {
revert ERC1155InvalidReceiver(address(0));
}
if (from==address(0)) {
revert ERC1155InvalidSender(address(0));
}
_updateWithAcceptanceCheck(from, to, ids, values, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the values in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/function_setURI(stringmemory newuri) internalvirtual{
_uri = newuri;
}
/**
* @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/function_mint(address to, uint256 id, uint256 value, bytesmemory data) internal{
if (to ==address(0)) {
revert ERC1155InvalidReceiver(address(0));
}
(uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
_updateWithAcceptanceCheck(address(0), to, ids, values, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `values` must have the same length.
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/function_mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytesmemory data) internal{
if (to ==address(0)) {
revert ERC1155InvalidReceiver(address(0));
}
_updateWithAcceptanceCheck(address(0), to, ids, values, data);
}
/**
* @dev Destroys a `value` amount of tokens of type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `value` amount of tokens of type `id`.
*/function_burn(addressfrom, uint256 id, uint256 value) internal{
if (from==address(0)) {
revert ERC1155InvalidSender(address(0));
}
(uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);
_updateWithAcceptanceCheck(from, address(0), ids, values, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `value` amount of tokens of type `id`.
* - `ids` and `values` must have the same length.
*/function_burnBatch(addressfrom, uint256[] memory ids, uint256[] memory values) internal{
if (from==address(0)) {
revert ERC1155InvalidSender(address(0));
}
_updateWithAcceptanceCheck(from, address(0), ids, values, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the zero address.
*/function_setApprovalForAll(address owner, address operator, bool approved) internalvirtual{
if (operator ==address(0)) {
revert ERC1155InvalidOperator(address(0));
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address
* if it contains code at the moment of execution.
*/function_doSafeTransferAcceptanceCheck(address operator,
addressfrom,
address to,
uint256 id,
uint256 value,
bytesmemory data
) private{
if (to.code.length>0) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
// Tokens rejectedrevert ERC1155InvalidReceiver(to);
}
} catch (bytesmemory reason) {
if (reason.length==0) {
// non-ERC1155Receiver implementerrevert ERC1155InvalidReceiver(to);
} else {
/// @solidity memory-safe-assemblyassembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
/**
* @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address
* if it contains code at the moment of execution.
*/function_doSafeBatchTransferAcceptanceCheck(address operator,
addressfrom,
address to,
uint256[] memory ids,
uint256[] memory values,
bytesmemory data
) private{
if (to.code.length>0) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
// Tokens rejectedrevert ERC1155InvalidReceiver(to);
}
} catch (bytesmemory reason) {
if (reason.length==0) {
// non-ERC1155Receiver implementerrevert ERC1155InvalidReceiver(to);
} else {
/// @solidity memory-safe-assemblyassembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
/**
* @dev Creates an array in memory with only one value for each of the elements provided.
*/function_asSingletonArrays(uint256 element1,
uint256 element2
) privatepurereturns (uint256[] memory array1, uint256[] memory array2) {
/// @solidity memory-safe-assemblyassembly {
// Load the free memory pointer
array1 :=mload(0x40)
// Set array length to 1mstore(array1, 1)
// Store the single element at the next word after the length (where content starts)mstore(add(array1, 0x20), element1)
// Repeat for next array locating it right after the first array
array2 :=add(array1, 0x40)
mstore(array2, 1)
mstore(add(array2, 0x20), element2)
// Update the free memory pointer by pointing after the second arraymstore(0x40, add(array2, 0x40))
}
}
}
Código Fuente del Contrato
Archivo 9 de 45: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/extensions/ERC1155Burnable.sol)pragmasolidity ^0.8.20;import {ERC1155} from"../ERC1155.sol";
/**
* @dev Extension of {ERC1155} that allows token holders to destroy both their
* own tokens and those that they have been approved to use.
*/abstractcontractERC1155BurnableisERC1155{
functionburn(address account, uint256 id, uint256 value) publicvirtual{
if (account != _msgSender() &&!isApprovedForAll(account, _msgSender())) {
revert ERC1155MissingApprovalForAll(_msgSender(), account);
}
_burn(account, id, value);
}
functionburnBatch(address account, uint256[] memory ids, uint256[] memory values) publicvirtual{
if (account != _msgSender() &&!isApprovedForAll(account, _msgSender())) {
revert ERC1155MissingApprovalForAll(_msgSender(), account);
}
_burnBatch(account, ids, values);
}
}
Código Fuente del Contrato
Archivo 10 de 45: ERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragmasolidity ^0.8.20;import {IERC165} from"./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/abstractcontractERC165isIERC165{
/**
* @dev See {IERC165-supportsInterface}.
*/functionsupportsInterface(bytes4 interfaceId) publicviewvirtualreturns (bool) {
return interfaceId ==type(IERC165).interfaceId;
}
}
Código Fuente del Contrato
Archivo 11 de 45: ERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)pragmasolidity ^0.8.20;import {IERC20} from"./IERC20.sol";
import {IERC20Metadata} from"./extensions/IERC20Metadata.sol";
import {Context} from"../../utils/Context.sol";
import {IERC20Errors} from"../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/abstractcontractERC20isContext, IERC20, IERC20Metadata, IERC20Errors{
mapping(address account =>uint256) private _balances;
mapping(address account =>mapping(address spender =>uint256)) private _allowances;
uint256private _totalSupply;
stringprivate _name;
stringprivate _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/constructor(stringmemory name_, stringmemory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/functionname() publicviewvirtualreturns (stringmemory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/functionsymbol() publicviewvirtualreturns (stringmemory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/functiondecimals() publicviewvirtualreturns (uint8) {
return18;
}
/**
* @dev See {IERC20-totalSupply}.
*/functiontotalSupply() publicviewvirtualreturns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/functionbalanceOf(address account) publicviewvirtualreturns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/functiontransfer(address to, uint256 value) publicvirtualreturns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
returntrue;
}
/**
* @dev See {IERC20-allowance}.
*/functionallowance(address owner, address spender) publicviewvirtualreturns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/functionapprove(address spender, uint256 value) publicvirtualreturns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
returntrue;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/functiontransferFrom(addressfrom, address to, uint256 value) publicvirtualreturns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
returntrue;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/function_transfer(addressfrom, address to, uint256 value) internal{
if (from==address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to ==address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/function_update(addressfrom, address to, uint256 value) internalvirtual{
if (from==address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to ==address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/function_mint(address account, uint256 value) internal{
if (account ==address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/function_burn(address account, uint256 value) internal{
if (account ==address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/function_approve(address owner, address spender, uint256 value) internal{
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/function_approve(address owner, address spender, uint256 value, bool emitEvent) internalvirtual{
if (owner ==address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender ==address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/function_spendAllowance(address owner, address spender, uint256 value) internalvirtual{
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance !=type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
Código Fuente del Contrato
Archivo 12 de 45: ERC20Burnable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)pragmasolidity ^0.8.20;import {ERC20} from"../ERC20.sol";
import {Context} from"../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/abstractcontractERC20BurnableisContext, ERC20{
/**
* @dev Destroys a `value` amount of tokens from the caller.
*
* See {ERC20-_burn}.
*/functionburn(uint256 value) publicvirtual{
_burn(_msgSender(), value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, deducting from
* the caller's allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `value`.
*/functionburnFrom(address account, uint256 value) publicvirtual{
_spendAllowance(account, _msgSender(), value);
_burn(account, value);
}
}
Código Fuente del Contrato
Archivo 13 de 45: ERC2981.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.4;/// @notice Simple ERC2981 NFT Royalty Standard implementation./// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC2981.sol)/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.sol)abstractcontractERC2981{
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The royalty fee numerator exceeds the fee denominator.errorRoyaltyOverflow();
/// @dev The royalty receiver cannot be the zero address.errorRoyaltyReceiverIsZeroAddress();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* STORAGE *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The default royalty info is given by:/// ```/// let packed := sload(_ERC2981_MASTER_SLOT_SEED)/// let receiver := shr(96, packed)/// let royaltyFraction := xor(packed, shl(96, receiver))/// ```////// The per token royalty info is given by./// ```/// mstore(0x00, tokenId)/// mstore(0x20, _ERC2981_MASTER_SLOT_SEED)/// let packed := sload(keccak256(0x00, 0x40))/// let receiver := shr(96, packed)/// let royaltyFraction := xor(packed, shl(96, receiver))/// ```uint256privateconstant _ERC2981_MASTER_SLOT_SEED =0xaa4ec00224afccfdb7;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* ERC2981 *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Checks that `_feeDenominator` is non-zero.constructor() {
require(_feeDenominator() !=0, "Fee denominator cannot be zero.");
}
/// @dev Returns the denominator for the royalty amount./// Defaults to 10000, which represents fees in basis points./// Override this function to return a custom amount if needed.function_feeDenominator() internalpurevirtualreturns (uint96) {
return10000;
}
/// @dev Returns true if this contract implements the interface defined by `interfaceId`./// See: https://eips.ethereum.org/EIPS/eip-165/// This function call must use less than 30000 gas.functionsupportsInterface(bytes4 interfaceId) publicviewvirtualreturns (bool result) {
/// @solidity memory-safe-assemblyassembly {
let s :=shr(224, interfaceId)
// ERC165: 0x01ffc9a7, ERC2981: 0x2a55205a.
result :=or(eq(s, 0x01ffc9a7), eq(s, 0x2a55205a))
}
}
/// @dev Returns the `receiver` and `royaltyAmount` for `tokenId` sold at `salePrice`.functionroyaltyInfo(uint256 tokenId, uint256 salePrice)
publicviewvirtualreturns (address receiver, uint256 royaltyAmount)
{
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assemblyassembly {
mstore(0x00, tokenId)
mstore(0x20, _ERC2981_MASTER_SLOT_SEED)
let packed :=sload(keccak256(0x00, 0x40))
receiver :=shr(96, packed)
ifiszero(receiver) {
packed :=sload(mload(0x20))
receiver :=shr(96, packed)
}
let x := salePrice
let y :=xor(packed, shl(96, receiver)) // `feeNumerator`.// Overflow check, equivalent to `require(y == 0 || x <= type(uint256).max / y)`.// Out-of-gas revert. Should not be triggered in practice, but included for safety.returndatacopy(returndatasize(), returndatasize(), mul(y, gt(x, div(not(0), y))))
royaltyAmount :=div(mul(x, y), feeDenominator)
}
}
/// @dev Sets the default royalty `receiver` and `feeNumerator`.////// Requirements:/// - `receiver` must not be the zero address./// - `feeNumerator` must not be greater than the fee denominator.function_setDefaultRoyalty(address receiver, uint96 feeNumerator) internalvirtual{
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assemblyassembly {
feeNumerator :=shr(160, shl(160, feeNumerator))
ifgt(feeNumerator, feeDenominator) {
mstore(0x00, 0x350a88b3) // `RoyaltyOverflow()`.revert(0x1c, 0x04)
}
let packed :=shl(96, receiver)
ifiszero(packed) {
mstore(0x00, 0xb4457eaa) // `RoyaltyReceiverIsZeroAddress()`.revert(0x1c, 0x04)
}
sstore(_ERC2981_MASTER_SLOT_SEED, or(packed, feeNumerator))
}
}
/// @dev Sets the default royalty `receiver` and `feeNumerator` to zero.function_deleteDefaultRoyalty() internalvirtual{
/// @solidity memory-safe-assemblyassembly {
sstore(_ERC2981_MASTER_SLOT_SEED, 0)
}
}
/// @dev Sets the royalty `receiver` and `feeNumerator` for `tokenId`.////// Requirements:/// - `receiver` must not be the zero address./// - `feeNumerator` must not be greater than the fee denominator.function_setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator)
internalvirtual{
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assemblyassembly {
feeNumerator :=shr(160, shl(160, feeNumerator))
ifgt(feeNumerator, feeDenominator) {
mstore(0x00, 0x350a88b3) // `RoyaltyOverflow()`.revert(0x1c, 0x04)
}
let packed :=shl(96, receiver)
ifiszero(packed) {
mstore(0x00, 0xb4457eaa) // `RoyaltyReceiverIsZeroAddress()`.revert(0x1c, 0x04)
}
mstore(0x00, tokenId)
mstore(0x20, _ERC2981_MASTER_SLOT_SEED)
sstore(keccak256(0x00, 0x40), or(packed, feeNumerator))
}
}
/// @dev Sets the royalty `receiver` and `feeNumerator` for `tokenId` to zero.function_resetTokenRoyalty(uint256 tokenId) internalvirtual{
/// @solidity memory-safe-assemblyassembly {
mstore(0x00, tokenId)
mstore(0x20, _ERC2981_MASTER_SLOT_SEED)
sstore(keccak256(0x00, 0x40), 0)
}
}
}
Código Fuente del Contrato
Archivo 14 de 45: ERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)pragmasolidity ^0.8.20;import {IERC721} from"./IERC721.sol";
import {IERC721Receiver} from"./IERC721Receiver.sol";
import {IERC721Metadata} from"./extensions/IERC721Metadata.sol";
import {Context} from"../../utils/Context.sol";
import {Strings} from"../../utils/Strings.sol";
import {IERC165, ERC165} from"../../utils/introspection/ERC165.sol";
import {IERC721Errors} from"../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/abstractcontractERC721isContext, ERC165, IERC721, IERC721Metadata, IERC721Errors{
usingStringsforuint256;
// Token namestringprivate _name;
// Token symbolstringprivate _symbol;
mapping(uint256 tokenId =>address) private _owners;
mapping(address owner =>uint256) private _balances;
mapping(uint256 tokenId =>address) private _tokenApprovals;
mapping(address owner =>mapping(address operator =>bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/constructor(stringmemory name_, stringmemory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/functionsupportsInterface(bytes4 interfaceId) publicviewvirtualoverride(ERC165, IERC165) returns (bool) {
return
interfaceId ==type(IERC721).interfaceId||
interfaceId ==type(IERC721Metadata).interfaceId||super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/functionbalanceOf(address owner) publicviewvirtualreturns (uint256) {
if (owner ==address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/functionownerOf(uint256 tokenId) publicviewvirtualreturns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/functionname() publicviewvirtualreturns (stringmemory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/functionsymbol() publicviewvirtualreturns (stringmemory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/functiontokenURI(uint256 tokenId) publicviewvirtualreturns (stringmemory) {
_requireOwned(tokenId);
stringmemory baseURI = _baseURI();
returnbytes(baseURI).length>0 ? string.concat(baseURI, tokenId.toString()) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/function_baseURI() internalviewvirtualreturns (stringmemory) {
return"";
}
/**
* @dev See {IERC721-approve}.
*/functionapprove(address to, uint256 tokenId) publicvirtual{
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/functiongetApproved(uint256 tokenId) publicviewvirtualreturns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/functionsetApprovalForAll(address operator, bool approved) publicvirtual{
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/functionisApprovedForAll(address owner, address operator) publicviewvirtualreturns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/functiontransferFrom(addressfrom, address to, uint256 tokenId) publicvirtual{
if (to ==address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner !=from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/functionsafeTransferFrom(addressfrom, address to, uint256 tokenId) public{
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/functionsafeTransferFrom(addressfrom, address to, uint256 tokenId, bytesmemory data) publicvirtual{
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/function_ownerOf(uint256 tokenId) internalviewvirtualreturns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/function_getApproved(uint256 tokenId) internalviewvirtualreturns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/function_isAuthorized(address owner, address spender, uint256 tokenId) internalviewvirtualreturns (bool) {
return
spender !=address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/function_checkAuthorized(address owner, address spender, uint256 tokenId) internalviewvirtual{
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner ==address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/function_increaseBalance(address account, uint128 value) internalvirtual{
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/function_update(address to, uint256 tokenId, address auth) internalvirtualreturns (address) {
addressfrom= _ownerOf(tokenId);
// Perform (optional) operator checkif (auth !=address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the updateif (from!=address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -=1;
}
}
if (to !=address(0)) {
unchecked {
_balances[to] +=1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
returnfrom;
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/function_mint(address to, uint256 tokenId) internal{
if (to ==address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner !=address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/function_safeMint(address to, uint256 tokenId) internal{
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/function_safeMint(address to, uint256 tokenId, bytesmemory data) internalvirtual{
_mint(to, tokenId);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/function_burn(uint256 tokenId) internal{
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner ==address(0)) {
revert ERC721NonexistentToken(tokenId);
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/function_transfer(addressfrom, address to, uint256 tokenId) internal{
if (to ==address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner ==address(0)) {
revert ERC721NonexistentToken(tokenId);
} elseif (previousOwner !=from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/function_safeTransfer(addressfrom, address to, uint256 tokenId) internal{
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/function_safeTransfer(addressfrom, address to, uint256 tokenId, bytesmemory data) internalvirtual{
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/function_approve(address to, uint256 tokenId, address auth) internal{
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/function_approve(address to, uint256 tokenId, address auth, bool emitEvent) internalvirtual{
// Avoid reading the owner unless necessaryif (emitEvent || auth !=address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approveif (auth !=address(0) && owner != auth &&!isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/function_setApprovalForAll(address owner, address operator, bool approved) internalvirtual{
if (operator ==address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/function_requireOwned(uint256 tokenId) internalviewreturns (address) {
address owner = _ownerOf(tokenId);
if (owner ==address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
*/function_checkOnERC721Received(addressfrom, address to, uint256 tokenId, bytesmemory data) private{
if (to.code.length>0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytesmemory reason) {
if (reason.length==0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assemblyassembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
Código Fuente del Contrato
Archivo 15 de 45: ERC721Burnable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol)pragmasolidity ^0.8.20;import {ERC721} from"../ERC721.sol";
import {Context} from"../../../utils/Context.sol";
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be burned (destroyed).
*/abstractcontractERC721BurnableisContext, ERC721{
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/functionburn(uint256 tokenId) publicvirtual{
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
_update(address(0), tokenId, _msgSender());
}
}
Código Fuente del Contrato
Archivo 16 de 45: ERC721ConduitPreapproved_Solady.sol
Archivo 17 de 45: ERC721ShipyardContractMetadata.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;import {ERC721ConduitPreapproved_Solady} from"shipyard-core/src/tokens/erc721/ERC721ConduitPreapproved_Solady.sol";
import {ERC721} from"solady/src/tokens/ERC721.sol";
import {ERC2981} from"solady/src/tokens/ERC2981.sol";
import {Ownable} from"solady/src/auth/Ownable.sol";
import {IShipyardContractMetadata} from"../interfaces/IShipyardContractMetadata.sol";
contractERC721ShipyardContractMetadataisERC721ConduitPreapproved_Solady,
IShipyardContractMetadata,
ERC2981,
Ownable{
/// @dev The token namestringinternal _name;
/// @dev The token symbolstringinternal _symbol;
/// @dev The base URI.stringpublic baseURI;
/// @dev The contract URI.stringpublic contractURI;
/// @dev The provenance hash for guaranteeing metadata order for random reveals.bytes32public provenanceHash;
constructor(stringmemory name_, stringmemory symbol_) ERC721ConduitPreapproved_Solady() {
// Set the token name and symbol.
_name = name_;
_symbol = symbol_;
// Initialize the owner of the contract.
_initializeOwner(msg.sender);
}
/**
* @notice Returns the name of this token contract.
*/functionname() publicviewoverride(ERC721, IShipyardContractMetadata) returns (stringmemory) {
return _name;
}
/**
* @notice Returns the symbol of this token contract.
*/functionsymbol() publicviewoverride(ERC721, IShipyardContractMetadata) returns (stringmemory) {
return _symbol;
}
/**
* @notice Sets the base URI for the token metadata and emits an event.
*
* @param newURI The new base URI to set.
*/functionsetBaseURI(stringcalldata newURI) externalonlyOwner{
baseURI = newURI;
// Emit an event with the update.emit BatchMetadataUpdate(0, type(uint256).max);
}
/**
* @notice Sets the contract URI for contract metadata.
*
* @param newURI The new contract URI.
*/functionsetContractURI(stringcalldata newURI) externalonlyOwner{
// Set the new contract URI.
contractURI = newURI;
// Emit an event with the update.emit ContractURIUpdated(newURI);
}
/**
* @notice Sets the provenance hash and emits an event.
*
* The provenance hash is used for random reveals, which
* is a hash of the ordered metadata to show it has not been
* modified after mint started.
*
* This function will revert if the provenance hash has already
* been set, so be sure to carefully set it only once.
*
* @param newProvenanceHash The new provenance hash to set.
*/functionsetProvenanceHash(bytes32 newProvenanceHash) externalonlyOwner{
// Keep track of the old provenance hash for emitting with the event.bytes32 oldProvenanceHash = provenanceHash;
// Revert if the provenance hash has already been set.if (oldProvenanceHash !=bytes32(0)) {
revert ProvenanceHashCannotBeSetAfterAlreadyBeingSet();
}
// Set the new provenance hash.
provenanceHash = newProvenanceHash;
// Emit an event with the update.emit ProvenanceHashUpdated(oldProvenanceHash, newProvenanceHash);
}
/**
* @notice Returns the token URI for token metadata.
*
* @param tokenId The token id to get the token URI for.
*/functiontokenURI(uint256 tokenId) publicviewvirtualoverridereturns (stringmemory uri) {
// Revert if the tokenId doesn't exist.if (!_exists(tokenId)) revert TokenDoesNotExist();
// Put the baseURI on the stack.
uri = baseURI;
// Return empty if baseURI is empty.if (bytes(uri).length==0) {
return"";
}
// If the last character of the baseURI is not a slash, then return// the baseURI to signal the same metadata for all tokens, such as// for a prereveal state.if (bytes(uri)[bytes(uri).length-1] !=bytes("/")[0]) {
return uri;
}
// Append the tokenId to the baseURI and return.
uri =string.concat(uri, _toString(tokenId));
}
/**
* @notice Sets the default royalty information.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator of 10_000 basis points.
*/functionsetDefaultRoyalty(address receiver, uint96 feeNumerator) externalonlyOwner{
// Set the default royalty.// ERC2981 implementation ensures feeNumerator <= feeDenominator// and receiver != address(0).
_setDefaultRoyalty(receiver, feeNumerator);
// Emit an event with the updated params.emit RoyaltyInfoUpdated(receiver, feeNumerator);
}
functionsupportsInterface(bytes4 interfaceId) publicviewvirtualoverride(ERC721, ERC2981) returns (bool) {
return ERC721.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/function_toString(uint256 value) internalpurevirtualreturns (stringmemory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.// We will need 1 word for the trailing zeros padding, 1 word for the length,// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.let m :=add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.mstore(0x40, m)
// Assign the `str` to the end.
str :=sub(m, 0x20)
// Zeroize the slot after the string.mstore(str, 0)
// Cache the end of the memory to calculate the length later.let end := str
// We write the string from rightmost digit to leftmost digit.// The following is essentially a do-while loop that also handles the zero case.// prettier-ignorefor { let temp := value } 1 {} {
str :=sub(str, 1)
// Write the character to the pointer.// The ASCII index of the '0' character is 48.mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp :=div(temp, 10)
// prettier-ignoreifiszero(temp) { break }
}
let length :=sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str :=sub(str, 0x20)
// Store the length.mstore(str, length)
}
}
}
Archivo 19 de 45: ERC721ShipyardRedeemableMintable.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;import {IERC165} from"openzeppelin-contracts/contracts/interfaces/IERC165.sol";
import {ERC721ConduitPreapproved_Solady} from"shipyard-core/src/tokens/erc721/ERC721ConduitPreapproved_Solady.sol";
import {ConsiderationItem, OfferItem} from"seaport-types/src/lib/ConsiderationStructs.sol";
import {Ownable} from"solady/src/auth/Ownable.sol";
import {ERC7498NFTRedeemables} from"../lib/ERC7498NFTRedeemables.sol";
import {CampaignParams} from"../lib/RedeemablesStructs.sol";
import {IRedemptionMintable} from"../interfaces/IRedemptionMintable.sol";
import {ERC721ShipyardRedeemable} from"../ERC721ShipyardRedeemable.sol";
import {IRedemptionMintable} from"../interfaces/IRedemptionMintable.sol";
import {TraitRedemption} from"../lib/RedeemablesStructs.sol";
contractERC721ShipyardRedeemableMintableisERC721ShipyardRedeemable, IRedemptionMintable{
/// @dev The ERC-7498 redeemables contracts.address[] internal _erc7498RedeemablesContracts;
/// @dev The next token id to mint.uint256 _nextTokenId =1;
constructor(stringmemory name_, stringmemory symbol_) ERC721ShipyardRedeemable(name_, symbol_) {}
functionmintRedemption(uint256, /* campaignId */address recipient,
OfferItem calldata, /* offer */
ConsiderationItem[] calldata, /* consideration */
TraitRedemption[] calldata/* traitRedemptions */) externalvirtual{
// Require that msg.sender is valid.
_requireValidRedeemablesCaller();
// Increment nextTokenId first so more of the same token id cannot be minted through reentrancy.++_nextTokenId;
_mint(recipient, _nextTokenId -1);
}
functiongetRedeemablesContracts() externalviewreturns (address[] memory) {
return _erc7498RedeemablesContracts;
}
functionsetRedeemablesContracts(address[] calldata redeemablesContracts) externalonlyOwner{
_erc7498RedeemablesContracts = redeemablesContracts;
}
function_requireValidRedeemablesCaller() internalview{
// Allow the contract to call itself.if (msg.sender==address(this)) return;
bool validCaller;
for (uint256 i; i < _erc7498RedeemablesContracts.length; i++) {
if (msg.sender== _erc7498RedeemablesContracts[i]) {
validCaller =true;
}
}
if (!validCaller) revert InvalidCaller(msg.sender);
}
functionsupportsInterface(bytes4 interfaceId)
publicviewvirtualoverride(ERC721ShipyardRedeemable)
returns (bool)
{
return interfaceId ==type(IRedemptionMintable).interfaceId|| ERC721ShipyardRedeemable.supportsInterface(interfaceId);
}
}
Código Fuente del Contrato
Archivo 20 de 45: ERC7498NFTRedeemables.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;import {IERC20} from"openzeppelin-contracts/contracts/interfaces/IERC20.sol";
import {IERC165} from"openzeppelin-contracts/contracts/interfaces/IERC165.sol";
import {IERC721} from"openzeppelin-contracts/contracts/interfaces/IERC721.sol";
import {IERC1155} from"openzeppelin-contracts/contracts/interfaces/IERC1155.sol";
import {ERC20Burnable} from"openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import {ERC721Burnable} from"openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol";
import {ERC1155Burnable} from"openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import {OfferItem, ConsiderationItem, SpentItem} from"seaport-types/src/lib/ConsiderationStructs.sol";
import {ItemType} from"seaport-types/src/lib/ConsiderationEnums.sol";
import {DynamicTraits} from"shipyard-core/src/dynamic-traits/DynamicTraits.sol";
import {IERC7496} from"shipyard-core/src/dynamic-traits/interfaces/IERC7496.sol";
import {IERC7498} from"../interfaces/IERC7498.sol";
import {IRedemptionMintable} from"../interfaces/IRedemptionMintable.sol";
import {RedeemablesErrors} from"./RedeemablesErrors.sol";
import {Campaign, CampaignParams, CampaignRequirements, TraitRedemption} from"./RedeemablesStructs.sol";
import {BURN_ADDRESS} from"./RedeemablesConstants.sol";
contractERC7498NFTRedeemablesisIERC165, IERC7498, DynamicTraits, RedeemablesErrors{
/// @dev Counter for next campaign id.uint256private _nextCampaignId =1;
/// @dev The campaign by campaign id.mapping(uint256 campaignId => Campaign campaign) private _campaigns;
/// @dev The campaign metadata URI.stringprivate _campaignMetadataURI;
/// @dev The total current redemptions by campaign id.mapping(uint256 campaignId =>uint256 count) private _totalRedemptions;
functionredeem(uint256[] calldata considerationTokenIds, address recipient, bytescalldata extraData)
publicpayable{
// If the recipient is the null address, set to msg.sender.if (recipient ==address(0)) {
recipient =msg.sender;
}
// Get the values from extraData.
(
uint256 campaignId,
uint256 requirementsIndex,
/* bytes32 redemptionHash */
,
uint256[] memory traitRedemptionTokenIds,
/* uint256 salt */
,
/*bytes memory signature */
) =abi.decode(extraData, (uint256, uint256, bytes32, uint256[], uint256, bytes));
// Get the campaign.
Campaign storage campaign = _campaigns[campaignId];
// Validate the requirements index is valid.if (requirementsIndex >= campaign.requirements.length) {
revert RequirementsIndexOutOfBounds();
}
// Validate the campaign time and total redemptions.
_validateRedemption(campaignId, campaign);
// Process the redemption.
_processRedemption(
campaignId,
campaign.requirements[requirementsIndex],
considerationTokenIds,
traitRedemptionTokenIds,
recipient
);
// Emit the Redemption event.emit Redemption(
campaignId, requirementsIndex, bytes32(0), considerationTokenIds, traitRedemptionTokenIds, msg.sender
);
}
functiongetCampaign(uint256 campaignId)
publicviewoverridereturns (Campaign memory campaign, stringmemory metadataURI, uint256 totalRedemptions)
{
// Revert if campaign id is invalid.if (campaignId ==0|| campaignId >= _nextCampaignId) {
revert InvalidCampaignId();
}
// Get the campaign.
campaign = _campaigns[campaignId];
// Get the campaign metadata uri.
metadataURI = _campaignMetadataURI;
// Get the total redemptions.
totalRedemptions = _totalRedemptions[campaignId];
}
/**
* @notice Create a new redeemable campaign.
* @dev IMPORTANT: Override this method with access role restriction.
* @param campaign The campaign.
* @param metadataURI The campaign metadata uri.
*/functioncreateCampaign(Campaign calldata campaign, stringcalldata metadataURI)
publicvirtualreturns (uint256 campaignId)
{
// Validate the campaign params, reverts if invalid.
_validateCampaign(campaign);
// Set the campaignId and increment the next one.
campaignId = _nextCampaignId;
++_nextCampaignId;
// Set the campaign params.
_campaigns[campaignId] = campaign;
// Set the campaign metadata uri if provided.if (bytes(metadataURI).length!=0) {
_campaignMetadataURI = metadataURI;
}
emit CampaignUpdated(campaignId, campaign, _campaignMetadataURI);
}
functionupdateCampaign(uint256 campaignId, Campaign calldata campaign, stringcalldata metadataURI) external{
// Revert if the campaign id is invalid.if (campaignId ==0|| campaignId >= _nextCampaignId) {
revert InvalidCampaignId();
}
// Revert if msg.sender is not the manager.address existingManager = _campaigns[campaignId].params.manager;
if (existingManager !=msg.sender) {
revert NotManager();
}
// Validate the campaign params and revert if invalid.
_validateCampaign(campaign);
// Set the campaign.
_campaigns[campaignId] = campaign;
// Update the campaign metadataURI if it was provided.if (bytes(metadataURI).length!=0) {
_campaignMetadataURI = metadataURI;
}
emit CampaignUpdated(campaignId, campaign, _campaignMetadataURI);
}
function_validateCampaign(Campaign memory campaign) internalpure{
// Revert if startTime is past endTime.if (campaign.params.startTime > campaign.params.endTime) {
revert InvalidTime();
}
// Iterate over the requirements.for (uint256 i; i < campaign.requirements.length;) {
CampaignRequirements memory requirement = campaign.requirements[i];
// Validate each consideration item.for (uint256 j =0; j < requirement.consideration.length;) {
ConsiderationItem memory c = requirement.consideration[j];
// Revert if any of the consideration item recipients is the zero address.// 0xdead address should be used instead.// For internal burn, override _internalBurn and set _useInternalBurn to true.if (c.recipient ==address(0)) {
revert ConsiderationItemRecipientCannotBeZeroAddress();
}
if (c.startAmount ==0) {
revert ConsiderationItemAmountCannotBeZero();
}
// Revert if startAmount != endAmount, as this requires more complex logic.if (c.startAmount != c.endAmount) {
revert NonMatchingConsiderationItemAmounts(i, c.startAmount, c.endAmount);
}
unchecked {
++j;
}
}
unchecked {
++i;
}
}
}
function_validateRedemption(uint256 campaignId, Campaign storage campaign) internalview{
if (_isInactive(campaign.params.startTime, campaign.params.endTime)) {
revert NotActive_(block.timestamp, campaign.params.startTime, campaign.params.endTime);
}
// Revert if max total redemptions would be exceeded.if (_totalRedemptions[campaignId] +1> campaign.params.maxCampaignRedemptions) {
revert MaxCampaignRedemptionsReached(
_totalRedemptions[campaignId] +1, campaign.params.maxCampaignRedemptions
);
}
}
function_transferConsiderationItem(uint256 id, ConsiderationItem memory c) internal{
// WITH_CRITERIA with identifier 0 is wildcard: any id is valid.// Criteria is not yet implemented, for that functionality use the contract offerer.if (
id != c.identifierOrCriteria && c.identifierOrCriteria !=0&& (c.itemType != ItemType.ERC721_WITH_CRITERIA || c.itemType != ItemType.ERC1155_WITH_CRITERIA)
) {
revert InvalidConsiderationTokenIdSupplied(c.token, id, c.identifierOrCriteria);
}
// If consideration item is this contract, recipient is burn address, and _useInternalBurn() fn returns true,// call the internal burn function and return.if (c.token ==address(this) && c.recipient ==payable(BURN_ADDRESS) && _useInternalBurn()) {
_internalBurn(msg.sender, id, c.startAmount);
} else {
// Transfer the token to the consideration recipient.if (c.itemType == ItemType.ERC721 || c.itemType == ItemType.ERC721_WITH_CRITERIA) {
// If recipient is the burn address, try burning the token first, if that doesn't work use transfer.if (c.recipient ==payable(BURN_ADDRESS)) {
try ERC721Burnable(c.token).burn(id) {
// If the burn worked, return.return;
} catch {
// If the burn failed, transfer the token.
IERC721(c.token).safeTransferFrom(msg.sender, c.recipient, id);
}
} else {
IERC721(c.token).safeTransferFrom(msg.sender, c.recipient, id);
}
} elseif ((c.itemType == ItemType.ERC1155 || c.itemType == ItemType.ERC1155_WITH_CRITERIA)) {
if (c.recipient ==payable(BURN_ADDRESS)) {
// If recipient is the burn address, try burning the token first, if that doesn't work use transfer.try ERC1155Burnable(c.token).burn(msg.sender, id, c.startAmount) {
// If the burn worked, return.return;
} catch {
// If the burn failed, transfer the token.
IERC1155(c.token).safeTransferFrom(msg.sender, c.recipient, id, c.startAmount, "");
}
} else {
IERC1155(c.token).safeTransferFrom(msg.sender, c.recipient, id, c.startAmount, "");
}
} elseif (c.itemType == ItemType.ERC20) {
if (c.recipient ==payable(BURN_ADDRESS)) {
// If recipient is the burn address, try burning the token first, if that doesn't work use transfer.try ERC20Burnable(c.token).burnFrom(msg.sender, c.startAmount) {
// If the burn worked, return.return;
} catch {
// If the burn failed, transfer the token.
IERC20(c.token).transferFrom(msg.sender, c.recipient, c.startAmount);
}
} else {
IERC20(c.token).transferFrom(msg.sender, c.recipient, c.startAmount);
}
} else {
// ItemType.NATIVE
(bool success,) = c.recipient.call{value: msg.value}("");
if (!success) revert EtherTransferFailed();
}
}
}
/// @dev Override this function to return true if `_internalBurn` is used.function_useInternalBurn() internalpurevirtualreturns (bool) {
returnfalse;
}
/// @dev Function that is called to burn amounts of a token internal to this inherited contract./// Override with token implementation calling internal burn.function_internalBurn(addressfrom, uint256 id, uint256 amount) internalvirtual{
// Override with your token implementation calling internal burn.
}
function_isInactive(uint256 startTime, uint256 endTime) internalviewreturns (bool inactive) {
// Using the same check for time boundary from Seaport.// startTime <= block.timestamp < endTimeassembly {
inactive :=or(iszero(gt(endTime, timestamp())), gt(startTime, timestamp()))
}
}
function_processRedemption(uint256 campaignId,
CampaignRequirements memory requirements,
uint256[] memory considerationTokenIds,
uint256[] memory traitRedemptionTokenIds,
address recipient
) internal{
// Increment the campaign's total redemptions.++_totalRedemptions[campaignId];
if (requirements.traitRedemptions.length>0) {
// Process the trait redemptions.
_processTraitRedemptions(requirements.traitRedemptions, traitRedemptionTokenIds);
}
if (requirements.consideration.length>0) {
// Process the consideration items.
_processConsiderationItems(requirements.consideration, considerationTokenIds);
}
if (requirements.offer.length>0) {
// Process the offer items.
_processOfferItems(
campaignId, requirements.consideration, requirements.offer, requirements.traitRedemptions, recipient
);
}
}
function_processConsiderationItems(
ConsiderationItem[] memory consideration,
uint256[] memory considerationTokenIds
) internal{
// Revert if the tokenIds length does not match the consideration length.if (consideration.length!= considerationTokenIds.length) {
revert ConsiderationTokenIdsDontMatchConsiderationLength(consideration.length, considerationTokenIds.length);
}
// Keep track of the total native value to validate.uint256 totalNativeValue;
// Iterate over the consideration items.for (uint256 i; i < consideration.length;) {
// Get the consideration item.
ConsiderationItem memory c = consideration[i];
// Get the identifier.uint256 id = considerationTokenIds[i];
// Get the token balance.uint256 balance;
if (c.itemType == ItemType.ERC721 || c.itemType == ItemType.ERC721_WITH_CRITERIA) {
balance = IERC721(c.token).ownerOf(id) ==msg.sender ? 1 : 0;
} elseif (c.itemType == ItemType.ERC1155 || c.itemType == ItemType.ERC1155_WITH_CRITERIA) {
balance = IERC1155(c.token).balanceOf(msg.sender, id);
} elseif (c.itemType == ItemType.ERC20) {
balance = IERC20(c.token).balanceOf(msg.sender);
} else {
// ItemType.NATIVE
totalNativeValue += c.startAmount;
// Total native value is validated after the loop.
}
// Ensure the balance is sufficient.if (c.itemType != ItemType.NATIVE && balance < c.startAmount) {
revert ConsiderationItemInsufficientBalance(c.token, balance, c.startAmount);
}
// Transfer the consideration item.
_transferConsiderationItem(id, c);
unchecked {
++i;
}
}
// Validate the correct native value is sent with the transaction.if (msg.value!= totalNativeValue) {
revert InvalidTxValue(msg.value, totalNativeValue);
}
}
function_processTraitRedemptions(
TraitRedemption[] memory traitRedemptions,
uint256[] memory traitRedemptionTokenIds
) internal{
if (traitRedemptions.length!= traitRedemptionTokenIds.length) {
revert TraitRedemptionTokenIdsDontMatchTraitRedemptionsLength(
traitRedemptions.length, traitRedemptionTokenIds.length
);
}
_setTraits(traitRedemptions, traitRedemptionTokenIds);
}
function_processOfferItems(uint256 campaignId,
ConsiderationItem[] memory consideration,
OfferItem[] memory offer,
TraitRedemption[] memory traitRedemptions,
address recipient
) internal{
// Mint the new tokens.for (uint256 i; i < offer.length;) {
OfferItem memory offerItem = offer[i];
IRedemptionMintable(offerItem.token).mintRedemption(
campaignId, recipient, offerItem, consideration, traitRedemptions
);
unchecked {
++i;
}
}
}
function_setTraits(TraitRedemption[] memory traitRedemptions, uint256[] memory traitRedemptionTokenIds) internal{
// Iterate over the trait redemptions and set traits on the tokens.for (uint256 i; i < traitRedemptions.length;) {
// Get the trait redemption identifier and place on the stack.uint256 identifier = traitRedemptionTokenIds[i];
// Declare a new block to manage stack depth.
{
// Get the substandard and place on the stack.uint8 substandard = traitRedemptions[i].substandard;
// Get the substandard value and place on the stack.bytes32 substandardValue = traitRedemptions[i].substandardValue;
// Get the token and place on the stack.address token = traitRedemptions[i].token;
// Get the trait key and place on the stack.bytes32 traitKey = traitRedemptions[i].traitKey;
// Get the trait value and place on the stack.bytes32 traitValue = traitRedemptions[i].traitValue;
// Get the current trait value and place on the stack.bytes32 currentTraitValue = IERC7496(token).getTraitValue(identifier, traitKey);
// If substandard is 1, set trait to traitValue.if (substandard ==1) {
// Revert if the current trait value does not match the substandard value.if (currentTraitValue != substandardValue) {
revert InvalidRequiredTraitValue(
token, identifier, traitKey, currentTraitValue, substandardValue
);
}
// Set the trait to the trait value.
IERC7496(token).setTrait(identifier, traitRedemptions[i].traitKey, traitValue);
// If substandard is 2, increment trait by traitValue.
} elseif (substandard ==2) {
// Revert if the current trait value is greater than the substandard value.if (currentTraitValue > substandardValue) {
revert InvalidRequiredTraitValue(
token, identifier, traitKey, currentTraitValue, substandardValue
);
}
// Increment the trait by the trait value.uint256 newTraitValue =uint256(currentTraitValue) +uint256(traitValue);
IERC7496(token).setTrait(identifier, traitRedemptions[i].traitKey, bytes32(newTraitValue));
} elseif (substandard ==3) {
// Revert if the current trait value is less than the substandard value.if (currentTraitValue < substandardValue) {
revert InvalidRequiredTraitValue(
token, identifier, traitKey, currentTraitValue, substandardValue
);
}
uint256 newTraitValue =uint256(currentTraitValue) -uint256(traitValue);
// Decrement the trait by the trait value.
IERC7496(token).setTrait(identifier, traitRedemptions[i].traitKey, bytes32(newTraitValue));
} elseif (substandard ==4) {
// Revert if the current trait value is not equal to the trait value.if (currentTraitValue != traitValue) {
revert InvalidRequiredTraitValue(
token, identifier, traitKey, currentTraitValue, substandardValue
);
}
// No-op: substandard 4 has no set trait action.
}
}
unchecked {
++i;
}
}
}
functionsupportsInterface(bytes4 interfaceId)
publicviewvirtualoverride(IERC165, DynamicTraits)
returns (bool)
{
return interfaceId ==type(IERC7498).interfaceId|| interfaceId ==type(IERC165).interfaceId|| interfaceId ==type(IERC7496).interfaceId;
}
}
Código Fuente del Contrato
Archivo 21 de 45: EnumerableSet.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.pragmasolidity ^0.8.20;/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/libraryEnumerableSet{
// To implement this library for multiple types with as little code// repetition as possible, we write it in terms of a generic Set type with// bytes32 values.// The Set implementation uses private functions, and user-facing// implementations (such as AddressSet) are just wrappers around the// underlying Set.// This means that we can only create new EnumerableSets for types that fit// in bytes32.structSet {
// Storage of set valuesbytes32[] _values;
// Position is the index of the value in the `values` array plus 1.// Position 0 is used to mean a value is not in the set.mapping(bytes32 value =>uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/function_add(Set storage set, bytes32 value) privatereturns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes// and use 0 as a sentinel value
set._positions[value] = set._values.length;
returntrue;
} else {
returnfalse;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/function_remove(Set storage set, bytes32 value) privatereturns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slotuint256 position = set._positions[value];
if (position !=0) {
// Equivalent to contains(set, value)// To delete an element from the _values array in O(1), we swap the element to delete with the last one in// the array, and then remove the last element (sometimes called as 'swap and pop').// This modifies the order of the array, as noted in {at}.uint256 valueIndex = position -1;
uint256 lastIndex = set._values.length-1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slotdelete set._positions[value];
returntrue;
} else {
returnfalse;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/function_contains(Set storage set, bytes32 value) privateviewreturns (bool) {
return set._positions[value] !=0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/function_length(Set storage set) privateviewreturns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/function_at(Set storage set, uint256 index) privateviewreturns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/function_values(Set storage set) privateviewreturns (bytes32[] memory) {
return set._values;
}
// Bytes32SetstructBytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/functionadd(Bytes32Set storage set, bytes32 value) internalreturns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/functionremove(Bytes32Set storage set, bytes32 value) internalreturns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/functioncontains(Bytes32Set storage set, bytes32 value) internalviewreturns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/functionlength(Bytes32Set storage set) internalviewreturns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/functionat(Bytes32Set storage set, uint256 index) internalviewreturns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/functionvalues(Bytes32Set storage set) internalviewreturns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assemblyassembly {
result := store
}
return result;
}
// AddressSetstructAddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/functionadd(AddressSet storage set, address value) internalreturns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/functionremove(AddressSet storage set, address value) internalreturns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/functioncontains(AddressSet storage set, address value) internalviewreturns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/functionlength(AddressSet storage set) internalviewreturns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/functionat(AddressSet storage set, uint256 index) internalviewreturns (address) {
returnaddress(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/functionvalues(AddressSet storage set) internalviewreturns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assemblyassembly {
result := store
}
return result;
}
// UintSetstructUintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/functionadd(UintSet storage set, uint256 value) internalreturns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/functionremove(UintSet storage set, uint256 value) internalreturns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/functioncontains(UintSet storage set, uint256 value) internalviewreturns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/functionlength(UintSet storage set) internalviewreturns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/functionat(UintSet storage set, uint256 index) internalviewreturns (uint256) {
returnuint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/functionvalues(UintSet storage set) internalviewreturns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assemblyassembly {
result := store
}
return result;
}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)pragmasolidity ^0.8.20;import {IERC1155} from"../IERC1155.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*/interfaceIERC1155MetadataURIisIERC1155{
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/functionuri(uint256 id) externalviewreturns (stringmemory);
}
Código Fuente del Contrato
Archivo 24 de 45: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)pragmasolidity ^0.8.20;import {IERC165} from"../../utils/introspection/IERC165.sol";
/**
* @dev Interface that must be implemented by smart contracts in order to receive
* ERC-1155 token transfers.
*/interfaceIERC1155ReceiverisIERC165{
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/functiononERC1155Received(address operator,
addressfrom,
uint256 id,
uint256 value,
bytescalldata data
) externalreturns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/functiononERC1155BatchReceived(address operator,
addressfrom,
uint256[] calldata ids,
uint256[] calldata values,
bytescalldata data
) externalreturns (bytes4);
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)pragmasolidity ^0.8.20;import {IERC20} from"../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/interfaceIERC20MetadataisIERC20{
/**
* @dev Returns the name of the token.
*/functionname() externalviewreturns (stringmemory);
/**
* @dev Returns the symbol of the token.
*/functionsymbol() externalviewreturns (stringmemory);
/**
* @dev Returns the decimals places of the token.
*/functiondecimals() externalviewreturns (uint8);
}
Código Fuente del Contrato
Archivo 28 de 45: IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)pragmasolidity ^0.8.20;import {IERC165} from"../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/interfaceIERC721isIERC165{
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/eventTransfer(addressindexedfrom, addressindexed to, uint256indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/eventApproval(addressindexed owner, addressindexed approved, uint256indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/eventApprovalForAll(addressindexed owner, addressindexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/functionbalanceOf(address owner) externalviewreturns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/functionownerOf(uint256 tokenId) externalviewreturns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/functionsafeTransferFrom(addressfrom, address to, uint256 tokenId, bytescalldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/functionsafeTransferFrom(addressfrom, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/functionapprove(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/functionsetApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/functiongetApproved(uint256 tokenId) externalviewreturns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/functionisApprovedForAll(address owner, address operator) externalviewreturns (bool);
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)pragmasolidity ^0.8.20;/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/interfaceIERC721Receiver{
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/functiononERC721Received(address operator,
addressfrom,
uint256 tokenId,
bytescalldata data
) externalreturns (bytes4);
}
// SPDX-License-Identifier: MITpragmasolidity ^0.8.17;interfaceIPreapprovalForAll{
/// @notice Emitted when a token contract preapproves (or revokes) all token transfers from a specific address, if/// the preapproval is configurable. This allows offchain indexers to correctly reflect token approvals/// which can later be revoked.eventPreapprovalForAll(addressindexed operator, boolindexed approved);
}
// SPDX-License-Identifier: MITpragmasolidity ^0.8.19;interfaceIShipyardContractMetadata{
/// @dev Emit an event for token metadata reveals/updates, according to EIP-4906.eventBatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
/// @dev Emit an event when the URI for the collection-level metadata is updated.eventContractURIUpdated(string uri);
/// @dev Emit an event when the provenance hash is updated.eventProvenanceHashUpdated(bytes32 oldProvenanceHash, bytes32 newProvenanceHash);
/// @dev Emit an event when the royalties info is updated.eventRoyaltyInfoUpdated(address receiver, uint256 basisPoints);
/// @dev Revert with an error when attempting to set the provenance hash after it has already been set.errorProvenanceHashCannotBeSetAfterAlreadyBeingSet();
functionname() externalviewreturns (stringmemory);
functionsymbol() externalviewreturns (stringmemory);
functionbaseURI() externalviewreturns (stringmemory);
functioncontractURI() externalviewreturns (stringmemory);
functionprovenanceHash() externalviewreturns (bytes32);
functionsetBaseURI(stringcalldata newURI) external;
functionsetContractURI(stringcalldata newURI) external;
functionsetProvenanceHash(bytes32 newProvenanceHash) external;
functionsetDefaultRoyalty(address receiver, uint96 feeNumerator) external;
}
Código Fuente del Contrato
Archivo 36 de 45: Math.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)pragmasolidity ^0.8.20;/**
* @dev Standard math utilities missing in the Solidity language.
*/libraryMath{
/**
* @dev Muldiv operation overflow.
*/errorMathOverflowedMulDiv();
enumRounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/functiontryAdd(uint256 a, uint256 b) internalpurereturns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/functiontrySub(uint256 a, uint256 b) internalpurereturns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/functiontryMul(uint256 a, uint256 b) internalpurereturns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the// benefit is lost if 'b' is also tested.// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522if (a ==0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/functiontryDiv(uint256 a, uint256 b) internalpurereturns (bool, uint256) {
unchecked {
if (b ==0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/functiontryMod(uint256 a, uint256 b) internalpurereturns (bool, uint256) {
unchecked {
if (b ==0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the largest of two numbers.
*/functionmax(uint256 a, uint256 b) internalpurereturns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/functionmin(uint256 a, uint256 b) internalpurereturns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/functionaverage(uint256 a, uint256 b) internalpurereturns (uint256) {
// (a + b) / 2 can overflow.return (a & b) + (a ^ b) /2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/functionceilDiv(uint256 a, uint256 b) internalpurereturns (uint256) {
if (b ==0) {
// Guarantee the same behavior as in a regular Solidity division.return a / b;
}
// (a + b - 1) / b can overflow on addition, so we distribute.return a ==0 ? 0 : (a -1) / b +1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/functionmulDiv(uint256 x, uint256 y, uint256 denominator) internalpurereturns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256// variables such that product = prod1 * 2^256 + prod0.uint256 prod0 = x * y; // Least significant 256 bits of the productuint256 prod1; // Most significant 256 bits of the productassembly {
let mm :=mulmod(x, y, not(0))
prod1 :=sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.if (prod1 ==0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.// The surrounding unchecked block does not change this fact.// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////// 512 by 256 division.///////////////////////////////////////////////// Make division exact by subtracting the remainder from [prod1 prod0].uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder :=mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 :=sub(prod1, gt(remainder, prod0))
prod0 :=sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.uint256 twos = denominator & (0- denominator);
assembly {
// Divide denominator by twos.
denominator :=div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 :=div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos :=add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for// four bits. That is, denominator * inv = 1 mod 2^4.uint256 inverse = (3* denominator) ^2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also// works in modular arithmetic, doubling the correct bits in each step.
inverse *=2- denominator * inverse; // inverse mod 2^8
inverse *=2- denominator * inverse; // inverse mod 2^16
inverse *=2- denominator * inverse; // inverse mod 2^32
inverse *=2- denominator * inverse; // inverse mod 2^64
inverse *=2- denominator * inverse; // inverse mod 2^128
inverse *=2- denominator * inverse; // inverse mod 2^256// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/functionmulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internalpurereturns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) &&mulmod(x, y, denominator) >0) {
result +=1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/functionsqrt(uint256 a) internalpurereturns (uint256) {
if (a ==0) {
return0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.//// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.//// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`//// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.uint256 result =1<< (log2(a) >>1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision// into the expected uint128 result.unchecked {
result = (result + a / result) >>1;
result = (result + a / result) >>1;
result = (result + a / result) >>1;
result = (result + a / result) >>1;
result = (result + a / result) >>1;
result = (result + a / result) >>1;
result = (result + a / result) >>1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/functionsqrt(uint256 a, Rounding rounding) internalpurereturns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/functionlog2(uint256 value) internalpurereturns (uint256) {
uint256 result =0;
unchecked {
if (value >>128>0) {
value >>=128;
result +=128;
}
if (value >>64>0) {
value >>=64;
result +=64;
}
if (value >>32>0) {
value >>=32;
result +=32;
}
if (value >>16>0) {
value >>=16;
result +=16;
}
if (value >>8>0) {
value >>=8;
result +=8;
}
if (value >>4>0) {
value >>=4;
result +=4;
}
if (value >>2>0) {
value >>=2;
result +=2;
}
if (value >>1>0) {
result +=1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/functionlog2(uint256 value, Rounding rounding) internalpurereturns (uint256) {
unchecked {
uint256 result =log2(value);
return result + (unsignedRoundsUp(rounding) &&1<< result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/functionlog10(uint256 value) internalpurereturns (uint256) {
uint256 result =0;
unchecked {
if (value >=10**64) {
value /=10**64;
result +=64;
}
if (value >=10**32) {
value /=10**32;
result +=32;
}
if (value >=10**16) {
value /=10**16;
result +=16;
}
if (value >=10**8) {
value /=10**8;
result +=8;
}
if (value >=10**4) {
value /=10**4;
result +=4;
}
if (value >=10**2) {
value /=10**2;
result +=2;
}
if (value >=10**1) {
result +=1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/functionlog10(uint256 value, Rounding rounding) internalpurereturns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) &&10** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/functionlog256(uint256 value) internalpurereturns (uint256) {
uint256 result =0;
unchecked {
if (value >>128>0) {
value >>=128;
result +=16;
}
if (value >>64>0) {
value >>=64;
result +=8;
}
if (value >>32>0) {
value >>=32;
result +=4;
}
if (value >>16>0) {
value >>=16;
result +=2;
}
if (value >>8>0) {
result +=1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/functionlog256(uint256 value, Rounding rounding) internalpurereturns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) &&1<< (result <<3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/functionunsignedRoundsUp(Rounding rounding) internalpurereturns (bool) {
returnuint8(rounding) %2==1;
}
}
Código Fuente del Contrato
Archivo 37 de 45: Ownable.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.4;/// @notice Simple single owner authorization mixin./// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)////// @dev Note:/// This implementation does NOT auto-initialize the owner to `msg.sender`./// You MUST call the `_initializeOwner` in the constructor / initializer.////// While the ownable portion follows/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,/// the nomenclature for the 2-step ownership handover may be unique to this codebase.abstractcontractOwnable{
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* CUSTOM ERRORS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The caller is not authorized to call the function.errorUnauthorized();
/// @dev The `newOwner` cannot be the zero address.errorNewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.errorNoHandoverRequest();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* EVENTS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The ownership is transferred from `oldOwner` to `newOwner`./// This event is intentionally kept the same as OpenZeppelin's Ownable to be/// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),/// despite it not being as lightweight as a single argument event.eventOwnershipTransferred(addressindexed oldOwner, addressindexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.eventOwnershipHandoverRequested(addressindexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.eventOwnershipHandoverCanceled(addressindexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.uint256privateconstant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.uint256privateconstant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.uint256privateconstant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* STORAGE *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`./// It is intentionally chosen to be a high value/// to avoid collision with lower slots./// The choice of manual storage layout is to enable compatibility/// with both regular and upgradeable contracts.uint256privateconstant _OWNER_SLOT_NOT =0x8b78c6d8;
/// The ownership handover slot of `newOwner` is given by:/// ```/// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))/// let handoverSlot := keccak256(0x00, 0x20)/// ```/// It stores the expiry timestamp of the two-step ownership handover.uint256privateconstant _HANDOVER_SLOT_SEED =0x389a75e1;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* INTERNAL FUNCTIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Initializes the owner directly without authorization guard./// This function must be called upon initialization,/// regardless of whether the contract is upgradeable or not./// This is to enable generalization to both regular and upgradeable contracts,/// and to save gas in case the initial owner is not the caller./// For performance reasons, this function will not check if there/// is an existing owner.function_initializeOwner(address newOwner) internalvirtual{
/// @solidity memory-safe-assemblyassembly {
// Clean the upper 96 bits.
newOwner :=shr(96, shl(96, newOwner))
// Store the new value.sstore(not(_OWNER_SLOT_NOT), newOwner)
// Emit the {OwnershipTransferred} event.log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
/// @dev Sets the owner directly without authorization guard.function_setOwner(address newOwner) internalvirtual{
/// @solidity memory-safe-assemblyassembly {
let ownerSlot :=not(_OWNER_SLOT_NOT)
// Clean the upper 96 bits.
newOwner :=shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.sstore(ownerSlot, newOwner)
}
}
/// @dev Throws if the sender is not the owner.function_checkOwner() internalviewvirtual{
/// @solidity memory-safe-assemblyassembly {
// If the caller is not the stored owner, revert.ifiszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.revert(0x1c, 0x04)
}
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds./// Override to return a different value if needed./// Made internal to conserve bytecode. Wrap it in a public function if needed.function_ownershipHandoverValidFor() internalviewvirtualreturns (uint64) {
return48*3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* PUBLIC UPDATE FUNCTIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Allows the owner to transfer the ownership to `newOwner`.functiontransferOwnership(address newOwner) publicpayablevirtualonlyOwner{
/// @solidity memory-safe-assemblyassembly {
ifiszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.functionrenounceOwnership() publicpayablevirtualonlyOwner{
_setOwner(address(0));
}
/// @dev Request a two-step ownership handover to the caller./// The request will automatically expire in 48 hours (172800 seconds) by default.functionrequestOwnershipHandover() publicpayablevirtual{
unchecked {
uint256 expires =block.timestamp+ _ownershipHandoverValidFor();
/// @solidity memory-safe-assemblyassembly {
// Compute and set the handover slot to `expires`.mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
// Emit the {OwnershipHandoverRequested} event.log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
/// @dev Cancels the two-step ownership handover to the caller, if any.functioncancelOwnershipHandover() publicpayablevirtual{
/// @solidity memory-safe-assemblyassembly {
// Compute and set the handover slot to 0.mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
// Emit the {OwnershipHandoverCanceled} event.log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
/// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`./// Reverts if there is no existing ownership handover requested by `pendingOwner`.functioncompleteOwnershipHandover(address pendingOwner) publicpayablevirtualonlyOwner{
/// @solidity memory-safe-assemblyassembly {
// Compute and set the handover slot to 0.mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot :=keccak256(0x0c, 0x20)
// If the handover does not exist, or has expired.ifgt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.revert(0x1c, 0x04)
}
// Set the handover slot to 0.sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* PUBLIC READ FUNCTIONS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Returns the owner of the contract.functionowner() publicviewvirtualreturns (address result) {
/// @solidity memory-safe-assemblyassembly {
result :=sload(not(_OWNER_SLOT_NOT))
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.functionownershipHandoverExpiresAt(address pendingOwner)
publicviewvirtualreturns (uint256 result)
{
/// @solidity memory-safe-assemblyassembly {
// Compute the handover slot.mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result :=sload(keccak256(0x0c, 0x20))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*//* MODIFIERS *//*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*//// @dev Marks a function as only callable by the owner.modifieronlyOwner() virtual{
_checkOwner();
_;
}
}
Código Fuente del Contrato
Archivo 38 de 45: PointerLibraries.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.13;type CalldataPointer isuint256;
type ReturndataPointer isuint256;
type MemoryPointer isuint256;
usingCalldataPointerLibforCalldataPointerglobal;
usingMemoryPointerLibforMemoryPointerglobal;
usingReturndataPointerLibforReturndataPointerglobal;
usingCalldataReadersforCalldataPointerglobal;
usingReturndataReadersforReturndataPointerglobal;
usingMemoryReadersforMemoryPointerglobal;
usingMemoryWritersforMemoryPointerglobal;
CalldataPointer constant CalldataStart = CalldataPointer.wrap(0x04);
MemoryPointer constant FreeMemoryPPtr = MemoryPointer.wrap(0x40);
uint256constant IdentityPrecompileAddress =0x4;
uint256constant OffsetOrLengthMask =0xffffffff;
uint256constant _OneWord =0x20;
uint256constant _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-visibilityfunctionmalloc(uint256 size) purereturns (MemoryPointer mPtr) {
assembly {
mPtr :=mload(_FreeMemoryPointerSlot)
mstore(_FreeMemoryPointerSlot, add(mPtr, size))
}
}
// (Free functions cannot have visibility.)// solhint-disable-next-line func-visibilityfunctiongetFreeMemoryPointer() purereturns (MemoryPointer mPtr) {
mPtr = FreeMemoryPPtr.readMemoryPointer();
}
// (Free functions cannot have visibility.)// solhint-disable-next-line func-visibilityfunctionsetFreeMemoryPointer(MemoryPointer mPtr) pure{
FreeMemoryPPtr.write(mPtr);
}
libraryCalldataPointerLib{
functionlt(
CalldataPointer a,
CalldataPointer b
) internalpurereturns (bool c) {
assembly {
c :=lt(a, b)
}
}
functiongt(
CalldataPointer a,
CalldataPointer b
) internalpurereturns (bool c) {
assembly {
c :=gt(a, b)
}
}
functioneq(
CalldataPointer a,
CalldataPointer b
) internalpurereturns (bool c) {
assembly {
c :=eq(a, b)
}
}
functionisNull(CalldataPointer a) internalpurereturns (bool b) {
assembly {
b :=iszero(a)
}
}
/// @dev Resolves an offset stored at `cdPtr + headOffset` to a calldata./// pointer `cdPtr` must point to some parent object with a dynamic/// type's head stored at `cdPtr + headOffset`.functionpptr(
CalldataPointer cdPtr,
uint256 headOffset
) internalpurereturns (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; }`functionpptr(
CalldataPointer cdPtr
) internalpurereturns (CalldataPointer cdPtrChild) {
cdPtrChild = cdPtr.offset(cdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the calldata pointer one word after `cdPtr`.functionnext(
CalldataPointer cdPtr
) internalpurereturns (CalldataPointer cdPtrNext) {
assembly {
cdPtrNext :=add(cdPtr, _OneWord)
}
}
/// @dev Returns the calldata pointer `_offset` bytes after `cdPtr`.functionoffset(
CalldataPointer cdPtr,
uint256 _offset
) internalpurereturns (CalldataPointer cdPtrNext) {
assembly {
cdPtrNext :=add(cdPtr, _offset)
}
}
/// @dev Copies `size` bytes from calldata starting at `src` to memory at/// `dst`.functioncopy(
CalldataPointer src,
MemoryPointer dst,
uint256 size
) internalpure{
assembly {
calldatacopy(dst, src, size)
}
}
}
libraryReturndataPointerLib{
functionlt(
ReturndataPointer a,
ReturndataPointer b
) internalpurereturns (bool c) {
assembly {
c :=lt(a, b)
}
}
functiongt(
ReturndataPointer a,
ReturndataPointer b
) internalpurereturns (bool c) {
assembly {
c :=gt(a, b)
}
}
functioneq(
ReturndataPointer a,
ReturndataPointer b
) internalpurereturns (bool c) {
assembly {
c :=eq(a, b)
}
}
functionisNull(ReturndataPointer a) internalpurereturns (bool b) {
assembly {
b :=iszero(a)
}
}
/// @dev Resolves an offset stored at `rdPtr + headOffset` to a returndata/// pointer. `rdPtr` must point to some parent object with a dynamic/// type's head stored at `rdPtr + headOffset`.functionpptr(
ReturndataPointer rdPtr,
uint256 headOffset
) internalpurereturns (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; }`functionpptr(
ReturndataPointer rdPtr
) internalpurereturns (ReturndataPointer rdPtrChild) {
rdPtrChild = rdPtr.offset(rdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the returndata pointer one word after `cdPtr`.functionnext(
ReturndataPointer rdPtr
) internalpurereturns (ReturndataPointer rdPtrNext) {
assembly {
rdPtrNext :=add(rdPtr, _OneWord)
}
}
/// @dev Returns the returndata pointer `_offset` bytes after `cdPtr`.functionoffset(
ReturndataPointer rdPtr,
uint256 _offset
) internalpurereturns (ReturndataPointer rdPtrNext) {
assembly {
rdPtrNext :=add(rdPtr, _offset)
}
}
/// @dev Copies `size` bytes from returndata starting at `src` to memory at/// `dst`.functioncopy(
ReturndataPointer src,
MemoryPointer dst,
uint256 size
) internalpure{
assembly {
returndatacopy(dst, src, size)
}
}
}
libraryMemoryPointerLib{
functioncopy(
MemoryPointer src,
MemoryPointer dst,
uint256 size
) internalview{
assembly {
let success :=staticcall(
gas(),
IdentityPrecompileAddress,
src,
size,
dst,
size
)
ifor(iszero(returndatasize()), iszero(success)) {
revert(0, 0)
}
}
}
functionlt(
MemoryPointer a,
MemoryPointer b
) internalpurereturns (bool c) {
assembly {
c :=lt(a, b)
}
}
functiongt(
MemoryPointer a,
MemoryPointer b
) internalpurereturns (bool c) {
assembly {
c :=gt(a, b)
}
}
functioneq(
MemoryPointer a,
MemoryPointer b
) internalpurereturns (bool c) {
assembly {
c :=eq(a, b)
}
}
functionisNull(MemoryPointer a) internalpurereturns (bool b) {
assembly {
b :=iszero(a)
}
}
functionhash(
MemoryPointer ptr,
uint256 length
) internalpurereturns (bytes32 _hash) {
assembly {
_hash :=keccak256(ptr, length)
}
}
/// @dev Returns the memory pointer one word after `mPtr`.functionnext(
MemoryPointer mPtr
) internalpurereturns (MemoryPointer mPtrNext) {
assembly {
mPtrNext :=add(mPtr, _OneWord)
}
}
/// @dev Returns the memory pointer `_offset` bytes after `mPtr`.functionoffset(
MemoryPointer mPtr,
uint256 _offset
) internalpurereturns (MemoryPointer mPtrNext) {
assembly {
mPtrNext :=add(mPtr, _offset)
}
}
/// @dev Resolves a pointer at `mPtr + headOffset` to a memory/// pointer. `mPtr` must point to some parent object with a dynamic/// type's pointer stored at `mPtr + headOffset`.functionpptr(
MemoryPointer mPtr,
uint256 headOffset
) internalpurereturns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.offset(headOffset).readMemoryPointer();
}
/// @dev Resolves a pointer stored at `mPtr` to a memory pointer./// `mPtr` must point to some parent object with a dynamic type as its/// first member, e.g. `struct { bytes data; }`functionpptr(
MemoryPointer mPtr
) internalpurereturns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.readMemoryPointer();
}
}
libraryCalldataReaders{
/// @dev Reads the value at `cdPtr` and applies a mask to return only the/// last 4 bytes.functionreadMaskedUint256(
CalldataPointer cdPtr
) internalpurereturns (uint256 value) {
value = cdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `cdPtr` in calldata.functionreadBool(
CalldataPointer cdPtr
) internalpurereturns (bool value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the address at `cdPtr` in calldata.functionreadAddress(
CalldataPointer cdPtr
) internalpurereturns (address value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes1 at `cdPtr` in calldata.functionreadBytes1(
CalldataPointer cdPtr
) internalpurereturns (bytes1 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes2 at `cdPtr` in calldata.functionreadBytes2(
CalldataPointer cdPtr
) internalpurereturns (bytes2 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes3 at `cdPtr` in calldata.functionreadBytes3(
CalldataPointer cdPtr
) internalpurereturns (bytes3 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes4 at `cdPtr` in calldata.functionreadBytes4(
CalldataPointer cdPtr
) internalpurereturns (bytes4 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes5 at `cdPtr` in calldata.functionreadBytes5(
CalldataPointer cdPtr
) internalpurereturns (bytes5 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes6 at `cdPtr` in calldata.functionreadBytes6(
CalldataPointer cdPtr
) internalpurereturns (bytes6 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes7 at `cdPtr` in calldata.functionreadBytes7(
CalldataPointer cdPtr
) internalpurereturns (bytes7 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes8 at `cdPtr` in calldata.functionreadBytes8(
CalldataPointer cdPtr
) internalpurereturns (bytes8 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes9 at `cdPtr` in calldata.functionreadBytes9(
CalldataPointer cdPtr
) internalpurereturns (bytes9 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes10 at `cdPtr` in calldata.functionreadBytes10(
CalldataPointer cdPtr
) internalpurereturns (bytes10 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes11 at `cdPtr` in calldata.functionreadBytes11(
CalldataPointer cdPtr
) internalpurereturns (bytes11 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes12 at `cdPtr` in calldata.functionreadBytes12(
CalldataPointer cdPtr
) internalpurereturns (bytes12 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes13 at `cdPtr` in calldata.functionreadBytes13(
CalldataPointer cdPtr
) internalpurereturns (bytes13 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes14 at `cdPtr` in calldata.functionreadBytes14(
CalldataPointer cdPtr
) internalpurereturns (bytes14 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes15 at `cdPtr` in calldata.functionreadBytes15(
CalldataPointer cdPtr
) internalpurereturns (bytes15 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes16 at `cdPtr` in calldata.functionreadBytes16(
CalldataPointer cdPtr
) internalpurereturns (bytes16 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes17 at `cdPtr` in calldata.functionreadBytes17(
CalldataPointer cdPtr
) internalpurereturns (bytes17 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes18 at `cdPtr` in calldata.functionreadBytes18(
CalldataPointer cdPtr
) internalpurereturns (bytes18 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes19 at `cdPtr` in calldata.functionreadBytes19(
CalldataPointer cdPtr
) internalpurereturns (bytes19 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes20 at `cdPtr` in calldata.functionreadBytes20(
CalldataPointer cdPtr
) internalpurereturns (bytes20 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes21 at `cdPtr` in calldata.functionreadBytes21(
CalldataPointer cdPtr
) internalpurereturns (bytes21 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes22 at `cdPtr` in calldata.functionreadBytes22(
CalldataPointer cdPtr
) internalpurereturns (bytes22 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes23 at `cdPtr` in calldata.functionreadBytes23(
CalldataPointer cdPtr
) internalpurereturns (bytes23 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes24 at `cdPtr` in calldata.functionreadBytes24(
CalldataPointer cdPtr
) internalpurereturns (bytes24 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes25 at `cdPtr` in calldata.functionreadBytes25(
CalldataPointer cdPtr
) internalpurereturns (bytes25 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes26 at `cdPtr` in calldata.functionreadBytes26(
CalldataPointer cdPtr
) internalpurereturns (bytes26 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes27 at `cdPtr` in calldata.functionreadBytes27(
CalldataPointer cdPtr
) internalpurereturns (bytes27 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes28 at `cdPtr` in calldata.functionreadBytes28(
CalldataPointer cdPtr
) internalpurereturns (bytes28 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes29 at `cdPtr` in calldata.functionreadBytes29(
CalldataPointer cdPtr
) internalpurereturns (bytes29 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes30 at `cdPtr` in calldata.functionreadBytes30(
CalldataPointer cdPtr
) internalpurereturns (bytes30 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes31 at `cdPtr` in calldata.functionreadBytes31(
CalldataPointer cdPtr
) internalpurereturns (bytes31 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the bytes32 at `cdPtr` in calldata.functionreadBytes32(
CalldataPointer cdPtr
) internalpurereturns (bytes32 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint8 at `cdPtr` in calldata.functionreadUint8(
CalldataPointer cdPtr
) internalpurereturns (uint8 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint16 at `cdPtr` in calldata.functionreadUint16(
CalldataPointer cdPtr
) internalpurereturns (uint16 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint24 at `cdPtr` in calldata.functionreadUint24(
CalldataPointer cdPtr
) internalpurereturns (uint24 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint32 at `cdPtr` in calldata.functionreadUint32(
CalldataPointer cdPtr
) internalpurereturns (uint32 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint40 at `cdPtr` in calldata.functionreadUint40(
CalldataPointer cdPtr
) internalpurereturns (uint40 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint48 at `cdPtr` in calldata.functionreadUint48(
CalldataPointer cdPtr
) internalpurereturns (uint48 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint56 at `cdPtr` in calldata.functionreadUint56(
CalldataPointer cdPtr
) internalpurereturns (uint56 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint64 at `cdPtr` in calldata.functionreadUint64(
CalldataPointer cdPtr
) internalpurereturns (uint64 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint72 at `cdPtr` in calldata.functionreadUint72(
CalldataPointer cdPtr
) internalpurereturns (uint72 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint80 at `cdPtr` in calldata.functionreadUint80(
CalldataPointer cdPtr
) internalpurereturns (uint80 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint88 at `cdPtr` in calldata.functionreadUint88(
CalldataPointer cdPtr
) internalpurereturns (uint88 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint96 at `cdPtr` in calldata.functionreadUint96(
CalldataPointer cdPtr
) internalpurereturns (uint96 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint104 at `cdPtr` in calldata.functionreadUint104(
CalldataPointer cdPtr
) internalpurereturns (uint104 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint112 at `cdPtr` in calldata.functionreadUint112(
CalldataPointer cdPtr
) internalpurereturns (uint112 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint120 at `cdPtr` in calldata.functionreadUint120(
CalldataPointer cdPtr
) internalpurereturns (uint120 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint128 at `cdPtr` in calldata.functionreadUint128(
CalldataPointer cdPtr
) internalpurereturns (uint128 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint136 at `cdPtr` in calldata.functionreadUint136(
CalldataPointer cdPtr
) internalpurereturns (uint136 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint144 at `cdPtr` in calldata.functionreadUint144(
CalldataPointer cdPtr
) internalpurereturns (uint144 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint152 at `cdPtr` in calldata.functionreadUint152(
CalldataPointer cdPtr
) internalpurereturns (uint152 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint160 at `cdPtr` in calldata.functionreadUint160(
CalldataPointer cdPtr
) internalpurereturns (uint160 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint168 at `cdPtr` in calldata.functionreadUint168(
CalldataPointer cdPtr
) internalpurereturns (uint168 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint176 at `cdPtr` in calldata.functionreadUint176(
CalldataPointer cdPtr
) internalpurereturns (uint176 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint184 at `cdPtr` in calldata.functionreadUint184(
CalldataPointer cdPtr
) internalpurereturns (uint184 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint192 at `cdPtr` in calldata.functionreadUint192(
CalldataPointer cdPtr
) internalpurereturns (uint192 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint200 at `cdPtr` in calldata.functionreadUint200(
CalldataPointer cdPtr
) internalpurereturns (uint200 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint208 at `cdPtr` in calldata.functionreadUint208(
CalldataPointer cdPtr
) internalpurereturns (uint208 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint216 at `cdPtr` in calldata.functionreadUint216(
CalldataPointer cdPtr
) internalpurereturns (uint216 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint224 at `cdPtr` in calldata.functionreadUint224(
CalldataPointer cdPtr
) internalpurereturns (uint224 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint232 at `cdPtr` in calldata.functionreadUint232(
CalldataPointer cdPtr
) internalpurereturns (uint232 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint240 at `cdPtr` in calldata.functionreadUint240(
CalldataPointer cdPtr
) internalpurereturns (uint240 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint248 at `cdPtr` in calldata.functionreadUint248(
CalldataPointer cdPtr
) internalpurereturns (uint248 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the uint256 at `cdPtr` in calldata.functionreadUint256(
CalldataPointer cdPtr
) internalpurereturns (uint256 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int8 at `cdPtr` in calldata.functionreadInt8(
CalldataPointer cdPtr
) internalpurereturns (int8 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int16 at `cdPtr` in calldata.functionreadInt16(
CalldataPointer cdPtr
) internalpurereturns (int16 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int24 at `cdPtr` in calldata.functionreadInt24(
CalldataPointer cdPtr
) internalpurereturns (int24 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int32 at `cdPtr` in calldata.functionreadInt32(
CalldataPointer cdPtr
) internalpurereturns (int32 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int40 at `cdPtr` in calldata.functionreadInt40(
CalldataPointer cdPtr
) internalpurereturns (int40 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int48 at `cdPtr` in calldata.functionreadInt48(
CalldataPointer cdPtr
) internalpurereturns (int48 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int56 at `cdPtr` in calldata.functionreadInt56(
CalldataPointer cdPtr
) internalpurereturns (int56 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int64 at `cdPtr` in calldata.functionreadInt64(
CalldataPointer cdPtr
) internalpurereturns (int64 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int72 at `cdPtr` in calldata.functionreadInt72(
CalldataPointer cdPtr
) internalpurereturns (int72 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int80 at `cdPtr` in calldata.functionreadInt80(
CalldataPointer cdPtr
) internalpurereturns (int80 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int88 at `cdPtr` in calldata.functionreadInt88(
CalldataPointer cdPtr
) internalpurereturns (int88 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int96 at `cdPtr` in calldata.functionreadInt96(
CalldataPointer cdPtr
) internalpurereturns (int96 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int104 at `cdPtr` in calldata.functionreadInt104(
CalldataPointer cdPtr
) internalpurereturns (int104 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int112 at `cdPtr` in calldata.functionreadInt112(
CalldataPointer cdPtr
) internalpurereturns (int112 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int120 at `cdPtr` in calldata.functionreadInt120(
CalldataPointer cdPtr
) internalpurereturns (int120 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int128 at `cdPtr` in calldata.functionreadInt128(
CalldataPointer cdPtr
) internalpurereturns (int128 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int136 at `cdPtr` in calldata.functionreadInt136(
CalldataPointer cdPtr
) internalpurereturns (int136 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int144 at `cdPtr` in calldata.functionreadInt144(
CalldataPointer cdPtr
) internalpurereturns (int144 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int152 at `cdPtr` in calldata.functionreadInt152(
CalldataPointer cdPtr
) internalpurereturns (int152 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int160 at `cdPtr` in calldata.functionreadInt160(
CalldataPointer cdPtr
) internalpurereturns (int160 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int168 at `cdPtr` in calldata.functionreadInt168(
CalldataPointer cdPtr
) internalpurereturns (int168 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int176 at `cdPtr` in calldata.functionreadInt176(
CalldataPointer cdPtr
) internalpurereturns (int176 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int184 at `cdPtr` in calldata.functionreadInt184(
CalldataPointer cdPtr
) internalpurereturns (int184 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int192 at `cdPtr` in calldata.functionreadInt192(
CalldataPointer cdPtr
) internalpurereturns (int192 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int200 at `cdPtr` in calldata.functionreadInt200(
CalldataPointer cdPtr
) internalpurereturns (int200 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int208 at `cdPtr` in calldata.functionreadInt208(
CalldataPointer cdPtr
) internalpurereturns (int208 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int216 at `cdPtr` in calldata.functionreadInt216(
CalldataPointer cdPtr
) internalpurereturns (int216 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int224 at `cdPtr` in calldata.functionreadInt224(
CalldataPointer cdPtr
) internalpurereturns (int224 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int232 at `cdPtr` in calldata.functionreadInt232(
CalldataPointer cdPtr
) internalpurereturns (int232 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int240 at `cdPtr` in calldata.functionreadInt240(
CalldataPointer cdPtr
) internalpurereturns (int240 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int248 at `cdPtr` in calldata.functionreadInt248(
CalldataPointer cdPtr
) internalpurereturns (int248 value) {
assembly {
value :=calldataload(cdPtr)
}
}
/// @dev Reads the int256 at `cdPtr` in calldata.functionreadInt256(
CalldataPointer cdPtr
) internalpurereturns (int256 value) {
assembly {
value :=calldataload(cdPtr)
}
}
}
libraryReturndataReaders{
/// @dev Reads value at `rdPtr` & applies a mask to return only last 4 bytesfunctionreadMaskedUint256(
ReturndataPointer rdPtr
) internalpurereturns (uint256 value) {
value = rdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `rdPtr` in returndata.functionreadBool(
ReturndataPointer rdPtr
) internalpurereturns (bool value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the address at `rdPtr` in returndata.functionreadAddress(
ReturndataPointer rdPtr
) internalpurereturns (address value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes1 at `rdPtr` in returndata.functionreadBytes1(
ReturndataPointer rdPtr
) internalpurereturns (bytes1 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes2 at `rdPtr` in returndata.functionreadBytes2(
ReturndataPointer rdPtr
) internalpurereturns (bytes2 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes3 at `rdPtr` in returndata.functionreadBytes3(
ReturndataPointer rdPtr
) internalpurereturns (bytes3 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes4 at `rdPtr` in returndata.functionreadBytes4(
ReturndataPointer rdPtr
) internalpurereturns (bytes4 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes5 at `rdPtr` in returndata.functionreadBytes5(
ReturndataPointer rdPtr
) internalpurereturns (bytes5 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes6 at `rdPtr` in returndata.functionreadBytes6(
ReturndataPointer rdPtr
) internalpurereturns (bytes6 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes7 at `rdPtr` in returndata.functionreadBytes7(
ReturndataPointer rdPtr
) internalpurereturns (bytes7 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes8 at `rdPtr` in returndata.functionreadBytes8(
ReturndataPointer rdPtr
) internalpurereturns (bytes8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes9 at `rdPtr` in returndata.functionreadBytes9(
ReturndataPointer rdPtr
) internalpurereturns (bytes9 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes10 at `rdPtr` in returndata.functionreadBytes10(
ReturndataPointer rdPtr
) internalpurereturns (bytes10 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes11 at `rdPtr` in returndata.functionreadBytes11(
ReturndataPointer rdPtr
) internalpurereturns (bytes11 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes12 at `rdPtr` in returndata.functionreadBytes12(
ReturndataPointer rdPtr
) internalpurereturns (bytes12 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes13 at `rdPtr` in returndata.functionreadBytes13(
ReturndataPointer rdPtr
) internalpurereturns (bytes13 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes14 at `rdPtr` in returndata.functionreadBytes14(
ReturndataPointer rdPtr
) internalpurereturns (bytes14 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes15 at `rdPtr` in returndata.functionreadBytes15(
ReturndataPointer rdPtr
) internalpurereturns (bytes15 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes16 at `rdPtr` in returndata.functionreadBytes16(
ReturndataPointer rdPtr
) internalpurereturns (bytes16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes17 at `rdPtr` in returndata.functionreadBytes17(
ReturndataPointer rdPtr
) internalpurereturns (bytes17 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes18 at `rdPtr` in returndata.functionreadBytes18(
ReturndataPointer rdPtr
) internalpurereturns (bytes18 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes19 at `rdPtr` in returndata.functionreadBytes19(
ReturndataPointer rdPtr
) internalpurereturns (bytes19 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes20 at `rdPtr` in returndata.functionreadBytes20(
ReturndataPointer rdPtr
) internalpurereturns (bytes20 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes21 at `rdPtr` in returndata.functionreadBytes21(
ReturndataPointer rdPtr
) internalpurereturns (bytes21 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes22 at `rdPtr` in returndata.functionreadBytes22(
ReturndataPointer rdPtr
) internalpurereturns (bytes22 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes23 at `rdPtr` in returndata.functionreadBytes23(
ReturndataPointer rdPtr
) internalpurereturns (bytes23 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes24 at `rdPtr` in returndata.functionreadBytes24(
ReturndataPointer rdPtr
) internalpurereturns (bytes24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes25 at `rdPtr` in returndata.functionreadBytes25(
ReturndataPointer rdPtr
) internalpurereturns (bytes25 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes26 at `rdPtr` in returndata.functionreadBytes26(
ReturndataPointer rdPtr
) internalpurereturns (bytes26 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes27 at `rdPtr` in returndata.functionreadBytes27(
ReturndataPointer rdPtr
) internalpurereturns (bytes27 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes28 at `rdPtr` in returndata.functionreadBytes28(
ReturndataPointer rdPtr
) internalpurereturns (bytes28 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes29 at `rdPtr` in returndata.functionreadBytes29(
ReturndataPointer rdPtr
) internalpurereturns (bytes29 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes30 at `rdPtr` in returndata.functionreadBytes30(
ReturndataPointer rdPtr
) internalpurereturns (bytes30 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes31 at `rdPtr` in returndata.functionreadBytes31(
ReturndataPointer rdPtr
) internalpurereturns (bytes31 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the bytes32 at `rdPtr` in returndata.functionreadBytes32(
ReturndataPointer rdPtr
) internalpurereturns (bytes32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint8 at `rdPtr` in returndata.functionreadUint8(
ReturndataPointer rdPtr
) internalpurereturns (uint8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint16 at `rdPtr` in returndata.functionreadUint16(
ReturndataPointer rdPtr
) internalpurereturns (uint16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint24 at `rdPtr` in returndata.functionreadUint24(
ReturndataPointer rdPtr
) internalpurereturns (uint24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint32 at `rdPtr` in returndata.functionreadUint32(
ReturndataPointer rdPtr
) internalpurereturns (uint32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint40 at `rdPtr` in returndata.functionreadUint40(
ReturndataPointer rdPtr
) internalpurereturns (uint40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint48 at `rdPtr` in returndata.functionreadUint48(
ReturndataPointer rdPtr
) internalpurereturns (uint48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint56 at `rdPtr` in returndata.functionreadUint56(
ReturndataPointer rdPtr
) internalpurereturns (uint56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint64 at `rdPtr` in returndata.functionreadUint64(
ReturndataPointer rdPtr
) internalpurereturns (uint64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint72 at `rdPtr` in returndata.functionreadUint72(
ReturndataPointer rdPtr
) internalpurereturns (uint72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint80 at `rdPtr` in returndata.functionreadUint80(
ReturndataPointer rdPtr
) internalpurereturns (uint80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint88 at `rdPtr` in returndata.functionreadUint88(
ReturndataPointer rdPtr
) internalpurereturns (uint88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint96 at `rdPtr` in returndata.functionreadUint96(
ReturndataPointer rdPtr
) internalpurereturns (uint96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint104 at `rdPtr` in returndata.functionreadUint104(
ReturndataPointer rdPtr
) internalpurereturns (uint104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint112 at `rdPtr` in returndata.functionreadUint112(
ReturndataPointer rdPtr
) internalpurereturns (uint112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint120 at `rdPtr` in returndata.functionreadUint120(
ReturndataPointer rdPtr
) internalpurereturns (uint120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint128 at `rdPtr` in returndata.functionreadUint128(
ReturndataPointer rdPtr
) internalpurereturns (uint128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint136 at `rdPtr` in returndata.functionreadUint136(
ReturndataPointer rdPtr
) internalpurereturns (uint136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint144 at `rdPtr` in returndata.functionreadUint144(
ReturndataPointer rdPtr
) internalpurereturns (uint144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint152 at `rdPtr` in returndata.functionreadUint152(
ReturndataPointer rdPtr
) internalpurereturns (uint152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint160 at `rdPtr` in returndata.functionreadUint160(
ReturndataPointer rdPtr
) internalpurereturns (uint160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint168 at `rdPtr` in returndata.functionreadUint168(
ReturndataPointer rdPtr
) internalpurereturns (uint168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint176 at `rdPtr` in returndata.functionreadUint176(
ReturndataPointer rdPtr
) internalpurereturns (uint176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint184 at `rdPtr` in returndata.functionreadUint184(
ReturndataPointer rdPtr
) internalpurereturns (uint184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint192 at `rdPtr` in returndata.functionreadUint192(
ReturndataPointer rdPtr
) internalpurereturns (uint192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint200 at `rdPtr` in returndata.functionreadUint200(
ReturndataPointer rdPtr
) internalpurereturns (uint200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint208 at `rdPtr` in returndata.functionreadUint208(
ReturndataPointer rdPtr
) internalpurereturns (uint208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint216 at `rdPtr` in returndata.functionreadUint216(
ReturndataPointer rdPtr
) internalpurereturns (uint216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint224 at `rdPtr` in returndata.functionreadUint224(
ReturndataPointer rdPtr
) internalpurereturns (uint224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint232 at `rdPtr` in returndata.functionreadUint232(
ReturndataPointer rdPtr
) internalpurereturns (uint232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint240 at `rdPtr` in returndata.functionreadUint240(
ReturndataPointer rdPtr
) internalpurereturns (uint240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint248 at `rdPtr` in returndata.functionreadUint248(
ReturndataPointer rdPtr
) internalpurereturns (uint248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the uint256 at `rdPtr` in returndata.functionreadUint256(
ReturndataPointer rdPtr
) internalpurereturns (uint256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int8 at `rdPtr` in returndata.functionreadInt8(
ReturndataPointer rdPtr
) internalpurereturns (int8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int16 at `rdPtr` in returndata.functionreadInt16(
ReturndataPointer rdPtr
) internalpurereturns (int16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int24 at `rdPtr` in returndata.functionreadInt24(
ReturndataPointer rdPtr
) internalpurereturns (int24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int32 at `rdPtr` in returndata.functionreadInt32(
ReturndataPointer rdPtr
) internalpurereturns (int32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int40 at `rdPtr` in returndata.functionreadInt40(
ReturndataPointer rdPtr
) internalpurereturns (int40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int48 at `rdPtr` in returndata.functionreadInt48(
ReturndataPointer rdPtr
) internalpurereturns (int48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int56 at `rdPtr` in returndata.functionreadInt56(
ReturndataPointer rdPtr
) internalpurereturns (int56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int64 at `rdPtr` in returndata.functionreadInt64(
ReturndataPointer rdPtr
) internalpurereturns (int64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int72 at `rdPtr` in returndata.functionreadInt72(
ReturndataPointer rdPtr
) internalpurereturns (int72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int80 at `rdPtr` in returndata.functionreadInt80(
ReturndataPointer rdPtr
) internalpurereturns (int80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int88 at `rdPtr` in returndata.functionreadInt88(
ReturndataPointer rdPtr
) internalpurereturns (int88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int96 at `rdPtr` in returndata.functionreadInt96(
ReturndataPointer rdPtr
) internalpurereturns (int96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int104 at `rdPtr` in returndata.functionreadInt104(
ReturndataPointer rdPtr
) internalpurereturns (int104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int112 at `rdPtr` in returndata.functionreadInt112(
ReturndataPointer rdPtr
) internalpurereturns (int112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int120 at `rdPtr` in returndata.functionreadInt120(
ReturndataPointer rdPtr
) internalpurereturns (int120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int128 at `rdPtr` in returndata.functionreadInt128(
ReturndataPointer rdPtr
) internalpurereturns (int128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int136 at `rdPtr` in returndata.functionreadInt136(
ReturndataPointer rdPtr
) internalpurereturns (int136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int144 at `rdPtr` in returndata.functionreadInt144(
ReturndataPointer rdPtr
) internalpurereturns (int144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int152 at `rdPtr` in returndata.functionreadInt152(
ReturndataPointer rdPtr
) internalpurereturns (int152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int160 at `rdPtr` in returndata.functionreadInt160(
ReturndataPointer rdPtr
) internalpurereturns (int160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int168 at `rdPtr` in returndata.functionreadInt168(
ReturndataPointer rdPtr
) internalpurereturns (int168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int176 at `rdPtr` in returndata.functionreadInt176(
ReturndataPointer rdPtr
) internalpurereturns (int176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int184 at `rdPtr` in returndata.functionreadInt184(
ReturndataPointer rdPtr
) internalpurereturns (int184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int192 at `rdPtr` in returndata.functionreadInt192(
ReturndataPointer rdPtr
) internalpurereturns (int192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int200 at `rdPtr` in returndata.functionreadInt200(
ReturndataPointer rdPtr
) internalpurereturns (int200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int208 at `rdPtr` in returndata.functionreadInt208(
ReturndataPointer rdPtr
) internalpurereturns (int208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int216 at `rdPtr` in returndata.functionreadInt216(
ReturndataPointer rdPtr
) internalpurereturns (int216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int224 at `rdPtr` in returndata.functionreadInt224(
ReturndataPointer rdPtr
) internalpurereturns (int224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int232 at `rdPtr` in returndata.functionreadInt232(
ReturndataPointer rdPtr
) internalpurereturns (int232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int240 at `rdPtr` in returndata.functionreadInt240(
ReturndataPointer rdPtr
) internalpurereturns (int240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int248 at `rdPtr` in returndata.functionreadInt248(
ReturndataPointer rdPtr
) internalpurereturns (int248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
/// @dev Reads the int256 at `rdPtr` in returndata.functionreadInt256(
ReturndataPointer rdPtr
) internalpurereturns (int256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value :=mload(0)
}
}
}
libraryMemoryReaders{
/// @dev Reads the memory pointer at `mPtr` in memory.functionreadMemoryPointer(
MemoryPointer mPtr
) internalpurereturns (MemoryPointer value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads value at `mPtr` & applies a mask to return only last 4 bytesfunctionreadMaskedUint256(
MemoryPointer mPtr
) internalpurereturns (uint256 value) {
value = mPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `mPtr` in memory.functionreadBool(MemoryPointer mPtr) internalpurereturns (bool value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the address at `mPtr` in memory.functionreadAddress(
MemoryPointer mPtr
) internalpurereturns (address value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes1 at `mPtr` in memory.functionreadBytes1(
MemoryPointer mPtr
) internalpurereturns (bytes1 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes2 at `mPtr` in memory.functionreadBytes2(
MemoryPointer mPtr
) internalpurereturns (bytes2 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes3 at `mPtr` in memory.functionreadBytes3(
MemoryPointer mPtr
) internalpurereturns (bytes3 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes4 at `mPtr` in memory.functionreadBytes4(
MemoryPointer mPtr
) internalpurereturns (bytes4 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes5 at `mPtr` in memory.functionreadBytes5(
MemoryPointer mPtr
) internalpurereturns (bytes5 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes6 at `mPtr` in memory.functionreadBytes6(
MemoryPointer mPtr
) internalpurereturns (bytes6 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes7 at `mPtr` in memory.functionreadBytes7(
MemoryPointer mPtr
) internalpurereturns (bytes7 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes8 at `mPtr` in memory.functionreadBytes8(
MemoryPointer mPtr
) internalpurereturns (bytes8 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes9 at `mPtr` in memory.functionreadBytes9(
MemoryPointer mPtr
) internalpurereturns (bytes9 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes10 at `mPtr` in memory.functionreadBytes10(
MemoryPointer mPtr
) internalpurereturns (bytes10 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes11 at `mPtr` in memory.functionreadBytes11(
MemoryPointer mPtr
) internalpurereturns (bytes11 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes12 at `mPtr` in memory.functionreadBytes12(
MemoryPointer mPtr
) internalpurereturns (bytes12 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes13 at `mPtr` in memory.functionreadBytes13(
MemoryPointer mPtr
) internalpurereturns (bytes13 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes14 at `mPtr` in memory.functionreadBytes14(
MemoryPointer mPtr
) internalpurereturns (bytes14 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes15 at `mPtr` in memory.functionreadBytes15(
MemoryPointer mPtr
) internalpurereturns (bytes15 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes16 at `mPtr` in memory.functionreadBytes16(
MemoryPointer mPtr
) internalpurereturns (bytes16 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes17 at `mPtr` in memory.functionreadBytes17(
MemoryPointer mPtr
) internalpurereturns (bytes17 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes18 at `mPtr` in memory.functionreadBytes18(
MemoryPointer mPtr
) internalpurereturns (bytes18 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes19 at `mPtr` in memory.functionreadBytes19(
MemoryPointer mPtr
) internalpurereturns (bytes19 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes20 at `mPtr` in memory.functionreadBytes20(
MemoryPointer mPtr
) internalpurereturns (bytes20 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes21 at `mPtr` in memory.functionreadBytes21(
MemoryPointer mPtr
) internalpurereturns (bytes21 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes22 at `mPtr` in memory.functionreadBytes22(
MemoryPointer mPtr
) internalpurereturns (bytes22 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes23 at `mPtr` in memory.functionreadBytes23(
MemoryPointer mPtr
) internalpurereturns (bytes23 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes24 at `mPtr` in memory.functionreadBytes24(
MemoryPointer mPtr
) internalpurereturns (bytes24 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes25 at `mPtr` in memory.functionreadBytes25(
MemoryPointer mPtr
) internalpurereturns (bytes25 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes26 at `mPtr` in memory.functionreadBytes26(
MemoryPointer mPtr
) internalpurereturns (bytes26 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes27 at `mPtr` in memory.functionreadBytes27(
MemoryPointer mPtr
) internalpurereturns (bytes27 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes28 at `mPtr` in memory.functionreadBytes28(
MemoryPointer mPtr
) internalpurereturns (bytes28 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes29 at `mPtr` in memory.functionreadBytes29(
MemoryPointer mPtr
) internalpurereturns (bytes29 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes30 at `mPtr` in memory.functionreadBytes30(
MemoryPointer mPtr
) internalpurereturns (bytes30 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes31 at `mPtr` in memory.functionreadBytes31(
MemoryPointer mPtr
) internalpurereturns (bytes31 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the bytes32 at `mPtr` in memory.functionreadBytes32(
MemoryPointer mPtr
) internalpurereturns (bytes32 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint8 at `mPtr` in memory.functionreadUint8(MemoryPointer mPtr) internalpurereturns (uint8 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint16 at `mPtr` in memory.functionreadUint16(
MemoryPointer mPtr
) internalpurereturns (uint16 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint24 at `mPtr` in memory.functionreadUint24(
MemoryPointer mPtr
) internalpurereturns (uint24 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint32 at `mPtr` in memory.functionreadUint32(
MemoryPointer mPtr
) internalpurereturns (uint32 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint40 at `mPtr` in memory.functionreadUint40(
MemoryPointer mPtr
) internalpurereturns (uint40 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint48 at `mPtr` in memory.functionreadUint48(
MemoryPointer mPtr
) internalpurereturns (uint48 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint56 at `mPtr` in memory.functionreadUint56(
MemoryPointer mPtr
) internalpurereturns (uint56 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint64 at `mPtr` in memory.functionreadUint64(
MemoryPointer mPtr
) internalpurereturns (uint64 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint72 at `mPtr` in memory.functionreadUint72(
MemoryPointer mPtr
) internalpurereturns (uint72 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint80 at `mPtr` in memory.functionreadUint80(
MemoryPointer mPtr
) internalpurereturns (uint80 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint88 at `mPtr` in memory.functionreadUint88(
MemoryPointer mPtr
) internalpurereturns (uint88 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint96 at `mPtr` in memory.functionreadUint96(
MemoryPointer mPtr
) internalpurereturns (uint96 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint104 at `mPtr` in memory.functionreadUint104(
MemoryPointer mPtr
) internalpurereturns (uint104 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint112 at `mPtr` in memory.functionreadUint112(
MemoryPointer mPtr
) internalpurereturns (uint112 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint120 at `mPtr` in memory.functionreadUint120(
MemoryPointer mPtr
) internalpurereturns (uint120 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint128 at `mPtr` in memory.functionreadUint128(
MemoryPointer mPtr
) internalpurereturns (uint128 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint136 at `mPtr` in memory.functionreadUint136(
MemoryPointer mPtr
) internalpurereturns (uint136 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint144 at `mPtr` in memory.functionreadUint144(
MemoryPointer mPtr
) internalpurereturns (uint144 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint152 at `mPtr` in memory.functionreadUint152(
MemoryPointer mPtr
) internalpurereturns (uint152 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint160 at `mPtr` in memory.functionreadUint160(
MemoryPointer mPtr
) internalpurereturns (uint160 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint168 at `mPtr` in memory.functionreadUint168(
MemoryPointer mPtr
) internalpurereturns (uint168 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint176 at `mPtr` in memory.functionreadUint176(
MemoryPointer mPtr
) internalpurereturns (uint176 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint184 at `mPtr` in memory.functionreadUint184(
MemoryPointer mPtr
) internalpurereturns (uint184 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint192 at `mPtr` in memory.functionreadUint192(
MemoryPointer mPtr
) internalpurereturns (uint192 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint200 at `mPtr` in memory.functionreadUint200(
MemoryPointer mPtr
) internalpurereturns (uint200 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint208 at `mPtr` in memory.functionreadUint208(
MemoryPointer mPtr
) internalpurereturns (uint208 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint216 at `mPtr` in memory.functionreadUint216(
MemoryPointer mPtr
) internalpurereturns (uint216 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint224 at `mPtr` in memory.functionreadUint224(
MemoryPointer mPtr
) internalpurereturns (uint224 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint232 at `mPtr` in memory.functionreadUint232(
MemoryPointer mPtr
) internalpurereturns (uint232 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint240 at `mPtr` in memory.functionreadUint240(
MemoryPointer mPtr
) internalpurereturns (uint240 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint248 at `mPtr` in memory.functionreadUint248(
MemoryPointer mPtr
) internalpurereturns (uint248 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the uint256 at `mPtr` in memory.functionreadUint256(
MemoryPointer mPtr
) internalpurereturns (uint256 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int8 at `mPtr` in memory.functionreadInt8(MemoryPointer mPtr) internalpurereturns (int8 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int16 at `mPtr` in memory.functionreadInt16(MemoryPointer mPtr) internalpurereturns (int16 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int24 at `mPtr` in memory.functionreadInt24(MemoryPointer mPtr) internalpurereturns (int24 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int32 at `mPtr` in memory.functionreadInt32(MemoryPointer mPtr) internalpurereturns (int32 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int40 at `mPtr` in memory.functionreadInt40(MemoryPointer mPtr) internalpurereturns (int40 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int48 at `mPtr` in memory.functionreadInt48(MemoryPointer mPtr) internalpurereturns (int48 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int56 at `mPtr` in memory.functionreadInt56(MemoryPointer mPtr) internalpurereturns (int56 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int64 at `mPtr` in memory.functionreadInt64(MemoryPointer mPtr) internalpurereturns (int64 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int72 at `mPtr` in memory.functionreadInt72(MemoryPointer mPtr) internalpurereturns (int72 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int80 at `mPtr` in memory.functionreadInt80(MemoryPointer mPtr) internalpurereturns (int80 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int88 at `mPtr` in memory.functionreadInt88(MemoryPointer mPtr) internalpurereturns (int88 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int96 at `mPtr` in memory.functionreadInt96(MemoryPointer mPtr) internalpurereturns (int96 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int104 at `mPtr` in memory.functionreadInt104(
MemoryPointer mPtr
) internalpurereturns (int104 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int112 at `mPtr` in memory.functionreadInt112(
MemoryPointer mPtr
) internalpurereturns (int112 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int120 at `mPtr` in memory.functionreadInt120(
MemoryPointer mPtr
) internalpurereturns (int120 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int128 at `mPtr` in memory.functionreadInt128(
MemoryPointer mPtr
) internalpurereturns (int128 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int136 at `mPtr` in memory.functionreadInt136(
MemoryPointer mPtr
) internalpurereturns (int136 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int144 at `mPtr` in memory.functionreadInt144(
MemoryPointer mPtr
) internalpurereturns (int144 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int152 at `mPtr` in memory.functionreadInt152(
MemoryPointer mPtr
) internalpurereturns (int152 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int160 at `mPtr` in memory.functionreadInt160(
MemoryPointer mPtr
) internalpurereturns (int160 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int168 at `mPtr` in memory.functionreadInt168(
MemoryPointer mPtr
) internalpurereturns (int168 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int176 at `mPtr` in memory.functionreadInt176(
MemoryPointer mPtr
) internalpurereturns (int176 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int184 at `mPtr` in memory.functionreadInt184(
MemoryPointer mPtr
) internalpurereturns (int184 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int192 at `mPtr` in memory.functionreadInt192(
MemoryPointer mPtr
) internalpurereturns (int192 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int200 at `mPtr` in memory.functionreadInt200(
MemoryPointer mPtr
) internalpurereturns (int200 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int208 at `mPtr` in memory.functionreadInt208(
MemoryPointer mPtr
) internalpurereturns (int208 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int216 at `mPtr` in memory.functionreadInt216(
MemoryPointer mPtr
) internalpurereturns (int216 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int224 at `mPtr` in memory.functionreadInt224(
MemoryPointer mPtr
) internalpurereturns (int224 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int232 at `mPtr` in memory.functionreadInt232(
MemoryPointer mPtr
) internalpurereturns (int232 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int240 at `mPtr` in memory.functionreadInt240(
MemoryPointer mPtr
) internalpurereturns (int240 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int248 at `mPtr` in memory.functionreadInt248(
MemoryPointer mPtr
) internalpurereturns (int248 value) {
assembly {
value :=mload(mPtr)
}
}
/// @dev Reads the int256 at `mPtr` in memory.functionreadInt256(
MemoryPointer mPtr
) internalpurereturns (int256 value) {
assembly {
value :=mload(mPtr)
}
}
}
libraryMemoryWriters{
/// @dev Writes `valuePtr` to memory at `mPtr`.functionwrite(MemoryPointer mPtr, MemoryPointer valuePtr) internalpure{
assembly {
mstore(mPtr, valuePtr)
}
}
/// @dev Writes a boolean `value` to `mPtr` in memory.functionwrite(MemoryPointer mPtr, bool value) internalpure{
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an address `value` to `mPtr` in memory.functionwrite(MemoryPointer mPtr, address value) internalpure{
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a bytes32 `value` to `mPtr` in memory./// Separate name to disambiguate literal write parameters.functionwriteBytes32(MemoryPointer mPtr, bytes32 value) internalpure{
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a uint256 `value` to `mPtr` in memory.functionwrite(MemoryPointer mPtr, uint256 value) internalpure{
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an int256 `value` to `mPtr` in memory./// Separate name to disambiguate literal write parameters.functionwriteInt(MemoryPointer mPtr, int256 value) internalpure{
assembly {
mstore(mPtr, value)
}
}
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)pragmasolidity ^0.8.20;/**
* @dev Standard signed math utilities missing in the Solidity language.
*/librarySignedMath{
/**
* @dev Returns the largest of two signed numbers.
*/functionmax(int256 a, int256 b) internalpurereturns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/functionmin(int256 a, int256 b) internalpurereturns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/functionaverage(int256 a, int256 b) internalpurereturns (int256) {
// Formula from the book "Hacker's Delight"int256 x = (a & b) + ((a ^ b) >>1);
return x + (int256(uint256(x) >>255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/functionabs(int256 n) internalpurereturns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`returnuint256(n >=0 ? n : -n);
}
}
}
Código Fuente del Contrato
Archivo 43 de 45: StorageSlot.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragmasolidity ^0.8.20;/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/libraryStorageSlot{
structAddressSlot {
address value;
}
structBooleanSlot {
bool value;
}
structBytes32Slot {
bytes32 value;
}
structUint256Slot {
uint256 value;
}
structStringSlot {
string value;
}
structBytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/functiongetAddressSlot(bytes32 slot) internalpurereturns (AddressSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/functiongetBooleanSlot(bytes32 slot) internalpurereturns (BooleanSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/functiongetBytes32Slot(bytes32 slot) internalpurereturns (Bytes32Slot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/functiongetUint256Slot(bytes32 slot) internalpurereturns (Uint256Slot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/functiongetStringSlot(bytes32 slot) internalpurereturns (StringSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/functiongetStringSlot(stringstorage store) internalpurereturns (StringSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/functiongetBytesSlot(bytes32 slot) internalpurereturns (BytesSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/functiongetBytesSlot(bytesstorage store) internalpurereturns (BytesSlot storage r) {
/// @solidity memory-safe-assemblyassembly {
r.slot:= store.slot
}
}
}
Código Fuente del Contrato
Archivo 44 de 45: Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragmasolidity ^0.8.20;import {Math} from"./math/Math.sol";
import {SignedMath} from"./math/SignedMath.sol";
/**
* @dev String operations.
*/libraryStrings{
bytes16privateconstant HEX_DIGITS ="0123456789abcdef";
uint8privateconstant ADDRESS_LENGTH =20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/errorStringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/functiontoString(uint256 value) internalpurereturns (stringmemory) {
unchecked {
uint256 length = Math.log10(value) +1;
stringmemory buffer =newstring(length);
uint256 ptr;
/// @solidity memory-safe-assemblyassembly {
ptr :=add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assemblyassembly {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /=10;
if (value ==0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/functiontoStringSigned(int256 value) internalpurereturns (stringmemory) {
returnstring.concat(value <0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/functiontoHexString(uint256 value) internalpurereturns (stringmemory) {
unchecked {
return toHexString(value, Math.log256(value) +1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/functiontoHexString(uint256 value, uint256 length) internalpurereturns (stringmemory) {
uint256 localValue = value;
bytesmemory buffer =newbytes(2* length +2);
buffer[0] ="0";
buffer[1] ="x";
for (uint256 i =2* length +1; i >1; --i) {
buffer[i] = HEX_DIGITS[localValue &0xf];
localValue >>=4;
}
if (localValue !=0) {
revert StringsInsufficientHexLength(value, length);
}
returnstring(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/functiontoHexString(address addr) internalpurereturns (stringmemory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/functionequal(stringmemory a, stringmemory b) internalpurereturns (bool) {
returnbytes(a).length==bytes(b).length&&keccak256(bytes(a)) ==keccak256(bytes(b));
}
}
Código Fuente del Contrato
Archivo 45 de 45: draft-IERC6093.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.20;/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/interfaceIERC20Errors{
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/errorERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/errorERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/errorERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/errorERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/errorERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/errorERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/interfaceIERC721Errors{
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/errorERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/errorERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/errorERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/errorERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/errorERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/errorERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/errorERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/errorERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/interfaceIERC1155Errors{
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/errorERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/errorERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/errorERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/errorERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/errorERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/errorERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/errorERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}