Overview
ETH Balance
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 62297459 | 669 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {
ERC1155SeaDropContractOffererCloneable
} from "./ERC1155SeaDropContractOffererCloneable.sol";
/**
* @title ERC1155SeaDropCloneable
* @author James Wenzel (emo.eth)
* @author Ryan Ghods (ralxz.eth)
* @author Stephan Min (stephanm.eth)
* @author Michael Cohen (notmichael.eth)
* @custom:contributor Limit Break (@limitbreak)
* @notice A cloneable ERC1155 token contract that can mint as a
* Seaport contract offerer.
* Implements Limit Break's Creator Token Standards transfer
* validation for royalty enforcement.
*/
contract ERC1155SeaDropCloneable is ERC1155SeaDropContractOffererCloneable {
/**
* @notice Initialize the token contract.
*
* @param allowedConfigurer The address of the contract allowed to
* implementation code. Also contains SeaDrop
* implementation code.
* @param allowedSeaport The address of the Seaport contract allowed to
* interact.
* @param name_ The name of the token.
* @param symbol_ The symbol of the token.
*/
function initialize(
address allowedConfigurer,
address allowedSeaport,
string memory name_,
string memory symbol_,
address initialOwner
) public initializer {
// Initialize ownership.
_initializeOwner(initialOwner);
// Initialize ERC1155SeaDropContractOffererCloneable.
__ERC1155SeaDropContractOffererCloneable_init(
allowedConfigurer,
allowedSeaport,
name_,
symbol_
);
}
/**
* @notice Burns a token, restricted to the owner or approved operator,
* and must have sufficient balance.
*
* @param from The address to burn from.
* @param id The token id to burn.
* @param amount The amount to burn.
*/
function burn(address from, uint256 id, uint256 amount) external {
// Burn the token.
_burn(msg.sender, from, id, amount);
}
/**
* @notice Burns a batch of tokens, restricted to the owner or
* approved operator, and must have sufficient balance.
*
* @param from The address to burn from.
* @param ids The token ids to burn.
* @param amounts The amounts to burn per token id.
*/
function batchBurn(
address from,
uint256[] calldata ids,
uint256[] calldata amounts
) external {
// Burn the tokens.
_batchBurn(msg.sender, from, ids, amounts);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { IERC1155SeaDrop } from "../interfaces/IERC1155SeaDrop.sol";
import { ISeaDropToken } from "../interfaces/ISeaDropToken.sol";
import {
ERC1155ContractMetadataCloneable
} from "./ERC1155ContractMetadataCloneable.sol";
import {
ERC1155SeaDropContractOffererStorage
} from "../lib/ERC1155SeaDropContractOffererStorage.sol";
import {
ERC1155SeaDropErrorsAndEvents
} from "../lib/ERC1155SeaDropErrorsAndEvents.sol";
import { PublicDrop } from "../lib//ERC1155SeaDropStructs.sol";
import { AllowListData } from "../lib/SeaDropStructs.sol";
import {
ERC1155ConduitPreapproved
} from "../lib/ERC1155ConduitPreapproved.sol";
import { ERC1155 } from "solady/src/tokens/ERC1155.sol";
import { SpentItem } from "seaport-types/src/lib/ConsiderationStructs.sol";
import {
ContractOffererInterface
} from "seaport-types/src/interfaces/ContractOffererInterface.sol";
import {
IERC165
} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @title ERC1155SeaDropContractOffererCloneable
* @author James Wenzel (emo.eth)
* @author Ryan Ghods (ralxz.eth)
* @author Stephan Min (stephanm.eth)
* @author Michael Cohen (notmichael.eth)
* @notice A cloneable ERC1155 token contract that can mint as a
* Seaport contract offerer.
*/
contract ERC1155SeaDropContractOffererCloneable is
ERC1155ContractMetadataCloneable,
ERC1155SeaDropErrorsAndEvents
{
using ERC1155SeaDropContractOffererStorage for ERC1155SeaDropContractOffererStorage.Layout;
/**
* @notice Initialize the token contract.
*
* @param allowedConfigurer The address of the contract allowed to
* configure parameters. Also contains SeaDrop
* implementation code.
* @param allowedSeaport The address of the Seaport contract allowed to
* interact.
* @param name_ The name of the token.
* @param symbol_ The symbol of the token.
*/
function __ERC1155SeaDropContractOffererCloneable_init(
address allowedConfigurer,
address allowedSeaport,
string memory name_,
string memory symbol_
) internal onlyInitializing {
// Set the allowed Seaport to interact with this contract.
if (allowedSeaport == address(0)) {
revert AllowedSeaportCannotBeZeroAddress();
}
ERC1155SeaDropContractOffererStorage.layout()._allowedSeaport[
allowedSeaport
] = true;
// Set the allowed Seaport enumeration.
address[] memory enumeratedAllowedSeaport = new address[](1);
enumeratedAllowedSeaport[0] = allowedSeaport;
ERC1155SeaDropContractOffererStorage
.layout()
._enumeratedAllowedSeaport = enumeratedAllowedSeaport;
// Emit an event noting the contract deployment.
emit SeaDropTokenDeployed(SEADROP_TOKEN_TYPE.ERC1155_CLONE);
// Initialize ERC1155ContractMetadataCloneable.
__ERC1155ContractMetadataCloneable_init(
allowedConfigurer,
name_,
symbol_
);
}
/**
* @notice The fallback function is used as a dispatcher for SeaDrop
* methods.
*/
fallback(bytes calldata) external returns (bytes memory output) {
// Get the function selector.
bytes4 selector = msg.sig;
// Get the rest of the msg data after the selector.
bytes calldata data = msg.data[4:];
// Determine if we should forward the call to the implementation
// contract with SeaDrop logic.
bool callSeaDropImplementation = selector ==
ISeaDropToken.updateAllowedSeaport.selector ||
selector == ISeaDropToken.updateDropURI.selector ||
selector == ISeaDropToken.updateAllowList.selector ||
selector == ISeaDropToken.updateCreatorPayouts.selector ||
selector == ISeaDropToken.updatePayer.selector ||
selector == ISeaDropToken.updateAllowedFeeRecipient.selector ||
selector == ISeaDropToken.updateSigner.selector ||
selector == IERC1155SeaDrop.updatePublicDrop.selector ||
selector == ContractOffererInterface.previewOrder.selector ||
selector == ContractOffererInterface.generateOrder.selector ||
selector == ContractOffererInterface.getSeaportMetadata.selector ||
selector == IERC1155SeaDrop.getPublicDrop.selector ||
selector == IERC1155SeaDrop.getPublicDropIndexes.selector ||
selector == ISeaDropToken.getAllowedSeaport.selector ||
selector == ISeaDropToken.getCreatorPayouts.selector ||
selector == ISeaDropToken.getAllowListMerkleRoot.selector ||
selector == ISeaDropToken.getAllowedFeeRecipients.selector ||
selector == ISeaDropToken.getSigners.selector ||
selector == ISeaDropToken.getDigestIsUsed.selector ||
selector == ISeaDropToken.getPayers.selector;
// Determine if we should require only the owner or configurer calling.
bool requireOnlyOwnerOrConfigurer = selector ==
ISeaDropToken.updateAllowedSeaport.selector ||
selector == ISeaDropToken.updateDropURI.selector ||
selector == ISeaDropToken.updateAllowList.selector ||
selector == ISeaDropToken.updateCreatorPayouts.selector ||
selector == ISeaDropToken.updatePayer.selector ||
selector == ISeaDropToken.updateAllowedFeeRecipient.selector ||
selector == IERC1155SeaDrop.updatePublicDrop.selector;
if (callSeaDropImplementation) {
// For update calls, ensure the sender is only the owner
// or configurer contract.
if (requireOnlyOwnerOrConfigurer) {
_onlyOwnerOrConfigurer();
} else if (selector == ISeaDropToken.updateSigner.selector) {
// For updateSigner, a signer can disallow themselves.
// Get the signer parameter.
address signer = address(bytes20(data[12:32]));
// If the signer is not allowed, ensure sender is only owner
// or configurer.
if (
msg.sender != signer ||
(msg.sender == signer &&
!ERC1155SeaDropContractOffererStorage
.layout()
._allowedSigners[signer])
) {
_onlyOwnerOrConfigurer();
}
}
// Forward the call to the implementation contract.
(bool success, bytes memory returnedData) = _CONFIGURER
.delegatecall(msg.data);
// Require that the call was successful.
if (!success) {
// Bubble up the revert reason.
assembly {
revert(add(32, returnedData), mload(returnedData))
}
}
// If the call was to generateOrder, mint the tokens.
if (selector == ContractOffererInterface.generateOrder.selector) {
_mintOrder(data);
}
// Return the data from the delegate call.
return returnedData;
} else if (selector == IERC1155SeaDrop.getMintStats.selector) {
// Get the minter and token id.
(address minter, uint256 tokenId) = abi.decode(
data,
(address, uint256)
);
// Get the mint stats.
(
uint256 minterNumMinted,
uint256 minterNumMintedForTokenId,
uint256 totalMintedForTokenId,
uint256 maxSupply
) = _getMintStats(minter, tokenId);
// Encode the return data.
return
abi.encode(
minterNumMinted,
minterNumMintedForTokenId,
totalMintedForTokenId,
maxSupply
);
} else if (selector == ContractOffererInterface.ratifyOrder.selector) {
// This function is a no-op, nothing additional needs to happen here.
// Utilize assembly to efficiently return the ratifyOrder magic value.
assembly {
mstore(0, 0xf4dd92ce)
return(0x1c, 32)
}
} else if (selector == ISeaDropToken.configurer.selector) {
// Return the configurer contract.
return abi.encode(_CONFIGURER);
} else if (selector == IERC1155SeaDrop.multiConfigureMint.selector) {
// Ensure only the owner or configurer can call this function.
_onlyOwnerOrConfigurer();
// Mint the tokens.
_multiConfigureMint(data);
} else {
// Revert if the function selector is not supported.
revert UnsupportedFunctionSelector(selector);
}
}
/**
* @notice Returns a set of mint stats for the address.
* This assists in enforcing maxSupply, maxTotalMintableByWallet,
* and maxTokenSupplyForStage checks.
*
* @dev NOTE: Implementing contracts should always update these numbers
* before transferring any tokens with _safeMint() to mitigate
* consequences of malicious onERC1155Received() hooks.
*
* @param minter The minter address.
* @param tokenId The token id to return the stats for.
*/
function _getMintStats(
address minter,
uint256 tokenId
)
internal
view
returns (
uint256 minterNumMinted,
uint256 minterNumMintedForTokenId,
uint256 totalMintedForTokenId,
uint256 maxSupply
)
{
// Put the token supply on the stack.
TokenSupply storage tokenSupply = _tokenSupply[tokenId];
// Assign the return values.
totalMintedForTokenId = tokenSupply.totalMinted;
maxSupply = tokenSupply.maxSupply;
minterNumMinted = _totalMintedByUser[minter];
minterNumMintedForTokenId = _totalMintedByUserPerToken[minter][tokenId];
}
/**
* @dev Handle ERC-1155 safeTransferFrom. If "from" is this contract,
* the sender can only be Seaport or the conduit.
*
* @param from The address to transfer from.
* @param to The address to transfer to.
* @param id The token id to transfer.
* @param amount The amount of tokens to transfer.
* @param data The data to pass to the onERC1155Received hook.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual override {
if (from == address(this)) {
// Only Seaport or the conduit can use this function
// when "from" is this contract.
if (
msg.sender != _CONDUIT &&
!ERC1155SeaDropContractOffererStorage.layout()._allowedSeaport[
msg.sender
]
) {
revert InvalidCallerOnlyAllowedSeaport(msg.sender);
}
return;
}
ERC1155._safeTransfer(_by(), from, to, id, amount, data);
}
/**
* @notice Returns whether the interface is supported.
*
* @param interfaceId The interface id to check against.
*/
function supportsInterface(
bytes4 interfaceId
)
public
view
virtual
override(ERC1155ContractMetadataCloneable)
returns (bool)
{
return
interfaceId == type(IERC1155SeaDrop).interfaceId ||
interfaceId == type(ContractOffererInterface).interfaceId ||
interfaceId == 0x2e778efc || // SIP-5 (getSeaportMetadata)
// ERC1155ContractMetadata returns supportsInterface true for
// IERC1155ContractMetadata, ERC-4906, ERC-2981
// ERC1155A returns supportsInterface true for
// ERC165, ERC1155, ERC1155MetadataURI
ERC1155ContractMetadataCloneable.supportsInterface(interfaceId);
}
/**
* @dev Internal function to mint tokens during a generateOrder call
* from Seaport.
*
* @param data The original transaction calldata, without the selector.
*/
function _mintOrder(bytes calldata data) internal {
// Decode fulfiller, minimumReceived, and context from calldata.
(
address fulfiller,
SpentItem[] memory minimumReceived,
,
bytes memory context
) = abi.decode(data, (address, SpentItem[], SpentItem[], bytes));
// Assign the minter from context[22:42]. We validate context has the
// correct minimum length in the implementation's `_decodeOrder`.
address minter;
assembly {
minter := shr(96, mload(add(add(context, 0x20), 22)))
}
// If the minter is the zero address, set it to the fulfiller.
if (minter == address(0)) {
minter = fulfiller;
}
// Set the token ids and quantities.
uint256 minimumReceivedLength = minimumReceived.length;
uint256[] memory tokenIds = new uint256[](minimumReceivedLength);
uint256[] memory quantities = new uint256[](minimumReceivedLength);
for (uint256 i = 0; i < minimumReceivedLength; ) {
tokenIds[i] = minimumReceived[i].identifier;
quantities[i] = minimumReceived[i].amount;
unchecked {
++i;
}
}
// Mint the tokens.
_batchMint(minter, tokenIds, quantities, "");
}
/**
* @dev Internal function to mint tokens during a multiConfigureMint call
* from the configurer contract.
*
* @param data The original transaction calldata, without the selector.
*/
function _multiConfigureMint(bytes calldata data) internal {
// Decode the calldata.
(
address recipient,
uint256[] memory tokenIds,
uint256[] memory amounts
) = abi.decode(data, (address, uint256[], uint256[]));
_batchMint(recipient, tokenIds, amounts, "");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { ISeaDropToken } from "./ISeaDropToken.sol";
import { PublicDrop } from "../lib/ERC1155SeaDropStructs.sol";
/**
* @dev A helper interface to get and set parameters for ERC1155SeaDrop.
* The token does not expose these methods as part of its external
* interface to optimize contract size, but does implement them.
*/
interface IERC1155SeaDrop is ISeaDropToken {
/**
* @notice Update the SeaDrop public drop parameters at a given index.
*
* @param publicDrop The new public drop parameters.
* @param index The public drop index.
*/
function updatePublicDrop(
PublicDrop calldata publicDrop,
uint256 index
) external;
/**
* @notice Returns the public drop stage parameters at a given index.
*
* @param index The index of the public drop stage.
*/
function getPublicDrop(
uint256 index
) external view returns (PublicDrop memory);
/**
* @notice Returns the public drop indexes.
*/
function getPublicDropIndexes() external view returns (uint256[] memory);
/**
* @notice Returns a set of mint stats for the address.
* This assists SeaDrop in enforcing maxSupply,
* maxTotalMintableByWallet, maxTotalMintableByWalletPerToken,
* and maxTokenSupplyForStage checks.
*
* @dev NOTE: Implementing contracts should always update these numbers
* before transferring any tokens with _safeMint() to mitigate
* consequences of malicious onERC1155Received() hooks.
*
* @param minter The minter address.
* @param tokenId The token id to return stats for.
*/
function getMintStats(
address minter,
uint256 tokenId
)
external
view
returns (
uint256 minterNumMinted,
uint256 minterNumMintedForTokenId,
uint256 totalMintedForTokenId,
uint256 maxSupply
);
/**
* @notice This function is only allowed to be called by the configurer
* contract as a way to batch mints and configuration in one tx.
*
* @param recipient The address to receive the mints.
* @param tokenIds The tokenIds to mint.
* @param amounts The amounts to mint.
*/
function multiConfigureMint(
address recipient,
uint256[] calldata tokenIds,
uint256[] calldata amounts
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {
ISeaDropTokenContractMetadata
} from "./ISeaDropTokenContractMetadata.sol";
import { AllowListData, CreatorPayout } from "../lib/SeaDropStructs.sol";
/**
* @dev A helper base interface for IERC721SeaDrop and IERC1155SeaDrop.
* The token does not expose these methods as part of its external
* interface to optimize contract size, but does implement them.
*/
interface ISeaDropToken is ISeaDropTokenContractMetadata {
/**
* @notice Update the SeaDrop allowed Seaport contracts privileged to mint.
* Only the owner can use this function.
*
* @param allowedSeaport The allowed Seaport addresses.
*/
function updateAllowedSeaport(address[] calldata allowedSeaport) external;
/**
* @notice Update the SeaDrop allowed fee recipient.
* Only the owner can use this function.
*
* @param feeRecipient The new fee recipient.
* @param allowed Whether the fee recipient is allowed.
*/
function updateAllowedFeeRecipient(
address feeRecipient,
bool allowed
) external;
/**
* @notice Update the SeaDrop creator payout addresses.
* The total basis points must add up to exactly 10_000.
* Only the owner can use this function.
*
* @param creatorPayouts The new creator payouts.
*/
function updateCreatorPayouts(
CreatorPayout[] calldata creatorPayouts
) external;
/**
* @notice Update the SeaDrop drop URI.
* Only the owner can use this function.
*
* @param dropURI The new drop URI.
*/
function updateDropURI(string calldata dropURI) external;
/**
* @notice Update the SeaDrop allow list data.
* Only the owner can use this function.
*
* @param allowListData The new allow list data.
*/
function updateAllowList(AllowListData calldata allowListData) external;
/**
* @notice Update the SeaDrop allowed payers.
* Only the owner can use this function.
*
* @param payer The payer to update.
* @param allowed Whether the payer is allowed.
*/
function updatePayer(address payer, bool allowed) external;
/**
* @notice Update the SeaDrop allowed signer.
* Only the owner can use this function.
* An allowed signer can also disallow themselves.
*
* @param signer The signer to update.
* @param allowed Whether the signer is allowed.
*/
function updateSigner(address signer, bool allowed) external;
/**
* @notice Get the SeaDrop allowed Seaport contracts privileged to mint.
*/
function getAllowedSeaport() external view returns (address[] memory);
/**
* @notice Returns the SeaDrop creator payouts.
*/
function getCreatorPayouts() external view returns (CreatorPayout[] memory);
/**
* @notice Returns the SeaDrop allow list merkle root.
*/
function getAllowListMerkleRoot() external view returns (bytes32);
/**
* @notice Returns the SeaDrop allowed fee recipients.
*/
function getAllowedFeeRecipients() external view returns (address[] memory);
/**
* @notice Returns the SeaDrop allowed signers.
*/
function getSigners() external view returns (address[] memory);
/**
* @notice Returns if the signed digest has been used.
*
* @param digest The digest hash.
*/
function getDigestIsUsed(bytes32 digest) external view returns (bool);
/**
* @notice Returns the SeaDrop allowed payers.
*/
function getPayers() external view returns (address[] memory);
/**
* @notice Returns the configurer contract.
*/
function configurer() external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {
IERC1155ContractMetadata
} from "../interfaces/IERC1155ContractMetadata.sol";
import {
ERC1155ConduitPreapproved
} from "../lib/ERC1155ConduitPreapproved.sol";
import {
ICreatorToken,
ILegacyCreatorToken
} from "../interfaces/ICreatorToken.sol";
import { ITransferValidator1155 } from "../interfaces/ITransferValidator.sol";
import { TokenTransferValidator } from "../lib/TokenTransferValidator.sol";
import { ERC1155 } from "solady/src/tokens/ERC1155.sol";
import { ERC2981 } from "solady/src/tokens/ERC2981.sol";
import { Ownable } from "solady/src/auth/Ownable.sol";
import {
Initializable
} from "@openzeppelin-upgradeable/contracts/proxy/utils/Initializable.sol";
/**
* @title ERC1155ContractMetadataCloneable
* @author James Wenzel (emo.eth)
* @author Ryan Ghods (ralxz.eth)
* @author Stephan Min (stephanm.eth)
* @author Michael Cohen (notmichael.eth)
* @notice A cloneable token contract that extends ERC-1155
* with additional metadata and ownership capabilities.
*/
contract ERC1155ContractMetadataCloneable is
ERC1155ConduitPreapproved,
TokenTransferValidator,
ERC2981,
Ownable,
IERC1155ContractMetadata,
Initializable
{
/// @notice A struct containing the token supply info per token id.
mapping(uint256 => TokenSupply) _tokenSupply;
/// @notice The total number of tokens minted by address.
mapping(address => uint256) _totalMintedByUser;
/// @notice The total number of tokens minted per token id by address.
mapping(address => mapping(uint256 => uint256)) _totalMintedByUserPerToken;
/// @notice The name of the token.
string internal _name;
/// @notice The symbol of the token.
string internal _symbol;
/// @notice The base URI for token metadata.
string internal _baseURI;
/// @notice The contract URI for contract metadata.
string internal _contractURI;
/// @notice The provenance hash for guaranteeing metadata order
/// for random reveals.
bytes32 internal _provenanceHash;
/// @notice The allowed contract that can configure SeaDrop parameters.
address internal _CONFIGURER;
/**
* @dev Reverts if the sender is not the owner or the allowed
* configurer contract.
*
* This is used as a function instead of a modifier
* to save contract space when used multiple times.
*/
function _onlyOwnerOrConfigurer() internal view {
if (msg.sender != _CONFIGURER && msg.sender != owner()) {
revert Unauthorized();
}
}
/**
* @notice Deploy the token contract.
*
* @param allowedConfigurer The address of the contract allowed to
* configure parameters. Also contains SeaDrop
* implementation code.
* @param name_ The name of the token.
* @param symbol_ The symbol of the token.
*/
function __ERC1155ContractMetadataCloneable_init(
address allowedConfigurer,
string memory name_,
string memory symbol_
) internal onlyInitializing {
// Set the name of the token.
_name = name_;
// Set the symbol of the token.
_symbol = symbol_;
// Set the allowed configurer contract to interact with this contract.
_CONFIGURER = allowedConfigurer;
}
/**
* @notice Sets the base URI for the token metadata and emits an event.
*
* @param newBaseURI The new base URI to set.
*/
function setBaseURI(string calldata newBaseURI) external override {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// Set the new base URI.
_baseURI = newBaseURI;
// Emit an event with the update.
emit BatchMetadataUpdate(0, type(uint256).max);
}
/**
* @notice Sets the contract URI for contract metadata.
*
* @param newContractURI The new contract URI.
*/
function setContractURI(string calldata newContractURI) external override {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// Set the new contract URI.
_contractURI = newContractURI;
// Emit an event with the update.
emit ContractURIUpdated(newContractURI);
}
/**
* @notice Emit an event notifying metadata updates for
* a range of token ids, according to EIP-4906.
*
* @param fromTokenId The start token id.
* @param toTokenId The end token id.
*/
function emitBatchMetadataUpdate(
uint256 fromTokenId,
uint256 toTokenId
) external {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// Emit an event with the update.
if (fromTokenId == toTokenId) {
// If only one token is being updated, use the event
// in the 1155 spec.
emit URI(uri(fromTokenId), fromTokenId);
} else {
emit BatchMetadataUpdate(fromTokenId, toTokenId);
}
}
/**
* @notice Sets the max token supply and emits an event.
*
* @param tokenId The token id to set the max supply for.
* @param newMaxSupply The new max supply to set.
*/
function setMaxSupply(uint256 tokenId, uint256 newMaxSupply) external {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// Ensure the max supply does not exceed the maximum value of uint64,
// a limit due to the storage of bit-packed variables in TokenSupply,
if (newMaxSupply > 2 ** 64 - 1) {
revert CannotExceedMaxSupplyOfUint64(newMaxSupply);
}
// Set the new max supply.
_tokenSupply[tokenId].maxSupply = uint64(newMaxSupply);
// Emit an event with the update.
emit MaxSupplyUpdated(tokenId, newMaxSupply);
}
/**
* @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.
*/
function setProvenanceHash(bytes32 newProvenanceHash) external {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// 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 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.
*/
function setDefaultRoyalty(address receiver, uint96 feeNumerator) external {
// Ensure the sender is only the owner or configurer contract.
_onlyOwnerOrConfigurer();
// 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);
}
/**
* @notice Returns the name of the token.
*/
function name() external view returns (string memory) {
return _name;
}
/**
* @notice Returns the symbol of the token.
*/
function symbol() external view returns (string memory) {
return _symbol;
}
/**
* @notice Returns the base URI for token metadata.
*/
function baseURI() external view override returns (string memory) {
return _baseURI;
}
/**
* @notice Returns the contract URI for contract metadata.
*/
function contractURI() external view override returns (string memory) {
return _contractURI;
}
/**
* @notice Returns the max token supply for a token id.
*/
function maxSupply(uint256 tokenId) external view returns (uint256) {
return _tokenSupply[tokenId].maxSupply;
}
/**
* @notice Returns the total supply for a token id.
*/
function totalSupply(uint256 tokenId) external view returns (uint256) {
return _tokenSupply[tokenId].totalSupply;
}
/**
* @notice Returns the total minted for a token id.
*/
function totalMinted(uint256 tokenId) external view returns (uint256) {
return _tokenSupply[tokenId].totalMinted;
}
/**
* @notice Returns the provenance hash.
* The provenance hash is used for random reveals, which
* is a hash of the ordered metadata to show it is unmodified
* after mint has started.
*/
function provenanceHash() external view override returns (bytes32) {
return _provenanceHash;
}
/**
* @notice Returns the URI for token metadata.
*
* This implementation returns the same URI for *all* token types.
* It relies on the token type ID substitution mechanism defined
* in the EIP to replace {id} with the token id.
*
* @custom:param tokenId The token id to get the URI for.
*/
function uri(
uint256 /* tokenId */
) public view virtual override returns (string memory) {
// Return the base URI.
return _baseURI;
}
/**
* @notice Returns the transfer validation function used.
*/
function getTransferValidationFunction()
external
pure
returns (bytes4 functionSignature, bool isViewFunction)
{
functionSignature = ITransferValidator1155.validateTransfer.selector;
isViewFunction = true;
}
/**
* @notice Set the transfer validator. Only callable by the token owner.
*/
function setTransferValidator(address newValidator) external onlyOwner {
// Set the new transfer validator.
_setTransferValidator(newValidator);
}
/// @dev Override this function to return true if `_beforeTokenTransfer` is used.
function _useBeforeTokenTransfer() internal view virtual override returns (bool) {
return true;
}
/**
* @dev Hook that is called before any token transfer.
* This includes minting and burning.
*/
function _beforeTokenTransfer(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory /* data */
) internal virtual override {
if (from != address(0) && to != address(0)) {
// Call the transfer validator if one is set.
address transferValidator = _transferValidator;
if (transferValidator != address(0)) {
for (uint256 i = 0; i < ids.length; i++) {
ITransferValidator1155(transferValidator).validateTransfer(
msg.sender,
from,
to,
ids[i],
amounts[i]
);
}
}
}
}
/**
* @notice Returns whether the interface is supported.
*
* @param interfaceId The interface id to check against.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(ERC1155, ERC2981) returns (bool) {
return
interfaceId == type(IERC1155ContractMetadata).interfaceId ||
interfaceId == type(ICreatorToken).interfaceId ||
interfaceId == type(ILegacyCreatorToken).interfaceId ||
interfaceId == 0x49064906 || // ERC-4906 (MetadataUpdate)
ERC2981.supportsInterface(interfaceId) ||
// ERC1155 returns supportsInterface true for
// ERC165, ERC1155, ERC1155MetadataURI
ERC1155.supportsInterface(interfaceId);
}
/**
* @dev Adds to the internal counters for a mint.
*
* @param to The address to mint to.
* @param id The token id to mint.
* @param amount The quantity to mint.
* @param data The data to pass if receiver is a contract.
*/
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual override {
// Increment mint counts.
_incrementMintCounts(to, id, amount);
ERC1155._mint(to, id, amount, data);
}
/**
* @dev Adds to the internal counters for a batch mint.
*
* @param to The address to mint to.
* @param ids The token ids to mint.
* @param amounts The quantities to mint.
* @param data The data to pass if receiver is a contract.
*/
function _batchMint(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual override {
// Put ids length on the stack to save MLOADs.
uint256 idsLength = ids.length;
for (uint256 i = 0; i < idsLength; ) {
// Increment mint counts.
_incrementMintCounts(to, ids[i], amounts[i]);
unchecked {
++i;
}
}
ERC1155._batchMint(to, ids, amounts, data);
}
/**
* @dev Subtracts from the internal counters for a burn.
*
* @param by The address calling the burn.
* @param from The address to burn from.
* @param id The token id to burn.
* @param amount The amount to burn.
*/
function _burn(
address by,
address from,
uint256 id,
uint256 amount
) internal virtual override {
// Reduce the supply.
_reduceSupplyOnBurn(id, amount);
ERC1155._burn(by, from, id, amount);
}
/**
* @dev Subtracts from the internal counters for a batch burn.
*
* @param by The address calling the burn.
* @param from The address to burn from.
* @param ids The token ids to burn.
* @param amounts The amounts to burn.
*/
function _batchBurn(
address by,
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual override {
// Put ids length on the stack to save MLOADs.
uint256 idsLength = ids.length;
for (uint256 i = 0; i < idsLength; ) {
// Reduce the supply.
_reduceSupplyOnBurn(ids[i], amounts[i]);
unchecked {
++i;
}
}
ERC1155._batchBurn(by, from, ids, amounts);
}
function _reduceSupplyOnBurn(uint256 id, uint256 amount) internal {
// Get the current token supply.
TokenSupply storage tokenSupply = _tokenSupply[id];
// Reduce the totalSupply.
unchecked {
tokenSupply.totalSupply -= uint64(amount);
}
}
/**
* @dev Internal function to increment mint counts.
*
* Note that this function does not check if the mint exceeds
* maxSupply, which should be validated before this function is called.
*
* @param to The address to mint to.
* @param id The token id to mint.
* @param amount The quantity to mint.
*/
function _incrementMintCounts(
address to,
uint256 id,
uint256 amount
) internal {
// Get the current token supply.
TokenSupply storage tokenSupply = _tokenSupply[id];
if (tokenSupply.totalMinted + amount > tokenSupply.maxSupply) {
revert MintExceedsMaxSupply(
tokenSupply.totalMinted + amount,
tokenSupply.maxSupply
);
}
// Increment supply and number minted.
// Can be unchecked because maxSupply cannot be set to exceed uint64.
unchecked {
tokenSupply.totalSupply += uint64(amount);
tokenSupply.totalMinted += uint64(amount);
// Increment total minted by user.
_totalMintedByUser[to] += amount;
// Increment total minted by user per token.
_totalMintedByUserPerToken[to][id] += amount;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { PublicDrop } from "./ERC1155SeaDropStructs.sol";
import { CreatorPayout } from "./SeaDropStructs.sol";
library ERC1155SeaDropContractOffererStorage {
struct Layout {
/// @notice The allowed Seaport addresses that can mint.
mapping(address => bool) _allowedSeaport;
/// @notice The enumerated allowed Seaport addresses.
address[] _enumeratedAllowedSeaport;
/// @notice The public drop data.
mapping(uint256 => PublicDrop) _publicDrops;
/// @notice The enumerated public drop indexes.
uint256[] _enumeratedPublicDropIndexes;
/// @notice The creator payout addresses and basis points.
CreatorPayout[] _creatorPayouts;
/// @notice The allow list merkle root.
bytes32 _allowListMerkleRoot;
/// @notice The allowed fee recipients.
mapping(address => bool) _allowedFeeRecipients;
/// @notice The enumerated allowed fee recipients.
address[] _enumeratedFeeRecipients;
/// @notice The allowed server-side signers.
mapping(address => bool) _allowedSigners;
/// @notice The enumerated allowed signers.
address[] _enumeratedSigners;
/// @notice The used signature digests.
mapping(bytes32 => bool) _usedDigests;
/// @notice The allowed payers.
mapping(address => bool) _allowedPayers;
/// @notice The enumerated allowed payers.
address[] _enumeratedPayers;
}
bytes32 internal constant STORAGE_SLOT =
bytes32(
uint256(
keccak256("contracts.storage.ERC1155SeaDropContractOfferer")
) - 1
);
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { PublicDrop } from "./ERC1155SeaDropStructs.sol";
import { SeaDropErrorsAndEvents } from "./SeaDropErrorsAndEvents.sol";
interface ERC1155SeaDropErrorsAndEvents is SeaDropErrorsAndEvents {
/**
* @dev Revert with an error if an empty PublicDrop is provided
* for an already-empty public drop.
*/
error PublicDropStageNotPresent();
/**
* @dev Revert with an error if the mint quantity exceeds the
* max minted per wallet for a certain token id.
*/
error MintQuantityExceedsMaxMintedPerWalletForTokenId(
uint256 tokenId,
uint256 total,
uint256 allowed
);
/**
* @dev Revert with an error if the target token id to mint is not within
* the drop stage range.
*/
error TokenIdNotWithinDropStageRange(
uint256 tokenId,
uint256 startTokenId,
uint256 endTokenId
);
/**
* @notice Revert with an error if the number of maxSupplyAmounts doesn't
* match the number of maxSupplyTokenIds.
*/
error MaxSupplyMismatch();
/**
* @notice Revert with an error if the number of mint tokenIds doesn't
* match the number of mint amounts.
*/
error MintAmountsMismatch();
/**
* @notice Revert with an error if the mint order offer contains
* a duplicate tokenId.
*/
error OfferContainsDuplicateTokenId(uint256 tokenId);
/**
* @dev Revert if the fromTokenId is greater than the toTokenId.
*/
error InvalidFromAndToTokenId(uint256 fromTokenId, uint256 toTokenId);
/**
* @notice Revert with an error if the number of publicDropIndexes doesn't
* match the number of publicDrops.
*/
error PublicDropsMismatch();
/**
* @dev An event with updated public drop data.
*/
event PublicDropUpdated(PublicDrop publicDrop, uint256 index);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { AllowListData, CreatorPayout } from "./SeaDropStructs.sol";
/**
* @notice A struct defining public drop data.
* Designed to fit efficiently in two storage slots.
*
* @param startPrice The start price per token. (Up to 1.2m
* of native token, e.g. ETH, MATIC)
* @param endPrice The end price per token. If this differs
* from startPrice, the current price will
* be calculated based on the current time.
* @param startTime The start time, ensure this is not zero.
* @param endTime The end time, ensure this is not zero.
* @param restrictFeeRecipients If false, allow any fee recipient;
* if true, check fee recipient is allowed.
* @param paymentToken The payment token address. Null for
* native token.
* @param fromTokenId The start token id for the stage.
* @param toTokenId The end token id for the stage.
* @param maxTotalMintableByWallet Maximum total number of mints a user is
* allowed. (The limit for this field is
* 2^16 - 1)
* @param maxTotalMintableByWalletPerToken Maximum total number of mints a user
* is allowed for the token id. (The limit for
* this field is 2^16 - 1)
* @param feeBps Fee out of 10_000 basis points to be
* collected.
*/
struct PublicDrop {
// slot 1
uint80 startPrice; // 80/512 bits
uint80 endPrice; // 160/512 bits
uint40 startTime; // 200/512 bits
uint40 endTime; // 240/512 bits
bool restrictFeeRecipients; // 248/512 bits
// uint8 unused;
// slot 2
address paymentToken; // 408/512 bits
uint24 fromTokenId; // 432/512 bits
uint24 toTokenId; // 456/512 bits
uint16 maxTotalMintableByWallet; // 472/512 bits
uint16 maxTotalMintableByWalletPerToken; // 488/512 bits
uint16 feeBps; // 504/512 bits
}
/**
* @notice A struct defining mint params for an allow list.
* An allow list leaf will be composed of `msg.sender` and
* the following params.
*
* Note: Since feeBps is encoded in the leaf, backend should ensure
* that feeBps is acceptable before generating a proof.
*
* @param startPrice The start price per token. (Up to 1.2m
* of native token, e.g. ETH, MATIC)
* @param endPrice The end price per token. If this differs
* from startPrice, the current price will
* be calculated based on the current time.
* @param startTime The start time, ensure this is not zero.
* @param endTime The end time, ensure this is not zero.
* @param paymentToken The payment token for the mint. Null for
* native token.
* @param fromTokenId The start token id for the stage.
* @param toTokenId The end token id for the stage.
* @param maxTotalMintableByWallet Maximum total number of mints a user is
* allowed.
* @param maxTotalMintableByWalletPerToken Maximum total number of mints a user
* is allowed for the token id.
* @param maxTokenSupplyForStage The limit of token supply this stage can
* mint within.
* @param dropStageIndex The drop stage index to emit with the event
* for analytical purposes. This should be
* non-zero since the public mint emits with
* index zero.
* @param feeBps Fee out of 10_000 basis points to be
* collected.
* @param restrictFeeRecipients If false, allow any fee recipient;
* if true, check fee recipient is allowed.
*/
struct MintParams {
uint256 startPrice;
uint256 endPrice;
uint256 startTime;
uint256 endTime;
address paymentToken;
uint256 fromTokenId;
uint256 toTokenId;
uint256 maxTotalMintableByWallet;
uint256 maxTotalMintableByWalletPerToken;
uint256 maxTokenSupplyForStage;
uint256 dropStageIndex; // non-zero
uint256 feeBps;
bool restrictFeeRecipients;
}
/**
* @dev Struct containing internal SeaDrop implementation logic
* mint details to avoid stack too deep.
*
* @param feeRecipient The fee recipient.
* @param payer The payer of the mint.
* @param minter The mint recipient.
* @param tokenIds The tokenIds to mint.
* @param quantities The number of tokens to mint per tokenId.
* @param withEffects Whether to apply state changes of the mint.
*/
struct MintDetails {
address feeRecipient;
address payer;
address minter;
uint256[] tokenIds;
uint256[] quantities;
bool withEffects;
}
/**
* @notice A struct to configure multiple contract options in one transaction.
*/
struct MultiConfigureStruct {
uint256[] maxSupplyTokenIds;
uint256[] maxSupplyAmounts;
string baseURI;
string contractURI;
PublicDrop[] publicDrops;
uint256[] publicDropsIndexes;
string dropURI;
AllowListData allowListData;
CreatorPayout[] creatorPayouts;
bytes32 provenanceHash;
address[] allowedFeeRecipients;
address[] disallowedFeeRecipients;
address[] allowedPayers;
address[] disallowedPayers;
// Server-signed
address[] allowedSigners;
address[] disallowedSigners;
// ERC-2981
address royaltyReceiver;
uint96 royaltyBps;
// Mint
address mintRecipient;
uint256[] mintTokenIds;
uint256[] mintAmounts;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/**
* @notice A struct defining a creator payout address and basis points.
*
* @param payoutAddress The payout address.
* @param basisPoints The basis points to pay out to the creator.
* The total creator payouts must equal 10_000 bps.
*/
struct CreatorPayout {
address payoutAddress;
uint16 basisPoints;
}
/**
* @notice A struct defining allow list data (for minting an allow list).
*
* @param merkleRoot The merkle root for the allow list.
* @param publicKeyURIs If the allowListURI is encrypted, a list of URIs
* pointing to the public keys. Empty if unencrypted.
* @param allowListURI The URI for the allow list.
*/
struct AllowListData {
bytes32 merkleRoot;
string[] publicKeyURIs;
string allowListURI;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { ERC1155 } from "solady/src/tokens/ERC1155.sol";
/**
* @title ERC1155ConduitPreapproved
* @notice Solady's ERC1155 with the OpenSea conduit preapproved.
*/
abstract contract ERC1155ConduitPreapproved is ERC1155 {
/// @dev The canonical OpenSea conduit.
address internal constant _CONDUIT =
0x1E0049783F008A0085193E00003D00cd54003c71;
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual override {
_safeTransfer(_by(), from, to, id, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public virtual override {
_safeBatchTransfer(_by(), from, to, ids, amounts, data);
}
function isApprovedForAll(
address owner,
address operator
) public view virtual override returns (bool) {
if (operator == _CONDUIT) return true;
return ERC1155.isApprovedForAll(owner, operator);
}
function _by() internal view virtual returns (address result) {
assembly {
// `msg.sender == _CONDUIT ? address(0) : msg.sender`.
result := mul(iszero(eq(caller(), _CONDUIT)), caller())
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple ERC1155 implementation.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)
///
/// @dev Note:
/// The ERC1155 standard allows for self-approvals.
/// For performance, this implementation WILL NOT revert for such actions.
/// Please add any checks with overrides if desired.
abstract contract ERC1155 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The lengths of the input arrays are not the same.
error ArrayLengthsMismatch();
/// @dev Cannot mint or transfer to the zero address.
error TransferToZeroAddress();
/// @dev The recipient's balance has overflowed.
error AccountBalanceOverflow();
/// @dev Insufficient balance.
error InsufficientBalance();
/// @dev Only the token owner or an approved account can manage the tokens.
error NotOwnerNorApproved();
/// @dev Cannot safely transfer to a contract that does not implement
/// the ERC1155Receiver interface.
error TransferToNonERC1155ReceiverImplementer();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Emitted when `amount` of token `id` is transferred
/// from `from` to `to` by `operator`.
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 amount
);
/// @dev Emitted when `amounts` of token `ids` are transferred
/// from `from` to `to` by `operator`.
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] amounts
);
/// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.
event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);
/// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`
/// is updated to `value`. This event is not used in the base contract.
/// You may need to emit this event depending on your URI logic.
///
/// See: https://eips.ethereum.org/EIPS/eip-1155#metadata
event URI(string value, uint256 indexed id);
/// @dev `keccak256(bytes("TransferSingle(address,address,address,uint256,uint256)"))`.
uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =
0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;
/// @dev `keccak256(bytes("TransferBatch(address,address,address,uint256[],uint256[])"))`.
uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =
0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;
/// @dev `keccak256(bytes("ApprovalForAll(address,address,bool)"))`.
uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =
0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The `ownerSlotSeed` of a given owner is given by.
/// ```
/// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))
/// ```
///
/// The balance slot of `owner` is given by.
/// ```
/// mstore(0x20, ownerSlotSeed)
/// mstore(0x00, id)
/// let balanceSlot := keccak256(0x00, 0x40)
/// ```
///
/// The operator approval slot of `owner` is given by.
/// ```
/// mstore(0x20, ownerSlotSeed)
/// mstore(0x00, operator)
/// let operatorApprovalSlot := keccak256(0x0c, 0x34)
/// ```
uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC1155 METADATA */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the URI for token `id`.
///
/// You can either return the same templated URI for all token IDs,
/// (e.g. "https://example.com/api/{id}.json"),
/// or return a unique URI for each `id`.
///
/// See: https://eips.ethereum.org/EIPS/eip-1155#metadata
function uri(uint256 id) public view virtual returns (string memory);
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC1155 */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the amount of `id` owned by `owner`.
function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x20, _ERC1155_MASTER_SLOT_SEED)
mstore(0x14, owner)
mstore(0x00, id)
result := sload(keccak256(0x00, 0x40))
}
}
/// @dev Returns whether `operator` is approved to manage the tokens of `owner`.
function isApprovedForAll(address owner, address operator)
public
view
virtual
returns (bool result)
{
/// @solidity memory-safe-assembly
assembly {
mstore(0x20, _ERC1155_MASTER_SLOT_SEED)
mstore(0x14, owner)
mstore(0x00, operator)
result := sload(keccak256(0x0c, 0x34))
}
}
/// @dev Sets whether `operator` is approved to manage the tokens of the caller.
///
/// Emits a {ApprovalForAll} event.
function setApprovalForAll(address operator, bool isApproved) public virtual {
/// @solidity memory-safe-assembly
assembly {
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`msg.sender`, `operator`).
mstore(0x20, _ERC1155_MASTER_SLOT_SEED)
mstore(0x14, caller())
mstore(0x00, operator)
sstore(keccak256(0x0c, 0x34), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
// forgefmt: disable-next-line
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))
}
}
/// @dev Transfers `amount` of `id` from `from` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - `from` must have at least `amount` of `id`.
/// - If the caller is not `from`,
/// it must be approved to manage the tokens of `from`.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155Reveived}, which is called upon a batch transfer.
///
/// Emits a {Transfer} event.
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, to, _single(id), _single(amount), data);
}
/// @solidity memory-safe-assembly
assembly {
let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))
let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))
mstore(0x20, fromSlotSeed)
// Clear the upper 96 bits.
from := shr(96, fromSlotSeed)
to := shr(96, toSlotSeed)
// Revert if `to` is the zero address.
if iszero(to) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
// If the caller is not `from`, do the authorization check.
if iszero(eq(caller(), from)) {
mstore(0x00, caller())
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Subtract and store the updated balance of `from`.
{
mstore(0x00, id)
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
// Increase and store the updated balance of `to`.
{
mstore(0x20, toSlotSeed)
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
// Emit a {TransferSingle} event.
mstore(0x20, amount)
log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, to, _single(id), _single(amount), data);
}
/// @solidity memory-safe-assembly
assembly {
// Do the {onERC1155Received} check if `to` is a smart contract.
if extcodesize(to) {
// Prepare the calldata.
let m := mload(0x40)
// `onERC1155Received(address,address,uint256,uint256,bytes)`.
mstore(m, 0xf23a6e61)
mstore(add(m, 0x20), caller())
mstore(add(m, 0x40), from)
mstore(add(m, 0x60), id)
mstore(add(m, 0x80), amount)
mstore(add(m, 0xa0), 0xa0)
calldatacopy(add(m, 0xc0), sub(data.offset, 0x20), add(0x20, data.length))
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(0x00, 0x00, returndatasize())
revert(0x00, returndatasize())
}
mstore(m, 0)
}
// Load the returndata and compare it with the function selector.
if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {
mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
}
/// @dev Transfers `amounts` of `ids` from `from` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - `from` must have at least `amount` of `id`.
/// - `ids` and `amounts` must have the same length.
/// - If the caller is not `from`,
/// it must be approved to manage the tokens of `from`.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155BatchReveived}, which is called upon a batch transfer.
///
/// Emits a {TransferBatch} event.
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, to, ids, amounts, data);
}
/// @solidity memory-safe-assembly
assembly {
if iszero(eq(ids.length, amounts.length)) {
mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.
revert(0x1c, 0x04)
}
let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))
let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))
mstore(0x20, fromSlotSeed)
// Clear the upper 96 bits.
from := shr(96, fromSlotSeed)
to := shr(96, toSlotSeed)
// Revert if `to` is the zero address.
if iszero(to) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
// If the caller is not `from`, do the authorization check.
if iszero(eq(caller(), from)) {
mstore(0x00, caller())
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Loop through all the `ids` and update the balances.
{
let end := shl(5, ids.length)
for { let i := 0 } iszero(eq(i, end)) { i := add(i, 0x20) } {
let amount := calldataload(add(amounts.offset, i))
// Subtract and store the updated balance of `from`.
{
mstore(0x20, fromSlotSeed)
mstore(0x00, calldataload(add(ids.offset, i)))
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
// Increase and store the updated balance of `to`.
{
mstore(0x20, toSlotSeed)
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
}
}
// Emit a {TransferBatch} event.
{
let m := mload(0x40)
// Copy the `ids`.
mstore(m, 0x40)
let n := add(0x20, shl(5, ids.length))
let o := add(m, 0x40)
calldatacopy(o, sub(ids.offset, 0x20), n)
// Copy the `amounts`.
mstore(add(m, 0x20), add(0x40, n))
o := add(o, n)
n := add(0x20, shl(5, amounts.length))
calldatacopy(o, sub(amounts.offset, 0x20), n)
n := sub(add(o, n), m)
// Do the emit.
log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)
}
}
if (_useAfterTokenTransfer()) {
_afterTokenTransferCalldata(from, to, ids, amounts, data);
}
/// @solidity memory-safe-assembly
assembly {
// Do the {onERC1155BatchReceived} check if `to` is a smart contract.
if extcodesize(to) {
let m := mload(0x40)
// Prepare the calldata.
// `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.
mstore(m, 0xbc197c81)
mstore(add(m, 0x20), caller())
mstore(add(m, 0x40), from)
// Copy the `ids`.
mstore(add(m, 0x60), 0xa0)
let n := add(0x20, shl(5, ids.length))
let o := add(m, 0xc0)
calldatacopy(o, sub(ids.offset, 0x20), n)
// Copy the `amounts`.
let s := add(0xa0, n)
mstore(add(m, 0x80), s)
o := add(o, n)
n := add(0x20, shl(5, amounts.length))
calldatacopy(o, sub(amounts.offset, 0x20), n)
// Copy the `data`.
mstore(add(m, 0xa0), add(s, n))
o := add(o, n)
n := add(0x20, data.length)
calldatacopy(o, sub(data.offset, 0x20), n)
n := sub(add(o, n), add(m, 0x1c))
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(0x00, 0x00, returndatasize())
revert(0x00, returndatasize())
}
mstore(m, 0)
}
// Load the returndata and compare it with the function selector.
if iszero(eq(mload(m), shl(224, 0xbc197c81))) {
mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
}
/// @dev Returns the amounts of `ids` for `owners.
///
/// Requirements:
/// - `owners` and `ids` must have the same length.
function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
public
view
virtual
returns (uint256[] memory balances)
{
/// @solidity memory-safe-assembly
assembly {
if iszero(eq(ids.length, owners.length)) {
mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.
revert(0x1c, 0x04)
}
balances := mload(0x40)
mstore(balances, ids.length)
let o := add(balances, 0x20)
let end := shl(5, ids.length)
mstore(0x40, add(end, o))
// Loop through all the `ids` and load the balances.
for { let i := 0 } iszero(eq(i, end)) { i := add(i, 0x20) } {
let owner := calldataload(add(owners.offset, i))
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))
mstore(0x00, calldataload(add(ids.offset, i)))
mstore(add(o, i), sload(keccak256(0x00, 0x40)))
}
}
}
/// @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.
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
let s := shr(224, interfaceId)
// ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.
result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL MINT FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Mints `amount` of `id` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155Reveived}, which is called upon a batch transfer.
///
/// Emits a {Transfer} event.
function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);
}
/// @solidity memory-safe-assembly
assembly {
let to_ := shl(96, to)
// Revert if `to` is the zero address.
if iszero(to_) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
// Increase and store the updated balance of `to`.
{
mstore(0x20, _ERC1155_MASTER_SLOT_SEED)
mstore(0x14, to)
mstore(0x00, id)
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
// Emit a {TransferSingle} event.
mstore(0x00, id)
mstore(0x20, amount)
log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(address(0), to, _single(id), _single(amount), data);
}
if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);
}
/// @dev Mints `amounts` of `ids` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - `ids` and `amounts` must have the same length.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155BatchReveived}, which is called upon a batch transfer.
///
/// Emits a {TransferBatch} event.
function _batchMint(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(address(0), to, ids, amounts, data);
}
/// @solidity memory-safe-assembly
assembly {
if iszero(eq(mload(ids), mload(amounts))) {
mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.
revert(0x1c, 0x04)
}
let to_ := shl(96, to)
// Revert if `to` is the zero address.
if iszero(to_) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
// Loop through all the `ids` and update the balances.
{
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))
let end := shl(5, mload(ids))
for { let i := 0 } iszero(eq(i, end)) {} {
i := add(i, 0x20)
let amount := mload(add(amounts, i))
// Increase and store the updated balance of `to`.
{
mstore(0x00, mload(add(ids, i)))
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
}
}
// Emit a {TransferBatch} event.
{
let m := mload(0x40)
// Copy the `ids`.
mstore(m, 0x40)
let n := add(0x20, shl(5, mload(ids)))
let o := add(m, 0x40)
pop(staticcall(gas(), 4, ids, n, o, n))
// Copy the `amounts`.
mstore(add(m, 0x20), add(0x40, returndatasize()))
o := add(o, returndatasize())
n := add(0x20, shl(5, mload(amounts)))
pop(staticcall(gas(), 4, amounts, n, o, n))
n := sub(add(o, returndatasize()), m)
// Do the emit.
log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))
}
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(address(0), to, ids, amounts, data);
}
if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL BURN FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_burn(address(0), from, id, amount)`.
function _burn(address from, uint256 id, uint256 amount) internal virtual {
_burn(address(0), from, id, amount);
}
/// @dev Destroys `amount` of `id` from `from`.
///
/// Requirements:
/// - `from` must have at least `amount` of `id`.
/// - If `by` is not the zero address, it must be either `from`,
/// or approved to manage the tokens of `from`.
///
/// Emits a {Transfer} event.
function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, address(0), _single(id), _single(amount), "");
}
/// @solidity memory-safe-assembly
assembly {
let from_ := shl(96, from)
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))
// If `by` is not the zero address, and not equal to `from`,
// check if it is approved to manage all the tokens of `from`.
if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {
mstore(0x00, by)
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Decrease and store the updated balance of `from`.
{
mstore(0x00, id)
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
// Emit a {TransferSingle} event.
mstore(0x00, id)
mstore(0x20, amount)
log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, address(0), _single(id), _single(amount), "");
}
}
/// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.
function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)
internal
virtual
{
_batchBurn(address(0), from, ids, amounts);
}
/// @dev Destroys `amounts` of `ids` from `from`.
///
/// Requirements:
/// - `ids` and `amounts` must have the same length.
/// - `from` must have at least `amounts` of `ids`.
/// - If `by` is not the zero address, it must be either `from`,
/// or approved to manage the tokens of `from`.
///
/// Emits a {TransferBatch} event.
function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)
internal
virtual
{
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, address(0), ids, amounts, "");
}
/// @solidity memory-safe-assembly
assembly {
if iszero(eq(mload(ids), mload(amounts))) {
mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.
revert(0x1c, 0x04)
}
let from_ := shl(96, from)
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))
// If `by` is not the zero address, and not equal to `from`,
// check if it is approved to manage all the tokens of `from`.
let by_ := shl(96, by)
if iszero(or(iszero(by_), eq(by_, from_))) {
mstore(0x00, by)
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Loop through all the `ids` and update the balances.
{
let end := shl(5, mload(ids))
for { let i := 0 } iszero(eq(i, end)) {} {
i := add(i, 0x20)
let amount := mload(add(amounts, i))
// Decrease and store the updated balance of `to`.
{
mstore(0x00, mload(add(ids, i)))
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
}
}
// Emit a {TransferBatch} event.
{
let m := mload(0x40)
// Copy the `ids`.
mstore(m, 0x40)
let n := add(0x20, shl(5, mload(ids)))
let o := add(m, 0x40)
pop(staticcall(gas(), 4, ids, n, o, n))
// Copy the `amounts`.
mstore(add(m, 0x20), add(0x40, returndatasize()))
o := add(o, returndatasize())
n := add(0x20, shl(5, mload(amounts)))
pop(staticcall(gas(), 4, amounts, n, o, n))
n := sub(add(o, returndatasize()), m)
// Do the emit.
log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)
}
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, address(0), ids, amounts, "");
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL APPROVAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Approve or remove the `operator` as an operator for `by`,
/// without authorization checks.
///
/// Emits a {ApprovalForAll} event.
function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`by`, `operator`).
mstore(0x20, _ERC1155_MASTER_SLOT_SEED)
mstore(0x14, by)
mstore(0x00, operator)
sstore(keccak256(0x0c, 0x34), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
let m := shr(96, not(0))
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL TRANSFER FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.
function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)
internal
virtual
{
_safeTransfer(address(0), from, to, id, amount, data);
}
/// @dev Transfers `amount` of `id` from `from` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - `from` must have at least `amount` of `id`.
/// - If `by` is not the zero address, it must be either `from`,
/// or approved to manage the tokens of `from`.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155Reveived}, which is called upon a batch transfer.
///
/// Emits a {Transfer} event.
function _safeTransfer(
address by,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, to, _single(id), _single(amount), data);
}
/// @solidity memory-safe-assembly
assembly {
let from_ := shl(96, from)
let to_ := shl(96, to)
// Revert if `to` is the zero address.
if iszero(to_) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))
// If `by` is not the zero address, and not equal to `from`,
// check if it is approved to manage all the tokens of `from`.
let by_ := shl(96, by)
if iszero(or(iszero(by_), eq(by_, from_))) {
mstore(0x00, by)
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Subtract and store the updated balance of `from`.
{
mstore(0x00, id)
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
// Increase and store the updated balance of `to`.
{
mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
// Emit a {TransferSingle} event.
mstore(0x20, amount)
// forgefmt: disable-next-line
log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, to, _single(id), _single(amount), data);
}
if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);
}
/// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.
function _safeBatchTransfer(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
_safeBatchTransfer(address(0), from, to, ids, amounts, data);
}
/// @dev Transfers `amounts` of `ids` from `from` to `to`.
///
/// Requirements:
/// - `to` cannot be the zero address.
/// - `ids` and `amounts` must have the same length.
/// - `from` must have at least `amounts` of `ids`.
/// - If `by` is not the zero address, it must be either `from`,
/// or approved to manage the tokens of `from`.
/// - If `to` refers to a smart contract, it must implement
/// {ERC1155-onERC1155BatchReveived}, which is called upon a batch transfer.
///
/// Emits a {TransferBatch} event.
function _safeBatchTransfer(
address by,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
if (_useBeforeTokenTransfer()) {
_beforeTokenTransfer(from, to, ids, amounts, data);
}
/// @solidity memory-safe-assembly
assembly {
if iszero(eq(mload(ids), mload(amounts))) {
mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.
revert(0x1c, 0x04)
}
let from_ := shl(96, from)
let to_ := shl(96, to)
// Revert if `to` is the zero address.
if iszero(to_) {
mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.
revert(0x1c, 0x04)
}
let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)
let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)
mstore(0x20, fromSlotSeed)
// If `by` is not the zero address, and not equal to `from`,
// check if it is approved to manage all the tokens of `from`.
let by_ := shl(96, by)
if iszero(or(iszero(by_), eq(by_, from_))) {
mstore(0x00, by)
if iszero(sload(keccak256(0x0c, 0x34))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Loop through all the `ids` and update the balances.
{
let end := shl(5, mload(ids))
for { let i := 0 } iszero(eq(i, end)) {} {
i := add(i, 0x20)
let amount := mload(add(amounts, i))
// Subtract and store the updated balance of `from`.
{
mstore(0x20, fromSlotSeed)
mstore(0x00, mload(add(ids, i)))
let fromBalanceSlot := keccak256(0x00, 0x40)
let fromBalance := sload(fromBalanceSlot)
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
sstore(fromBalanceSlot, sub(fromBalance, amount))
}
// Increase and store the updated balance of `to`.
{
mstore(0x20, toSlotSeed)
let toBalanceSlot := keccak256(0x00, 0x40)
let toBalanceBefore := sload(toBalanceSlot)
let toBalanceAfter := add(toBalanceBefore, amount)
if lt(toBalanceAfter, toBalanceBefore) {
mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceAfter)
}
}
}
// Emit a {TransferBatch} event.
{
let m := mload(0x40)
// Copy the `ids`.
mstore(m, 0x40)
let n := add(0x20, shl(5, mload(ids)))
let o := add(m, 0x40)
pop(staticcall(gas(), 4, ids, n, o, n))
// Copy the `amounts`.
mstore(add(m, 0x20), add(0x40, returndatasize()))
o := add(o, returndatasize())
n := add(0x20, shl(5, mload(amounts)))
pop(staticcall(gas(), 4, amounts, n, o, n))
n := sub(add(o, returndatasize()), m)
// Do the emit.
log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))
}
}
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, to, ids, amounts, data);
}
if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* HOOKS FOR OVERRIDING */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Override this function to return true if `_beforeTokenTransfer` is used.
/// The is to help the compiler avoid producing dead bytecode.
function _useBeforeTokenTransfer() internal view virtual returns (bool) {
return false;
}
/// @dev Hook that is called before any token transfer.
/// This includes minting and burning, as well as batched variants.
///
/// The same hook is called on both single and batched variants.
/// For single transfers, the length of the `id` and `amount` arrays are 1.
function _beforeTokenTransfer(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/// @dev Override this function to return true if `_afterTokenTransfer` is used.
/// The is to help the compiler avoid producing dead bytecode.
function _useAfterTokenTransfer() internal view virtual returns (bool) {
return false;
}
/// @dev Hook that is called after any token transfer.
/// This includes minting and burning, as well as batched variants.
///
/// The same hook is called on both single and batched variants.
/// For single transfers, the length of the `id` and `amount` arrays are 1.
function _afterTokenTransfer(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PRIVATE HELPERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Helper for calling the `_afterTokenTransfer` hook.
/// The is to help the compiler avoid producing dead bytecode.
function _afterTokenTransferCalldata(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) private {
if (_useAfterTokenTransfer()) {
_afterTokenTransfer(from, to, ids, amounts, data);
}
}
/// @dev Returns if `a` has bytecode of non-zero length.
function _hasCode(address a) private view returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
result := extcodesize(a) // Can handle dirty upper bits.
}
}
/// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.
/// Reverts if the target does not support the function correctly.
function _checkOnERC1155Received(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
/// @solidity memory-safe-assembly
assembly {
// Prepare the calldata.
let m := mload(0x40)
// `onERC1155Received(address,address,uint256,uint256,bytes)`.
mstore(m, 0xf23a6e61)
mstore(add(m, 0x20), caller())
mstore(add(m, 0x40), shr(96, shl(96, from)))
mstore(add(m, 0x60), id)
mstore(add(m, 0x80), amount)
mstore(add(m, 0xa0), 0xa0)
let n := mload(data)
mstore(add(m, 0xc0), n)
if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(0x00, 0x00, returndatasize())
revert(0x00, returndatasize())
}
mstore(m, 0)
}
// Load the returndata and compare it with the function selector.
if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {
mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.
/// Reverts if the target does not support the function correctly.
function _checkOnERC1155BatchReceived(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
/// @solidity memory-safe-assembly
assembly {
// Prepare the calldata.
let m := mload(0x40)
// `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.
mstore(m, 0xbc197c81)
mstore(add(m, 0x20), caller())
mstore(add(m, 0x40), shr(96, shl(96, from)))
// Copy the `ids`.
mstore(add(m, 0x60), 0xa0)
let n := add(0x20, shl(5, mload(ids)))
let o := add(m, 0xc0)
pop(staticcall(gas(), 4, ids, n, o, n))
// Copy the `amounts`.
let s := add(0xa0, returndatasize())
mstore(add(m, 0x80), s)
o := add(o, returndatasize())
n := add(0x20, shl(5, mload(amounts)))
pop(staticcall(gas(), 4, amounts, n, o, n))
// Copy the `data`.
mstore(add(m, 0xa0), add(s, returndatasize()))
o := add(o, returndatasize())
n := add(0x20, mload(data))
pop(staticcall(gas(), 4, data, n, o, n))
n := sub(add(o, returndatasize()), add(m, 0x1c))
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(0x00, 0x00, returndatasize())
revert(0x00, returndatasize())
}
mstore(m, 0)
}
// Load the returndata and compare it with the function selector.
if iszero(eq(mload(m), shl(224, 0xbc197c81))) {
mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns `x` in an array with a single element.
function _single(uint256 x) private pure returns (uint256[] memory result) {
assembly {
result := mload(0x40)
mstore(0x40, add(result, 0x40))
mstore(result, 1)
mstore(add(result, 0x20), x)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {
BasicOrderType,
ItemType,
OrderType,
Side
} from "./ConsiderationEnums.sol";
import {
CalldataPointer,
MemoryPointer
} from "../helpers/PointerLibraries.sol";
/**
* @dev An order contains eleven components: an offerer, a zone (or account that
* can cancel the order or restrict who can fulfill the order depending on
* the type), the order type (specifying partial fill support as well as
* restricted order status), the start and end time, a hash that will be
* provided to the zone when validating restricted orders, a salt, a key
* corresponding to a given conduit, a counter, and an arbitrary number of
* offer items that can be spent along with consideration items that must
* be received by their respective recipient.
*/
struct OrderComponents {
address offerer;
address zone;
OfferItem[] offer;
ConsiderationItem[] consideration;
OrderType orderType;
uint256 startTime;
uint256 endTime;
bytes32 zoneHash;
uint256 salt;
bytes32 conduitKey;
uint256 counter;
}
/**
* @dev An offer item has five components: an item type (ETH or other native
* tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and
* ERC1155), a token address, a dual-purpose "identifierOrCriteria"
* component that will either represent a tokenId or a merkle root
* depending on the item type, and a start and end amount that support
* increasing or decreasing amounts over the duration of the respective
* order.
*/
struct OfferItem {
ItemType itemType;
address token;
uint256 identifierOrCriteria;
uint256 startAmount;
uint256 endAmount;
}
/**
* @dev A consideration item has the same five components as an offer item and
* an additional sixth component designating the required recipient of the
* item.
*/
struct ConsiderationItem {
ItemType itemType;
address token;
uint256 identifierOrCriteria;
uint256 startAmount;
uint256 endAmount;
address payable recipient;
}
/**
* @dev A spent item is translated from a utilized offer item and has four
* components: an item type (ETH or other native tokens, ERC20, ERC721, and
* ERC1155), a token address, a tokenId, and an amount.
*/
struct SpentItem {
ItemType itemType;
address token;
uint256 identifier;
uint256 amount;
}
/**
* @dev A received item is translated from a utilized consideration item and has
* the same four components as a spent item, as well as an additional fifth
* component designating the required recipient of the item.
*/
struct ReceivedItem {
ItemType itemType;
address token;
uint256 identifier;
uint256 amount;
address payable recipient;
}
/**
* @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155
* matching, a group of six functions may be called that only requires a
* subset of the usual order arguments. Note the use of a "basicOrderType"
* enum; this represents both the usual order type as well as the "route"
* of the basic order (a simple derivation function for the basic order
* type is `basicOrderType = orderType + (4 * basicOrderRoute)`.)
*/
struct BasicOrderParameters {
// calldata offset
address considerationToken; // 0x24
uint256 considerationIdentifier; // 0x44
uint256 considerationAmount; // 0x64
address payable offerer; // 0x84
address zone; // 0xa4
address offerToken; // 0xc4
uint256 offerIdentifier; // 0xe4
uint256 offerAmount; // 0x104
BasicOrderType basicOrderType; // 0x124
uint256 startTime; // 0x144
uint256 endTime; // 0x164
bytes32 zoneHash; // 0x184
uint256 salt; // 0x1a4
bytes32 offererConduitKey; // 0x1c4
bytes32 fulfillerConduitKey; // 0x1e4
uint256 totalOriginalAdditionalRecipients; // 0x204
AdditionalRecipient[] additionalRecipients; // 0x224
bytes signature; // 0x244
// Total length, excluding dynamic array data: 0x264 (580)
}
/**
* @dev Basic orders can supply any number of additional recipients, with the
* implied assumption that they are supplied from the offered ETH (or other
* native token) or ERC20 token for the order.
*/
struct AdditionalRecipient {
uint256 amount;
address payable recipient;
}
/**
* @dev The full set of order components, with the exception of the counter,
* must be supplied when fulfilling more sophisticated orders or groups of
* orders. The total number of original consideration items must also be
* supplied, as the caller may specify additional consideration items.
*/
struct OrderParameters {
address offerer; // 0x00
address zone; // 0x20
OfferItem[] offer; // 0x40
ConsiderationItem[] consideration; // 0x60
OrderType orderType; // 0x80
uint256 startTime; // 0xa0
uint256 endTime; // 0xc0
bytes32 zoneHash; // 0xe0
uint256 salt; // 0x100
bytes32 conduitKey; // 0x120
uint256 totalOriginalConsiderationItems; // 0x140
// offer.length // 0x160
}
/**
* @dev Orders require a signature in addition to the other order parameters.
*/
struct Order {
OrderParameters parameters;
bytes signature;
}
/**
* @dev Advanced orders include a numerator (i.e. a fraction to attempt to fill)
* and a denominator (the total size of the order) in addition to the
* signature and other order parameters. It also supports an optional field
* for supplying extra data; this data will be provided to the zone if the
* order type is restricted and the zone is not the caller, or will be
* provided to the offerer as context for contract order types.
*/
struct AdvancedOrder {
OrderParameters parameters;
uint120 numerator;
uint120 denominator;
bytes signature;
bytes extraData;
}
/**
* @dev Orders can be validated (either explicitly via `validate`, or as a
* consequence of a full or partial fill), specifically cancelled (they can
* also be cancelled in bulk via incrementing a per-zone counter), and
* partially or fully filled (with the fraction filled represented by a
* numerator and denominator).
*/
struct OrderStatus {
bool isValidated;
bool isCancelled;
uint120 numerator;
uint120 denominator;
}
/**
* @dev A criteria resolver specifies an order, side (offer vs. consideration),
* and item index. It then provides a chosen identifier (i.e. tokenId)
* alongside a merkle proof demonstrating the identifier meets the required
* criteria.
*/
struct CriteriaResolver {
uint256 orderIndex;
Side side;
uint256 index;
uint256 identifier;
bytes32[] criteriaProof;
}
/**
* @dev A fulfillment is applied to a group of orders. It decrements a series of
* offer and consideration items, then generates a single execution
* element. A given fulfillment can be applied to as many offer and
* consideration items as desired, but must contain at least one offer and
* at least one consideration that match. The fulfillment must also remain
* consistent on all key parameters across all offer items (same offerer,
* token, type, tokenId, and conduit preference) as well as across all
* consideration items (token, type, tokenId, and recipient).
*/
struct Fulfillment {
FulfillmentComponent[] offerComponents;
FulfillmentComponent[] considerationComponents;
}
/**
* @dev Each fulfillment component contains one index referencing a specific
* order and another referencing a specific offer or consideration item.
*/
struct FulfillmentComponent {
uint256 orderIndex;
uint256 itemIndex;
}
/**
* @dev An execution is triggered once all consideration items have been zeroed
* out. It sends the item in question from the offerer to the item's
* recipient, optionally sourcing approvals from either this contract
* directly or from the offerer's chosen conduit if one is specified. An
* execution is not provided as an argument, but rather is derived via
* orders, criteria resolvers, and fulfillments (where the total number of
* executions will be less than or equal to the total number of indicated
* fulfillments) and returned as part of `matchOrders`.
*/
struct Execution {
ReceivedItem item;
address offerer;
bytes32 conduitKey;
}
/**
* @dev Restricted orders are validated post-execution by calling validateOrder
* on the zone. This struct provides context about the order fulfillment
* and any supplied extraData, as well as all order hashes fulfilled in a
* call to a match or fulfillAvailable method.
*/
struct ZoneParameters {
bytes32 orderHash;
address fulfiller;
address offerer;
SpentItem[] offer;
ReceivedItem[] consideration;
bytes extraData;
bytes32[] orderHashes;
uint256 startTime;
uint256 endTime;
bytes32 zoneHash;
}
/**
* @dev Zones and contract offerers can communicate which schemas they implement
* along with any associated metadata related to each schema.
*/
struct Schema {
uint256 id;
bytes metadata;
}
using StructPointers for OrderComponents global;
using StructPointers for OfferItem global;
using StructPointers for ConsiderationItem global;
using StructPointers for SpentItem global;
using StructPointers for ReceivedItem global;
using StructPointers for BasicOrderParameters global;
using StructPointers for AdditionalRecipient global;
using StructPointers for OrderParameters global;
using StructPointers for Order global;
using StructPointers for AdvancedOrder global;
using StructPointers for OrderStatus global;
using StructPointers for CriteriaResolver global;
using StructPointers for Fulfillment global;
using StructPointers for FulfillmentComponent global;
using StructPointers for Execution global;
using StructPointers for ZoneParameters global;
/**
* @dev This library provides a set of functions for converting structs to
* pointers.
*/
library StructPointers {
/**
* @dev Get a MemoryPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
OrderComponents memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderComponents.
*
* @param obj The OrderComponents object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
OrderComponents calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
OfferItem memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OfferItem.
*
* @param obj The OfferItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
OfferItem calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
ConsiderationItem memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ConsiderationItem.
*
* @param obj The ConsiderationItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
ConsiderationItem calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
SpentItem memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from SpentItem.
*
* @param obj The SpentItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
SpentItem calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
ReceivedItem memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ReceivedItem.
*
* @param obj The ReceivedItem object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
ReceivedItem calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
BasicOrderParameters memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from BasicOrderParameters.
*
* @param obj The BasicOrderParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
BasicOrderParameters calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
AdditionalRecipient memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdditionalRecipient.
*
* @param obj The AdditionalRecipient object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
AdditionalRecipient calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
OrderParameters memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderParameters.
*
* @param obj The OrderParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
OrderParameters calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
Order memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Order.
*
* @param obj The Order object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
Order calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
AdvancedOrder memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from AdvancedOrder.
*
* @param obj The AdvancedOrder object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
AdvancedOrder calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
OrderStatus memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from OrderStatus.
*
* @param obj The OrderStatus object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
OrderStatus calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
CriteriaResolver memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from CriteriaResolver.
*
* @param obj The CriteriaResolver object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
CriteriaResolver calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
Fulfillment memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Fulfillment.
*
* @param obj The Fulfillment object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
Fulfillment calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
FulfillmentComponent memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from FulfillmentComponent.
*
* @param obj The FulfillmentComponent object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
FulfillmentComponent calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
Execution memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from Execution.
*
* @param obj The Execution object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
Execution calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a MemoryPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The MemoryPointer.
*/
function toMemoryPointer(
ZoneParameters memory obj
) internal pure returns (MemoryPointer ptr) {
assembly {
ptr := obj
}
}
/**
* @dev Get a CalldataPointer from ZoneParameters.
*
* @param obj The ZoneParameters object.
*
* @return ptr The CalldataPointer.
*/
function toCalldataPointer(
ZoneParameters calldata obj
) internal pure returns (CalldataPointer ptr) {
assembly {
ptr := obj
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {ReceivedItem, Schema, SpentItem} from "../lib/ConsiderationStructs.sol";
import {IERC165} from "../interfaces/IERC165.sol";
/**
* @title ContractOffererInterface
* @notice Contains the minimum interfaces needed to interact with a contract
* offerer.
*/
interface ContractOffererInterface is IERC165 {
/**
* @dev Generates an order with the specified minimum and maximum spent
* items, and optional context (supplied as extraData).
*
* @param fulfiller The address of the fulfiller.
* @param minimumReceived The minimum items that the caller is willing to
* receive.
* @param maximumSpent The maximum items the caller is willing to spend.
* @param context Additional context of the order.
*
* @return offer A tuple containing the offer items.
* @return consideration A tuple containing the consideration items.
*/
function generateOrder(
address fulfiller,
SpentItem[] calldata minimumReceived,
SpentItem[] calldata maximumSpent,
bytes calldata context // encoded based on the schemaID
) external returns (SpentItem[] memory offer, ReceivedItem[] memory consideration);
/**
* @dev Ratifies an order with the specified offer, consideration, and
* optional context (supplied as extraData).
*
* @param offer The offer items.
* @param consideration The consideration items.
* @param context Additional context of the order.
* @param orderHashes The hashes to ratify.
* @param contractNonce The nonce of the contract.
*
* @return ratifyOrderMagicValue The magic value returned by the contract
* offerer.
*/
function ratifyOrder(
SpentItem[] calldata offer,
ReceivedItem[] calldata consideration,
bytes calldata context, // encoded based on the schemaID
bytes32[] calldata orderHashes,
uint256 contractNonce
) external returns (bytes4 ratifyOrderMagicValue);
/**
* @dev View function to preview an order generated in response to a minimum
* set of received items, maximum set of spent items, and context
* (supplied as extraData).
*
* @param caller The address of the caller (e.g. Seaport).
* @param fulfiller The address of the fulfiller (e.g. the account
* calling Seaport).
* @param minimumReceived The minimum items that the caller is willing to
* receive.
* @param maximumSpent The maximum items the caller is willing to spend.
* @param context Additional context of the order.
*
* @return offer A tuple containing the offer items.
* @return consideration A tuple containing the consideration items.
*/
function previewOrder(
address caller,
address fulfiller,
SpentItem[] calldata minimumReceived,
SpentItem[] calldata maximumSpent,
bytes calldata context // encoded based on the schemaID
) external view returns (SpentItem[] memory offer, ReceivedItem[] memory consideration);
/**
* @dev Gets the metadata for this contract offerer.
*
* @return name The name of the contract offerer.
* @return schemas The schemas supported by the contract offerer.
*/
function getSeaportMetadata() external view returns (string memory name, Schema[] memory schemas); // map to Seaport Improvement Proposal IDs
function supportsInterface(bytes4 interfaceId) external view override returns (bool);
// Additional functions and/or events based on implemented schemaIDs
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface ISeaDropTokenContractMetadata {
/**
* @dev Emit an event for token metadata reveals/updates,
* according to EIP-4906.
*
* @param _fromTokenId The start token id.
* @param _toTokenId The end token id.
*/
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
/**
* @dev Emit an event when the URI for the collection-level metadata
* is updated.
*/
event ContractURIUpdated(string newContractURI);
/**
* @dev Emit an event with the previous and new provenance hash after
* being updated.
*/
event ProvenanceHashUpdated(bytes32 previousHash, bytes32 newHash);
/**
* @dev Emit an event when the EIP-2981 royalty info is updated.
*/
event RoyaltyInfoUpdated(address receiver, uint256 basisPoints);
/**
* @notice Throw if the max supply exceeds uint64, a limit
* due to the storage of bit-packed variables.
*/
error CannotExceedMaxSupplyOfUint64(uint256 got);
/**
* @dev Revert with an error when attempting to set the provenance
* hash after the mint has started.
*/
error ProvenanceHashCannotBeSetAfterMintStarted();
/**
* @dev Revert with an error when attempting to set the provenance
* hash after it has already been set.
*/
error ProvenanceHashCannotBeSetAfterAlreadyBeingSet();
/**
* @notice Sets the base URI for the token metadata and emits an event.
*
* @param tokenURI The new base URI to set.
*/
function setBaseURI(string calldata tokenURI) external;
/**
* @notice Sets the contract URI for contract metadata.
*
* @param newContractURI The new contract URI.
*/
function setContractURI(string calldata newContractURI) external;
/**
* @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 after the first item has been minted.
*
* @param newProvenanceHash The new provenance hash to set.
*/
function setProvenanceHash(bytes32 newProvenanceHash) external;
/**
* @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.
*/
function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;
/**
* @notice Returns the base URI for token metadata.
*/
function baseURI() external view returns (string memory);
/**
* @notice Returns the contract URI.
*/
function contractURI() external view returns (string memory);
/**
* @notice Returns the provenance hash.
* The provenance hash is used for random reveals, which
* is a hash of the ordered metadata to show it is unmodified
* after mint has started.
*/
function provenanceHash() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {
ISeaDropTokenContractMetadata
} from "./ISeaDropTokenContractMetadata.sol";
interface IERC1155ContractMetadata is ISeaDropTokenContractMetadata {
/**
* @dev A struct representing the supply info for a token id,
* packed into one storage slot.
*
* @param maxSupply The max supply for the token id.
* @param totalSupply The total token supply for the token id.
* Subtracted when an item is burned.
* @param totalMinted The total number of tokens minted for the token id.
*/
struct TokenSupply {
uint64 maxSupply; // 64/256 bits
uint64 totalSupply; // 128/256 bits
uint64 totalMinted; // 192/256 bits
}
/**
* @dev Emit an event when the max token supply for a token id is updated.
*/
event MaxSupplyUpdated(uint256 tokenId, uint256 newMaxSupply);
/**
* @dev Revert with an error if the mint quantity exceeds the max token
* supply.
*/
error MintExceedsMaxSupply(uint256 total, uint256 maxSupply);
/**
* @notice Sets the max supply for a token id and emits an event.
*
* @param tokenId The token id to set the max supply for.
* @param newMaxSupply The new max supply to set.
*/
function setMaxSupply(uint256 tokenId, uint256 newMaxSupply) external;
/**
* @notice Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @notice Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @notice Returns the max token supply for a token id.
*/
function maxSupply(uint256 tokenId) external view returns (uint256);
/**
* @notice Returns the total supply for a token id.
*/
function totalSupply(uint256 tokenId) external view returns (uint256);
/**
* @notice Returns the total minted for a token id.
*/
function totalMinted(uint256 tokenId) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface ICreatorToken {
event TransferValidatorUpdated(address oldValidator, address newValidator);
function getTransferValidator() external view returns (address validator);
function getTransferValidationFunction()
external
view
returns (bytes4 functionSignature, bool isViewFunction);
function setTransferValidator(address validator) external;
}
interface ILegacyCreatorToken {
event TransferValidatorUpdated(address oldValidator, address newValidator);
function getTransferValidator() external view returns (address validator);
function setTransferValidator(address validator) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface ITransferValidator721 {
/// @notice Ensure that a transfer has been authorized for a specific tokenId
function validateTransfer(
address caller,
address from,
address to,
uint256 tokenId
) external view;
}
interface ITransferValidator1155 {
/// @notice Ensure that a transfer has been authorized for a specific amount of a specific tokenId, and reduce the transferable amount remaining
function validateTransfer(
address caller,
address from,
address to,
uint256 tokenId,
uint256 amount
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import { ICreatorToken } from "../interfaces/ICreatorToken.sol";
/**
* @title TokenTransferValidator
* @notice Functionality to use a transfer validator.
*/
abstract contract TokenTransferValidator is ICreatorToken {
/// @dev Store the transfer validator. The null address means no transfer validator is set.
address internal _transferValidator;
/// @notice Revert with an error if the transfer validator is being set to the same address.
error SameTransferValidator();
/// @notice Returns the currently active transfer validator.
/// The null address means no transfer validator is set.
function getTransferValidator() external view returns (address) {
return _transferValidator;
}
/// @notice Set the transfer validator.
/// The external method that uses this must include access control.
function _setTransferValidator(address newValidator) internal {
address oldValidator = _transferValidator;
if (oldValidator == newValidator) {
revert SameTransferValidator();
}
_transferValidator = newValidator;
emit TransferValidatorUpdated(oldValidator, newValidator);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^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)
abstract contract ERC2981 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The royalty fee numerator exceeds the fee denominator.
error RoyaltyOverflow();
/// @dev The royalty receiver cannot be the zero address.
error RoyaltyReceiverIsZeroAddress();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* 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))
/// ```
uint256 private constant _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() internal pure virtual returns (uint96) {
return 10000;
}
/// @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.
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
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`.
function royaltyInfo(uint256 tokenId, uint256 salePrice)
public
view
virtual
returns (address receiver, uint256 royaltyAmount)
{
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, tokenId)
mstore(0x20, _ERC2981_MASTER_SLOT_SEED)
let packed := sload(keccak256(0x00, 0x40))
receiver := shr(96, packed)
if iszero(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) internal virtual {
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assembly
assembly {
feeNumerator := shr(160, shl(160, feeNumerator))
if gt(feeNumerator, feeDenominator) {
mstore(0x00, 0x350a88b3) // `RoyaltyOverflow()`.
revert(0x1c, 0x04)
}
let packed := shl(96, receiver)
if iszero(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() internal virtual {
/// @solidity memory-safe-assembly
assembly {
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)
internal
virtual
{
uint256 feeDenominator = _feeDenominator();
/// @solidity memory-safe-assembly
assembly {
feeNumerator := shr(160, shl(160, feeNumerator))
if gt(feeNumerator, feeDenominator) {
mstore(0x00, 0x350a88b3) // `RoyaltyOverflow()`.
revert(0x1c, 0x04)
}
let packed := shl(96, receiver)
if iszero(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) internal virtual {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, tokenId)
mstore(0x20, _ERC2981_MASTER_SLOT_SEED)
sstore(keccak256(0x00, 0x40), 0)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
/// @dev 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.
abstract contract Ownable {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The caller is not authorized to call the function.
error Unauthorized();
/// @dev The `newOwner` cannot be the zero address.
error NewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.
error NoHandoverRequest();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* 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.
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.
event OwnershipHandoverRequested(address indexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.
event OwnershipHandoverCanceled(address indexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
uint256 private constant _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.
uint256 private constant _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.
uint256 private constant _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) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// 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) internal virtual {
/// @solidity memory-safe-assembly
assembly {
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() internal view virtual {
/// @solidity memory-safe-assembly
assembly {
// If the caller is not the stored owner, revert.
if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.
revert(0x1c, 0x04)
}
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC UPDATE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Allows the owner to transfer the ownership to `newOwner`.
function transferOwnership(address newOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.
function renounceOwnership() public payable virtual onlyOwner {
_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.
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + ownershipHandoverValidFor();
/// @solidity memory-safe-assembly
assembly {
// 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.
function cancelOwnershipHandover() public payable virtual {
/// @solidity memory-safe-assembly
assembly {
// 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`.
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
// 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.
if gt(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.
function owner() public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(not(_OWNER_SLOT_NOT))
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
// Compute the handover slot.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result := sload(keccak256(0x0c, 0x20))
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds.
function ownershipHandoverValidFor() public view virtual returns (uint64) {
return 48 * 3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MODIFIERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Marks a function as only callable by the owner.
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.19;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (address(this).code.length == 0 && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { CreatorPayout, PublicDrop } from "./ERC721SeaDropStructs.sol";
interface SeaDropErrorsAndEvents {
/**
* @notice The SeaDrop token types, emitted as part of
* `event SeaDropTokenDeployed`.
*/
enum SEADROP_TOKEN_TYPE {
ERC721_STANDARD,
ERC721_CLONE,
ERC721_UPGRADEABLE,
ERC1155_STANDARD,
ERC1155_CLONE,
ERC1155_UPGRADEABLE
}
/**
* @notice An event to signify that a SeaDrop token contract was deployed.
*/
event SeaDropTokenDeployed(SEADROP_TOKEN_TYPE tokenType);
/**
* @notice Revert with an error if the function selector is not supported.
*/
error UnsupportedFunctionSelector(bytes4 selector);
/**
* @dev Revert with an error if the drop stage is not active.
*/
error NotActive(
uint256 currentTimestamp,
uint256 startTimestamp,
uint256 endTimestamp
);
/**
* @dev Revert with an error if the mint quantity exceeds the max allowed
* to be minted per wallet.
*/
error MintQuantityExceedsMaxMintedPerWallet(uint256 total, uint256 allowed);
/**
* @dev Revert with an error if the mint quantity exceeds the max token
* supply.
*/
error MintQuantityExceedsMaxSupply(uint256 total, uint256 maxSupply);
/**
* @dev Revert with an error if the mint quantity exceeds the max token
* supply for the stage.
* Note: The `maxTokenSupplyForStage` for public mint is
* always `type(uint).max`.
*/
error MintQuantityExceedsMaxTokenSupplyForStage(
uint256 total,
uint256 maxTokenSupplyForStage
);
/**
* @dev Revert if the fee recipient is the zero address.
*/
error FeeRecipientCannotBeZeroAddress();
/**
* @dev Revert if the fee recipient is not already included.
*/
error FeeRecipientNotPresent();
/**
* @dev Revert if the fee basis points is greater than 10_000.
*/
error InvalidFeeBps(uint256 feeBps);
/**
* @dev Revert if the fee recipient is already included.
*/
error DuplicateFeeRecipient();
/**
* @dev Revert if the fee recipient is restricted and not allowed.
*/
error FeeRecipientNotAllowed(address got);
/**
* @dev Revert if the creator payout address is the zero address.
*/
error CreatorPayoutAddressCannotBeZeroAddress();
/**
* @dev Revert if the creator payouts are not set.
*/
error CreatorPayoutsNotSet();
/**
* @dev Revert if the creator payout basis points are zero.
*/
error CreatorPayoutBasisPointsCannotBeZero();
/**
* @dev Revert if the total basis points for the creator payouts
* don't equal exactly 10_000.
*/
error InvalidCreatorPayoutTotalBasisPoints(
uint256 totalReceivedBasisPoints
);
/**
* @dev Revert if the creator payout basis points don't add up to 10_000.
*/
error InvalidCreatorPayoutBasisPoints(uint256 totalReceivedBasisPoints);
/**
* @dev Revert with an error if the allow list proof is invalid.
*/
error InvalidProof();
/**
* @dev Revert if a supplied signer address is the zero address.
*/
error SignerCannotBeZeroAddress();
/**
* @dev Revert with an error if a signer is not included in
* the enumeration when removing.
*/
error SignerNotPresent();
/**
* @dev Revert with an error if a payer is not included in
* the enumeration when removing.
*/
error PayerNotPresent();
/**
* @dev Revert with an error if a payer is already included in mapping
* when adding.
*/
error DuplicatePayer();
/**
* @dev Revert with an error if a signer is already included in mapping
* when adding.
*/
error DuplicateSigner();
/**
* @dev Revert with an error if the payer is not allowed. The minter must
* pay for their own mint.
*/
error PayerNotAllowed(address got);
/**
* @dev Revert if a supplied payer address is the zero address.
*/
error PayerCannotBeZeroAddress();
/**
* @dev Revert if the start time is greater than the end time.
*/
error InvalidStartAndEndTime(uint256 startTime, uint256 endTime);
/**
* @dev Revert with an error if the signer payment token is not the same.
*/
error InvalidSignedPaymentToken(address got, address want);
/**
* @dev Revert with an error if supplied signed mint price is less than
* the minimum specified.
*/
error InvalidSignedMintPrice(
address paymentToken,
uint256 got,
uint256 minimum
);
/**
* @dev Revert with an error if supplied signed maxTotalMintableByWallet
* is greater than the maximum specified.
*/
error InvalidSignedMaxTotalMintableByWallet(uint256 got, uint256 maximum);
/**
* @dev Revert with an error if supplied signed
* maxTotalMintableByWalletPerToken is greater than the maximum
* specified.
*/
error InvalidSignedMaxTotalMintableByWalletPerToken(
uint256 got,
uint256 maximum
);
/**
* @dev Revert with an error if the fromTokenId is not within range.
*/
error InvalidSignedFromTokenId(uint256 got, uint256 minimum);
/**
* @dev Revert with an error if the toTokenId is not within range.
*/
error InvalidSignedToTokenId(uint256 got, uint256 maximum);
/**
* @dev Revert with an error if supplied signed start time is less than
* the minimum specified.
*/
error InvalidSignedStartTime(uint256 got, uint256 minimum);
/**
* @dev Revert with an error if supplied signed end time is greater than
* the maximum specified.
*/
error InvalidSignedEndTime(uint256 got, uint256 maximum);
/**
* @dev Revert with an error if supplied signed maxTokenSupplyForStage
* is greater than the maximum specified.
*/
error InvalidSignedMaxTokenSupplyForStage(uint256 got, uint256 maximum);
/**
* @dev Revert with an error if supplied signed feeBps is greater than
* the maximum specified, or less than the minimum.
*/
error InvalidSignedFeeBps(uint256 got, uint256 minimumOrMaximum);
/**
* @dev Revert with an error if signed mint did not specify to restrict
* fee recipients.
*/
error SignedMintsMustRestrictFeeRecipients();
/**
* @dev Revert with an error if a signature for a signed mint has already
* been used.
*/
error SignatureAlreadyUsed();
/**
* @dev Revert with an error if the contract has no balance to withdraw.
*/
error NoBalanceToWithdraw();
/**
* @dev Revert with an error if the caller is not an allowed Seaport.
*/
error InvalidCallerOnlyAllowedSeaport(address caller);
/**
* @dev Revert with an error if the order does not have the ERC1155 magic
* consideration item to signify a consecutive mint.
*/
error MustSpecifyERC1155ConsiderationItemForSeaDropMint();
/**
* @dev Revert with an error if the extra data version is not supported.
*/
error UnsupportedExtraDataVersion(uint8 version);
/**
* @dev Revert with an error if the extra data encoding is not supported.
*/
error InvalidExtraDataEncoding(uint8 version);
/**
* @dev Revert with an error if the provided substandard is not supported.
*/
error InvalidSubstandard(uint8 substandard);
/**
* @dev Revert with an error if the implementation contract is called without
* delegatecall.
*/
error OnlyDelegateCalled();
/**
* @dev Revert with an error if the provided allowed Seaport is the
* zero address.
*/
error AllowedSeaportCannotBeZeroAddress();
/**
* @dev Emit an event when allowed Seaport contracts are updated.
*/
event AllowedSeaportUpdated(address[] allowedSeaport);
/**
* @dev An event with details of a SeaDrop mint, for analytical purposes.
*
* @param payer The address who payed for the tx.
* @param dropStageIndex The drop stage index. Items minted through
* public mint have dropStageIndex of 0
*/
event SeaDropMint(address payer, uint256 dropStageIndex);
/**
* @dev An event with updated allow list data.
*
* @param previousMerkleRoot The previous allow list merkle root.
* @param newMerkleRoot The new allow list merkle root.
* @param publicKeyURI If the allow list is encrypted, the public key
* URIs that can decrypt the list.
* Empty if unencrypted.
* @param allowListURI The URI for the allow list.
*/
event AllowListUpdated(
bytes32 indexed previousMerkleRoot,
bytes32 indexed newMerkleRoot,
string[] publicKeyURI,
string allowListURI
);
/**
* @dev An event with updated drop URI.
*/
event DropURIUpdated(string newDropURI);
/**
* @dev An event with the updated creator payout address.
*/
event CreatorPayoutsUpdated(CreatorPayout[] creatorPayouts);
/**
* @dev An event with the updated allowed fee recipient.
*/
event AllowedFeeRecipientUpdated(
address indexed feeRecipient,
bool indexed allowed
);
/**
* @dev An event with the updated signer.
*/
event SignerUpdated(address indexed signer, bool indexed allowed);
/**
* @dev An event with the updated payer.
*/
event PayerUpdated(address indexed payer, bool indexed allowed);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
enum OrderType {
// 0: no partial fills, anyone can execute
FULL_OPEN,
// 1: partial fills supported, anyone can execute
PARTIAL_OPEN,
// 2: no partial fills, only offerer or zone can execute
FULL_RESTRICTED,
// 3: partial fills supported, only offerer or zone can execute
PARTIAL_RESTRICTED,
// 4: contract order type
CONTRACT
}
enum BasicOrderType {
// 0: no partial fills, anyone can execute
ETH_TO_ERC721_FULL_OPEN,
// 1: partial fills supported, anyone can execute
ETH_TO_ERC721_PARTIAL_OPEN,
// 2: no partial fills, only offerer or zone can execute
ETH_TO_ERC721_FULL_RESTRICTED,
// 3: partial fills supported, only offerer or zone can execute
ETH_TO_ERC721_PARTIAL_RESTRICTED,
// 4: no partial fills, anyone can execute
ETH_TO_ERC1155_FULL_OPEN,
// 5: partial fills supported, anyone can execute
ETH_TO_ERC1155_PARTIAL_OPEN,
// 6: no partial fills, only offerer or zone can execute
ETH_TO_ERC1155_FULL_RESTRICTED,
// 7: partial fills supported, only offerer or zone can execute
ETH_TO_ERC1155_PARTIAL_RESTRICTED,
// 8: no partial fills, anyone can execute
ERC20_TO_ERC721_FULL_OPEN,
// 9: partial fills supported, anyone can execute
ERC20_TO_ERC721_PARTIAL_OPEN,
// 10: no partial fills, only offerer or zone can execute
ERC20_TO_ERC721_FULL_RESTRICTED,
// 11: partial fills supported, only offerer or zone can execute
ERC20_TO_ERC721_PARTIAL_RESTRICTED,
// 12: no partial fills, anyone can execute
ERC20_TO_ERC1155_FULL_OPEN,
// 13: partial fills supported, anyone can execute
ERC20_TO_ERC1155_PARTIAL_OPEN,
// 14: no partial fills, only offerer or zone can execute
ERC20_TO_ERC1155_FULL_RESTRICTED,
// 15: partial fills supported, only offerer or zone can execute
ERC20_TO_ERC1155_PARTIAL_RESTRICTED,
// 16: no partial fills, anyone can execute
ERC721_TO_ERC20_FULL_OPEN,
// 17: partial fills supported, anyone can execute
ERC721_TO_ERC20_PARTIAL_OPEN,
// 18: no partial fills, only offerer or zone can execute
ERC721_TO_ERC20_FULL_RESTRICTED,
// 19: partial fills supported, only offerer or zone can execute
ERC721_TO_ERC20_PARTIAL_RESTRICTED,
// 20: no partial fills, anyone can execute
ERC1155_TO_ERC20_FULL_OPEN,
// 21: partial fills supported, anyone can execute
ERC1155_TO_ERC20_PARTIAL_OPEN,
// 22: no partial fills, only offerer or zone can execute
ERC1155_TO_ERC20_FULL_RESTRICTED,
// 23: partial fills supported, only offerer or zone can execute
ERC1155_TO_ERC20_PARTIAL_RESTRICTED
}
enum BasicOrderRouteType {
// 0: provide Ether (or other native token) to receive offered ERC721 item.
ETH_TO_ERC721,
// 1: provide Ether (or other native token) to receive offered ERC1155 item.
ETH_TO_ERC1155,
// 2: provide ERC20 item to receive offered ERC721 item.
ERC20_TO_ERC721,
// 3: provide ERC20 item to receive offered ERC1155 item.
ERC20_TO_ERC1155,
// 4: provide ERC721 item to receive offered ERC20 item.
ERC721_TO_ERC20,
// 5: provide ERC1155 item to receive offered ERC20 item.
ERC1155_TO_ERC20
}
enum ItemType {
// 0: ETH on mainnet, MATIC on polygon, etc.
NATIVE,
// 1: ERC20 items (ERC777 and ERC20 analogues could also technically work)
ERC20,
// 2: ERC721 items
ERC721,
// 3: ERC1155 items
ERC1155,
// 4: ERC721 items where a number of tokenIds are supported
ERC721_WITH_CRITERIA,
// 5: ERC1155 items where a number of ids are supported
ERC1155_WITH_CRITERIA
}
enum Side {
// 0: Items that can be spent
OFFER,
// 1: Items that must be received
CONSIDERATION
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
type CalldataPointer is uint256;
type ReturndataPointer is uint256;
type MemoryPointer is uint256;
using CalldataPointerLib for CalldataPointer global;
using MemoryPointerLib for MemoryPointer global;
using ReturndataPointerLib for ReturndataPointer global;
using CalldataReaders for CalldataPointer global;
using ReturndataReaders for ReturndataPointer global;
using MemoryReaders for MemoryPointer global;
using MemoryWriters for MemoryPointer global;
CalldataPointer constant CalldataStart = CalldataPointer.wrap(0x04);
MemoryPointer constant FreeMemoryPPtr = MemoryPointer.wrap(0x40);
uint256 constant IdentityPrecompileAddress = 0x4;
uint256 constant OffsetOrLengthMask = 0xffffffff;
uint256 constant _OneWord = 0x20;
uint256 constant _FreeMemoryPointerSlot = 0x40;
/// @dev Allocates `size` bytes in memory by increasing the free memory pointer
/// and returns the memory pointer to the first byte of the allocated region.
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function malloc(uint256 size) pure returns (MemoryPointer mPtr) {
assembly {
mPtr := mload(_FreeMemoryPointerSlot)
mstore(_FreeMemoryPointerSlot, add(mPtr, size))
}
}
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function getFreeMemoryPointer() pure returns (MemoryPointer mPtr) {
mPtr = FreeMemoryPPtr.readMemoryPointer();
}
// (Free functions cannot have visibility.)
// solhint-disable-next-line func-visibility
function setFreeMemoryPointer(MemoryPointer mPtr) pure {
FreeMemoryPPtr.write(mPtr);
}
library CalldataPointerLib {
function lt(
CalldataPointer a,
CalldataPointer b
) internal pure returns (bool c) {
assembly {
c := lt(a, b)
}
}
function gt(
CalldataPointer a,
CalldataPointer b
) internal pure returns (bool c) {
assembly {
c := gt(a, b)
}
}
function eq(
CalldataPointer a,
CalldataPointer b
) internal pure returns (bool c) {
assembly {
c := eq(a, b)
}
}
function isNull(CalldataPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
/// @dev Resolves an offset stored at `cdPtr + headOffset` to a calldata.
/// pointer `cdPtr` must point to some parent object with a dynamic
/// type's head stored at `cdPtr + headOffset`.
function pptr(
CalldataPointer cdPtr,
uint256 headOffset
) internal pure returns (CalldataPointer cdPtrChild) {
cdPtrChild = cdPtr.offset(
cdPtr.offset(headOffset).readUint256() & OffsetOrLengthMask
);
}
/// @dev Resolves an offset stored at `cdPtr` to a calldata pointer.
/// `cdPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(
CalldataPointer cdPtr
) internal pure returns (CalldataPointer cdPtrChild) {
cdPtrChild = cdPtr.offset(cdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the calldata pointer one word after `cdPtr`.
function next(
CalldataPointer cdPtr
) internal pure returns (CalldataPointer cdPtrNext) {
assembly {
cdPtrNext := add(cdPtr, _OneWord)
}
}
/// @dev Returns the calldata pointer `_offset` bytes after `cdPtr`.
function offset(
CalldataPointer cdPtr,
uint256 _offset
) internal pure returns (CalldataPointer cdPtrNext) {
assembly {
cdPtrNext := add(cdPtr, _offset)
}
}
/// @dev Copies `size` bytes from calldata starting at `src` to memory at
/// `dst`.
function copy(
CalldataPointer src,
MemoryPointer dst,
uint256 size
) internal pure {
assembly {
calldatacopy(dst, src, size)
}
}
}
library ReturndataPointerLib {
function lt(
ReturndataPointer a,
ReturndataPointer b
) internal pure returns (bool c) {
assembly {
c := lt(a, b)
}
}
function gt(
ReturndataPointer a,
ReturndataPointer b
) internal pure returns (bool c) {
assembly {
c := gt(a, b)
}
}
function eq(
ReturndataPointer a,
ReturndataPointer b
) internal pure returns (bool c) {
assembly {
c := eq(a, b)
}
}
function isNull(ReturndataPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
/// @dev Resolves an offset stored at `rdPtr + headOffset` to a returndata
/// pointer. `rdPtr` must point to some parent object with a dynamic
/// type's head stored at `rdPtr + headOffset`.
function pptr(
ReturndataPointer rdPtr,
uint256 headOffset
) internal pure returns (ReturndataPointer rdPtrChild) {
rdPtrChild = rdPtr.offset(
rdPtr.offset(headOffset).readUint256() & OffsetOrLengthMask
);
}
/// @dev Resolves an offset stored at `rdPtr` to a returndata pointer.
/// `rdPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(
ReturndataPointer rdPtr
) internal pure returns (ReturndataPointer rdPtrChild) {
rdPtrChild = rdPtr.offset(rdPtr.readUint256() & OffsetOrLengthMask);
}
/// @dev Returns the returndata pointer one word after `cdPtr`.
function next(
ReturndataPointer rdPtr
) internal pure returns (ReturndataPointer rdPtrNext) {
assembly {
rdPtrNext := add(rdPtr, _OneWord)
}
}
/// @dev Returns the returndata pointer `_offset` bytes after `cdPtr`.
function offset(
ReturndataPointer rdPtr,
uint256 _offset
) internal pure returns (ReturndataPointer rdPtrNext) {
assembly {
rdPtrNext := add(rdPtr, _offset)
}
}
/// @dev Copies `size` bytes from returndata starting at `src` to memory at
/// `dst`.
function copy(
ReturndataPointer src,
MemoryPointer dst,
uint256 size
) internal pure {
assembly {
returndatacopy(dst, src, size)
}
}
}
library MemoryPointerLib {
function copy(
MemoryPointer src,
MemoryPointer dst,
uint256 size
) internal view {
assembly {
let success := staticcall(
gas(),
IdentityPrecompileAddress,
src,
size,
dst,
size
)
if or(iszero(returndatasize()), iszero(success)) {
revert(0, 0)
}
}
}
function lt(
MemoryPointer a,
MemoryPointer b
) internal pure returns (bool c) {
assembly {
c := lt(a, b)
}
}
function gt(
MemoryPointer a,
MemoryPointer b
) internal pure returns (bool c) {
assembly {
c := gt(a, b)
}
}
function eq(
MemoryPointer a,
MemoryPointer b
) internal pure returns (bool c) {
assembly {
c := eq(a, b)
}
}
function isNull(MemoryPointer a) internal pure returns (bool b) {
assembly {
b := iszero(a)
}
}
function hash(
MemoryPointer ptr,
uint256 length
) internal pure returns (bytes32 _hash) {
assembly {
_hash := keccak256(ptr, length)
}
}
/// @dev Returns the memory pointer one word after `mPtr`.
function next(
MemoryPointer mPtr
) internal pure returns (MemoryPointer mPtrNext) {
assembly {
mPtrNext := add(mPtr, _OneWord)
}
}
/// @dev Returns the memory pointer `_offset` bytes after `mPtr`.
function offset(
MemoryPointer mPtr,
uint256 _offset
) internal pure returns (MemoryPointer mPtrNext) {
assembly {
mPtrNext := add(mPtr, _offset)
}
}
/// @dev Resolves a pointer at `mPtr + headOffset` to a memory
/// pointer. `mPtr` must point to some parent object with a dynamic
/// type's pointer stored at `mPtr + headOffset`.
function pptr(
MemoryPointer mPtr,
uint256 headOffset
) internal pure returns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.offset(headOffset).readMemoryPointer();
}
/// @dev Resolves a pointer stored at `mPtr` to a memory pointer.
/// `mPtr` must point to some parent object with a dynamic type as its
/// first member, e.g. `struct { bytes data; }`
function pptr(
MemoryPointer mPtr
) internal pure returns (MemoryPointer mPtrChild) {
mPtrChild = mPtr.readMemoryPointer();
}
}
library CalldataReaders {
/// @dev Reads the value at `cdPtr` and applies a mask to return only the
/// last 4 bytes.
function readMaskedUint256(
CalldataPointer cdPtr
) internal pure returns (uint256 value) {
value = cdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `cdPtr` in calldata.
function readBool(
CalldataPointer cdPtr
) internal pure returns (bool value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the address at `cdPtr` in calldata.
function readAddress(
CalldataPointer cdPtr
) internal pure returns (address value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes1 at `cdPtr` in calldata.
function readBytes1(
CalldataPointer cdPtr
) internal pure returns (bytes1 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes2 at `cdPtr` in calldata.
function readBytes2(
CalldataPointer cdPtr
) internal pure returns (bytes2 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes3 at `cdPtr` in calldata.
function readBytes3(
CalldataPointer cdPtr
) internal pure returns (bytes3 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes4 at `cdPtr` in calldata.
function readBytes4(
CalldataPointer cdPtr
) internal pure returns (bytes4 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes5 at `cdPtr` in calldata.
function readBytes5(
CalldataPointer cdPtr
) internal pure returns (bytes5 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes6 at `cdPtr` in calldata.
function readBytes6(
CalldataPointer cdPtr
) internal pure returns (bytes6 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes7 at `cdPtr` in calldata.
function readBytes7(
CalldataPointer cdPtr
) internal pure returns (bytes7 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes8 at `cdPtr` in calldata.
function readBytes8(
CalldataPointer cdPtr
) internal pure returns (bytes8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes9 at `cdPtr` in calldata.
function readBytes9(
CalldataPointer cdPtr
) internal pure returns (bytes9 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes10 at `cdPtr` in calldata.
function readBytes10(
CalldataPointer cdPtr
) internal pure returns (bytes10 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes11 at `cdPtr` in calldata.
function readBytes11(
CalldataPointer cdPtr
) internal pure returns (bytes11 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes12 at `cdPtr` in calldata.
function readBytes12(
CalldataPointer cdPtr
) internal pure returns (bytes12 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes13 at `cdPtr` in calldata.
function readBytes13(
CalldataPointer cdPtr
) internal pure returns (bytes13 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes14 at `cdPtr` in calldata.
function readBytes14(
CalldataPointer cdPtr
) internal pure returns (bytes14 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes15 at `cdPtr` in calldata.
function readBytes15(
CalldataPointer cdPtr
) internal pure returns (bytes15 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes16 at `cdPtr` in calldata.
function readBytes16(
CalldataPointer cdPtr
) internal pure returns (bytes16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes17 at `cdPtr` in calldata.
function readBytes17(
CalldataPointer cdPtr
) internal pure returns (bytes17 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes18 at `cdPtr` in calldata.
function readBytes18(
CalldataPointer cdPtr
) internal pure returns (bytes18 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes19 at `cdPtr` in calldata.
function readBytes19(
CalldataPointer cdPtr
) internal pure returns (bytes19 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes20 at `cdPtr` in calldata.
function readBytes20(
CalldataPointer cdPtr
) internal pure returns (bytes20 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes21 at `cdPtr` in calldata.
function readBytes21(
CalldataPointer cdPtr
) internal pure returns (bytes21 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes22 at `cdPtr` in calldata.
function readBytes22(
CalldataPointer cdPtr
) internal pure returns (bytes22 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes23 at `cdPtr` in calldata.
function readBytes23(
CalldataPointer cdPtr
) internal pure returns (bytes23 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes24 at `cdPtr` in calldata.
function readBytes24(
CalldataPointer cdPtr
) internal pure returns (bytes24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes25 at `cdPtr` in calldata.
function readBytes25(
CalldataPointer cdPtr
) internal pure returns (bytes25 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes26 at `cdPtr` in calldata.
function readBytes26(
CalldataPointer cdPtr
) internal pure returns (bytes26 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes27 at `cdPtr` in calldata.
function readBytes27(
CalldataPointer cdPtr
) internal pure returns (bytes27 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes28 at `cdPtr` in calldata.
function readBytes28(
CalldataPointer cdPtr
) internal pure returns (bytes28 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes29 at `cdPtr` in calldata.
function readBytes29(
CalldataPointer cdPtr
) internal pure returns (bytes29 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes30 at `cdPtr` in calldata.
function readBytes30(
CalldataPointer cdPtr
) internal pure returns (bytes30 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes31 at `cdPtr` in calldata.
function readBytes31(
CalldataPointer cdPtr
) internal pure returns (bytes31 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the bytes32 at `cdPtr` in calldata.
function readBytes32(
CalldataPointer cdPtr
) internal pure returns (bytes32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint8 at `cdPtr` in calldata.
function readUint8(
CalldataPointer cdPtr
) internal pure returns (uint8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint16 at `cdPtr` in calldata.
function readUint16(
CalldataPointer cdPtr
) internal pure returns (uint16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint24 at `cdPtr` in calldata.
function readUint24(
CalldataPointer cdPtr
) internal pure returns (uint24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint32 at `cdPtr` in calldata.
function readUint32(
CalldataPointer cdPtr
) internal pure returns (uint32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint40 at `cdPtr` in calldata.
function readUint40(
CalldataPointer cdPtr
) internal pure returns (uint40 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint48 at `cdPtr` in calldata.
function readUint48(
CalldataPointer cdPtr
) internal pure returns (uint48 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint56 at `cdPtr` in calldata.
function readUint56(
CalldataPointer cdPtr
) internal pure returns (uint56 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint64 at `cdPtr` in calldata.
function readUint64(
CalldataPointer cdPtr
) internal pure returns (uint64 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint72 at `cdPtr` in calldata.
function readUint72(
CalldataPointer cdPtr
) internal pure returns (uint72 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint80 at `cdPtr` in calldata.
function readUint80(
CalldataPointer cdPtr
) internal pure returns (uint80 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint88 at `cdPtr` in calldata.
function readUint88(
CalldataPointer cdPtr
) internal pure returns (uint88 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint96 at `cdPtr` in calldata.
function readUint96(
CalldataPointer cdPtr
) internal pure returns (uint96 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint104 at `cdPtr` in calldata.
function readUint104(
CalldataPointer cdPtr
) internal pure returns (uint104 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint112 at `cdPtr` in calldata.
function readUint112(
CalldataPointer cdPtr
) internal pure returns (uint112 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint120 at `cdPtr` in calldata.
function readUint120(
CalldataPointer cdPtr
) internal pure returns (uint120 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint128 at `cdPtr` in calldata.
function readUint128(
CalldataPointer cdPtr
) internal pure returns (uint128 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint136 at `cdPtr` in calldata.
function readUint136(
CalldataPointer cdPtr
) internal pure returns (uint136 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint144 at `cdPtr` in calldata.
function readUint144(
CalldataPointer cdPtr
) internal pure returns (uint144 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint152 at `cdPtr` in calldata.
function readUint152(
CalldataPointer cdPtr
) internal pure returns (uint152 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint160 at `cdPtr` in calldata.
function readUint160(
CalldataPointer cdPtr
) internal pure returns (uint160 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint168 at `cdPtr` in calldata.
function readUint168(
CalldataPointer cdPtr
) internal pure returns (uint168 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint176 at `cdPtr` in calldata.
function readUint176(
CalldataPointer cdPtr
) internal pure returns (uint176 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint184 at `cdPtr` in calldata.
function readUint184(
CalldataPointer cdPtr
) internal pure returns (uint184 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint192 at `cdPtr` in calldata.
function readUint192(
CalldataPointer cdPtr
) internal pure returns (uint192 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint200 at `cdPtr` in calldata.
function readUint200(
CalldataPointer cdPtr
) internal pure returns (uint200 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint208 at `cdPtr` in calldata.
function readUint208(
CalldataPointer cdPtr
) internal pure returns (uint208 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint216 at `cdPtr` in calldata.
function readUint216(
CalldataPointer cdPtr
) internal pure returns (uint216 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint224 at `cdPtr` in calldata.
function readUint224(
CalldataPointer cdPtr
) internal pure returns (uint224 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint232 at `cdPtr` in calldata.
function readUint232(
CalldataPointer cdPtr
) internal pure returns (uint232 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint240 at `cdPtr` in calldata.
function readUint240(
CalldataPointer cdPtr
) internal pure returns (uint240 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint248 at `cdPtr` in calldata.
function readUint248(
CalldataPointer cdPtr
) internal pure returns (uint248 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the uint256 at `cdPtr` in calldata.
function readUint256(
CalldataPointer cdPtr
) internal pure returns (uint256 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int8 at `cdPtr` in calldata.
function readInt8(
CalldataPointer cdPtr
) internal pure returns (int8 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int16 at `cdPtr` in calldata.
function readInt16(
CalldataPointer cdPtr
) internal pure returns (int16 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int24 at `cdPtr` in calldata.
function readInt24(
CalldataPointer cdPtr
) internal pure returns (int24 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int32 at `cdPtr` in calldata.
function readInt32(
CalldataPointer cdPtr
) internal pure returns (int32 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int40 at `cdPtr` in calldata.
function readInt40(
CalldataPointer cdPtr
) internal pure returns (int40 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int48 at `cdPtr` in calldata.
function readInt48(
CalldataPointer cdPtr
) internal pure returns (int48 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int56 at `cdPtr` in calldata.
function readInt56(
CalldataPointer cdPtr
) internal pure returns (int56 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int64 at `cdPtr` in calldata.
function readInt64(
CalldataPointer cdPtr
) internal pure returns (int64 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int72 at `cdPtr` in calldata.
function readInt72(
CalldataPointer cdPtr
) internal pure returns (int72 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int80 at `cdPtr` in calldata.
function readInt80(
CalldataPointer cdPtr
) internal pure returns (int80 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int88 at `cdPtr` in calldata.
function readInt88(
CalldataPointer cdPtr
) internal pure returns (int88 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int96 at `cdPtr` in calldata.
function readInt96(
CalldataPointer cdPtr
) internal pure returns (int96 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int104 at `cdPtr` in calldata.
function readInt104(
CalldataPointer cdPtr
) internal pure returns (int104 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int112 at `cdPtr` in calldata.
function readInt112(
CalldataPointer cdPtr
) internal pure returns (int112 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int120 at `cdPtr` in calldata.
function readInt120(
CalldataPointer cdPtr
) internal pure returns (int120 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int128 at `cdPtr` in calldata.
function readInt128(
CalldataPointer cdPtr
) internal pure returns (int128 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int136 at `cdPtr` in calldata.
function readInt136(
CalldataPointer cdPtr
) internal pure returns (int136 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int144 at `cdPtr` in calldata.
function readInt144(
CalldataPointer cdPtr
) internal pure returns (int144 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int152 at `cdPtr` in calldata.
function readInt152(
CalldataPointer cdPtr
) internal pure returns (int152 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int160 at `cdPtr` in calldata.
function readInt160(
CalldataPointer cdPtr
) internal pure returns (int160 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int168 at `cdPtr` in calldata.
function readInt168(
CalldataPointer cdPtr
) internal pure returns (int168 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int176 at `cdPtr` in calldata.
function readInt176(
CalldataPointer cdPtr
) internal pure returns (int176 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int184 at `cdPtr` in calldata.
function readInt184(
CalldataPointer cdPtr
) internal pure returns (int184 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int192 at `cdPtr` in calldata.
function readInt192(
CalldataPointer cdPtr
) internal pure returns (int192 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int200 at `cdPtr` in calldata.
function readInt200(
CalldataPointer cdPtr
) internal pure returns (int200 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int208 at `cdPtr` in calldata.
function readInt208(
CalldataPointer cdPtr
) internal pure returns (int208 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int216 at `cdPtr` in calldata.
function readInt216(
CalldataPointer cdPtr
) internal pure returns (int216 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int224 at `cdPtr` in calldata.
function readInt224(
CalldataPointer cdPtr
) internal pure returns (int224 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int232 at `cdPtr` in calldata.
function readInt232(
CalldataPointer cdPtr
) internal pure returns (int232 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int240 at `cdPtr` in calldata.
function readInt240(
CalldataPointer cdPtr
) internal pure returns (int240 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int248 at `cdPtr` in calldata.
function readInt248(
CalldataPointer cdPtr
) internal pure returns (int248 value) {
assembly {
value := calldataload(cdPtr)
}
}
/// @dev Reads the int256 at `cdPtr` in calldata.
function readInt256(
CalldataPointer cdPtr
) internal pure returns (int256 value) {
assembly {
value := calldataload(cdPtr)
}
}
}
library ReturndataReaders {
/// @dev Reads value at `rdPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(
ReturndataPointer rdPtr
) internal pure returns (uint256 value) {
value = rdPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `rdPtr` in returndata.
function readBool(
ReturndataPointer rdPtr
) internal pure returns (bool value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the address at `rdPtr` in returndata.
function readAddress(
ReturndataPointer rdPtr
) internal pure returns (address value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes1 at `rdPtr` in returndata.
function readBytes1(
ReturndataPointer rdPtr
) internal pure returns (bytes1 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes2 at `rdPtr` in returndata.
function readBytes2(
ReturndataPointer rdPtr
) internal pure returns (bytes2 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes3 at `rdPtr` in returndata.
function readBytes3(
ReturndataPointer rdPtr
) internal pure returns (bytes3 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes4 at `rdPtr` in returndata.
function readBytes4(
ReturndataPointer rdPtr
) internal pure returns (bytes4 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes5 at `rdPtr` in returndata.
function readBytes5(
ReturndataPointer rdPtr
) internal pure returns (bytes5 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes6 at `rdPtr` in returndata.
function readBytes6(
ReturndataPointer rdPtr
) internal pure returns (bytes6 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes7 at `rdPtr` in returndata.
function readBytes7(
ReturndataPointer rdPtr
) internal pure returns (bytes7 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes8 at `rdPtr` in returndata.
function readBytes8(
ReturndataPointer rdPtr
) internal pure returns (bytes8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes9 at `rdPtr` in returndata.
function readBytes9(
ReturndataPointer rdPtr
) internal pure returns (bytes9 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes10 at `rdPtr` in returndata.
function readBytes10(
ReturndataPointer rdPtr
) internal pure returns (bytes10 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes11 at `rdPtr` in returndata.
function readBytes11(
ReturndataPointer rdPtr
) internal pure returns (bytes11 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes12 at `rdPtr` in returndata.
function readBytes12(
ReturndataPointer rdPtr
) internal pure returns (bytes12 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes13 at `rdPtr` in returndata.
function readBytes13(
ReturndataPointer rdPtr
) internal pure returns (bytes13 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes14 at `rdPtr` in returndata.
function readBytes14(
ReturndataPointer rdPtr
) internal pure returns (bytes14 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes15 at `rdPtr` in returndata.
function readBytes15(
ReturndataPointer rdPtr
) internal pure returns (bytes15 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes16 at `rdPtr` in returndata.
function readBytes16(
ReturndataPointer rdPtr
) internal pure returns (bytes16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes17 at `rdPtr` in returndata.
function readBytes17(
ReturndataPointer rdPtr
) internal pure returns (bytes17 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes18 at `rdPtr` in returndata.
function readBytes18(
ReturndataPointer rdPtr
) internal pure returns (bytes18 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes19 at `rdPtr` in returndata.
function readBytes19(
ReturndataPointer rdPtr
) internal pure returns (bytes19 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes20 at `rdPtr` in returndata.
function readBytes20(
ReturndataPointer rdPtr
) internal pure returns (bytes20 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes21 at `rdPtr` in returndata.
function readBytes21(
ReturndataPointer rdPtr
) internal pure returns (bytes21 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes22 at `rdPtr` in returndata.
function readBytes22(
ReturndataPointer rdPtr
) internal pure returns (bytes22 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes23 at `rdPtr` in returndata.
function readBytes23(
ReturndataPointer rdPtr
) internal pure returns (bytes23 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes24 at `rdPtr` in returndata.
function readBytes24(
ReturndataPointer rdPtr
) internal pure returns (bytes24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes25 at `rdPtr` in returndata.
function readBytes25(
ReturndataPointer rdPtr
) internal pure returns (bytes25 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes26 at `rdPtr` in returndata.
function readBytes26(
ReturndataPointer rdPtr
) internal pure returns (bytes26 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes27 at `rdPtr` in returndata.
function readBytes27(
ReturndataPointer rdPtr
) internal pure returns (bytes27 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes28 at `rdPtr` in returndata.
function readBytes28(
ReturndataPointer rdPtr
) internal pure returns (bytes28 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes29 at `rdPtr` in returndata.
function readBytes29(
ReturndataPointer rdPtr
) internal pure returns (bytes29 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes30 at `rdPtr` in returndata.
function readBytes30(
ReturndataPointer rdPtr
) internal pure returns (bytes30 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes31 at `rdPtr` in returndata.
function readBytes31(
ReturndataPointer rdPtr
) internal pure returns (bytes31 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the bytes32 at `rdPtr` in returndata.
function readBytes32(
ReturndataPointer rdPtr
) internal pure returns (bytes32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint8 at `rdPtr` in returndata.
function readUint8(
ReturndataPointer rdPtr
) internal pure returns (uint8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint16 at `rdPtr` in returndata.
function readUint16(
ReturndataPointer rdPtr
) internal pure returns (uint16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint24 at `rdPtr` in returndata.
function readUint24(
ReturndataPointer rdPtr
) internal pure returns (uint24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint32 at `rdPtr` in returndata.
function readUint32(
ReturndataPointer rdPtr
) internal pure returns (uint32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint40 at `rdPtr` in returndata.
function readUint40(
ReturndataPointer rdPtr
) internal pure returns (uint40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint48 at `rdPtr` in returndata.
function readUint48(
ReturndataPointer rdPtr
) internal pure returns (uint48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint56 at `rdPtr` in returndata.
function readUint56(
ReturndataPointer rdPtr
) internal pure returns (uint56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint64 at `rdPtr` in returndata.
function readUint64(
ReturndataPointer rdPtr
) internal pure returns (uint64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint72 at `rdPtr` in returndata.
function readUint72(
ReturndataPointer rdPtr
) internal pure returns (uint72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint80 at `rdPtr` in returndata.
function readUint80(
ReturndataPointer rdPtr
) internal pure returns (uint80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint88 at `rdPtr` in returndata.
function readUint88(
ReturndataPointer rdPtr
) internal pure returns (uint88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint96 at `rdPtr` in returndata.
function readUint96(
ReturndataPointer rdPtr
) internal pure returns (uint96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint104 at `rdPtr` in returndata.
function readUint104(
ReturndataPointer rdPtr
) internal pure returns (uint104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint112 at `rdPtr` in returndata.
function readUint112(
ReturndataPointer rdPtr
) internal pure returns (uint112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint120 at `rdPtr` in returndata.
function readUint120(
ReturndataPointer rdPtr
) internal pure returns (uint120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint128 at `rdPtr` in returndata.
function readUint128(
ReturndataPointer rdPtr
) internal pure returns (uint128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint136 at `rdPtr` in returndata.
function readUint136(
ReturndataPointer rdPtr
) internal pure returns (uint136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint144 at `rdPtr` in returndata.
function readUint144(
ReturndataPointer rdPtr
) internal pure returns (uint144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint152 at `rdPtr` in returndata.
function readUint152(
ReturndataPointer rdPtr
) internal pure returns (uint152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint160 at `rdPtr` in returndata.
function readUint160(
ReturndataPointer rdPtr
) internal pure returns (uint160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint168 at `rdPtr` in returndata.
function readUint168(
ReturndataPointer rdPtr
) internal pure returns (uint168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint176 at `rdPtr` in returndata.
function readUint176(
ReturndataPointer rdPtr
) internal pure returns (uint176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint184 at `rdPtr` in returndata.
function readUint184(
ReturndataPointer rdPtr
) internal pure returns (uint184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint192 at `rdPtr` in returndata.
function readUint192(
ReturndataPointer rdPtr
) internal pure returns (uint192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint200 at `rdPtr` in returndata.
function readUint200(
ReturndataPointer rdPtr
) internal pure returns (uint200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint208 at `rdPtr` in returndata.
function readUint208(
ReturndataPointer rdPtr
) internal pure returns (uint208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint216 at `rdPtr` in returndata.
function readUint216(
ReturndataPointer rdPtr
) internal pure returns (uint216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint224 at `rdPtr` in returndata.
function readUint224(
ReturndataPointer rdPtr
) internal pure returns (uint224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint232 at `rdPtr` in returndata.
function readUint232(
ReturndataPointer rdPtr
) internal pure returns (uint232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint240 at `rdPtr` in returndata.
function readUint240(
ReturndataPointer rdPtr
) internal pure returns (uint240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint248 at `rdPtr` in returndata.
function readUint248(
ReturndataPointer rdPtr
) internal pure returns (uint248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the uint256 at `rdPtr` in returndata.
function readUint256(
ReturndataPointer rdPtr
) internal pure returns (uint256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int8 at `rdPtr` in returndata.
function readInt8(
ReturndataPointer rdPtr
) internal pure returns (int8 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int16 at `rdPtr` in returndata.
function readInt16(
ReturndataPointer rdPtr
) internal pure returns (int16 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int24 at `rdPtr` in returndata.
function readInt24(
ReturndataPointer rdPtr
) internal pure returns (int24 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int32 at `rdPtr` in returndata.
function readInt32(
ReturndataPointer rdPtr
) internal pure returns (int32 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int40 at `rdPtr` in returndata.
function readInt40(
ReturndataPointer rdPtr
) internal pure returns (int40 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int48 at `rdPtr` in returndata.
function readInt48(
ReturndataPointer rdPtr
) internal pure returns (int48 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int56 at `rdPtr` in returndata.
function readInt56(
ReturndataPointer rdPtr
) internal pure returns (int56 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int64 at `rdPtr` in returndata.
function readInt64(
ReturndataPointer rdPtr
) internal pure returns (int64 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int72 at `rdPtr` in returndata.
function readInt72(
ReturndataPointer rdPtr
) internal pure returns (int72 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int80 at `rdPtr` in returndata.
function readInt80(
ReturndataPointer rdPtr
) internal pure returns (int80 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int88 at `rdPtr` in returndata.
function readInt88(
ReturndataPointer rdPtr
) internal pure returns (int88 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int96 at `rdPtr` in returndata.
function readInt96(
ReturndataPointer rdPtr
) internal pure returns (int96 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int104 at `rdPtr` in returndata.
function readInt104(
ReturndataPointer rdPtr
) internal pure returns (int104 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int112 at `rdPtr` in returndata.
function readInt112(
ReturndataPointer rdPtr
) internal pure returns (int112 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int120 at `rdPtr` in returndata.
function readInt120(
ReturndataPointer rdPtr
) internal pure returns (int120 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int128 at `rdPtr` in returndata.
function readInt128(
ReturndataPointer rdPtr
) internal pure returns (int128 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int136 at `rdPtr` in returndata.
function readInt136(
ReturndataPointer rdPtr
) internal pure returns (int136 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int144 at `rdPtr` in returndata.
function readInt144(
ReturndataPointer rdPtr
) internal pure returns (int144 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int152 at `rdPtr` in returndata.
function readInt152(
ReturndataPointer rdPtr
) internal pure returns (int152 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int160 at `rdPtr` in returndata.
function readInt160(
ReturndataPointer rdPtr
) internal pure returns (int160 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int168 at `rdPtr` in returndata.
function readInt168(
ReturndataPointer rdPtr
) internal pure returns (int168 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int176 at `rdPtr` in returndata.
function readInt176(
ReturndataPointer rdPtr
) internal pure returns (int176 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int184 at `rdPtr` in returndata.
function readInt184(
ReturndataPointer rdPtr
) internal pure returns (int184 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int192 at `rdPtr` in returndata.
function readInt192(
ReturndataPointer rdPtr
) internal pure returns (int192 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int200 at `rdPtr` in returndata.
function readInt200(
ReturndataPointer rdPtr
) internal pure returns (int200 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int208 at `rdPtr` in returndata.
function readInt208(
ReturndataPointer rdPtr
) internal pure returns (int208 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int216 at `rdPtr` in returndata.
function readInt216(
ReturndataPointer rdPtr
) internal pure returns (int216 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int224 at `rdPtr` in returndata.
function readInt224(
ReturndataPointer rdPtr
) internal pure returns (int224 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int232 at `rdPtr` in returndata.
function readInt232(
ReturndataPointer rdPtr
) internal pure returns (int232 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int240 at `rdPtr` in returndata.
function readInt240(
ReturndataPointer rdPtr
) internal pure returns (int240 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int248 at `rdPtr` in returndata.
function readInt248(
ReturndataPointer rdPtr
) internal pure returns (int248 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
/// @dev Reads the int256 at `rdPtr` in returndata.
function readInt256(
ReturndataPointer rdPtr
) internal pure returns (int256 value) {
assembly {
returndatacopy(0, rdPtr, _OneWord)
value := mload(0)
}
}
}
library MemoryReaders {
/// @dev Reads the memory pointer at `mPtr` in memory.
function readMemoryPointer(
MemoryPointer mPtr
) internal pure returns (MemoryPointer value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads value at `mPtr` & applies a mask to return only last 4 bytes
function readMaskedUint256(
MemoryPointer mPtr
) internal pure returns (uint256 value) {
value = mPtr.readUint256() & OffsetOrLengthMask;
}
/// @dev Reads the bool at `mPtr` in memory.
function readBool(MemoryPointer mPtr) internal pure returns (bool value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the address at `mPtr` in memory.
function readAddress(
MemoryPointer mPtr
) internal pure returns (address value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes1 at `mPtr` in memory.
function readBytes1(
MemoryPointer mPtr
) internal pure returns (bytes1 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes2 at `mPtr` in memory.
function readBytes2(
MemoryPointer mPtr
) internal pure returns (bytes2 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes3 at `mPtr` in memory.
function readBytes3(
MemoryPointer mPtr
) internal pure returns (bytes3 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes4 at `mPtr` in memory.
function readBytes4(
MemoryPointer mPtr
) internal pure returns (bytes4 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes5 at `mPtr` in memory.
function readBytes5(
MemoryPointer mPtr
) internal pure returns (bytes5 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes6 at `mPtr` in memory.
function readBytes6(
MemoryPointer mPtr
) internal pure returns (bytes6 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes7 at `mPtr` in memory.
function readBytes7(
MemoryPointer mPtr
) internal pure returns (bytes7 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes8 at `mPtr` in memory.
function readBytes8(
MemoryPointer mPtr
) internal pure returns (bytes8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes9 at `mPtr` in memory.
function readBytes9(
MemoryPointer mPtr
) internal pure returns (bytes9 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes10 at `mPtr` in memory.
function readBytes10(
MemoryPointer mPtr
) internal pure returns (bytes10 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes11 at `mPtr` in memory.
function readBytes11(
MemoryPointer mPtr
) internal pure returns (bytes11 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes12 at `mPtr` in memory.
function readBytes12(
MemoryPointer mPtr
) internal pure returns (bytes12 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes13 at `mPtr` in memory.
function readBytes13(
MemoryPointer mPtr
) internal pure returns (bytes13 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes14 at `mPtr` in memory.
function readBytes14(
MemoryPointer mPtr
) internal pure returns (bytes14 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes15 at `mPtr` in memory.
function readBytes15(
MemoryPointer mPtr
) internal pure returns (bytes15 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes16 at `mPtr` in memory.
function readBytes16(
MemoryPointer mPtr
) internal pure returns (bytes16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes17 at `mPtr` in memory.
function readBytes17(
MemoryPointer mPtr
) internal pure returns (bytes17 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes18 at `mPtr` in memory.
function readBytes18(
MemoryPointer mPtr
) internal pure returns (bytes18 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes19 at `mPtr` in memory.
function readBytes19(
MemoryPointer mPtr
) internal pure returns (bytes19 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes20 at `mPtr` in memory.
function readBytes20(
MemoryPointer mPtr
) internal pure returns (bytes20 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes21 at `mPtr` in memory.
function readBytes21(
MemoryPointer mPtr
) internal pure returns (bytes21 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes22 at `mPtr` in memory.
function readBytes22(
MemoryPointer mPtr
) internal pure returns (bytes22 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes23 at `mPtr` in memory.
function readBytes23(
MemoryPointer mPtr
) internal pure returns (bytes23 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes24 at `mPtr` in memory.
function readBytes24(
MemoryPointer mPtr
) internal pure returns (bytes24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes25 at `mPtr` in memory.
function readBytes25(
MemoryPointer mPtr
) internal pure returns (bytes25 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes26 at `mPtr` in memory.
function readBytes26(
MemoryPointer mPtr
) internal pure returns (bytes26 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes27 at `mPtr` in memory.
function readBytes27(
MemoryPointer mPtr
) internal pure returns (bytes27 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes28 at `mPtr` in memory.
function readBytes28(
MemoryPointer mPtr
) internal pure returns (bytes28 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes29 at `mPtr` in memory.
function readBytes29(
MemoryPointer mPtr
) internal pure returns (bytes29 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes30 at `mPtr` in memory.
function readBytes30(
MemoryPointer mPtr
) internal pure returns (bytes30 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes31 at `mPtr` in memory.
function readBytes31(
MemoryPointer mPtr
) internal pure returns (bytes31 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the bytes32 at `mPtr` in memory.
function readBytes32(
MemoryPointer mPtr
) internal pure returns (bytes32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint8 at `mPtr` in memory.
function readUint8(MemoryPointer mPtr) internal pure returns (uint8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint16 at `mPtr` in memory.
function readUint16(
MemoryPointer mPtr
) internal pure returns (uint16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint24 at `mPtr` in memory.
function readUint24(
MemoryPointer mPtr
) internal pure returns (uint24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint32 at `mPtr` in memory.
function readUint32(
MemoryPointer mPtr
) internal pure returns (uint32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint40 at `mPtr` in memory.
function readUint40(
MemoryPointer mPtr
) internal pure returns (uint40 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint48 at `mPtr` in memory.
function readUint48(
MemoryPointer mPtr
) internal pure returns (uint48 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint56 at `mPtr` in memory.
function readUint56(
MemoryPointer mPtr
) internal pure returns (uint56 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint64 at `mPtr` in memory.
function readUint64(
MemoryPointer mPtr
) internal pure returns (uint64 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint72 at `mPtr` in memory.
function readUint72(
MemoryPointer mPtr
) internal pure returns (uint72 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint80 at `mPtr` in memory.
function readUint80(
MemoryPointer mPtr
) internal pure returns (uint80 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint88 at `mPtr` in memory.
function readUint88(
MemoryPointer mPtr
) internal pure returns (uint88 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint96 at `mPtr` in memory.
function readUint96(
MemoryPointer mPtr
) internal pure returns (uint96 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint104 at `mPtr` in memory.
function readUint104(
MemoryPointer mPtr
) internal pure returns (uint104 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint112 at `mPtr` in memory.
function readUint112(
MemoryPointer mPtr
) internal pure returns (uint112 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint120 at `mPtr` in memory.
function readUint120(
MemoryPointer mPtr
) internal pure returns (uint120 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint128 at `mPtr` in memory.
function readUint128(
MemoryPointer mPtr
) internal pure returns (uint128 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint136 at `mPtr` in memory.
function readUint136(
MemoryPointer mPtr
) internal pure returns (uint136 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint144 at `mPtr` in memory.
function readUint144(
MemoryPointer mPtr
) internal pure returns (uint144 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint152 at `mPtr` in memory.
function readUint152(
MemoryPointer mPtr
) internal pure returns (uint152 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint160 at `mPtr` in memory.
function readUint160(
MemoryPointer mPtr
) internal pure returns (uint160 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint168 at `mPtr` in memory.
function readUint168(
MemoryPointer mPtr
) internal pure returns (uint168 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint176 at `mPtr` in memory.
function readUint176(
MemoryPointer mPtr
) internal pure returns (uint176 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint184 at `mPtr` in memory.
function readUint184(
MemoryPointer mPtr
) internal pure returns (uint184 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint192 at `mPtr` in memory.
function readUint192(
MemoryPointer mPtr
) internal pure returns (uint192 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint200 at `mPtr` in memory.
function readUint200(
MemoryPointer mPtr
) internal pure returns (uint200 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint208 at `mPtr` in memory.
function readUint208(
MemoryPointer mPtr
) internal pure returns (uint208 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint216 at `mPtr` in memory.
function readUint216(
MemoryPointer mPtr
) internal pure returns (uint216 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint224 at `mPtr` in memory.
function readUint224(
MemoryPointer mPtr
) internal pure returns (uint224 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint232 at `mPtr` in memory.
function readUint232(
MemoryPointer mPtr
) internal pure returns (uint232 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint240 at `mPtr` in memory.
function readUint240(
MemoryPointer mPtr
) internal pure returns (uint240 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint248 at `mPtr` in memory.
function readUint248(
MemoryPointer mPtr
) internal pure returns (uint248 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the uint256 at `mPtr` in memory.
function readUint256(
MemoryPointer mPtr
) internal pure returns (uint256 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int8 at `mPtr` in memory.
function readInt8(MemoryPointer mPtr) internal pure returns (int8 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int16 at `mPtr` in memory.
function readInt16(MemoryPointer mPtr) internal pure returns (int16 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int24 at `mPtr` in memory.
function readInt24(MemoryPointer mPtr) internal pure returns (int24 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int32 at `mPtr` in memory.
function readInt32(MemoryPointer mPtr) internal pure returns (int32 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int40 at `mPtr` in memory.
function readInt40(MemoryPointer mPtr) internal pure returns (int40 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int48 at `mPtr` in memory.
function readInt48(MemoryPointer mPtr) internal pure returns (int48 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int56 at `mPtr` in memory.
function readInt56(MemoryPointer mPtr) internal pure returns (int56 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int64 at `mPtr` in memory.
function readInt64(MemoryPointer mPtr) internal pure returns (int64 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int72 at `mPtr` in memory.
function readInt72(MemoryPointer mPtr) internal pure returns (int72 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int80 at `mPtr` in memory.
function readInt80(MemoryPointer mPtr) internal pure returns (int80 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int88 at `mPtr` in memory.
function readInt88(MemoryPointer mPtr) internal pure returns (int88 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int96 at `mPtr` in memory.
function readInt96(MemoryPointer mPtr) internal pure returns (int96 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int104 at `mPtr` in memory.
function readInt104(
MemoryPointer mPtr
) internal pure returns (int104 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int112 at `mPtr` in memory.
function readInt112(
MemoryPointer mPtr
) internal pure returns (int112 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int120 at `mPtr` in memory.
function readInt120(
MemoryPointer mPtr
) internal pure returns (int120 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int128 at `mPtr` in memory.
function readInt128(
MemoryPointer mPtr
) internal pure returns (int128 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int136 at `mPtr` in memory.
function readInt136(
MemoryPointer mPtr
) internal pure returns (int136 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int144 at `mPtr` in memory.
function readInt144(
MemoryPointer mPtr
) internal pure returns (int144 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int152 at `mPtr` in memory.
function readInt152(
MemoryPointer mPtr
) internal pure returns (int152 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int160 at `mPtr` in memory.
function readInt160(
MemoryPointer mPtr
) internal pure returns (int160 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int168 at `mPtr` in memory.
function readInt168(
MemoryPointer mPtr
) internal pure returns (int168 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int176 at `mPtr` in memory.
function readInt176(
MemoryPointer mPtr
) internal pure returns (int176 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int184 at `mPtr` in memory.
function readInt184(
MemoryPointer mPtr
) internal pure returns (int184 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int192 at `mPtr` in memory.
function readInt192(
MemoryPointer mPtr
) internal pure returns (int192 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int200 at `mPtr` in memory.
function readInt200(
MemoryPointer mPtr
) internal pure returns (int200 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int208 at `mPtr` in memory.
function readInt208(
MemoryPointer mPtr
) internal pure returns (int208 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int216 at `mPtr` in memory.
function readInt216(
MemoryPointer mPtr
) internal pure returns (int216 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int224 at `mPtr` in memory.
function readInt224(
MemoryPointer mPtr
) internal pure returns (int224 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int232 at `mPtr` in memory.
function readInt232(
MemoryPointer mPtr
) internal pure returns (int232 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int240 at `mPtr` in memory.
function readInt240(
MemoryPointer mPtr
) internal pure returns (int240 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int248 at `mPtr` in memory.
function readInt248(
MemoryPointer mPtr
) internal pure returns (int248 value) {
assembly {
value := mload(mPtr)
}
}
/// @dev Reads the int256 at `mPtr` in memory.
function readInt256(
MemoryPointer mPtr
) internal pure returns (int256 value) {
assembly {
value := mload(mPtr)
}
}
}
library MemoryWriters {
/// @dev Writes `valuePtr` to memory at `mPtr`.
function write(MemoryPointer mPtr, MemoryPointer valuePtr) internal pure {
assembly {
mstore(mPtr, valuePtr)
}
}
/// @dev Writes a boolean `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, bool value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an address `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, address value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a bytes32 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeBytes32(MemoryPointer mPtr, bytes32 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes a uint256 `value` to `mPtr` in memory.
function write(MemoryPointer mPtr, uint256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
/// @dev Writes an int256 `value` to `mPtr` in memory.
/// Separate name to disambiguate literal write parameters.
function writeInt(MemoryPointer mPtr, int256 value) internal pure {
assembly {
mstore(mPtr, value)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.7;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.19;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(target.code.length > 0, "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import { AllowListData, CreatorPayout } from "./SeaDropStructs.sol";
/**
* @notice A struct defining public drop data.
* Designed to fit efficiently in two storage slots.
*
* @param startPrice The start price per token. (Up to 1.2m
* of native token, e.g. ETH, MATIC)
* @param endPrice The end price per token. If this differs
* from startPrice, the current price will
* be calculated based on the current time.
* @param startTime The start time, ensure this is not zero.
* @param endTime The end time, ensure this is not zero.
* @param paymentToken The payment token address. Null for
* native token.
* @param maxTotalMintableByWallet Maximum total number of mints a user is
* allowed. (The limit for this field is
* 2^16 - 1)
* @param feeBps Fee out of 10_000 basis points to be
* collected.
* @param restrictFeeRecipients If false, allow any fee recipient;
* if true, check fee recipient is allowed.
*/
struct PublicDrop {
uint80 startPrice; // 80/512 bits
uint80 endPrice; // 160/512 bits
uint40 startTime; // 200/512 bits
uint40 endTime; // 240/512 bits
address paymentToken; // 400/512 bits
uint16 maxTotalMintableByWallet; // 416/512 bits
uint16 feeBps; // 432/512 bits
bool restrictFeeRecipients; // 440/512 bits
}
/**
* @notice A struct defining mint params for an allow list.
* An allow list leaf will be composed of `msg.sender` and
* the following params.
*
* Note: Since feeBps is encoded in the leaf, backend should ensure
* that feeBps is acceptable before generating a proof.
*
* @param startPrice The start price per token. (Up to 1.2m
* of native token, e.g. ETH, MATIC)
* @param endPrice The end price per token. If this differs
* from startPrice, the current price will
* be calculated based on the current time.
* @param startTime The start time, ensure this is not zero.
* @param endTime The end time, ensure this is not zero.
* @param paymentToken The payment token for the mint. Null for
* native token.
* @param maxTotalMintableByWallet Maximum total number of mints a user is
* allowed.
* @param maxTokenSupplyForStage The limit of token supply this stage can
* mint within.
* @param dropStageIndex The drop stage index to emit with the event
* for analytical purposes. This should be
* non-zero since the public mint emits with
* index zero.
* @param feeBps Fee out of 10_000 basis points to be
* collected.
* @param restrictFeeRecipients If false, allow any fee recipient;
* if true, check fee recipient is allowed.
*/
struct MintParams {
uint256 startPrice;
uint256 endPrice;
uint256 startTime;
uint256 endTime;
address paymentToken;
uint256 maxTotalMintableByWallet;
uint256 maxTokenSupplyForStage;
uint256 dropStageIndex; // non-zero
uint256 feeBps;
bool restrictFeeRecipients;
}
/**
* @dev Struct containing internal SeaDrop implementation logic
* mint details to avoid stack too deep.
*
* @param feeRecipient The fee recipient.
* @param payer The payer of the mint.
* @param minter The mint recipient.
* @param quantity The number of tokens to mint.
* @param withEffects Whether to apply state changes of the mint.
*/
struct MintDetails {
address feeRecipient;
address payer;
address minter;
uint256 quantity;
bool withEffects;
}
/**
* @notice A struct to configure multiple contract options in one transaction.
*/
struct MultiConfigureStruct {
uint256 maxSupply;
string baseURI;
string contractURI;
PublicDrop publicDrop;
string dropURI;
AllowListData allowListData;
CreatorPayout[] creatorPayouts;
bytes32 provenanceHash;
address[] allowedFeeRecipients;
address[] disallowedFeeRecipients;
address[] allowedPayers;
address[] disallowedPayers;
// Server-signed
address[] allowedSigners;
address[] disallowedSigners;
// ERC-2981
address royaltyReceiver;
uint96 royaltyBps;
// Mint
address mintRecipient;
uint256 mintQuantity;
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"ERC721A/=lib/ERC721A/contracts/",
"ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin-upgradeable/contracts/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@rari-capital/solmate/=lib/seaport/lib/solmate/",
"murky/=lib/murky/src/",
"create2-scripts/=lib/create2-helpers/script/",
"seadrop/=src/",
"seaport-sol/=lib/seaport/lib/seaport-sol/",
"seaport-types/=lib/seaport/lib/seaport-types/",
"seaport-core/=lib/seaport/lib/seaport-core/",
"seaport-test-utils/=lib/seaport/test/foundry/utils/",
"solady/=lib/solady/"
],
"optimizer": {
"enabled": true,
"runs": 100000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"AccountBalanceOverflow","type":"error"},{"inputs":[],"name":"AllowedSeaportCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"ArrayLengthsMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"}],"name":"CannotExceedMaxSupplyOfUint64","type":"error"},{"inputs":[],"name":"CreatorPayoutAddressCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"CreatorPayoutBasisPointsCannotBeZero","type":"error"},{"inputs":[],"name":"CreatorPayoutsNotSet","type":"error"},{"inputs":[],"name":"DuplicateFeeRecipient","type":"error"},{"inputs":[],"name":"DuplicatePayer","type":"error"},{"inputs":[],"name":"DuplicateSigner","type":"error"},{"inputs":[],"name":"FeeRecipientCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"got","type":"address"}],"name":"FeeRecipientNotAllowed","type":"error"},{"inputs":[],"name":"FeeRecipientNotPresent","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"InvalidCallerOnlyAllowedSeaport","type":"error"},{"inputs":[{"internalType":"uint256","name":"totalReceivedBasisPoints","type":"uint256"}],"name":"InvalidCreatorPayoutBasisPoints","type":"error"},{"inputs":[{"internalType":"uint256","name":"totalReceivedBasisPoints","type":"uint256"}],"name":"InvalidCreatorPayoutTotalBasisPoints","type":"error"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8"}],"name":"InvalidExtraDataEncoding","type":"error"},{"inputs":[{"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"InvalidFeeBps","type":"error"},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"InvalidFromAndToTokenId","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidSignedEndTime","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"minimumOrMaximum","type":"uint256"}],"name":"InvalidSignedFeeBps","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"minimum","type":"uint256"}],"name":"InvalidSignedFromTokenId","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidSignedMaxTokenSupplyForStage","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidSignedMaxTotalMintableByWallet","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidSignedMaxTotalMintableByWalletPerToken","type":"error"},{"inputs":[{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"minimum","type":"uint256"}],"name":"InvalidSignedMintPrice","type":"error"},{"inputs":[{"internalType":"address","name":"got","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"InvalidSignedPaymentToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"minimum","type":"uint256"}],"name":"InvalidSignedStartTime","type":"error"},{"inputs":[{"internalType":"uint256","name":"got","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidSignedToTokenId","type":"error"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"InvalidStartAndEndTime","type":"error"},{"inputs":[{"internalType":"uint8","name":"substandard","type":"uint8"}],"name":"InvalidSubstandard","type":"error"},{"inputs":[],"name":"MaxSupplyMismatch","type":"error"},{"inputs":[],"name":"MintAmountsMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"MintExceedsMaxSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"MintQuantityExceedsMaxMintedPerWallet","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"MintQuantityExceedsMaxMintedPerWalletForTokenId","type":"error"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"MintQuantityExceedsMaxSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"maxTokenSupplyForStage","type":"uint256"}],"name":"MintQuantityExceedsMaxTokenSupplyForStage","type":"error"},{"inputs":[],"name":"MustSpecifyERC1155ConsiderationItemForSeaDropMint","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoBalanceToWithdraw","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"}],"name":"NotActive","type":"error"},{"inputs":[],"name":"NotOwnerNorApproved","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OfferContainsDuplicateTokenId","type":"error"},{"inputs":[],"name":"OnlyDelegateCalled","type":"error"},{"inputs":[],"name":"PayerCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"got","type":"address"}],"name":"PayerNotAllowed","type":"error"},{"inputs":[],"name":"PayerNotPresent","type":"error"},{"inputs":[],"name":"ProvenanceHashCannotBeSetAfterAlreadyBeingSet","type":"error"},{"inputs":[],"name":"ProvenanceHashCannotBeSetAfterMintStarted","type":"error"},{"inputs":[],"name":"PublicDropStageNotPresent","type":"error"},{"inputs":[],"name":"PublicDropsMismatch","type":"error"},{"inputs":[],"name":"RoyaltyOverflow","type":"error"},{"inputs":[],"name":"RoyaltyReceiverIsZeroAddress","type":"error"},{"inputs":[],"name":"SameTransferValidator","type":"error"},{"inputs":[],"name":"SignatureAlreadyUsed","type":"error"},{"inputs":[],"name":"SignedMintsMustRestrictFeeRecipients","type":"error"},{"inputs":[],"name":"SignerCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"SignerNotPresent","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"startTokenId","type":"uint256"},{"internalType":"uint256","name":"endTokenId","type":"uint256"}],"name":"TokenIdNotWithinDropStageRange","type":"error"},{"inputs":[],"name":"TransferToNonERC1155ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8"}],"name":"UnsupportedExtraDataVersion","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"UnsupportedFunctionSelector","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"previousMerkleRoot","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"},{"indexed":false,"internalType":"string[]","name":"publicKeyURI","type":"string[]"},{"indexed":false,"internalType":"string","name":"allowListURI","type":"string"}],"name":"AllowListUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeRecipient","type":"address"},{"indexed":true,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AllowedFeeRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"allowedSeaport","type":"address[]"}],"name":"AllowedSeaportUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newContractURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"payoutAddress","type":"address"},{"internalType":"uint16","name":"basisPoints","type":"uint16"}],"indexed":false,"internalType":"struct CreatorPayout[]","name":"creatorPayouts","type":"tuple[]"}],"name":"CreatorPayoutsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newDropURI","type":"string"}],"name":"DropURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"MaxSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"bool","name":"allowed","type":"bool"}],"name":"PayerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"previousHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newHash","type":"bytes32"}],"name":"ProvenanceHashUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint80","name":"startPrice","type":"uint80"},{"internalType":"uint80","name":"endPrice","type":"uint80"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"endTime","type":"uint40"},{"internalType":"bool","name":"restrictFeeRecipients","type":"bool"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint24","name":"fromTokenId","type":"uint24"},{"internalType":"uint24","name":"toTokenId","type":"uint24"},{"internalType":"uint16","name":"maxTotalMintableByWallet","type":"uint16"},{"internalType":"uint16","name":"maxTotalMintableByWalletPerToken","type":"uint16"},{"internalType":"uint16","name":"feeBps","type":"uint16"}],"indexed":false,"internalType":"struct PublicDrop","name":"publicDrop","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"PublicDropUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"RoyaltyInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"dropStageIndex","type":"uint256"}],"name":"SeaDropMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum SeaDropErrorsAndEvents.SEADROP_TOKEN_TYPE","name":"tokenType","type":"uint8"}],"name":"SeaDropTokenDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"bool","name":"allowed","type":"bool"}],"name":"SignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldValidator","type":"address"},{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"TransferValidatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"emitBatchMetadataUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTransferValidationFunction","outputs":[{"internalType":"bytes4","name":"functionSignature","type":"bytes4"},{"internalType":"bool","name":"isViewFunction","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getTransferValidator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"allowedConfigurer","type":"address"},{"internalType":"address","name":"allowedSeaport","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipHandoverValidFor","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newProvenanceHash","type":"bytes32"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValidator","type":"address"}],"name":"setTransferValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506145c1806100206000396000f3fe6080604052600436106102695760003560e01c8063869f759411610153578063c6ab67a3116100cb578063f242432a1161007f578063f5298aca11610064578063f5298aca1461143d578063f6eb127a1461145d578063fee81cf41461147d57610269565b8063f242432a1461140a578063f2fde38b1461142a57610269565b8063e8a3d485116100b0578063e8a3d485146113c2578063e985e9c5146113d7578063f04e283e146113f757610269565b8063c6ab67a31461138f578063d7533f02146113a457610269565b80639d7f4ebf11610122578063a483011411610107578063a48301141461130c578063a9fc664e1461132c578063bd85b0391461134c57610269565b80639d7f4ebf146112a1578063a22cb465146112ec57610269565b8063869f7594146112015780638da5cb5b14611238578063938e3d7b1461126c57806395d89b411461128c57610269565b80632a55205a116101e65780634e1273f4116101b557806355f804b31161019a57806355f804b3146111c45780636c0360eb146111e4578063715018a6146111f957610269565b80634e1273f41461118f57806354d1f13d146111bc57610269565b80632a55205a146110e35780632eb2c2d61461112f578063362925c21461114f57806337da577c1461116f57610269565b8063098144d41161023d5780630d705df6116102225780630d705df61461107a5780630e89341c146110bb57806325692962146110db57610269565b8063098144d41461100e578063099b6bfa1461105a57610269565b8062fdd58e14610f4d57806301ffc9a714610f9a57806304634d8d14610fca57806306fdde0314610fec575b34801561027557600080fd5b5060003660607fffffffff0000000000000000000000000000000000000000000000000000000083351682846102ae8260048184613770565b909250905060007fffffffff0000000000000000000000000000000000000000000000000000000084167f6aba501800000000000000000000000000000000000000000000000000000000148061034657507fffffffff0000000000000000000000000000000000000000000000000000000084167fb957d0cb00000000000000000000000000000000000000000000000000000000145b8061039257507fffffffff0000000000000000000000000000000000000000000000000000000084167febb4a55f00000000000000000000000000000000000000000000000000000000145b806103de57507fffffffff0000000000000000000000000000000000000000000000000000000084167f1ecdfb8c00000000000000000000000000000000000000000000000000000000145b8061042a57507fffffffff0000000000000000000000000000000000000000000000000000000084167f7f2a5cca00000000000000000000000000000000000000000000000000000000145b8061047657507fffffffff0000000000000000000000000000000000000000000000000000000084167f8e7d1e4300000000000000000000000000000000000000000000000000000000145b806104c257507fffffffff0000000000000000000000000000000000000000000000000000000084167ff460590b00000000000000000000000000000000000000000000000000000000145b8061050e57507fffffffff0000000000000000000000000000000000000000000000000000000084167f69ec1daa00000000000000000000000000000000000000000000000000000000145b8061055a57507fffffffff0000000000000000000000000000000000000000000000000000000084167f582d424100000000000000000000000000000000000000000000000000000000145b806105a657507fffffffff0000000000000000000000000000000000000000000000000000000084167f9891976500000000000000000000000000000000000000000000000000000000145b806105f257507fffffffff0000000000000000000000000000000000000000000000000000000084167f2e778efc00000000000000000000000000000000000000000000000000000000145b8061063e57507fffffffff0000000000000000000000000000000000000000000000000000000084167fe6fd04ff00000000000000000000000000000000000000000000000000000000145b8061068a57507fffffffff0000000000000000000000000000000000000000000000000000000084167fa9236bc400000000000000000000000000000000000000000000000000000000145b806106d557507fffffffff0000000000000000000000000000000000000000000000000000000084167e378a3a00000000000000000000000000000000000000000000000000000000145b8061072157507fffffffff0000000000000000000000000000000000000000000000000000000084167f6233719600000000000000000000000000000000000000000000000000000000145b8061076d57507fffffffff0000000000000000000000000000000000000000000000000000000084167f82daf2a100000000000000000000000000000000000000000000000000000000145b806107b957507fffffffff0000000000000000000000000000000000000000000000000000000084167fd59ff1fc00000000000000000000000000000000000000000000000000000000145b8061080557507fffffffff0000000000000000000000000000000000000000000000000000000084167f94cf795e00000000000000000000000000000000000000000000000000000000145b8061085157507fffffffff0000000000000000000000000000000000000000000000000000000084167ffde6e55400000000000000000000000000000000000000000000000000000000145b8061089d57507fffffffff0000000000000000000000000000000000000000000000000000000084167f1055d70800000000000000000000000000000000000000000000000000000000145b905060007fffffffff0000000000000000000000000000000000000000000000000000000085167f6aba501800000000000000000000000000000000000000000000000000000000148061093257507fffffffff0000000000000000000000000000000000000000000000000000000085167fb957d0cb00000000000000000000000000000000000000000000000000000000145b8061097e57507fffffffff0000000000000000000000000000000000000000000000000000000085167febb4a55f00000000000000000000000000000000000000000000000000000000145b806109ca57507fffffffff0000000000000000000000000000000000000000000000000000000085167f1ecdfb8c00000000000000000000000000000000000000000000000000000000145b80610a1657507fffffffff0000000000000000000000000000000000000000000000000000000085167f7f2a5cca00000000000000000000000000000000000000000000000000000000145b80610a6257507fffffffff0000000000000000000000000000000000000000000000000000000085167f8e7d1e4300000000000000000000000000000000000000000000000000000000145b80610aae57507fffffffff0000000000000000000000000000000000000000000000000000000085167f69ec1daa00000000000000000000000000000000000000000000000000000000145b90508115610c84578015610ac957610ac46114b0565b610ba0565b7f0b9fa6f5000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610ba0576000610b226020600c8688613770565b610b2b9161379a565b60601c90503381141580610b9157503373ffffffffffffffffffffffffffffffffffffffff8216148015610b915750610b6261155e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600891909101602052604090205460ff16155b15610b9e57610b9e6114b0565b505b600954604051600091829173ffffffffffffffffffffffffffffffffffffffff90911690610bd190839036906137e2565b600060405180830381855af49150503d8060008114610c0c576040519150601f19603f3d011682016040523d82523d6000602084013e610c11565b606091505b509150915081610c2357805181602001fd5b7f676e689b000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000881601610c7657610c768686611592565b9650610f4295505050505050565b7fe3f34ec7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610da157600080610cdc85870187613814565b91509150600080600080610d59868660008181526001602090815260408083205473ffffffffffffffffffffffffffffffffffffffff9095168352600282528083205460038352818420948452939091529020549092909167ffffffffffffffff7001000000000000000000000000000000008204811692911690565b6040805160208101959095528481019390935260608401919091526080808401919091528151808403909101815260a090920190529b50610f429a5050505050505050505050565b7f0b226d32000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610df85763f4dd92ce6000526020601cf35b7fca388191000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610e81576009546040805173ffffffffffffffffffffffffffffffffffffffff90921660208301520160405160208183030381529060405295505050505050610f42565b7f51d9a6ad000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610ee157610ed26114b0565b610edc84846116fd565b610f3c565b6040517f67fe1ffb0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000861660048201526024015b60405180910390fd5b50505050505b915050805190602001f35b348015610f5957600080fd5b50610f87610f68366004613814565b679a31110384e0b0c96020526014919091526000908152604090205490565b6040519081526020015b60405180910390f35b348015610fa657600080fd5b50610fba610fb5366004613840565b611735565b6040519015158152602001610f91565b348015610fd657600080fd5b50610fea610fe5366004613882565b611823565b005b348015610ff857600080fd5b50611001611896565b604051610f9191906138cc565b34801561101a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610f91565b34801561106657600080fd5b50610fea611075366004613938565b611928565b34801561108657600080fd5b50604080517f1854b2410000000000000000000000000000000000000000000000000000000081526001602082015201610f91565b3480156110c757600080fd5b506110016110d6366004613938565b6119a6565b610fea611a3a565b3480156110ef57600080fd5b506111036110fe366004613951565b611a8a565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610f91565b34801561113b57600080fd5b50610fea61114a366004613a01565b611afd565b34801561115b57600080fd5b50610fea61116a366004613bfd565b611bc4565b34801561117b57600080fd5b50610fea61118a366004613951565b611dd3565b34801561119b57600080fd5b506111af6111aa366004613c9b565b611e97565b604051610f919190613d07565b610fea611f07565b3480156111d057600080fd5b50610fea6111df366004613d4b565b611f43565b3480156111f057600080fd5b50611001611faf565b610fea611fbe565b34801561120d57600080fd5b50610f8761121c366004613938565b60009081526001602052604090205467ffffffffffffffff1690565b34801561124457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754611035565b34801561127857600080fd5b50610fea611287366004613d4b565b611fd0565b34801561129857600080fd5b50611001612017565b3480156112ad57600080fd5b50610f876112bc366004613938565b600090815260016020526040902054700100000000000000000000000000000000900467ffffffffffffffff1690565b3480156112f857600080fd5b50610fea611307366004613d8d565b612026565b34801561131857600080fd5b50610fea611327366004613951565b61207c565b34801561133857600080fd5b50610fea611347366004613dc0565b612105565b34801561135857600080fd5b50610f87611367366004613938565b60009081526001602052604090205468010000000000000000900467ffffffffffffffff1690565b34801561139b57600080fd5b50600854610f87565b3480156113b057600080fd5b506040516202a3008152602001610f91565b3480156113ce57600080fd5b50611001612119565b3480156113e357600080fd5b50610fba6113f2366004613ddd565b612128565b610fea611405366004613dc0565b612193565b34801561141657600080fd5b50610fea611425366004613e0b565b6121d0565b610fea611438366004613dc0565b6122c5565b34801561144957600080fd5b50610fea611458366004613e87565b6122ec565b34801561146957600080fd5b50610fea611478366004613ebc565b6122fd565b34801561148957600080fd5b50610f87611498366004613dc0565b63389a75e1600c908152600091909152602090205490565b60095473ffffffffffffffffffffffffffffffffffffffff16331480159061152557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561155c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60008061158c60017fa1f93c45d55294e6c2e764d95774fe71c86ec26daf62930bcecf3675030e7d9b613f6e565b92915050565b600080806115a28486018661405f565b60368101519396509194509092505060601c806115bc5750825b825160008167ffffffffffffffff8111156115d9576115d9613ac0565b604051908082528060200260200182016040528015611602578160200160208202803683370190505b50905060008267ffffffffffffffff81111561162057611620613ac0565b604051908082528060200260200182016040528015611649578160200160208202803683370190505b50905060005b838110156116d6578681815181106116695761166961410e565b6020026020010151604001518382815181106116875761168761410e565b6020026020010181815250508681815181106116a5576116a561410e565b6020026020010151606001518282815181106116c3576116c361410e565b602090810291909101015260010161164f565b506116f28483836040518060200160405280600081525061236c565b505050505050505050565b6000808061170d84860186614198565b92509250925061172e8383836040518060200160405280600081525061236c565b5050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f94189afb0000000000000000000000000000000000000000000000000000000014806117c857507fffffffff0000000000000000000000000000000000000000000000000000000082167f1be900b100000000000000000000000000000000000000000000000000000000145b8061181457507f2e778efc000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061158c575061158c826123cb565b61182b6114b0565b6118358282612540565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526bffffffffffffffffffffffff831660208201527ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d91015b60405180910390a15050565b6060600480546118a59061420e565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061420e565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b5050505050905090565b6119306114b0565b600854801561196b576040517f2858c21800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600882905560408051828152602081018490527f7c22004198bf87da0f0dab623c72e66ca1200f4454aa3b9ca30f436275428b7c910161188a565b6060600680546119b59061420e565b80601f01602080910402602001604051908101604052809291908181526020018280546119e19061420e565b8015611a2e5780601f10611a0357610100808354040283529160200191611a2e565b820191906000526020600020905b815481529060010190602001808311611a1157829003601f168201915b50505050509050919050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600082815268aa4ec00224afccfdb76020526040812054606081901c91906127109083611abe576020515490508060601c93505b606084901b18847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff829004811182023d3d3e9396930204935090915050565b611bba33731e0049783f008a0085193e00003d00cd54003c7181141502898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061259092505050565b5050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015611c0f575060005460017401000000000000000000000000000000000000000090910460ff16105b80611c415750303b158015611c41575060005474010000000000000000000000000000000000000000900460ff166001145b611ccd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610f33565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015611d5357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611d5c82612721565b611d6886868686612785565b8015611dcb57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611ddb6114b0565b67ffffffffffffffff811115611e20576040517fb43e913700000000000000000000000000000000000000000000000000000000815260048101829052602401610f33565b60008281526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff851617905581518481529081018390527f44ecfc706d63e347851cfd40acfa6cf2e3a41faa3e8b460210c03938e84a91ad910161188a565b6060838214611eae57633b800a466000526004601cfd5b6040519050818152602081018260051b81810160405260005b818114611efc57679a31110384e0b0c98882013560601b17602090815286820135600090815260409020548483015201611ec7565b505050949350505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b611f4b6114b0565b6006611f588284836142a7565b5060408051600081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910161188a565b6060600680546118a59061420e565b611fc66129ab565b61155c60006129e1565b611fd86114b0565b6007611fe58284836142a7565b507f905d981207a7d0b6c62cc46ab0be2a076d0298e4a86d0ab79882dbd01ac37378828260405161188a9291906143c1565b6060600580546118a59061420e565b8015159050679a31110384e0b0c96020523360145281600052806034600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b6120846114b0565b8082036120cf57817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6120b6846119a6565b6040516120c391906138cc565b60405180910390a25050565b60408051838152602081018390527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910161188a565b61210d6129ab565b61211681612a47565b50565b6060600780546118a59061420e565b60007fffffffffffffffffffffffffe1ffb687c0ff75ff7ae6c1ffffc2ff32abffc38f73ffffffffffffffffffffffffffffffffffffffff83160161216f5750600161158c565b679a31110384e0b0c9602052601483905260008290526034600c20545b9392505050565b61219b6129ab565b63389a75e1600c52806000526020600c2080544211156121c357636f5e88186000526004601cfd5b60009055612116816129e1565b3073ffffffffffffffffffffffffffffffffffffffff8716036122685733731e0049783f008a0085193e00003d00cd54003c711480159061222a575061221461155e565b336000908152602091909152604090205460ff16155b15612263576040517f98d94de6000000000000000000000000000000000000000000000000000000008152336004820152602401610f33565b611dcb565b611dcb33731e0049783f008a0085193e00003d00cd54003c71811415028787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b1a92505050565b6122cd6129ab565b8060601b6122e357637448fbae6000526004601cfd5b612116816129e1565b6122f833848484612c99565b505050565b61172e338686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250612cfb92505050565b825160005b818110156123be576123b68686838151811061238f5761238f61410e565b60200260200101518684815181106123a9576123a961410e565b6020026020010151612db1565b600101612371565b5061172e85858585612f5e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f029a992c00000000000000000000000000000000000000000000000000000000148061245e57507fffffffff0000000000000000000000000000000000000000000000000000000082167fad0d7f6c00000000000000000000000000000000000000000000000000000000145b806124aa57507fffffffff0000000000000000000000000000000000000000000000000000000082167fa07d229a00000000000000000000000000000000000000000000000000000000145b806124f657507f49064906000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806125145750632a55205a60e083901c9081146301ffc9a791909114175b8061158c575061158c826301ffc9a760e09190911c90811463d9b67a26821417630e89341c9091141790565b6bffffffffffffffffffffffff16612710808211156125675763350a88b36000526004601cfd5b8260601b8061257e5763b4457eaa6000526004601cfd5b90911768aa4ec00224afccfdb7555050565b61259d8585858585613086565b81518351146125b457633b800a466000526004601cfd5b8460601b8460601b806125cf5763ea553b346000526004601cfd5b81679a31110384e0b0c91781679a31110384e0b0c917816020528960601b848114811517612613578a6000526034600c205461261357634b6e7f186000526004601cfd5b50865160051b60005b81811461268a576020810190508088015184602052818a015160005260406000208054808311156126555763f4d678b86000526004601cfd5b82900390556020849052604060002080548083018181101561267f576301336cea6000526004601cfd5b9091555061261c9050565b5050505060405160408152855160051b602001604082018181838a60045afa503d60400160208401523d81019050865160051b60200191508181838960045afa50823d8201039150508260601c8460601c337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a45050505061270c600090565b50833b15611dcb57611dcb85858585856131fe565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6000547501000000000000000000000000000000000000000000900460ff16612830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610f33565b73ffffffffffffffffffffffffffffffffffffffff831661287d576040517fa4d16ed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600161288761155e565b73ffffffffffffffffffffffffffffffffffffffff851660009081526020918252604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935582516001808252818501909452909290918281019080368337019050509050838160008151811061290e5761290e61410e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508061295161155e565b60010190805190602001906129679291906136d1565b507fc90c61dd7a67259711a8a4c0b50bc6130257c5ba9f2539c5050264827f3819ea6004604051612998919061440e565b60405180910390a161172e8584846132d9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754331461155c576382b429006000526004601cfd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60005473ffffffffffffffffffffffffffffffffffffffff9081169082168103612a9d576040517f4a3bb19e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821790925560408051928416835260208301919091527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910161188a565b612b578585612b3c866040805180820190915260018152602081019190915290565b60408051808201909152600181526020810187905285613086565b8460601b8460601b80612b725763ea553b346000526004601cfd5b81679a31110384e0b0c9176020528760601b828114811517612baa57886000526034600c2054612baa57634b6e7f186000526004601cfd5b50846000526040600020805480861115612bcc5763f4d678b86000526004601cfd5b8590039055679a31110384e0b0c981176020526040600020805480860181811015612bff576301336cea6000526004601cfd5b808355505050836020528060601c8260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a45050612c42600090565b15612c8557612c858585612c69866040805180820190915260018152602081019190915290565b6040805180820190915260018152602081018790525b50505050565b833b15611dcb57611dcb85858585856133e8565b6000828152600160205260409020805467ffffffffffffffff680100000000000000008083048216859003909116027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909116179055612c7f84848484613494565b815160005b81811015612da457612d9c848281518110612d1d57612d1d61410e565b6020026020010151848381518110612d3757612d3761410e565b6020026020010151600091825260016020526040909120805467ffffffffffffffff68010000000000000000808304821694909403169092027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b600101612d00565b5061172e85858585613582565b6000828152600160205260409020805467ffffffffffffffff80821691612dee91859170010000000000000000000000000000000090041661444f565b1115612e66578054612e1f908390700100000000000000000000000000000000900467ffffffffffffffff1661444f565b81546040517f60a2a42c000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff166024820152604401610f33565b805470010000000000000000000000000000000067ffffffffffffffff68010000000000000000808404821686018216027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff84168117839004821686019091169091027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9092169190911717905573ffffffffffffffffffffffffffffffffffffffff9092166000908152600260209081526040808320805486019055600382528083209383529290522080549091019055565b612f6c600085858585613086565b8151835114612f8357633b800a466000526004601cfd5b8360601b80612f9a5763ea553b346000526004601cfd5b80679a31110384e0b0c917602052835160051b60005b818114612ff35760208101905080850151818701516000526040600020805482810181811015612fe8576301336cea6000526004601cfd5b90915550612fb09050565b505060405160408152845160051b602001604082018181838960045afa503d60400160208401523d81019050855160051b60200191508181838860045afa50823d8201039150508260601c6000337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a4505050613070600090565b50833b15612c7f57612c7f6000858585856131fe565b73ffffffffffffffffffffffffffffffffffffffff8516158015906130c0575073ffffffffffffffffffffffffffffffffffffffff841615155b1561172e5760005473ffffffffffffffffffffffffffffffffffffffff168015611dcb5760005b84518110156131f5578173ffffffffffffffffffffffffffffffffffffffff16631854b2413389898986815181106131215761312161410e565b602002602001015189878151811061313b5761313b61410e565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015293851660248501529390911660448301526064820152608481019190915260a401600060405180830381600087803b1580156131ca57600080fd5b505af11580156131de573d6000803e3d6000fd5b5050505080806131ed90614462565b9150506130e7565b50505050505050565b60405163bc197c8181523360208201528560601b60601c604082015260a06060820152835160051b60200160c082018181838860045afa503d60a0018060808501523d82019150855160051b60200192508282848860045afa503d0160a0840152835160200191503d018181818660045afa50601c83013d82010391505060208282601c850160008a5af16132a2573d1561329d573d6000803e3d6000fd5b600082525b5080517fbc197c810000000000000000000000000000000000000000000000000000000014611dcb57639c05499b6000526004601cfd5b6000547501000000000000000000000000000000000000000000900460ff16613384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610f33565b6004613390838261449a565b50600561339d828261449a565b5050600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff939093169290921790915550565b60405163f23a6e6181523360208201528560601b60601c604082015283606082015282608082015260a08082015281518060c08301528015613434578060e08301826020860160045afa505b6020828260c401601c850160008a5af161345d573d15613458573d6000803e3d6000fd5b600082525b5080517ff23a6e610000000000000000000000000000000000000000000000000000000014611dcb57639c05499b6000526004601cfd5b6134e18360006134b7856040805180820190915260018152602081019190915290565b60408051808201909152600181526020810186905260405180602001604052806000815250613086565b8260601b80679a31110384e0b0c917602052808560601b148560601b151761351f57846000526034600c205461351f57634b6e7f186000526004601cfd5b8260005260406000208054808411156135405763f4d678b86000526004601cfd5b83810382555050826000528160205260008160601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a450612c7f565b61359f836000848460405180602001604052806000815250613086565b80518251146135b657633b800a466000526004601cfd5b8260601b80679a31110384e0b0c9176020528460601b8181148115176135f257856000526034600c20546135f257634b6e7f186000526004601cfd5b50825160051b60005b81811461363b57602081019050808401518186015160005260406000208054808311156136305763f4d678b86000526004601cfd5b9190910390556135fb565b505060405160408152835160051b602001604082018181838860045afa503d60400160208401523d81019050845160051b60200191508181838760045afa50823d82010391505060008360601c337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a45050506136b8600090565b15612c7f57604080516020810190915260009052612c7f565b82805482825590600052602060002090810192821561374b579160200282015b8281111561374b57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906136f1565b5061375792915061375b565b5090565b5b80821115613757576000815560010161375c565b6000808585111561378057600080fd5b8386111561378d57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156137da5780818660140360031b1b83161692505b505092915050565b8183823760009101908152919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461211657600080fd5b6000806040838503121561382757600080fd5b8235613832816137f2565b946020939093013593505050565b60006020828403121561385257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461218c57600080fd5b6000806040838503121561389557600080fd5b82356138a0816137f2565b915060208301356bffffffffffffffffffffffff811681146138c157600080fd5b809150509250929050565b600060208083528351808285015260005b818110156138f9578581018301518582016040015282016138dd565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561394a57600080fd5b5035919050565b6000806040838503121561396457600080fd5b50508035926020909101359150565b60008083601f84011261398557600080fd5b50813567ffffffffffffffff81111561399d57600080fd5b6020830191508360208260051b85010111156139b857600080fd5b9250929050565b60008083601f8401126139d157600080fd5b50813567ffffffffffffffff8111156139e957600080fd5b6020830191508360208285010111156139b857600080fd5b60008060008060008060008060a0898b031215613a1d57600080fd5b8835613a28816137f2565b97506020890135613a38816137f2565b9650604089013567ffffffffffffffff80821115613a5557600080fd5b613a618c838d01613973565b909850965060608b0135915080821115613a7a57600080fd5b613a868c838d01613973565b909650945060808b0135915080821115613a9f57600080fd5b50613aac8b828c016139bf565b999c989b5096995094979396929594505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613b1257613b12613ac0565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b5f57613b5f613ac0565b604052919050565b600067ffffffffffffffff831115613b8157613b81613ac0565b613bb260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613b18565b9050828152838383011115613bc657600080fd5b828260208301376000602084830101529392505050565b600082601f830112613bee57600080fd5b61218c83833560208501613b67565b600080600080600060a08688031215613c1557600080fd5b8535613c20816137f2565b94506020860135613c30816137f2565b9350604086013567ffffffffffffffff80821115613c4d57600080fd5b613c5989838a01613bdd565b94506060880135915080821115613c6f57600080fd5b50613c7c88828901613bdd565b9250506080860135613c8d816137f2565b809150509295509295909350565b60008060008060408587031215613cb157600080fd5b843567ffffffffffffffff80821115613cc957600080fd5b613cd588838901613973565b90965094506020870135915080821115613cee57600080fd5b50613cfb87828801613973565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015613d3f57835183529284019291840191600101613d23565b50909695505050505050565b60008060208385031215613d5e57600080fd5b823567ffffffffffffffff811115613d7557600080fd5b613d81858286016139bf565b90969095509350505050565b60008060408385031215613da057600080fd5b8235613dab816137f2565b9150602083013580151581146138c157600080fd5b600060208284031215613dd257600080fd5b813561218c816137f2565b60008060408385031215613df057600080fd5b8235613dfb816137f2565b915060208301356138c1816137f2565b60008060008060008060a08789031215613e2457600080fd5b8635613e2f816137f2565b95506020870135613e3f816137f2565b94506040870135935060608701359250608087013567ffffffffffffffff811115613e6957600080fd5b613e7589828a016139bf565b979a9699509497509295939492505050565b600080600060608486031215613e9c57600080fd5b8335613ea7816137f2565b95602085013595506040909401359392505050565b600080600080600060608688031215613ed457600080fd5b8535613edf816137f2565b9450602086013567ffffffffffffffff80821115613efc57600080fd5b613f0889838a01613973565b90965094506040880135915080821115613f2157600080fd5b50613f2e88828901613973565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561158c5761158c613f3f565b600067ffffffffffffffff821115613f9b57613f9b613ac0565b5060051b60200190565b600082601f830112613fb657600080fd5b81356020613fcb613fc683613f81565b613b18565b82815260079290921b84018101918181019086841115613fea57600080fd5b8286015b8481101561405457608081890312156140075760008081fd5b61400f613aef565b81356006811061401f5760008081fd5b81528185013561402e816137f2565b818601526040828101359082015260608083013590820152835291830191608001613fee565b509695505050505050565b6000806000806080858703121561407557600080fd5b8435614080816137f2565b9350602085013567ffffffffffffffff8082111561409d57600080fd5b6140a988838901613fa5565b945060408701359150808211156140bf57600080fd5b6140cb88838901613fa5565b935060608701359150808211156140e157600080fd5b508501601f810187136140f357600080fd5b61410287823560208401613b67565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082601f83011261414e57600080fd5b8135602061415e613fc683613f81565b82815260059290921b8401810191818101908684111561417d57600080fd5b8286015b848110156140545780358352918301918301614181565b6000806000606084860312156141ad57600080fd5b83356141b8816137f2565b9250602084013567ffffffffffffffff808211156141d557600080fd5b6141e18783880161413d565b935060408601359150808211156141f757600080fd5b506142048682870161413d565b9150509250925092565b600181811c9082168061422257607f821691505b60208210810361425b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156122f857600081815260208120601f850160051c810160208610156142885750805b601f850160051c820191505b81811015611dcb57828155600101614294565b67ffffffffffffffff8311156142bf576142bf613ac0565b6142d3836142cd835461420e565b83614261565b6000601f84116001811461432557600085156142ef5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561172e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156143745786850135825560209485019460019092019101614354565b50868210156143af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020810160068310614449577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b8082018082111561158c5761158c613f3f565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361449357614493613f3f565b5060010190565b815167ffffffffffffffff8111156144b4576144b4613ac0565b6144c8816144c2845461420e565b84614261565b602080601f83116001811461451b57600084156144e55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611dcb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561456857888601518255948401946001909101908401614549565b50858210156145a457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000813000a
Deployed Bytecode
0x6080604052600436106102695760003560e01c8063869f759411610153578063c6ab67a3116100cb578063f242432a1161007f578063f5298aca11610064578063f5298aca1461143d578063f6eb127a1461145d578063fee81cf41461147d57610269565b8063f242432a1461140a578063f2fde38b1461142a57610269565b8063e8a3d485116100b0578063e8a3d485146113c2578063e985e9c5146113d7578063f04e283e146113f757610269565b8063c6ab67a31461138f578063d7533f02146113a457610269565b80639d7f4ebf11610122578063a483011411610107578063a48301141461130c578063a9fc664e1461132c578063bd85b0391461134c57610269565b80639d7f4ebf146112a1578063a22cb465146112ec57610269565b8063869f7594146112015780638da5cb5b14611238578063938e3d7b1461126c57806395d89b411461128c57610269565b80632a55205a116101e65780634e1273f4116101b557806355f804b31161019a57806355f804b3146111c45780636c0360eb146111e4578063715018a6146111f957610269565b80634e1273f41461118f57806354d1f13d146111bc57610269565b80632a55205a146110e35780632eb2c2d61461112f578063362925c21461114f57806337da577c1461116f57610269565b8063098144d41161023d5780630d705df6116102225780630d705df61461107a5780630e89341c146110bb57806325692962146110db57610269565b8063098144d41461100e578063099b6bfa1461105a57610269565b8062fdd58e14610f4d57806301ffc9a714610f9a57806304634d8d14610fca57806306fdde0314610fec575b34801561027557600080fd5b5060003660607fffffffff0000000000000000000000000000000000000000000000000000000083351682846102ae8260048184613770565b909250905060007fffffffff0000000000000000000000000000000000000000000000000000000084167f6aba501800000000000000000000000000000000000000000000000000000000148061034657507fffffffff0000000000000000000000000000000000000000000000000000000084167fb957d0cb00000000000000000000000000000000000000000000000000000000145b8061039257507fffffffff0000000000000000000000000000000000000000000000000000000084167febb4a55f00000000000000000000000000000000000000000000000000000000145b806103de57507fffffffff0000000000000000000000000000000000000000000000000000000084167f1ecdfb8c00000000000000000000000000000000000000000000000000000000145b8061042a57507fffffffff0000000000000000000000000000000000000000000000000000000084167f7f2a5cca00000000000000000000000000000000000000000000000000000000145b8061047657507fffffffff0000000000000000000000000000000000000000000000000000000084167f8e7d1e4300000000000000000000000000000000000000000000000000000000145b806104c257507fffffffff0000000000000000000000000000000000000000000000000000000084167ff460590b00000000000000000000000000000000000000000000000000000000145b8061050e57507fffffffff0000000000000000000000000000000000000000000000000000000084167f69ec1daa00000000000000000000000000000000000000000000000000000000145b8061055a57507fffffffff0000000000000000000000000000000000000000000000000000000084167f582d424100000000000000000000000000000000000000000000000000000000145b806105a657507fffffffff0000000000000000000000000000000000000000000000000000000084167f9891976500000000000000000000000000000000000000000000000000000000145b806105f257507fffffffff0000000000000000000000000000000000000000000000000000000084167f2e778efc00000000000000000000000000000000000000000000000000000000145b8061063e57507fffffffff0000000000000000000000000000000000000000000000000000000084167fe6fd04ff00000000000000000000000000000000000000000000000000000000145b8061068a57507fffffffff0000000000000000000000000000000000000000000000000000000084167fa9236bc400000000000000000000000000000000000000000000000000000000145b806106d557507fffffffff0000000000000000000000000000000000000000000000000000000084167e378a3a00000000000000000000000000000000000000000000000000000000145b8061072157507fffffffff0000000000000000000000000000000000000000000000000000000084167f6233719600000000000000000000000000000000000000000000000000000000145b8061076d57507fffffffff0000000000000000000000000000000000000000000000000000000084167f82daf2a100000000000000000000000000000000000000000000000000000000145b806107b957507fffffffff0000000000000000000000000000000000000000000000000000000084167fd59ff1fc00000000000000000000000000000000000000000000000000000000145b8061080557507fffffffff0000000000000000000000000000000000000000000000000000000084167f94cf795e00000000000000000000000000000000000000000000000000000000145b8061085157507fffffffff0000000000000000000000000000000000000000000000000000000084167ffde6e55400000000000000000000000000000000000000000000000000000000145b8061089d57507fffffffff0000000000000000000000000000000000000000000000000000000084167f1055d70800000000000000000000000000000000000000000000000000000000145b905060007fffffffff0000000000000000000000000000000000000000000000000000000085167f6aba501800000000000000000000000000000000000000000000000000000000148061093257507fffffffff0000000000000000000000000000000000000000000000000000000085167fb957d0cb00000000000000000000000000000000000000000000000000000000145b8061097e57507fffffffff0000000000000000000000000000000000000000000000000000000085167febb4a55f00000000000000000000000000000000000000000000000000000000145b806109ca57507fffffffff0000000000000000000000000000000000000000000000000000000085167f1ecdfb8c00000000000000000000000000000000000000000000000000000000145b80610a1657507fffffffff0000000000000000000000000000000000000000000000000000000085167f7f2a5cca00000000000000000000000000000000000000000000000000000000145b80610a6257507fffffffff0000000000000000000000000000000000000000000000000000000085167f8e7d1e4300000000000000000000000000000000000000000000000000000000145b80610aae57507fffffffff0000000000000000000000000000000000000000000000000000000085167f69ec1daa00000000000000000000000000000000000000000000000000000000145b90508115610c84578015610ac957610ac46114b0565b610ba0565b7f0b9fa6f5000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610ba0576000610b226020600c8688613770565b610b2b9161379a565b60601c90503381141580610b9157503373ffffffffffffffffffffffffffffffffffffffff8216148015610b915750610b6261155e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600891909101602052604090205460ff16155b15610b9e57610b9e6114b0565b505b600954604051600091829173ffffffffffffffffffffffffffffffffffffffff90911690610bd190839036906137e2565b600060405180830381855af49150503d8060008114610c0c576040519150601f19603f3d011682016040523d82523d6000602084013e610c11565b606091505b509150915081610c2357805181602001fd5b7f676e689b000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000881601610c7657610c768686611592565b9650610f4295505050505050565b7fe3f34ec7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610da157600080610cdc85870187613814565b91509150600080600080610d59868660008181526001602090815260408083205473ffffffffffffffffffffffffffffffffffffffff9095168352600282528083205460038352818420948452939091529020549092909167ffffffffffffffff7001000000000000000000000000000000008204811692911690565b6040805160208101959095528481019390935260608401919091526080808401919091528151808403909101815260a090920190529b50610f429a5050505050505050505050565b7f0b226d32000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610df85763f4dd92ce6000526020601cf35b7fca388191000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610e81576009546040805173ffffffffffffffffffffffffffffffffffffffff90921660208301520160405160208183030381529060405295505050505050610f42565b7f51d9a6ad000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000861601610ee157610ed26114b0565b610edc84846116fd565b610f3c565b6040517f67fe1ffb0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000861660048201526024015b60405180910390fd5b50505050505b915050805190602001f35b348015610f5957600080fd5b50610f87610f68366004613814565b679a31110384e0b0c96020526014919091526000908152604090205490565b6040519081526020015b60405180910390f35b348015610fa657600080fd5b50610fba610fb5366004613840565b611735565b6040519015158152602001610f91565b348015610fd657600080fd5b50610fea610fe5366004613882565b611823565b005b348015610ff857600080fd5b50611001611896565b604051610f9191906138cc565b34801561101a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610f91565b34801561106657600080fd5b50610fea611075366004613938565b611928565b34801561108657600080fd5b50604080517f1854b2410000000000000000000000000000000000000000000000000000000081526001602082015201610f91565b3480156110c757600080fd5b506110016110d6366004613938565b6119a6565b610fea611a3a565b3480156110ef57600080fd5b506111036110fe366004613951565b611a8a565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610f91565b34801561113b57600080fd5b50610fea61114a366004613a01565b611afd565b34801561115b57600080fd5b50610fea61116a366004613bfd565b611bc4565b34801561117b57600080fd5b50610fea61118a366004613951565b611dd3565b34801561119b57600080fd5b506111af6111aa366004613c9b565b611e97565b604051610f919190613d07565b610fea611f07565b3480156111d057600080fd5b50610fea6111df366004613d4b565b611f43565b3480156111f057600080fd5b50611001611faf565b610fea611fbe565b34801561120d57600080fd5b50610f8761121c366004613938565b60009081526001602052604090205467ffffffffffffffff1690565b34801561124457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754611035565b34801561127857600080fd5b50610fea611287366004613d4b565b611fd0565b34801561129857600080fd5b50611001612017565b3480156112ad57600080fd5b50610f876112bc366004613938565b600090815260016020526040902054700100000000000000000000000000000000900467ffffffffffffffff1690565b3480156112f857600080fd5b50610fea611307366004613d8d565b612026565b34801561131857600080fd5b50610fea611327366004613951565b61207c565b34801561133857600080fd5b50610fea611347366004613dc0565b612105565b34801561135857600080fd5b50610f87611367366004613938565b60009081526001602052604090205468010000000000000000900467ffffffffffffffff1690565b34801561139b57600080fd5b50600854610f87565b3480156113b057600080fd5b506040516202a3008152602001610f91565b3480156113ce57600080fd5b50611001612119565b3480156113e357600080fd5b50610fba6113f2366004613ddd565b612128565b610fea611405366004613dc0565b612193565b34801561141657600080fd5b50610fea611425366004613e0b565b6121d0565b610fea611438366004613dc0565b6122c5565b34801561144957600080fd5b50610fea611458366004613e87565b6122ec565b34801561146957600080fd5b50610fea611478366004613ebc565b6122fd565b34801561148957600080fd5b50610f87611498366004613dc0565b63389a75e1600c908152600091909152602090205490565b60095473ffffffffffffffffffffffffffffffffffffffff16331480159061152557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561155c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60008061158c60017fa1f93c45d55294e6c2e764d95774fe71c86ec26daf62930bcecf3675030e7d9b613f6e565b92915050565b600080806115a28486018661405f565b60368101519396509194509092505060601c806115bc5750825b825160008167ffffffffffffffff8111156115d9576115d9613ac0565b604051908082528060200260200182016040528015611602578160200160208202803683370190505b50905060008267ffffffffffffffff81111561162057611620613ac0565b604051908082528060200260200182016040528015611649578160200160208202803683370190505b50905060005b838110156116d6578681815181106116695761166961410e565b6020026020010151604001518382815181106116875761168761410e565b6020026020010181815250508681815181106116a5576116a561410e565b6020026020010151606001518282815181106116c3576116c361410e565b602090810291909101015260010161164f565b506116f28483836040518060200160405280600081525061236c565b505050505050505050565b6000808061170d84860186614198565b92509250925061172e8383836040518060200160405280600081525061236c565b5050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f94189afb0000000000000000000000000000000000000000000000000000000014806117c857507fffffffff0000000000000000000000000000000000000000000000000000000082167f1be900b100000000000000000000000000000000000000000000000000000000145b8061181457507f2e778efc000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061158c575061158c826123cb565b61182b6114b0565b6118358282612540565b6040805173ffffffffffffffffffffffffffffffffffffffff841681526bffffffffffffffffffffffff831660208201527ff21fccf4d64d86d532c4e4eb86c007b6ad57a460c27d724188625e755ec6cf6d91015b60405180910390a15050565b6060600480546118a59061420e565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061420e565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b5050505050905090565b6119306114b0565b600854801561196b576040517f2858c21800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600882905560408051828152602081018490527f7c22004198bf87da0f0dab623c72e66ca1200f4454aa3b9ca30f436275428b7c910161188a565b6060600680546119b59061420e565b80601f01602080910402602001604051908101604052809291908181526020018280546119e19061420e565b8015611a2e5780601f10611a0357610100808354040283529160200191611a2e565b820191906000526020600020905b815481529060010190602001808311611a1157829003601f168201915b50505050509050919050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600082815268aa4ec00224afccfdb76020526040812054606081901c91906127109083611abe576020515490508060601c93505b606084901b18847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff829004811182023d3d3e9396930204935090915050565b611bba33731e0049783f008a0085193e00003d00cd54003c7181141502898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061259092505050565b5050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015611c0f575060005460017401000000000000000000000000000000000000000090910460ff16105b80611c415750303b158015611c41575060005474010000000000000000000000000000000000000000900460ff166001145b611ccd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610f33565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015611d5357600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611d5c82612721565b611d6886868686612785565b8015611dcb57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611ddb6114b0565b67ffffffffffffffff811115611e20576040517fb43e913700000000000000000000000000000000000000000000000000000000815260048101829052602401610f33565b60008281526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff851617905581518481529081018390527f44ecfc706d63e347851cfd40acfa6cf2e3a41faa3e8b460210c03938e84a91ad910161188a565b6060838214611eae57633b800a466000526004601cfd5b6040519050818152602081018260051b81810160405260005b818114611efc57679a31110384e0b0c98882013560601b17602090815286820135600090815260409020548483015201611ec7565b505050949350505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b611f4b6114b0565b6006611f588284836142a7565b5060408051600081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910161188a565b6060600680546118a59061420e565b611fc66129ab565b61155c60006129e1565b611fd86114b0565b6007611fe58284836142a7565b507f905d981207a7d0b6c62cc46ab0be2a076d0298e4a86d0ab79882dbd01ac37378828260405161188a9291906143c1565b6060600580546118a59061420e565b8015159050679a31110384e0b0c96020523360145281600052806034600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b6120846114b0565b8082036120cf57817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6120b6846119a6565b6040516120c391906138cc565b60405180910390a25050565b60408051838152602081018390527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910161188a565b61210d6129ab565b61211681612a47565b50565b6060600780546118a59061420e565b60007fffffffffffffffffffffffffe1ffb687c0ff75ff7ae6c1ffffc2ff32abffc38f73ffffffffffffffffffffffffffffffffffffffff83160161216f5750600161158c565b679a31110384e0b0c9602052601483905260008290526034600c20545b9392505050565b61219b6129ab565b63389a75e1600c52806000526020600c2080544211156121c357636f5e88186000526004601cfd5b60009055612116816129e1565b3073ffffffffffffffffffffffffffffffffffffffff8716036122685733731e0049783f008a0085193e00003d00cd54003c711480159061222a575061221461155e565b336000908152602091909152604090205460ff16155b15612263576040517f98d94de6000000000000000000000000000000000000000000000000000000008152336004820152602401610f33565b611dcb565b611dcb33731e0049783f008a0085193e00003d00cd54003c71811415028787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b1a92505050565b6122cd6129ab565b8060601b6122e357637448fbae6000526004601cfd5b612116816129e1565b6122f833848484612c99565b505050565b61172e338686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250612cfb92505050565b825160005b818110156123be576123b68686838151811061238f5761238f61410e565b60200260200101518684815181106123a9576123a961410e565b6020026020010151612db1565b600101612371565b5061172e85858585612f5e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f029a992c00000000000000000000000000000000000000000000000000000000148061245e57507fffffffff0000000000000000000000000000000000000000000000000000000082167fad0d7f6c00000000000000000000000000000000000000000000000000000000145b806124aa57507fffffffff0000000000000000000000000000000000000000000000000000000082167fa07d229a00000000000000000000000000000000000000000000000000000000145b806124f657507f49064906000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806125145750632a55205a60e083901c9081146301ffc9a791909114175b8061158c575061158c826301ffc9a760e09190911c90811463d9b67a26821417630e89341c9091141790565b6bffffffffffffffffffffffff16612710808211156125675763350a88b36000526004601cfd5b8260601b8061257e5763b4457eaa6000526004601cfd5b90911768aa4ec00224afccfdb7555050565b61259d8585858585613086565b81518351146125b457633b800a466000526004601cfd5b8460601b8460601b806125cf5763ea553b346000526004601cfd5b81679a31110384e0b0c91781679a31110384e0b0c917816020528960601b848114811517612613578a6000526034600c205461261357634b6e7f186000526004601cfd5b50865160051b60005b81811461268a576020810190508088015184602052818a015160005260406000208054808311156126555763f4d678b86000526004601cfd5b82900390556020849052604060002080548083018181101561267f576301336cea6000526004601cfd5b9091555061261c9050565b5050505060405160408152855160051b602001604082018181838a60045afa503d60400160208401523d81019050865160051b60200191508181838960045afa50823d8201039150508260601c8460601c337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a45050505061270c600090565b50833b15611dcb57611dcb85858585856131fe565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6000547501000000000000000000000000000000000000000000900460ff16612830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610f33565b73ffffffffffffffffffffffffffffffffffffffff831661287d576040517fa4d16ed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600161288761155e565b73ffffffffffffffffffffffffffffffffffffffff851660009081526020918252604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169415159490941790935582516001808252818501909452909290918281019080368337019050509050838160008151811061290e5761290e61410e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508061295161155e565b60010190805190602001906129679291906136d1565b507fc90c61dd7a67259711a8a4c0b50bc6130257c5ba9f2539c5050264827f3819ea6004604051612998919061440e565b60405180910390a161172e8584846132d9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754331461155c576382b429006000526004601cfd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60005473ffffffffffffffffffffffffffffffffffffffff9081169082168103612a9d576040517f4a3bb19e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821790925560408051928416835260208301919091527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910161188a565b612b578585612b3c866040805180820190915260018152602081019190915290565b60408051808201909152600181526020810187905285613086565b8460601b8460601b80612b725763ea553b346000526004601cfd5b81679a31110384e0b0c9176020528760601b828114811517612baa57886000526034600c2054612baa57634b6e7f186000526004601cfd5b50846000526040600020805480861115612bcc5763f4d678b86000526004601cfd5b8590039055679a31110384e0b0c981176020526040600020805480860181811015612bff576301336cea6000526004601cfd5b808355505050836020528060601c8260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a45050612c42600090565b15612c8557612c858585612c69866040805180820190915260018152602081019190915290565b6040805180820190915260018152602081018790525b50505050565b833b15611dcb57611dcb85858585856133e8565b6000828152600160205260409020805467ffffffffffffffff680100000000000000008083048216859003909116027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909116179055612c7f84848484613494565b815160005b81811015612da457612d9c848281518110612d1d57612d1d61410e565b6020026020010151848381518110612d3757612d3761410e565b6020026020010151600091825260016020526040909120805467ffffffffffffffff68010000000000000000808304821694909403169092027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b600101612d00565b5061172e85858585613582565b6000828152600160205260409020805467ffffffffffffffff80821691612dee91859170010000000000000000000000000000000090041661444f565b1115612e66578054612e1f908390700100000000000000000000000000000000900467ffffffffffffffff1661444f565b81546040517f60a2a42c000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff166024820152604401610f33565b805470010000000000000000000000000000000067ffffffffffffffff68010000000000000000808404821686018216027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff84168117839004821686019091169091027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9092169190911717905573ffffffffffffffffffffffffffffffffffffffff9092166000908152600260209081526040808320805486019055600382528083209383529290522080549091019055565b612f6c600085858585613086565b8151835114612f8357633b800a466000526004601cfd5b8360601b80612f9a5763ea553b346000526004601cfd5b80679a31110384e0b0c917602052835160051b60005b818114612ff35760208101905080850151818701516000526040600020805482810181811015612fe8576301336cea6000526004601cfd5b90915550612fb09050565b505060405160408152845160051b602001604082018181838960045afa503d60400160208401523d81019050855160051b60200191508181838860045afa50823d8201039150508260601c6000337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a4505050613070600090565b50833b15612c7f57612c7f6000858585856131fe565b73ffffffffffffffffffffffffffffffffffffffff8516158015906130c0575073ffffffffffffffffffffffffffffffffffffffff841615155b1561172e5760005473ffffffffffffffffffffffffffffffffffffffff168015611dcb5760005b84518110156131f5578173ffffffffffffffffffffffffffffffffffffffff16631854b2413389898986815181106131215761312161410e565b602002602001015189878151811061313b5761313b61410e565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015293851660248501529390911660448301526064820152608481019190915260a401600060405180830381600087803b1580156131ca57600080fd5b505af11580156131de573d6000803e3d6000fd5b5050505080806131ed90614462565b9150506130e7565b50505050505050565b60405163bc197c8181523360208201528560601b60601c604082015260a06060820152835160051b60200160c082018181838860045afa503d60a0018060808501523d82019150855160051b60200192508282848860045afa503d0160a0840152835160200191503d018181818660045afa50601c83013d82010391505060208282601c850160008a5af16132a2573d1561329d573d6000803e3d6000fd5b600082525b5080517fbc197c810000000000000000000000000000000000000000000000000000000014611dcb57639c05499b6000526004601cfd5b6000547501000000000000000000000000000000000000000000900460ff16613384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610f33565b6004613390838261449a565b50600561339d828261449a565b5050600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff939093169290921790915550565b60405163f23a6e6181523360208201528560601b60601c604082015283606082015282608082015260a08082015281518060c08301528015613434578060e08301826020860160045afa505b6020828260c401601c850160008a5af161345d573d15613458573d6000803e3d6000fd5b600082525b5080517ff23a6e610000000000000000000000000000000000000000000000000000000014611dcb57639c05499b6000526004601cfd5b6134e18360006134b7856040805180820190915260018152602081019190915290565b60408051808201909152600181526020810186905260405180602001604052806000815250613086565b8260601b80679a31110384e0b0c917602052808560601b148560601b151761351f57846000526034600c205461351f57634b6e7f186000526004601cfd5b8260005260406000208054808411156135405763f4d678b86000526004601cfd5b83810382555050826000528160205260008160601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a450612c7f565b61359f836000848460405180602001604052806000815250613086565b80518251146135b657633b800a466000526004601cfd5b8260601b80679a31110384e0b0c9176020528460601b8181148115176135f257856000526034600c20546135f257634b6e7f186000526004601cfd5b50825160051b60005b81811461363b57602081019050808401518186015160005260406000208054808311156136305763f4d678b86000526004601cfd5b9190910390556135fb565b505060405160408152835160051b602001604082018181838860045afa503d60400160208401523d81019050845160051b60200191508181838760045afa50823d82010391505060008360601c337f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8486a45050506136b8600090565b15612c7f57604080516020810190915260009052612c7f565b82805482825590600052602060002090810192821561374b579160200282015b8281111561374b57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906136f1565b5061375792915061375b565b5090565b5b80821115613757576000815560010161375c565b6000808585111561378057600080fd5b8386111561378d57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156137da5780818660140360031b1b83161692505b505092915050565b8183823760009101908152919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461211657600080fd5b6000806040838503121561382757600080fd5b8235613832816137f2565b946020939093013593505050565b60006020828403121561385257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461218c57600080fd5b6000806040838503121561389557600080fd5b82356138a0816137f2565b915060208301356bffffffffffffffffffffffff811681146138c157600080fd5b809150509250929050565b600060208083528351808285015260005b818110156138f9578581018301518582016040015282016138dd565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561394a57600080fd5b5035919050565b6000806040838503121561396457600080fd5b50508035926020909101359150565b60008083601f84011261398557600080fd5b50813567ffffffffffffffff81111561399d57600080fd5b6020830191508360208260051b85010111156139b857600080fd5b9250929050565b60008083601f8401126139d157600080fd5b50813567ffffffffffffffff8111156139e957600080fd5b6020830191508360208285010111156139b857600080fd5b60008060008060008060008060a0898b031215613a1d57600080fd5b8835613a28816137f2565b97506020890135613a38816137f2565b9650604089013567ffffffffffffffff80821115613a5557600080fd5b613a618c838d01613973565b909850965060608b0135915080821115613a7a57600080fd5b613a868c838d01613973565b909650945060808b0135915080821115613a9f57600080fd5b50613aac8b828c016139bf565b999c989b5096995094979396929594505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613b1257613b12613ac0565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b5f57613b5f613ac0565b604052919050565b600067ffffffffffffffff831115613b8157613b81613ac0565b613bb260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613b18565b9050828152838383011115613bc657600080fd5b828260208301376000602084830101529392505050565b600082601f830112613bee57600080fd5b61218c83833560208501613b67565b600080600080600060a08688031215613c1557600080fd5b8535613c20816137f2565b94506020860135613c30816137f2565b9350604086013567ffffffffffffffff80821115613c4d57600080fd5b613c5989838a01613bdd565b94506060880135915080821115613c6f57600080fd5b50613c7c88828901613bdd565b9250506080860135613c8d816137f2565b809150509295509295909350565b60008060008060408587031215613cb157600080fd5b843567ffffffffffffffff80821115613cc957600080fd5b613cd588838901613973565b90965094506020870135915080821115613cee57600080fd5b50613cfb87828801613973565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015613d3f57835183529284019291840191600101613d23565b50909695505050505050565b60008060208385031215613d5e57600080fd5b823567ffffffffffffffff811115613d7557600080fd5b613d81858286016139bf565b90969095509350505050565b60008060408385031215613da057600080fd5b8235613dab816137f2565b9150602083013580151581146138c157600080fd5b600060208284031215613dd257600080fd5b813561218c816137f2565b60008060408385031215613df057600080fd5b8235613dfb816137f2565b915060208301356138c1816137f2565b60008060008060008060a08789031215613e2457600080fd5b8635613e2f816137f2565b95506020870135613e3f816137f2565b94506040870135935060608701359250608087013567ffffffffffffffff811115613e6957600080fd5b613e7589828a016139bf565b979a9699509497509295939492505050565b600080600060608486031215613e9c57600080fd5b8335613ea7816137f2565b95602085013595506040909401359392505050565b600080600080600060608688031215613ed457600080fd5b8535613edf816137f2565b9450602086013567ffffffffffffffff80821115613efc57600080fd5b613f0889838a01613973565b90965094506040880135915080821115613f2157600080fd5b50613f2e88828901613973565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561158c5761158c613f3f565b600067ffffffffffffffff821115613f9b57613f9b613ac0565b5060051b60200190565b600082601f830112613fb657600080fd5b81356020613fcb613fc683613f81565b613b18565b82815260079290921b84018101918181019086841115613fea57600080fd5b8286015b8481101561405457608081890312156140075760008081fd5b61400f613aef565b81356006811061401f5760008081fd5b81528185013561402e816137f2565b818601526040828101359082015260608083013590820152835291830191608001613fee565b509695505050505050565b6000806000806080858703121561407557600080fd5b8435614080816137f2565b9350602085013567ffffffffffffffff8082111561409d57600080fd5b6140a988838901613fa5565b945060408701359150808211156140bf57600080fd5b6140cb88838901613fa5565b935060608701359150808211156140e157600080fd5b508501601f810187136140f357600080fd5b61410287823560208401613b67565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082601f83011261414e57600080fd5b8135602061415e613fc683613f81565b82815260059290921b8401810191818101908684111561417d57600080fd5b8286015b848110156140545780358352918301918301614181565b6000806000606084860312156141ad57600080fd5b83356141b8816137f2565b9250602084013567ffffffffffffffff808211156141d557600080fd5b6141e18783880161413d565b935060408601359150808211156141f757600080fd5b506142048682870161413d565b9150509250925092565b600181811c9082168061422257607f821691505b60208210810361425b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156122f857600081815260208120601f850160051c810160208610156142885750805b601f850160051c820191505b81811015611dcb57828155600101614294565b67ffffffffffffffff8311156142bf576142bf613ac0565b6142d3836142cd835461420e565b83614261565b6000601f84116001811461432557600085156142ef5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561172e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156143745786850135825560209485019460019092019101614354565b50868210156143af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020810160068310614449577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b8082018082111561158c5761158c613f3f565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361449357614493613f3f565b5060010190565b815167ffffffffffffffff8111156144b4576144b4613ac0565b6144c8816144c2845461420e565b84614261565b602080601f83116001811461451b57600084156144e55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611dcb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561456857888601518255948401946001909101908401614549565b50858210156145a457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000813000a
Deployed Bytecode Sourcemap
624:2046:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;624:2046:12;;3369:19:13;3456:7;;;;624:2046:12;;3556:12:13;624:2046:12;3565:1:13;624:2046:12;;3556:12:13;:::i;:::-;3534:34;;-1:-1:-1;3534:34:13;-1:-1:-1;3692:30:13;3725:67;;;3749:43;3725:67;;:131;;-1:-1:-1;3808:48:13;;;3820:36;3808:48;3725:131;:197;;;-1:-1:-1;3872:50:13;;;3884:38;3872:50;3725:197;:268;;;-1:-1:-1;3938:55:13;;;3950:43;3938:55;3725:268;:330;;;-1:-1:-1;4009:46:13;;;4021:34;4009:46;3725:330;:406;;;-1:-1:-1;4071:60:13;;;4083:48;4071:60;3725:406;:469;;;-1:-1:-1;4147:47:13;;;4159:35;4147:47;3725:469;:538;;;-1:-1:-1;4210:53:13;;;4222:41;4210:53;3725:538;:612;;;-1:-1:-1;4279:58:13;;;4291:46;4279:58;3725:612;:687;;;-1:-1:-1;4353:59:13;;;4365:47;4353:59;3725:687;:767;;;-1:-1:-1;4428:64:13;;;4440:52;4428:64;3725:767;:833;;;-1:-1:-1;4508:50:13;;;4520:38;4508:50;3725:833;:906;;;-1:-1:-1;4574:57:13;;;4586:45;4574:57;3725:906;:974;;;-1:-1:-1;4647:52:13;;;4659:40;4647:52;3725:974;:1042;;;-1:-1:-1;4715:52:13;;;4727:40;4715:52;3725:1042;:1115;;;-1:-1:-1;4783:57:13;;;4795:45;4783:57;3725:1115;:1189;;;-1:-1:-1;4856:58:13;;;4868:46;4856:58;3725:1189;:1250;;;-1:-1:-1;4930:45:13;;;4942:33;4930:45;3725:1250;:1316;;;-1:-1:-1;4991:50:13;;;5003:38;4991:50;3725:1316;:1376;;;-1:-1:-1;5057:44:13;;;5069:32;5057:44;3725:1376;3692:1409;-1:-1:-1;5192:33:13;5228:67;;;5252:43;5228:67;;:131;;-1:-1:-1;5311:48:13;;;5323:36;5311:48;5228:131;:197;;;-1:-1:-1;5375:50:13;;;5387:38;5375:50;5228:197;:268;;;-1:-1:-1;5441:55:13;;;5453:43;5441:55;5228:268;:330;;;-1:-1:-1;5512:46:13;;;5524:34;5512:46;5228:330;:406;;;-1:-1:-1;5574:60:13;;;5586:48;5574:60;5228:406;:475;;;-1:-1:-1;5650:53:13;;;5662:41;5650:53;5228:475;5192:511;;5718:25;5714:3381;;;5871:28;5867:804;;;5919:24;:22;:24::i;:::-;5867:804;;;5968:47;;;;;5964:707;;6151:14;6184:11;6192:2;6189;6184:4;;:11;:::i;:::-;6176:20;;;:::i;:::-;6168:29;;;-1:-1:-1;6351:10:13;:20;;;;:222;;-1:-1:-1;6396:10:13;:20;;;;:176;;;;;6445:74;:72;:74::i;:::-;:127;;;;;;;:119;;;;;:127;;;;;;;;6444:128;6396:176;6326:331;;;6614:24;:22;:24::i;:::-;6017:654;5964:707;6793:11;;:51;;6750:12;;;;6793:11;;;;;:51;;6750:12;;6835:8;;6793:51;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6749:95;;;;6917:7;6912:193;;7059:12;7053:19;7038:12;7034:2;7030:21;7023:50;6912:193;7189:59;;;;;7185:114;;7268:16;7279:4;;7268:10;:16::i;:::-;7375:12;-1:-1:-1;7368:19:13;;-1:-1:-1;;;;;;7368:19:13;5714:3381;7408:49;;;;;7404:1691;;7518:14;;7553:82;;;;7581:4;7553:82;:::i;:::-;7517:118;;;;7703:23;7744:33;7795:29;7842:17;7876:30;7890:6;7898:7;9787:23;10036:21;;;:12;:21;;;;;;;;10129:23;10223:26;;;;;;:18;:26;;;;;;10287;:34;;;;;:43;;;;;;;;;;10223:26;;10287:43;;10129:23;;;;;;;10174:21;;;9649:688;7876:30;7983:186;;;;;;1737:25:28;;;;1778:18;;;1771:34;;;;1821:18;;;1814:34;;;;1864:18;;;;1857:34;;;;7983:186:13;;;;;;;;;;1709:19:28;;;;7983:186:13;;;-1:-1:-1;7960:209:13;;-1:-1:-1;;;;;;;;;;;7960:209:13;7404:1691;8190:57;;;;;8186:909;;8465:10;8462:1;8455:21;8506:2;8500:4;8493:16;8186:909;8543:45;;;;;8539:556;;8669:11;;8658:23;;;8669:11;;;;8658:23;;;2048:74:28;2021:18;8658:23:13;;;;;;;;;;;;8651:30;;;;;;;;;8539:556;8702:55;;;;;8698:397;;8848:24;:22;:24::i;:::-;8919:25;8939:4;;8919:19;:25::i;:::-;8698:397;;;9047:37;;;;;2307:66:28;2295:79;;9047:37:13;;;2277:98:28;2250:18;;9047:37:13;;;;;;;;8698:397;3390:5711;;;;;3326:5775;;;;624:2046:12;;;;;;5602:334:9;;;;;;;;;;-1:-1:-1;5602:334:9;;;;;:::i;:::-;5782:25;5776:4;5769:39;5828:4;5821:19;;;;5677:14;5853:16;;;5914:4;5898:21;;5892:28;;5602:334;;;;2860:25:28;;;2848:2;2833:18;5602:334:9;;;;;;;;11627:742:13;;;;;;;;;;-1:-1:-1;11627:742:13;;;;;:::i;:::-;;:::i;:::-;;;3398:14:28;;3391:22;3373:41;;3361:2;3346:18;11627:742:13;3233:187:28;7533:496:11;;;;;;;;;;-1:-1:-1;7533:496:11;;;;;:::i;:::-;;:::i;:::-;;8097:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;689:106:27:-;;;;;;;;;;-1:-1:-1;744:7:27;770:18;;;689:106;;;2078:42:28;2066:55;;;2048:74;;2036:2;2021:18;689:106:27;1902:226:28;6585:699:11;;;;;;;;;;-1:-1:-1;6585:699:11;;;;;:::i;:::-;;:::i;10290:255::-;;;;;;;;;;-1:-1:-1;10290:255:11;;;10459:48;4836:98:28;;10534:4:11;4965:2:28;4950:18;;4943:50;4809:18;10290:255:11;4670:329:28;10039:167:11;;;;;;;;;;-1:-1:-1;10039:167:11;;;;;:::i;:::-;;:::i;6821:616:8:-;;;:::i;3179:1058:10:-;;;;;;;;;;-1:-1:-1;3179:1058:10;;;;;:::i;:::-;;:::i;:::-;;;;5646:42:28;5634:55;;;5616:74;;5721:2;5706:18;;5699:34;;;;5589:18;3179:1058:10;5442:297:28;668:272:20;;;;;;;;;;-1:-1:-1;668:272:20;;;;;:::i;:::-;;:::i;1206:509:12:-;;;;;;;;;;-1:-1:-1;1206:509:12;;;;;:::i;:::-;;:::i;5437:652:11:-;;;;;;;;;;-1:-1:-1;5437:652:11;;;;;:::i;:::-;;:::i;18335:1039:9:-;;;;;;;;;;-1:-1:-1;18335:1039:9;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7519:456:8:-;;;:::i;3611:342:11:-;;;;;;;;;;-1:-1:-1;3611:342:11;;;;;:::i;:::-;;:::i;8415:98::-;;;;;;;;;;;;;:::i;6562:100:8:-;;;:::i;8786:123:11:-;;;;;;;;;;-1:-1:-1;8786:123:11;;;;;:::i;:::-;8845:7;8871:21;;;:12;:21;;;;;:31;;;;8786:123;9207:191:8;;;;;;;;;;-1:-1:-1;9361:20:8;9355:27;9207:191;;4093:355:11;;;;;;;;;;-1:-1:-1;4093:355:11;;;;;:::i;:::-;;:::i;8250:87::-;;;;;;;;;;;;;:::i;9192:127::-;;;;;;;;;;-1:-1:-1;9192:127:11;;;;;:::i;:::-;9253:7;9279:21;;;:12;:21;;;;;:33;;;;;;;9192:127;6552:720:9;;;;;;;;;;-1:-1:-1;6552:720:9;;;;;:::i;:::-;;:::i;4687:539:11:-;;;;;;;;;;-1:-1:-1;4687:539:11;;;;;:::i;:::-;;:::i;10644:166::-;;;;;;;;;;-1:-1:-1;10644:166:11;;;;;:::i;:::-;;:::i;8987:127::-;;;;;;;;;;-1:-1:-1;8987:127:11;;;;;:::i;:::-;9048:7;9074:21;;;:12;:21;;;;;:33;;;;;;;8987:127;9567:106;;;;;;;;;;-1:-1:-1;9651:15:11;;9567:106;;10027:107:8;;;;;;;;;;-1:-1:-1;10027:107:8;;10118:9;13147:50:28;;13135:2;13120:18;10027:107:8;13003:200:28;8598:106:11;;;;;;;;;;;;;:::i;946:237:20:-;;;;;;;;;;-1:-1:-1;946:237:20;;;;;:::i;:::-;;:::i;8162:708:8:-;;;;;;:::i;:::-;;:::i;10770::13:-;;;;;;;;;;-1:-1:-1;10770:708:13;;;;;:::i;:::-;;:::i;6148:349:8:-;;;;;;:::i;:::-;;:::i;2000:144:12:-;;;;;;;;;;-1:-1:-1;2000:144:12;;;;;:::i;:::-;;:::i;2457:211::-;;;;;;;;;;-1:-1:-1;2457:211:12;;;;;:::i;:::-;;:::i;9501:435:8:-;;;;;;;;;;-1:-1:-1;9501:435:8;;;;;:::i;:::-;9771:19;9765:4;9758:33;;;9620:14;9804:26;;;;9914:4;9898:21;;9892:28;;9501:435;2474:166:11;2550:11;;;;2536:10;:25;;;;:50;;-1:-1:-1;9361:20:8;9355:27;2565:21:11;;:10;:21;;;;2536:50;2532:102;;;2609:14;;;;;;;;;;;;;;2532:102;2474:166::o;1727:159:21:-;1768:16;;1607:103;1709:1;1632:60;1607:103;:::i;:::-;1586:134;1727:159;-1:-1:-1;;1727:159:21:o;12573:1345:13:-;12720:17;;;12846:60;;;;12857:4;12846:60;:::i;:::-;13140:27;;;13134:34;12706:200;;-1:-1:-1;12706:200:13;;-1:-1:-1;12706:200:13;;-1:-1:-1;;13130:2:13;13126:43;;13260:69;;-1:-1:-1;13309:9:13;13260:69;13416:22;;13384:29;13416:22;13476:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13476:36:13;;13448:64;;13522:27;13566:21;13552:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13552:36:13;;13522:66;;13603:9;13598:231;13622:21;13618:1;:25;13598:231;;;13675:15;13691:1;13675:18;;;;;;;;:::i;:::-;;;;;;;:29;;;13661:8;13670:1;13661:11;;;;;;;;:::i;:::-;;;;;;:43;;;;;13734:15;13750:1;13734:18;;;;;;;;:::i;:::-;;;;;;;:25;;;13718:10;13729:1;13718:13;;;;;;;;:::i;:::-;;;;;;;;;;:41;13801:3;;13598:231;;;;13867:44;13878:6;13886:8;13896:10;13867:44;;;;;;;;;;;;:10;:44::i;:::-;12623:1295;;;;;;;12573:1345;;:::o;14143:333::-;14258:17;;;14365:49;;;;14376:4;14365:49;:::i;:::-;14244:170;;;;;;14425:44;14436:9;14447:8;14457:7;14425:44;;;;;;;;;;;;:10;:44::i;:::-;14202:274;;;14143:333;;:::o;11627:742::-;11800:4;11839:48;;;11854:33;11839:48;;:121;;-1:-1:-1;11903:57:13;;;11918:42;11903:57;11839:121;:162;;;-1:-1:-1;11976:25:13;;;;;11839:162;:523;;;;12299:63;12350:11;12299:50;:63::i;7533:496:11:-;7689:24;:22;:24::i;:::-;7872:42;7891:8;7901:12;7872:18;:42::i;:::-;7980;;;20651::28;20639:55;;20621:74;;20743:26;20731:39;;20726:2;20711:18;;20704:67;7980:42:11;;20594:18:28;7980:42:11;;;;;;;;7533:496;;:::o;8097:83::-;8136:13;8168:5;8161:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8097:83;:::o;6585:699::-;6729:24;:22;:24::i;:::-;6870:15;;6963:31;;6959:116;;7017:47;;;;;;;;;;;;;;6959:116;7125:15;:35;;;7218:59;;;21398:25:28;;;21454:2;21439:18;;21432:34;;;7218:59:11;;21371:18:28;7218:59:11;21224:248:28;10039:167:11;10127:13;10191:8;10184:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:167;;;:::o;6821:616:8:-;6914:15;10118:9;6932:45;;:15;:45;6914:63;;7145:19;7139:4;7132:33;7195:8;7189:4;7182:22;7251:7;7244:4;7238;7228:21;7221:38;7398:8;7351:45;7348:1;7345;7340:67;7047:374;6821:616::o;3179:1058:10:-;3297:16;3470:21;;;3517:25;3511:4;3504:39;3592:4;3576:21;;3570:28;3627:2;3623:15;;;;3297:16;2531:5;;3623:15;3651:124;;3711:4;3705:11;3699:18;3689:28;;3754:6;3750:2;3746:15;3734:27;;3651:124;3844:2;3840:17;;;3828:30;3797:9;4148:6;4144:14;;;4138:21;;4131:29;;4113:16;4095;4080:81;3179:1058;;4195:9;;4191:30;;-1:-1:-1;3179:1058:10;;-1:-1:-1;;3179:1058:10:o;668:272:20:-;878:55;1397:8;1385;1372:22;;1365:30;1361:45;904:4;910:2;914:3;;878:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;878:55:20;;;;;;;;;;;;;;;;;;;;-1:-1:-1;919:7:20;;-1:-1:-1;919:7:20;;;;878:55;;;919:7;;878:55;919:7;878:55;;;;;;;;;-1:-1:-1;;878:55:20;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;928:4:20;;-1:-1:-1;928:4:20;;;;878:55;;928:4;;;;878:55;;;;;;;;;-1:-1:-1;878:18:20;;-1:-1:-1;;;878:55:20:i;:::-;668:272;;;;;;;;:::o;1206:509:12:-;3280:19:0;3303:13;;;;;;3302:14;;3348:34;;;;-1:-1:-1;3366:12:0;;3381:1;3366:12;;;;;;:16;3348:34;3347:93;;;-1:-1:-1;3396:4:0;3388:25;:30;:51;;;;-1:-1:-1;3422:12:0;;;;;;;3438:1;3422:17;3388:51;3326:186;;;;;;;21679:2:28;3326:186:0;;;21661:21:28;21718:2;21698:18;;;21691:30;21757:34;21737:18;;;21730:62;21828:16;21808:18;;;21801:44;21862:19;;3326:186:0;21477:410:28;3326:186:0;3522:12;:16;;;;;;;;3548:65;;;;3582:13;:20;;;;;;;;3548:65;1451:30:12::1;1468:12;1451:16;:30::i;:::-;1554:154;1613:17;1644:14;1672:5;1691:7;1554:45;:154::i;:::-;3637:14:0::0;3633:99;;;3683:5;3667:21;;;;;;3707:14;;-1:-1:-1;22044:36:28;;3707:14:0;;22032:2:28;22017:18;3707:14:0;;;;;;;3633:99;3270:468;1206:509:12;;;;;:::o;5437:652:11:-;5588:24;:22;:24::i;:::-;5798:11;5783:12;:26;5779:107;;;5832:43;;;;;;;;2860:25:28;;;2833:18;;5832:43:11;2714:177:28;5779:107:11;5931:21;;;;:12;:21;;;;;;;;;:54;;;;;;;;;;6043:39;;21398:25:28;;;21439:18;;;21432:34;;;6043:39:11;;21371:18:28;6043:39:11;21224:248:28;18335:1039:9;18471:25;18603:13;18591:10;18588:29;18578:161;;18650:10;18644:4;18637:24;18720:4;18714;18707:18;18578:161;18770:4;18764:11;18752:23;;18805:10;18795:8;18788:28;18852:4;18842:8;18838:19;18888:10;18885:1;18881:18;18934:1;18929:3;18925:11;18919:4;18912:25;19030:1;19015:343;19047:3;19044:1;19041:10;19015:343;;19174:25;19119:21;;;19106:35;19205:2;19201:14;19171:45;19165:4;19158:59;;;19260:18;;;19247:32;19241:4;19234:46;;;19337:4;19321:21;;19315:28;19304:9;;;19297:47;19060:12;19015:343;;;19019:14;;;18335:1039;;;;;;:::o;7519:456:8:-;7721:19;7715:4;7708:33;7767:8;7761:4;7754:22;7819:1;7812:4;7806;7796:21;7789:32;7950:8;7904:44;7901:1;7898;7893:66;7519:456::o;3611:342:11:-;3758:24;:22;:24::i;:::-;3826:8;:21;3837:10;;3826:8;:21;:::i;:::-;-1:-1:-1;3905:41:11;;;3925:1;21398:25:28;;3928:17:11;21454:2:28;21439:18;;21432:34;3905:41:11;;21371:18:28;3905:41:11;21224:248:28;8415:98:11;8466:13;8498:8;8491:15;;;;;:::i;6562:100:8:-;10523:13;:11;:13::i;:::-;6634:21:::1;6652:1;6634:9;:21::i;4093:355:11:-:0;4248:24;:22;:24::i;:::-;4320:12;:29;4335:14;;4320:12;:29;:::i;:::-;;4407:34;4426:14;;4407:34;;;;;;;:::i;8250:87::-;8291:13;8323:7;8316:14;;;;;:::i;6552:720:9:-;6767:10;6760:18;6753:26;6739:40;;6876:25;6870:4;6863:39;6928:8;6922:4;6915:22;6963:8;6957:4;6950:22;7015:10;7008:4;7002;6992:21;6985:41;7100:10;7094:4;7087:24;7245:8;7241:2;7237:17;7233:2;7229:26;7219:8;7184:33;7178:4;7172;7167:89;6552:720;;:::o;4687:539:11:-;4872:24;:22;:24::i;:::-;4968:9;4953:11;:24;4949:271;;5118:11;5096:34;5100:16;5104:11;5100:3;:16::i;:::-;5096:34;;;;;;:::i;:::-;;;;;;;;4687:539;;:::o;4949:271::-;5166:43;;;21398:25:28;;;21454:2;21439:18;;21432:34;;;5166:43:11;;21371:18:28;5166:43:11;21224:248:28;10644:166:11;10523:13:8;:11;:13::i;:::-;10768:35:11::1;10790:12;10768:21;:35::i;:::-;10644:166:::0;:::o;8598:106::-;8653:13;8685:12;8678:19;;;;;:::i;946:237:20:-;1065:4;1085:20;;;;;1081:37;;-1:-1:-1;1114:4:20;1107:11;;1081:37;6253:25:9;6247:4;6240:39;6299:4;6292:19;;;6147:11;6324:22;;;6391:4;-1:-1:-1;6375:21:9;6369:28;1135:41:20;1128:48;946:237;-1:-1:-1;;;946:237:20:o;8162:708:8:-;10523:13;:11;:13::i;:::-;8396:19:::1;8390:4;8383:33;8442:12;8436:4;8429:26;8504:4;8498;8488:21;8610:12;8604:19;8591:11;8588:36;8585:157;;;8656:10;8650:4;8643:24;8723:4;8717;8710:18;8585:157;8819:1;8798:23:::0;;8840::::1;8850:12:::0;8840:9:::1;:23::i;10770:708:13:-:0;10971:4;10955:21;;;;10951:454;;11123:10;377:42:20;11123:22:13;;;;:154;;;11166:45;:43;:45::i;:::-;11249:10;11166:61;:111;;;;;;;;;;;;;;11165:112;11123:154;11102:273;;;11317:43;;;;;11349:10;11317:43;;;2048:74:28;2021:18;;11317:43:13;1902:226:28;11102:273:13;11388:7;;10951:454;11415:56;1397:8:20;1385;1372:22;;1365:30;1361:45;11444:4:13;11450:2;11454;11458:6;11466:4;;11415:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11415:21:13;;-1:-1:-1;;;11415:56:13:i;6148:349:8:-;10523:13;:11;:13::i;:::-;6320:8:::1;6316:2;6312:17;6302:150;;6362:10;6356:4;6349:24;6433:4;6427;6420:18;6302:150;6471:19;6481:8;6471:9;:19::i;2000:144:12:-:0;2102:35;2108:10;2120:4;2126:2;2130:6;2102:5;:35::i;:::-;2000:144;;;:::o;2457:211::-;2619:42;2630:10;2642:4;2648:3;;2619:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2619:42:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2653:7:12;;-1:-1:-1;2653:7:12;;;;2619:42;;;2653:7;;2619:42;2653:7;2619:42;;;;;;;;;-1:-1:-1;2619:10:12;;-1:-1:-1;;;2619:42:12:i;13563:532:11:-;13811:10;;13791:17;13832:204;13856:9;13852:1;:13;13832:204;;;13921:44;13942:2;13946:3;13950:1;13946:6;;;;;;;;:::i;:::-;;;;;;;13954:7;13962:1;13954:10;;;;;;;;:::i;:::-;;;;;;;13921:20;:44::i;:::-;14008:3;;13832:204;;;;14046:42;14065:2;14069:3;14074:7;14083:4;14046:18;:42::i;12084:637::-;12201:4;12236:57;;;12251:42;12236:57;;:119;;-1:-1:-1;12309:46:11;;;12324:31;12309:46;12236:119;:187;;;-1:-1:-1;12371:52:11;;;12386:37;12371:52;12236:187;:228;;;-1:-1:-1;12439:25:11;;;;;12236:228;:311;;;-1:-1:-1;3054:10:10;2930:3;2926:21;;;3048:17;;;3035:10;3029:17;;;;3026:40;12509:38:11;12236:478;;;;12676:38;12702:11;19901:10:9;19761:3;19757:21;;;;19895:17;;;19920:10;19914:17;;19892:40;19940:10;19934:17;;;19889:63;;19583:385;4464:715:10;4558:42;4692:32;2531:5;4740:32;;;4737:151;;;4804:10;4798:4;4791:24;4869:4;4863;4856:18;4737:151;4923:8;4919:2;4915:17;4955:6;4945:146;;4994:10;4988:4;4981:24;5072:4;5066;5059:18;4945:146;5138:24;;;5111:25;5104:59;-1:-1:-1;;4464:715:10:o;37158:4084:9:-;37417:50;37438:4;37444:2;37448:3;37453:7;37462:4;37417:20;:50::i;:::-;37584:7;37578:14;37572:3;37566:10;37563:30;37553:162;;37626:10;37620:4;37613:24;37696:4;37690;37683:18;37553:162;37749:4;37745:2;37741:13;37786:2;37782;37778:11;37863:3;37853:136;;37899:10;37893:4;37886:24;37970:4;37964;37957:18;37853:136;38052:5;38025:25;38022:36;38119:3;38092:25;38089:34;38149:12;38143:4;38136:26;38342:2;38338;38334:11;38392:5;38387:3;38384:14;38378:3;38371:11;38368:31;38358:279;;38432:2;38426:4;38419:16;38484:4;38478;38468:21;38462:28;38452:171;;38527:10;38521:4;38514:24;38600:4;38594;38587:18;38452:171;38358:279;38759:3;38753:10;38750:1;38746:18;38796:1;38781:1454;38813:3;38810:1;38807:10;38781:1454;;38856:4;38853:1;38849:12;38844:17;;38915:1;38906:7;38902:15;38896:22;39051:12;39045:4;39038:26;39117:1;39112:3;39108:11;39102:18;39096:4;39089:32;39185:4;39179;39169:21;39240:15;39234:22;39295:11;39287:6;39284:23;39281:182;;;39351:10;39345:4;39338:24;39432:4;39426;39419:18;39281:182;39512:24;;;39488:49;;39684:4;39677:24;;;39763:4;39757;39747:21;39816:20;;39883:28;;;39939:35;;;39936:197;;;40018:10;40012:4;40005:24;40102:4;40096;40089:18;39936:197;40158:37;;;-1:-1:-1;38781:1454:9;;-1:-1:-1;38781:1454:9;;38785:14;;38717:1532;;40340:4;40334:11;40407:4;40404:1;40397:15;40461:3;40455:10;40452:1;40448:18;40442:4;40438:29;40500:4;40497:1;40493:12;40558:1;40555;40552;40547:3;40544:1;40537:5;40526:34;40522:39;40648:16;40642:4;40638:27;40631:4;40628:1;40624:12;40617:49;40695:16;40692:1;40688:24;40683:29;;40757:7;40751:14;40748:1;40744:22;40738:4;40734:33;40729:38;;40824:1;40821;40818;40809:7;40806:1;40799:5;40788:38;40784:43;40879:1;40860:16;40857:1;40853:24;40849:32;40844:37;;;41008:3;41004:2;41000:12;40992:5;40988:2;40984:14;40974:8;40941:31;40938:1;40935;40930:83;;;40307:720;;41050:24;42491:4;42426:100;;41050:24;41046:104;43954:14;;41159:76;;;41177:58;41206:4;41212:2;41216:3;41221:7;41230:4;41177:28;:58::i;4351:448:8:-;4540:26;;4622:20;4615:38;;;4540:26;4771:1;4731:38;4771:1;;4720:63;4351:448;:::o;2072:1135:13:-;5360:13:0;;;;;;;5352:69;;;;;;;25498:2:28;5352:69:0;;;25480:21:28;25537:2;25517:18;;;25510:30;25576:34;25556:18;;;25549:62;25647:13;25627:18;;;25620:41;25678:19;;5352:69:0;25296:407:28;5352:69:0;2367:28:13::1;::::0;::::1;2363:101;;2418:35;;;;;;;;;;;;;;2363:101;2575:4;2473:45;:43;:45::i;:::-;:99;::::0;::::1;:61;:99:::0;;;::::1;::::0;;;;;;;:106;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;2682:16;;-1:-1:-1;2682:16:13;;;;;::::1;::::0;;;2473:61;;2682:16;;;;::::1;::::0;2473:99;2682:16:::1;::::0;::::1;;::::0;-1:-1:-1;2682:16:13::1;2638:60;;2738:14;2708:24;2733:1;2708:27;;;;;;;;:::i;:::-;;;;;;:44;;;;;;;;;::::0;::::1;2862:24;2762:58;:56;:58::i;:::-;:97;;:124;;;;;;;;;;;;:::i;:::-;;2959:54;2980:32;2959:54;;;;;;:::i;:::-;;;;;;;;3080:120;3133:17;3164:5;3183:7;3080:39;:120::i;5424:364:8:-:0;5636:20;5630:27;5620:8;5617:41;5607:165;;5691:10;5685:4;5678:24;5753:4;5747;5740:18;4871:495;5018:20;5247:16;;5103:26;;;;;;;5207:38;5204:1;;5196:78;5323:27;4871:495::o;925:328:27:-;997:20;1020:18;;;;;;1052:28;;;;1048:89;;1103:23;;;;;;;;;;;;;;1048:89;1146:18;:33;;;;;;;;;;;;;;1194:52;;;26374:15:28;;;26356:34;;26421:2;26406:18;;26399:43;;;;1194:52:27;;26268:18:28;1194:52:27;26121:327:28;33522:2706:9;33756:66;33777:4;33783:2;33787:11;33795:2;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;;47979:11;47861:260;33787:11;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;33817:4;33756:20;:66::i;:::-;33929:4;33925:2;33921:13;33966:2;33962;33958:11;34043:3;34033:136;;34079:10;34073:4;34066:24;34150:4;34144;34137:18;34033:136;34225:5;34198:25;34195:36;34189:4;34182:50;34412:2;34408;34404:11;34462:5;34457:3;34454:14;34448:3;34441:11;34438:31;34428:279;;34502:2;34496:4;34489:16;34554:4;34548;34538:21;34532:28;34522:171;;34597:10;34591:4;34584:24;34670:4;34664;34657:18;34522:171;34428:279;34816:2;34810:4;34803:16;34875:4;34869;34859:21;34922:15;34916:22;34969:11;34961:6;34958:23;34955:158;;;35017:10;35011:4;35004:24;35090:4;35084;35077:18;34955:158;35154:24;;;35130:49;;35303:25;35300:34;;35294:4;35287:48;35389:4;35383;35373:21;35434:20;;35493:28;;;35541:35;;;35538:173;;;35612:10;35606:4;35599:24;35688:4;35682;35675:18;35538:173;35750:14;35735:13;35728:37;;;;35851:6;35845:4;35838:20;35999:3;35995:2;35991:12;35983:5;35979:2;35975:14;35965:8;35931:32;35925:4;35919;35914:90;;;36027:24;42491:4;42426:100;;36027:24;36023:120;;;36067:65;36087:4;36093:2;36097:11;36105:2;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;;47979:11;47861:260;36097:11;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;36110:15;14202:274:13;;14143:333;;;36067:65:9;43954:14;;36152:69;;;36170:51;36194:4;36200:2;36204;36208:6;36216:4;36170:23;:51::i;14367:257:11:-;15549:31;15583:16;;;:12;:16;;;;;15669:41;;;;;;;;;;;;;;;;;;;;;;;14582:35;14596:2;14600:4;14606:2;14610:6;14582:13;:35::i;14908:518::-;15151:10;;15131:17;15172:195;15196:9;15192:1;:13;15172:195;;;15257:39;15277:3;15281:1;15277:6;;;;;;;;:::i;:::-;;;;;;;15285:7;15293:1;15285:10;;;;;;;;:::i;:::-;;;;;;;15549:31;15583:16;;;:12;:16;;;;;;15669:41;;;;;;;;;;;;;;;;;;;;;;;;;;;15432:295;15257:39;15339:3;;15172:195;;;;15377:42;15396:2;15400:4;15406:3;15411:7;15377:18;:42::i;16102:920::-;16262:31;16296:16;;;:12;:16;;;;;16362:21;;;;;;;16327:32;;16353:6;;16327:23;;;;:32;:::i;:::-;:56;16323:217;;;16444:23;;:32;;16470:6;;16444:23;;;;;:32;:::i;:::-;16494:21;;16406:123;;;;;;;;26756:25:28;;;;16494:21:11;;26797:18:28;;;26790:59;26729:18;;16406:123:11;26583:272:28;16323:217:11;16699:41;;16754;16699;;;;;;;;;;;;;;;;;16754;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:22;;;;16699:23;16857:22;;;:18;:22;;;;;;;;:32;;;;;;16961:26;:30;;;;;:34;;;;;;;:44;;;;;;;16102:920::o;22539:2784:9:-;22748:56;22777:1;22781:2;22785:3;22790:7;22799:4;22748:20;:56::i;:::-;22921:7;22915:14;22909:3;22903:10;22900:30;22890:162;;22963:10;22957:4;22950:24;23033:4;23027;23020:18;22890:162;23084:2;23080;23076:11;23161:3;23151:136;;23197:10;23191:4;23184:24;23268:4;23262;23255:18;23151:136;23428:3;23401:25;23398:34;23392:4;23385:48;23474:3;23468:10;23465:1;23461:18;23511:1;23496:821;23528:3;23525:1;23522:10;23496:821;;23571:4;23568:1;23564:12;23559:17;;23630:1;23621:7;23617:15;23611:22;23779:1;23774:3;23770:11;23764:18;23758:4;23751:32;23845:4;23839;23829:21;23904:13;23898:20;23986:6;23969:15;23965:28;24040:15;24024:14;24021:35;24018:197;;;24100:10;24094:4;24087:24;24184:4;24178;24171:18;24018:197;24240:37;;;-1:-1:-1;23496:821:9;;-1:-1:-1;23496:821:9;;23500:14;;24422:4;24416:11;24489:4;24486:1;24479:15;24543:3;24537:10;24534:1;24530:18;24524:4;24520:29;24582:4;24579:1;24575:12;24640:1;24637;24634;24629:3;24626:1;24619:5;24608:34;24604:39;24730:16;24724:4;24720:27;24713:4;24710:1;24706:12;24699:49;24777:16;24774:1;24770:24;24765:29;;24839:7;24833:14;24830:1;24826:22;24820:4;24816:33;24811:38;;24906:1;24903;24900;24891:7;24888:1;24881:5;24870:38;24866:43;24961:1;24942:16;24939:1;24935:24;24931:32;24926:37;;;25077:3;25073:2;25069:12;25066:1;25056:8;25023:31;25020:1;25017;25012:70;;;24389:707;25119:24;42491:4;42426:100;;25119:24;25115:110;43954:14;;25234:82;;;25252:64;25289:1;25293:2;25297:3;25302:7;25311:4;25252:28;:64::i;11139:796:11:-;11354:18;;;;;;;:38;;-1:-1:-1;11376:16:11;;;;;11354:38;11350:579;;;11466:25;11494:18;;;11530:31;;11526:393;;11586:9;11581:324;11605:3;:10;11601:1;:14;11581:324;;;11667:17;11644:58;;;11728:10;11764:4;11794:2;11822:3;11826:1;11822:6;;;;;;;;:::i;:::-;;;;;;;11854:7;11862:1;11854:10;;;;;;;;:::i;:::-;;;;;;;;;;;11644:242;;;;;;;;;;27129:42:28;27198:15;;;11644:242:11;;;27180:34:28;27250:15;;;27230:18;;;27223:43;27302:15;;;;27282:18;;;27275:43;27334:18;;;27327:34;27377:19;;;27370:35;;;;27091:19;;11644:242:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11617:3;;;;;:::i;:::-;;;;11581:324;;;;11394:535;11139:796;;;;;:::o;45811:1984:9:-;46124:4;46118:11;46236:10;46233:1;46226:21;46281:8;46274:4;46271:1;46267:12;46260:30;46340:4;46336:2;46332:13;46328:2;46324:22;46317:4;46314:1;46310:12;46303:44;46412:4;46405;46402:1;46398:12;46391:26;46462:3;46456:10;46453:1;46449:18;46443:4;46439:29;46497:4;46494:1;46490:12;46551:1;46548;46545;46540:3;46537:1;46530:5;46519:34;46515:39;46621:16;46615:4;46611:27;46672:1;46665:4;46662:1;46658:12;46651:23;46699:16;46696:1;46692:24;46687:29;;46757:7;46751:14;46748:1;46744:22;46738:4;46734:33;46729:38;;46820:1;46817;46814;46805:7;46802:1;46795:5;46784:38;-1:-1:-1;46896:16:9;46889:24;46882:4;46875:12;;46868:46;46984:11;;46978:4;46974:22;;-1:-1:-1;46939:16:9;46932:24;46974:22;46932:24;46974:22;46990:4;47031:1;47024:5;47013:35;47009:40;47104:4;47101:1;47097:12;47078:16;47075:1;47071:24;47067:43;47062:48;;;47215:4;47212:1;47209;47202:4;47199:1;47195:12;47192:1;47188:2;47181:5;47176:44;47166:337;;47243:16;47240:220;;;47374:16;47368:4;47362;47347:44;47425:16;47419:4;47412:30;47240:220;47487:1;47484;47477:12;47166:337;-1:-1:-1;47607:8:9;;47617:20;47604:34;47594:185;;47671:10;47665:4;47658:24;47760:4;47754;47747:18;3023:433:11;5360:13:0;;;;;;;5352:69;;;;;;;25498:2:28;5352:69:0;;;25480:21:28;25537:2;25517:18;;;25510:30;25576:34;25556:18;;;25549:62;25647:13;25627:18;;;25620:41;25678:19;;5352:69:0;25296:407:28;5352:69:0;3247:5:11::1;:13;3255:5:::0;3247;:13:::1;:::i;:::-;-1:-1:-1::0;3311:7:11::1;:17;3321:7:::0;3311;:17:::1;:::i;:::-;-1:-1:-1::0;;3418:11:11::1;:31:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;3023:433:11:o;44177:1468:9:-;44465:4;44459:11;44568:10;44565:1;44558:21;44613:8;44606:4;44603:1;44599:12;44592:30;44672:4;44668:2;44664:13;44660:2;44656:22;44649:4;44646:1;44642:12;44635:44;44713:2;44706:4;44703:1;44699:12;44692:24;44750:6;44743:4;44740:1;44736:12;44729:28;44791:4;44784;44781:1;44777:12;44770:26;44824:4;44818:11;44863:1;44856:4;44853:1;44849:12;44842:23;44881:1;44878:71;;;44944:1;44937:4;44934:1;44930:12;44927:1;44920:4;44914;44910:15;44907:1;44900:5;44889:57;44885:62;44878:71;45065:4;45062:1;45058;45052:4;45048:12;45041:4;45038:1;45034:12;45031:1;45027:2;45020:5;45015:55;45005:348;;45093:16;45090:220;;;45224:16;45218:4;45212;45197:44;45275:16;45269:4;45262:30;45090:220;45337:1;45334;45327:12;45005:348;-1:-1:-1;45457:8:9;;45467:20;45454:34;45444:185;;45521:10;45515:4;45508:24;45610:4;45604;45597:18;26111:1681;26252:72;26273:4;26287:1;26291:11;26299:2;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;;47979:11;47861:260;26291:11;47985:4;47979:11;;48016:17;;;48003:31;;;48062:1;48047:17;;48096:4;48084:17;;48077:28;;;26252:72;;;;;;;;;;;;:20;:72::i;:::-;26431:4;26427:2;26423:13;26492:5;26465:25;26462:36;26456:4;26449:50;26710:5;26705:2;26701;26697:11;26694:22;26688:2;26684;26680:11;26673:19;26670:47;26660:295;;26750:2;26744:4;26737:16;26802:4;26796;26786:21;26780:28;26770:171;;26845:10;26839:4;26832:24;26918:4;26912;26905:18;26770:171;27064:2;27058:4;27051:16;27123:4;27117;27107:21;27170:15;27164:22;27217:11;27209:6;27206:23;27203:158;;;27265:10;27259:4;27252:24;27338:4;27332;27325:18;27203:158;27419:6;27406:11;27402:24;27385:15;27378:49;;;27513:2;27507:4;27500:16;27542:6;27536:4;27529:20;27639:1;27631:5;27627:2;27623:14;27613:8;27579:32;27573:4;27567;27562:79;-1:-1:-1;27660:126:9;;28422:2870;28608:56;28629:4;28643:1;28647:3;28652:7;28608:56;;;;;;;;;;;;:20;:56::i;:::-;28781:7;28775:14;28769:3;28763:10;28760:30;28750:162;;28823:10;28817:4;28810:24;28893:4;28887;28880:18;28750:162;28946:4;28942:2;28938:13;29007:5;28980:25;28977:36;28971:4;28964:50;29194:2;29190;29186:11;29244:5;29239:3;29236:14;29230:3;29223:11;29220:31;29210:279;;29284:2;29278:4;29271:16;29336:4;29330;29320:21;29314:28;29304:171;;29379:10;29373:4;29366:24;29452:4;29446;29439:18;29304:171;29210:279;29611:3;29605:10;29602:1;29598:18;29648:1;29633:743;29665:3;29662:1;29659:10;29633:743;;29708:4;29705:1;29701:12;29696:17;;29767:1;29758:7;29754:15;29748:22;29916:1;29911:3;29907:11;29901:18;29895:4;29888:32;29984:4;29978;29968:21;30039:15;30033:22;30094:11;30086:6;30083:23;30080:182;;;30150:10;30144:4;30137:24;30231:4;30225;30218:18;30080:182;30311:24;;;;30287:49;;29633:743;;;29637:14;;30481:4;30475:11;30548:4;30545:1;30538:15;30602:3;30596:10;30593:1;30589:18;30583:4;30579:29;30641:4;30638:1;30634:12;30699:1;30696;30693;30688:3;30685:1;30678:5;30667:34;30663:39;30789:16;30783:4;30779:27;30772:4;30769:1;30765:12;30758:49;30836:16;30833:1;30829:24;30824:29;;30898:7;30892:14;30889:1;30885:22;30879:4;30875:33;30870:38;;30965:1;30962;30959;30950:7;30947:1;30940:5;30929:38;30925:43;31020:1;31001:16;30998:1;30994:24;30990:32;30985:37;;;31141:1;31133:5;31129:2;31125:14;31115:8;31082:31;31079:1;31076;31071:72;;;30448:709;31180:24;42491:4;42426:100;;31180:24;31176:110;;;31220:55;;;;;;;;;31254:1;31220:55;;;14143:333:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:331:28;119:9;130;172:8;160:10;157:24;154:44;;;194:1;191;184:12;154:44;223:6;213:8;210:20;207:40;;;243:1;240;233:12;207:40;-1:-1:-1;;269:23:28;;;314:25;;;;;-1:-1:-1;14:331:28:o;350:372::-;509:66;471:19;;593:11;;;;624:2;616:11;;613:103;;;703:2;697;690:3;686:2;682:12;679:1;675:20;671:29;667:2;663:38;659:47;650:56;;613:103;;;350:372;;;;:::o;727:271::-;910:6;902;897:3;884:33;866:3;936:16;;961:13;;;936:16;727:271;-1:-1:-1;727:271:28:o;1003:162::-;1097:42;1090:5;1086:54;1079:5;1076:65;1066:93;;1155:1;1152;1145:12;1170:331;1246:6;1254;1307:2;1295:9;1286:7;1282:23;1278:32;1275:52;;;1323:1;1320;1313:12;1275:52;1362:9;1349:23;1381:39;1414:5;1381:39;:::i;:::-;1439:5;1491:2;1476:18;;;;1463:32;;-1:-1:-1;;;1170:331:28:o;2896:332::-;2954:6;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3062:9;3049:23;3112:66;3105:5;3101:78;3094:5;3091:89;3081:117;;3194:1;3191;3184:12;3425:443;3492:6;3500;3553:2;3541:9;3532:7;3528:23;3524:32;3521:52;;;3569:1;3566;3559:12;3521:52;3608:9;3595:23;3627:39;3660:5;3627:39;:::i;:::-;3685:5;-1:-1:-1;3742:2:28;3727:18;;3714:32;3790:26;3777:40;;3765:53;;3755:81;;3832:1;3829;3822:12;3755:81;3855:7;3845:17;;;3425:443;;;;;:::o;3873:607::-;3985:4;4014:2;4043;4032:9;4025:21;4075:6;4069:13;4118:6;4113:2;4102:9;4098:18;4091:34;4143:1;4153:140;4167:6;4164:1;4161:13;4153:140;;;4262:14;;;4258:23;;4252:30;4228:17;;;4247:2;4224:26;4217:66;4182:10;;4153:140;;;4157:3;4342:1;4337:2;4328:6;4317:9;4313:22;4309:31;4302:42;4471:2;4401:66;4396:2;4388:6;4384:15;4380:88;4369:9;4365:104;4361:113;4353:121;;;;3873:607;;;;:::o;4485:180::-;4544:6;4597:2;4585:9;4576:7;4572:23;4568:32;4565:52;;;4613:1;4610;4603:12;4565:52;-1:-1:-1;4636:23:28;;4485:180;-1:-1:-1;4485:180:28:o;5189:248::-;5257:6;5265;5318:2;5306:9;5297:7;5293:23;5289:32;5286:52;;;5334:1;5331;5324:12;5286:52;-1:-1:-1;;5357:23:28;;;5427:2;5412:18;;;5399:32;;-1:-1:-1;5189:248:28:o;5744:367::-;5807:8;5817:6;5871:3;5864:4;5856:6;5852:17;5848:27;5838:55;;5889:1;5886;5879:12;5838:55;-1:-1:-1;5912:20:28;;5955:18;5944:30;;5941:50;;;5987:1;5984;5977:12;5941:50;6024:4;6016:6;6012:17;6000:29;;6084:3;6077:4;6067:6;6064:1;6060:14;6052:6;6048:27;6044:38;6041:47;6038:67;;;6101:1;6098;6091:12;6038:67;5744:367;;;;;:::o;6116:347::-;6167:8;6177:6;6231:3;6224:4;6216:6;6212:17;6208:27;6198:55;;6249:1;6246;6239:12;6198:55;-1:-1:-1;6272:20:28;;6315:18;6304:30;;6301:50;;;6347:1;6344;6337:12;6301:50;6384:4;6376:6;6372:17;6360:29;;6436:3;6429:4;6420:6;6412;6408:19;6404:30;6401:39;6398:59;;;6453:1;6450;6443:12;6468:1354;6628:6;6636;6644;6652;6660;6668;6676;6684;6737:3;6725:9;6716:7;6712:23;6708:33;6705:53;;;6754:1;6751;6744:12;6705:53;6793:9;6780:23;6812:39;6845:5;6812:39;:::i;:::-;6870:5;-1:-1:-1;6927:2:28;6912:18;;6899:32;6940:41;6899:32;6940:41;:::i;:::-;7000:7;-1:-1:-1;7058:2:28;7043:18;;7030:32;7081:18;7111:14;;;7108:34;;;7138:1;7135;7128:12;7108:34;7177:70;7239:7;7230:6;7219:9;7215:22;7177:70;:::i;:::-;7266:8;;-1:-1:-1;7151:96:28;-1:-1:-1;7354:2:28;7339:18;;7326:32;;-1:-1:-1;7370:16:28;;;7367:36;;;7399:1;7396;7389:12;7367:36;7438:72;7502:7;7491:8;7480:9;7476:24;7438:72;:::i;:::-;7529:8;;-1:-1:-1;7412:98:28;-1:-1:-1;7617:3:28;7602:19;;7589:33;;-1:-1:-1;7634:16:28;;;7631:36;;;7663:1;7660;7653:12;7631:36;;7702:60;7754:7;7743:8;7732:9;7728:24;7702:60;:::i;:::-;6468:1354;;;;-1:-1:-1;6468:1354:28;;-1:-1:-1;6468:1354:28;;;;;;7781:8;-1:-1:-1;;;6468:1354:28:o;7827:184::-;7879:77;7876:1;7869:88;7976:4;7973:1;7966:15;8000:4;7997:1;7990:15;8016:253;8088:2;8082:9;8130:4;8118:17;;8165:18;8150:34;;8186:22;;;8147:62;8144:88;;;8212:18;;:::i;:::-;8248:2;8241:22;8016:253;:::o;8274:334::-;8345:2;8339:9;8401:2;8391:13;;8406:66;8387:86;8375:99;;8504:18;8489:34;;8525:22;;;8486:62;8483:88;;;8551:18;;:::i;:::-;8587:2;8580:22;8274:334;;-1:-1:-1;8274:334:28:o;8613:466::-;8678:5;8712:18;8704:6;8701:30;8698:56;;;8734:18;;:::i;:::-;8772:116;8882:4;8813:66;8808:2;8800:6;8796:15;8792:88;8788:99;8772:116;:::i;:::-;8763:125;;8911:6;8904:5;8897:21;8951:3;8942:6;8937:3;8933:16;8930:25;8927:45;;;8968:1;8965;8958:12;8927:45;9017:6;9012:3;9005:4;8998:5;8994:16;8981:43;9071:1;9064:4;9055:6;9048:5;9044:18;9040:29;9033:40;8613:466;;;;;:::o;9084:222::-;9127:5;9180:3;9173:4;9165:6;9161:17;9157:27;9147:55;;9198:1;9195;9188:12;9147:55;9220:80;9296:3;9287:6;9274:20;9267:4;9259:6;9255:17;9220:80;:::i;9311:986::-;9426:6;9434;9442;9450;9458;9511:3;9499:9;9490:7;9486:23;9482:33;9479:53;;;9528:1;9525;9518:12;9479:53;9567:9;9554:23;9586:39;9619:5;9586:39;:::i;:::-;9644:5;-1:-1:-1;9701:2:28;9686:18;;9673:32;9714:41;9673:32;9714:41;:::i;:::-;9774:7;-1:-1:-1;9832:2:28;9817:18;;9804:32;9855:18;9885:14;;;9882:34;;;9912:1;9909;9902:12;9882:34;9935:50;9977:7;9968:6;9957:9;9953:22;9935:50;:::i;:::-;9925:60;;10038:2;10027:9;10023:18;10010:32;9994:48;;10067:2;10057:8;10054:16;10051:36;;;10083:1;10080;10073:12;10051:36;;10106:52;10150:7;10139:8;10128:9;10124:24;10106:52;:::i;:::-;10096:62;;;10210:3;10199:9;10195:19;10182:33;10224:41;10257:7;10224:41;:::i;:::-;10284:7;10274:17;;;9311:986;;;;;;;;:::o;10302:773::-;10424:6;10432;10440;10448;10501:2;10489:9;10480:7;10476:23;10472:32;10469:52;;;10517:1;10514;10507:12;10469:52;10557:9;10544:23;10586:18;10627:2;10619:6;10616:14;10613:34;;;10643:1;10640;10633:12;10613:34;10682:70;10744:7;10735:6;10724:9;10720:22;10682:70;:::i;:::-;10771:8;;-1:-1:-1;10656:96:28;-1:-1:-1;10859:2:28;10844:18;;10831:32;;-1:-1:-1;10875:16:28;;;10872:36;;;10904:1;10901;10894:12;10872:36;;10943:72;11007:7;10996:8;10985:9;10981:24;10943:72;:::i;:::-;10302:773;;;;-1:-1:-1;11034:8:28;-1:-1:-1;;;;10302:773:28:o;11080:632::-;11251:2;11303:21;;;11373:13;;11276:18;;;11395:22;;;11222:4;;11251:2;11474:15;;;;11448:2;11433:18;;;11222:4;11517:169;11531:6;11528:1;11525:13;11517:169;;;11592:13;;11580:26;;11661:15;;;;11626:12;;;;11553:1;11546:9;11517:169;;;-1:-1:-1;11703:3:28;;11080:632;-1:-1:-1;;;;;;11080:632:28:o;11717:410::-;11788:6;11796;11849:2;11837:9;11828:7;11824:23;11820:32;11817:52;;;11865:1;11862;11855:12;11817:52;11905:9;11892:23;11938:18;11930:6;11927:30;11924:50;;;11970:1;11967;11960:12;11924:50;12009:58;12059:7;12050:6;12039:9;12035:22;12009:58;:::i;:::-;12086:8;;11983:84;;-1:-1:-1;11717:410:28;-1:-1:-1;;;;11717:410:28:o;12132:424::-;12197:6;12205;12258:2;12246:9;12237:7;12233:23;12229:32;12226:52;;;12274:1;12271;12264:12;12226:52;12313:9;12300:23;12332:39;12365:5;12332:39;:::i;:::-;12390:5;-1:-1:-1;12447:2:28;12432:18;;12419:32;12489:15;;12482:23;12470:36;;12460:64;;12520:1;12517;12510:12;12561:255;12620:6;12673:2;12661:9;12652:7;12648:23;12644:32;12641:52;;;12689:1;12686;12679:12;12641:52;12728:9;12715:23;12747:39;12780:5;12747:39;:::i;13208:404::-;13276:6;13284;13337:2;13325:9;13316:7;13312:23;13308:32;13305:52;;;13353:1;13350;13343:12;13305:52;13392:9;13379:23;13411:39;13444:5;13411:39;:::i;:::-;13469:5;-1:-1:-1;13526:2:28;13511:18;;13498:32;13539:41;13498:32;13539:41;:::i;13617:839::-;13723:6;13731;13739;13747;13755;13763;13816:3;13804:9;13795:7;13791:23;13787:33;13784:53;;;13833:1;13830;13823:12;13784:53;13872:9;13859:23;13891:39;13924:5;13891:39;:::i;:::-;13949:5;-1:-1:-1;14006:2:28;13991:18;;13978:32;14019:41;13978:32;14019:41;:::i;:::-;14079:7;-1:-1:-1;14133:2:28;14118:18;;14105:32;;-1:-1:-1;14184:2:28;14169:18;;14156:32;;-1:-1:-1;14239:3:28;14224:19;;14211:33;14267:18;14256:30;;14253:50;;;14299:1;14296;14289:12;14253:50;14338:58;14388:7;14379:6;14368:9;14364:22;14338:58;:::i;:::-;13617:839;;;;-1:-1:-1;13617:839:28;;-1:-1:-1;13617:839:28;;14415:8;;13617:839;-1:-1:-1;;;13617:839:28:o;14461:391::-;14538:6;14546;14554;14607:2;14595:9;14586:7;14582:23;14578:32;14575:52;;;14623:1;14620;14613:12;14575:52;14662:9;14649:23;14681:39;14714:5;14681:39;:::i;:::-;14739:5;14791:2;14776:18;;14763:32;;-1:-1:-1;14842:2:28;14827:18;;;14814:32;;14461:391;-1:-1:-1;;;14461:391:28:o;14857:916::-;14988:6;14996;15004;15012;15020;15073:2;15061:9;15052:7;15048:23;15044:32;15041:52;;;15089:1;15086;15079:12;15041:52;15128:9;15115:23;15147:39;15180:5;15147:39;:::i;:::-;15205:5;-1:-1:-1;15261:2:28;15246:18;;15233:32;15284:18;15314:14;;;15311:34;;;15341:1;15338;15331:12;15311:34;15380:70;15442:7;15433:6;15422:9;15418:22;15380:70;:::i;:::-;15469:8;;-1:-1:-1;15354:96:28;-1:-1:-1;15557:2:28;15542:18;;15529:32;;-1:-1:-1;15573:16:28;;;15570:36;;;15602:1;15599;15592:12;15570:36;;15641:72;15705:7;15694:8;15683:9;15679:24;15641:72;:::i;:::-;14857:916;;;;-1:-1:-1;14857:916:28;;-1:-1:-1;15732:8:28;;15615:98;14857:916;-1:-1:-1;;;14857:916:28:o;15778:184::-;15830:77;15827:1;15820:88;15927:4;15924:1;15917:15;15951:4;15948:1;15941:15;15967:128;16034:9;;;16055:11;;;16052:37;;;16069:18;;:::i;16100:192::-;16169:4;16202:18;16194:6;16191:30;16188:56;;;16224:18;;:::i;:::-;-1:-1:-1;16269:1:28;16265:14;16281:4;16261:25;;16100:192::o;16297:1378::-;16360:5;16413:3;16406:4;16398:6;16394:17;16390:27;16380:55;;16431:1;16428;16421:12;16380:55;16467:6;16454:20;16493:4;16517:69;16533:52;16582:2;16533:52;:::i;:::-;16517:69;:::i;:::-;16620:15;;;16706:1;16702:10;;;;16690:23;;16686:32;;;16651:12;;;;16730:15;;;16727:35;;;16758:1;16755;16748:12;16727:35;16794:2;16786:6;16782:15;16806:840;16822:6;16817:3;16814:15;16806:840;;;16900:4;16894:3;16889;16885:13;16881:24;16878:114;;;16946:1;16975:2;16971;16964:14;16878:114;17018:22;;:::i;:::-;17081:3;17068:17;17120:1;17111:7;17108:14;17098:112;;17164:1;17193:2;17189;17182:14;17098:112;17223:22;;17286:12;;;17273:26;17312:41;17273:26;17312:41;:::i;:::-;17373:14;;;17366:31;17420:2;17471:12;;;17458:26;17442:14;;;17435:50;17508:2;17559:12;;;17546:26;17530:14;;;17523:50;17586:18;;17624:12;;;;16848:4;16839:14;16806:840;;;-1:-1:-1;17664:5:28;16297:1378;-1:-1:-1;;;;;;16297:1378:28:o;17680:1147::-;17887:6;17895;17903;17911;17964:3;17952:9;17943:7;17939:23;17935:33;17932:53;;;17981:1;17978;17971:12;17932:53;18020:9;18007:23;18039:39;18072:5;18039:39;:::i;:::-;18097:5;-1:-1:-1;18153:2:28;18138:18;;18125:32;18176:18;18206:14;;;18203:34;;;18233:1;18230;18223:12;18203:34;18256:70;18318:7;18309:6;18298:9;18294:22;18256:70;:::i;:::-;18246:80;;18379:2;18368:9;18364:18;18351:32;18335:48;;18408:2;18398:8;18395:16;18392:36;;;18424:1;18421;18414:12;18392:36;18447:72;18511:7;18500:8;18489:9;18485:24;18447:72;:::i;:::-;18437:82;;18572:2;18561:9;18557:18;18544:32;18528:48;;18601:2;18591:8;18588:16;18585:36;;;18617:1;18614;18607:12;18585:36;-1:-1:-1;18640:24:28;;18695:4;18687:13;;18683:27;-1:-1:-1;18673:55:28;;18724:1;18721;18714:12;18673:55;18747:74;18813:7;18808:2;18795:16;18790:2;18786;18782:11;18747:74;:::i;:::-;18737:84;;;17680:1147;;;;;;;:::o;18832:184::-;18884:77;18881:1;18874:88;18981:4;18978:1;18971:15;19005:4;19002:1;18995:15;19021:671;19075:5;19128:3;19121:4;19113:6;19109:17;19105:27;19095:55;;19146:1;19143;19136:12;19095:55;19182:6;19169:20;19208:4;19232:69;19248:52;19297:2;19248:52;:::i;19232:69::-;19335:15;;;19421:1;19417:10;;;;19405:23;;19401:32;;;19366:12;;;;19445:15;;;19442:35;;;19473:1;19470;19463:12;19442:35;19509:2;19501:6;19497:15;19521:142;19537:6;19532:3;19529:15;19521:142;;;19603:17;;19591:30;;19641:12;;;;19554;;19521:142;;19697:746;19832:6;19840;19848;19901:2;19889:9;19880:7;19876:23;19872:32;19869:52;;;19917:1;19914;19907:12;19869:52;19956:9;19943:23;19975:39;20008:5;19975:39;:::i;:::-;20033:5;-1:-1:-1;20089:2:28;20074:18;;20061:32;20112:18;20142:14;;;20139:34;;;20169:1;20166;20159:12;20139:34;20192:61;20245:7;20236:6;20225:9;20221:22;20192:61;:::i;:::-;20182:71;;20306:2;20295:9;20291:18;20278:32;20262:48;;20335:2;20325:8;20322:16;20319:36;;;20351:1;20348;20341:12;20319:36;;20374:63;20429:7;20418:8;20407:9;20403:24;20374:63;:::i;:::-;20364:73;;;19697:746;;;;;:::o;20782:437::-;20861:1;20857:12;;;;20904;;;20925:61;;20979:4;20971:6;20967:17;20957:27;;20925:61;21032:2;21024:6;21021:14;21001:18;20998:38;20995:218;;21069:77;21066:1;21059:88;21170:4;21167:1;21160:15;21198:4;21195:1;21188:15;20995:218;;20782:437;;;:::o;22470:545::-;22572:2;22567:3;22564:11;22561:448;;;22608:1;22633:5;22629:2;22622:17;22678:4;22674:2;22664:19;22748:2;22736:10;22732:19;22729:1;22725:27;22719:4;22715:38;22784:4;22772:10;22769:20;22766:47;;;-1:-1:-1;22807:4:28;22766:47;22862:2;22857:3;22853:12;22850:1;22846:20;22840:4;22836:31;22826:41;;22917:82;22935:2;22928:5;22925:13;22917:82;;;22980:17;;;22961:1;22950:13;22917:82;;23251:1325;23375:18;23370:3;23367:27;23364:53;;;23397:18;;:::i;:::-;23426:94;23516:3;23476:38;23508:4;23502:11;23476:38;:::i;:::-;23470:4;23426:94;:::i;:::-;23546:1;23571:2;23566:3;23563:11;23588:1;23583:735;;;;24362:1;24379:3;24376:93;;;-1:-1:-1;24435:19:28;;;24422:33;24376:93;23157:66;23148:1;23144:11;;;23140:84;23136:89;23126:100;23232:1;23228:11;;;23123:117;24482:78;;23556:1014;;23583:735;22417:1;22410:14;;;22454:4;22441:18;;23628:66;23619:76;;;23779:9;23801:229;23815:7;23812:1;23809:14;23801:229;;;23904:19;;;23891:33;23876:49;;24011:4;23996:20;;;;23964:1;23952:14;;;;23831:12;23801:229;;;23805:3;24058;24049:7;24046:16;24043:219;;;24178:66;24172:3;24166;24163:1;24159:11;24155:21;24151:94;24147:99;24134:9;24129:3;24125:19;24112:33;24108:139;24100:6;24093:155;24043:219;;;24305:1;24299:3;24296:1;24292:11;24288:19;24282:4;24275:33;23556:1014;;23251:1325;;;:::o;24842:449::-;25001:2;24990:9;24983:21;25040:6;25035:2;25024:9;25020:18;25013:34;25097:6;25089;25084:2;25073:9;25069:18;25056:48;25153:1;25124:22;;;25148:2;25120:31;;;25113:42;;;;25207:2;25195:15;;;25212:66;25191:88;25176:104;25172:113;;24842:449;-1:-1:-1;24842:449:28:o;25708:408::-;25863:2;25848:18;;25896:1;25885:13;;25875:201;;25932:77;25929:1;25922:88;26033:4;26030:1;26023:15;26061:4;26058:1;26051:15;25875:201;26085:25;;;25708:408;:::o;26453:125::-;26518:9;;;26539:10;;;26536:36;;;26552:18;;:::i;27416:195::-;27455:3;27486:66;27479:5;27476:77;27473:103;;27556:18;;:::i;:::-;-1:-1:-1;27603:1:28;27592:13;;27416:195::o;27616:1471::-;27742:3;27736:10;27769:18;27761:6;27758:30;27755:56;;;27791:18;;:::i;:::-;27820:97;27910:6;27870:38;27902:4;27896:11;27870:38;:::i;:::-;27864:4;27820:97;:::i;:::-;27972:4;;28036:2;28025:14;;28053:1;28048:782;;;;28874:1;28891:6;28888:89;;;-1:-1:-1;28943:19:28;;;28937:26;28888:89;23157:66;23148:1;23144:11;;;23140:84;23136:89;23126:100;23232:1;23228:11;;;23123:117;28990:81;;28018:1063;;28048:782;22417:1;22410:14;;;22454:4;22441:18;;28096:66;28084:79;;;28261:236;28275:7;28272:1;28269:14;28261:236;;;28364:19;;;28358:26;28343:42;;28456:27;;;;28424:1;28412:14;;;;28291:19;;28261:236;;;28265:3;28525:6;28516:7;28513:19;28510:261;;;28586:19;;;28580:26;28687:66;28669:1;28665:14;;;28681:3;28661:24;28657:97;28653:102;28638:118;28623:134;;28510:261;-1:-1:-1;;;;;28817:1:28;28801:14;;;28797:22;28784:36;;-1:-1:-1;27616:1471:28:o
Swarm Source
none://164736f6c6343000813000a
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.